基于Gitlab实现的配置中心(支持Docker)
来源:互联网 发布:c语言基础知识要点 编辑:程序博客网 时间:2024/06/07 10:43
项目介绍
项目地址: https://github.com/lipg/config-agent
配置中心工具,目前支持通过http,https的方式从git中下载配置文件。
gitlab支持在线Web修改文件,遂使用该方式可实现一个支持传统应用的配置中心。使用shell
脚本也可是实现该功能,但是为了提供更好的兼容性,遂使用Go专门写的Agent,不依赖与系统环境组件,如:curl、wget等。
基本流程:从Gitlab中获取访问Api的Access Key
-> 使用Config下载配置文件
-> 将配置文件复制并覆盖到指定位置
-> 启动应用
项目结构
Docker+Jenkins的持续集成及相关脚本分享请查看 http://blog.lipg.cn/ji-yu-jenkinsshi-xian-de-docker-imagechi-xu-ji-cheng/
git作为配置中心,其每个仓库结构
- 根目录
- app/ : 项目配置文件
- script/ : 项目所需脚本
项目结构(基于jenkins的Pipeline构建)
- 根目录
- Jenkinsfile : jenkins构建脚本
- docker/ : Docker构建所需的Dockerfile等文件
- entrypoint/ : 启动脚本
- Dockerfile : docker构建脚本
使用方式
配置文件下载脚本 Get_Configuration.sh
#!/usr/bin/env bash# 配置文件配置# 配置文件所在的服务器,可使用环境变量AUTOZI_CONFIG_URL注入。export DEFAULT_AUTOZI_CONFIG_URL='http://git.lipg.cn'# 配置文件仓库名称,可使用环境变量AUTOZI_CONFIG_REPO注入。export DEFAULT_AUTOZI_CONFIG_REPO='cloud/config-agent'# 配置文件标示,可以使用环境变量AUTOZI_CONFIG_TARGET注入。(可以是分支名称、Tag、可以是commit ID。)export DEFAULT_AUTOZI_CONFIG_TARGET='master'# 授权的Token,可以使用环境变量AUTOZI_CONFIG_TOKEN注入。export DEFAULT_AUTOZI_CONFIG_TOKEN=''# 配置文件下载的临时目录,可以使用环境变量CONFIG_TMP_PATH注入export AUTOZI_CONFIG_TMP_PATH='/tmp'# 检查配置参数,如果未注入,则使用默认值if [ -z "$AUTOZI_CONFIG_URL" ]; then export AUTOZI_CONFIG_URL="$DEFAULT_AUTOZI_CONFIG_URL"fiif [ -z "$AUTOZI_CONFIG_REPO" ]; then export AUTOZI_CONFIG_REPO="$DEFAULT_AUTOZI_CONFIG_REPO"fiif [ -z "$AUTOZI_CONFIG_TARGET" ]; then export AUTOZI_CONFIG_TARGET="$DEFAULT_AUTOZI_CONFIG_TARGET"fiif [ -z "$AUTOZI_CONFIG_TOKEN" ]; then export AUTOZI_CONFIG_TOKEN="$DEFAULT_AUTOZI_CONFIG_TOKEN"fiif [ -z "$AUTOZI_CONFIG_TMP_PATH" ]; then export AUTOZI_CONFIG_TMP_PATH="$DEFAULT_AUTOZI_CONFIG_TMP_PATH"fi# 下载配置到临时目录mkdir -pv ${AUTOZI_CONFIG_TMP_PATH}$bash_dir/config --url=${AUTOZI_CONFIG_URL} --repo=${AUTOZI_CONFIG_REPO} --branch=${AUTOZI_CONFIG_TARGET} --token=${AUTOZI_CONFIG_TOKEN} --path=${AUTOZI_CONFIG_TMP_PATH}/config.tar# 将配置文件展开cd ${AUTOZI_CONFIG_TMP_PATH} && tar -xvf config.tar --strip-components=1 && rm -rf config.tar && ls -lR
更新配置文件 App_Configuration.sh
将仓库中的app目录下的配置文件全部拷贝到指定目录,使用AUTOZI_CONFIG_PATH环境变量指定目录。
#!/usr/bin/env bash# 检查目标环境# 检查原始配置文件目录是否存在if [ ! -d "$AUTOZI_CONFIG_TMP_PATH" ] || [ ! -d "$AUTOZI_CONFIG_TMP_PATH/app" ] ; then echo '配置文件不存在,将不处理任何配置';fi# 检查目标配置文件目录是否存在,不存在的话则创建目录if [ ! -d "$AUTOZI_CONFIG_PATH" ]; then mkdir -pv ${AUTOZI_CONFIG_PATH};fi# 拷贝配置文件到指定目录\cp -rv ${AUTOZI_CONFIG_TMP_PATH}/app/* ${AUTOZI_CONFIG_PATH}/echo "完成APP配置文件处理。应用配置文件:$AUTOZI_CONFIG_TMP_PATH/app,目标路径:$AUTOZI_CONFIG_PATH";
扩展脚本
通用启动脚本 entrypoint.sh
#!/usr/bin/env bash# 遇到任意命令返回非0则推出脚本set -e# 获取脚本所在的路径bash_dir=$(cd `dirname $0`; pwd)echo "启动脚本所在路径:$bash_dir";# 设置默认参数# 配置文件存储路径export DEFAULT_AUTOZI_CONFIG_TMP_PATH='/tmp/config';# 默认的配置文件路径,公共配置export DEFAULT_AUTOZI_CONFIG_PATH='/usr/local/tomcat/webapps/ROOT/WEB-INF/classes';# 处理公共配置文件# 检查目标环境if [ -z "$AUTOZI_CONFIG_TMP_PATH" ]; then export AUTOZI_CONFIG_TMP_PATH="$DEFAULT_AUTOZI_CONFIG_TMP_PATH";fiif [ -z "$AUTOZI_CONFIG_PATH" ]; then export AUTOZI_CONFIG_PATH="$DEFAULT_AUTOZI_CONFIG_PATH";fiecho "完成公共配置参数处理。AUTOZI_CONFIG_TMP_PACH:$AUTOZI_CONFIG_TMP_PATH ; AUTOZI_CONF_PATH:$AUTOZI_CONFIG_PATH";# 更新全部配置文件. ${bash_dir}/Get_Configuration.sh# 处理App配置. ${bash_dir}/App_Configuration.sh# 处理Jar包配置文件. ${bash_dir}/Jar_Reconfigure.sh# 处理Tomcat配置. ${bash_dir}/Tomcat_Configuration.sh# 处理各环境独立脚本. ${bash_dir}/Script_Configuration.sh# 执行启动命令exec "$@"
处理Jar包内的配置文件 Jar_Reconfigure.sh
#!/usr/bin/env bash# 默认的lib依赖路径export DEFAULT_APP_LIB_PATH='/usr/local/tomcat/webapps/ROOT/WEB-INF/lib';# 检查原始配置文件目录是否存在# 检查依赖资源目录if [ -z "$APP_LIB_PATH" ]; then export APP_LIB_PATH="$DEFAULT_APP_LIB_PATH";fiReconfigure(){ # 查找Service包 export JAR_FILE=$(find ${APP_LIB_PATH} -iregex ${JAR_TARGET_REGEX} | xargs ls -ltr | awk {'print $9'} | tail -1); echo "找到Service包,路径为:$JAR_FILE"; # 跳转到配置文件目录 cd ${AUTOZI_CONFIG_TMP_PATH}/${JAR_CONF_PATH}; # 重新Service配置 jar -uvf ${JAR_FILE} ./*; echo "完成Jar: $JAR_CONF_PATH 配置文件处理。应用配置文件:$AUTOZI_CONFIG_TMP_PATH/$JAR_CONF_PATH,目标路径:$AUTOZI_CLASS_PATH" }# 处理Commons-Memcached的配置export JAR_CONF_PATH='service-interface';export JAR_TARGET_REGEX='.*/lzfinance-bt-service-interface-.*.jar';Reconfigure;# 处理Commons-Memcached的配置export JAR_CONF_PATH='service-interface';export JAR_TARGET_REGEX='.*/lzfinance-bt-service-interface-.*.jar';Reconfigure;.............
执行相关启动脚本,并打印所执行命令 Script_Configuration.sh
需要执行的脚本可以通过注入环境变量AUTOZI_SCRIPT_FILE来启动,脚本名称使用都好分割,如AUTOZI_SCRIPT_FILE=link.sh,del.sh,mv.sh,nfs.sh
#!/usr/bin/env bash# 默认执行的脚本export DEFAULT_AUTOZI_SCRIPT_FILE=('links');# 检查脚本是否存在if [ ! -d "$AUTOZI_CONFIG_TMP_PATH" ] || [ ! -d "$AUTOZI_CONFIG_TMP_PATH/script" ] ; then echo '配置脚本不存在,将不处理任何脚本!'fi# 检查初始化脚本的环境变量if [ -z "$AUTOZI_SCRIPT_FILE" ]; then AUTOZI_SCRIPT_FILE=${DEFAULT_AUTOZI_SCRIPT_FILE[@]}else # 从环境变量获取需要执行的脚本 OLD_IFS="$IFS" IFS="," AUTOZI_SCRIPT_FILE=(${AUTOZI_SCRIPT_FILE}) IFS="$OLD_IFS" fi# 再次确认脚本if [ ! ${AUTOZI_SCRIPT_FILE} ]; then AUTOZI_SCRIPT_FILE=()fiset -x# 载入软件环境变量配置for script in ${AUTOZI_SCRIPT_FILE[@]};do if [ -f "$AUTOZI_CONFIG_TMP_PATH/script/$script.sh" ]; then source "$AUTOZI_CONFIG_TMP_PATH/script/$script.sh" else echo "文件$AUTOZI_CONFIG_TMP_PATH/script/$script.sh不存在,不进行载入。" fidoneset +x
启动后阻塞进程退出 sleep.sh
#!/usr/bin/env bash# 遇到任意命令返回非0则推出脚本set -eecho '完成文件处理,启动bash阻塞容器';# 使用死循环,阻止容器退出while true;do sleep 24h;done
启动时处理Tomcat端口 Tomcat_Configuration.sh
#!/usr/bin/env bash# Tomcat端口配置export DEFAULT_TOMCAT_HTTP_PORT='8080';export DEFAULT_TOMCAT_AJP_PORT='8009';export DEFAULT_TOMCAT_SERVER_PORT='8005';# 检查目标环境if [ -z "$TOMCAT_HTTP_PORT" ]; then export TOMCAT_HTTP_PORT="$DEFAULT_TOMCAT_HTTP_PORT";fiif [ -z "$TOMCAT_AJP_PORT" ]; then export TOMCAT_AJP_PORT="$DEFAULT_TOMCAT_AJP_PORT";fiif [ -z "$TOMCAT_SERVER_PORT" ]; then export TOMCAT_SERVER_PORT="$DEFAULT_TOMCAT_SERVER_PORT";fi# 打印并重写配置sed -n "s/Connector port=\"8080\"/Connector port=\"$TOMCAT_HTTP_PORT\"/"p /usr/local/tomcat/conf/server.xmlsed -i "s/Connector port=\"8080\"/Connector port=\"$TOMCAT_HTTP_PORT\"/" /usr/local/tomcat/conf/server.xmlsed -n "s/Connector port=\"8009\"/Connector port=\"$TOMCAT_AJP_PORT\"/"p /usr/local/tomcat/conf/server.xmlsed -i "s/Connector port=\"8009\"/Connector port=\"$TOMCAT_AJP_PORT\"/" /usr/local/tomcat/conf/server.xmlsed -n "s/Server port=\"8005\"/Server port=\"$TOMCAT_SERVER_PORT\"/"p /usr/local/tomcat/conf/server.xmlsed -i "s/Server port=\"8005\"/Server port=\"$TOMCAT_SERVER_PORT\"/" /usr/local/tomcat/conf/server.xmlecho "即将启动Tomcat,并使用端口HTTP:$TOMCAT_HTTP_PORT,AJP:$TOMCAT_AJP_PORT,Server:$TOMCAT_SERVER_PORT";
启动时解压jar包指定文件到项目,优先加载从而解决加载顺序问题 Jar_Uncompress.sh
#!/usr/bin/env bash# 默认的类文件文件路径export DEFAULT_AUTOZI_CLASS_PATH='/usr/local/tomcat/webapps/ROOT/WEB-INF/classes';# 默认的lib依赖路径export DEFAULT_APP_LIB_PATH='/usr/local/tomcat/webapps/ROOT/WEB-INF/lib';# 检查需要解压的资源目录if [ -z "$APP_LIB_PATH" ]; then export APP_LIB_PATH="$DEFAULT_APP_LIB_PATH";fi# 检查解压所需要的文件if [ -z "$AUTOZI_CLASS_PATH" ]; then export AUTOZI_CLASS_PATH="$DEFAULT_AUTOZI_CLASS_PATH";fi# 检查解压所需要的文件if [ -z "$JAR_UNCOMPRESS_REGEX" ]; then export JAR_UNCOMPRESS_REGEX='./*';fi# 解压Jar文件Uncompress(){ # 查找Service包 export JAR_FILE=$(find ${APP_LIB_PATH} -iregex ${SERVICE_TARGET_REGEX} | xargs ls -ltr | awk {'print $9'} | tail -1); echo "找到需要解压的Jar包,路径为:$JAR_FILE"; # 解压相关Service # 创建临时目录 mkdir -pv /tmp/uncompress && cd /tmp/uncompress; # 解压并拷贝文件 jar -xvf ${JAR_FILE}; \cp -rv ${JAR_UNCOMPRESS_REGEX} ${AUTOZI_CLASS_PATH}; # 清理文件 cd /tmp && rm -rf /tmp/uncompress; echo "完成jar: $JAR_FILE 解压处理。处理文件: $JAR_UNCOMPRESS_REGEX,目标路径:$AUTOZI_CLASS_PATH";}# 处理文件配置export JAR_TARGET_REGEX='.*/autozi-common-core-.*.jar';export JAR_UNCOMPRESS_REGEX='./org';Uncompress;# 处理文件配置export JAR_TARGET_REGEX='.*/autozi-common-core-.*.jar';export JAR_UNCOMPRESS_REGEX='./org';Uncompress;.........
阅读全文
0 0
- 基于Gitlab实现的配置中心(支持Docker)
- 基于docker安装gitlab
- docker gitlab邮件配置
- docker-gitlab配置
- 基于zookeeper的配置中心
- spring cloud config整合gitlab搭建分布式的配置中心
- spring cloud config整合gitlab搭建分布式的配置中心
- zookeeper配置中心的实现
- 基于zookeeper的分布式一致性配置中心
- 3步基于docker搭建gitlab-ce
- docker版本的gitlab迁移
- 通过 Docker 配置 yum 和 gitlab 容器
- 一个基于TeamCity+GitLab+Docker的完整的持续集成方案
- GitLab搭建与维护(基于docker镜像sameersbn/docker-gitlab)
- GitLab 的安装配置
- 基于Docker实现DevOps的一些探索
- 基于Docker实现DevOps的一些探索
- 基于Docker的MongoDB实现授权访问
- python 数字拆分
- Gson的使用
- 给你八个参加SDCC 2017·深圳站不容错过的理由!
- Android简单的的小视频
- [原生js] 前端开发必须掌握的七个JavaScript技巧
- 基于Gitlab实现的配置中心(支持Docker)
- C++class默认生成4个函数
- C++中UTF-8转换成string
- 跨平台APP----对Cordova,APPCan,DCloud,APICloud四大平台的分析
- android4.2.2的stagefright架构下基于SurfaceFlinger的视频解码输出缓存创建机制
- Project 读写管理控件Aspose.Tasks V17.5发布 | 附下载
- Codeforces 813C The Tag Game 题解
- Android自定义view --Path 的高级用法之-搜索按钮动画
- 点击图片不同位置,让图片向不同方向运动。