项目介绍
项目地址: 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
export DEFAULT_AUTOZI_CONFIG_URL=
'http://git.lipg.cn'
export DEFAULT_AUTOZI_CONFIG_REPO=
'cloud/config-agent'
export DEFAULT_AUTOZI_CONFIG_TARGET=
'master'
export DEFAULT_AUTOZI_CONFIG_TOKEN=
''
export AUTOZI_CONFIG_TMP_PATH=
'/tmp'
if [ -z
"$AUTOZI_CONFIG_URL" ];
then
export AUTOZI_CONFIG_URL=
"$DEFAULT_AUTOZI_CONFIG_URL"
fi
if [ -z
"$AUTOZI_CONFIG_REPO" ];
then
export AUTOZI_CONFIG_REPO=
"$DEFAULT_AUTOZI_CONFIG_REPO"
fi
if [ -z
"$AUTOZI_CONFIG_TARGET" ];
then
export AUTOZI_CONFIG_TARGET=
"$DEFAULT_AUTOZI_CONFIG_TARGET"
fi
if [ -z
"$AUTOZI_CONFIG_TOKEN" ];
then
export AUTOZI_CONFIG_TOKEN=
"$DEFAULT_AUTOZI_CONFIG_TOKEN"
fi
if [ -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
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";
fi
if [ -z
"$AUTOZI_CONFIG_PATH" ];
then
export AUTOZI_CONFIG_PATH=
"$DEFAULT_AUTOZI_CONFIG_PATH";
fi
echo "完成公共配置参数处理。AUTOZI_CONFIG_TMP_PACH:$AUTOZI_CONFIG_TMP_PATH ; AUTOZI_CONF_PATH:$AUTOZI_CONFIG_PATH";
.
${bash_dir}/Get_Configuration.sh
.
${bash_dir}/App_Configuration.sh
.
${bash_dir}/Jar_Reconfigure.sh
.
${bash_dir}/Tomcat_Configuration.sh
.
${bash_dir}/Script_Configuration.sh
exec "$@"
#!/usr/bin/env bash
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
Reconfigure(){
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};
jar -uvf
${JAR_FILE} ./*;
echo "完成Jar: $JAR_CONF_PATH 配置文件处理。应用配置文件:$AUTOZI_CONFIG_TMP_PATH/$JAR_CONF_PATH,目标路径:$AUTOZI_CLASS_PATH"
}
export JAR_CONF_PATH=
'service-interface';
export JAR_TARGET_REGEX=
'.*/lzfinance-bt-service-interface-.*.jar';
Reconfigure;
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=()
fi
set -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不存在,不进行载入。"
fi
done
set +x
启动后阻塞进程退出 sleep.sh
#!/usr/bin/env bash
set -e
echo '完成文件处理,启动bash阻塞容器';
while true;
do
sleep
24h;
done
启动时处理Tomcat端口 Tomcat_Configuration.sh
#!/usr/bin/env bash
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";
fi
if [ -z
"$TOMCAT_AJP_PORT" ];
then
export TOMCAT_AJP_PORT=
"$DEFAULT_TOMCAT_AJP_PORT";
fi
if [ -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.xml
sed -i
"s/Connector port=\"8080\"/Connector port=\"$TOMCAT_HTTP_PORT\"/" /usr/local/tomcat/conf/server.xml
sed -n
"s/Connector port=\"8009\"/Connector port=\"$TOMCAT_AJP_PORT\"/"p /usr/local/tomcat/conf/server.xml
sed -i
"s/Connector port=\"8009\"/Connector port=\"$TOMCAT_AJP_PORT\"/" /usr/local/tomcat/conf/server.xml
sed -n
"s/Server port=\"8005\"/Server port=\"$TOMCAT_SERVER_PORT\"/"p /usr/local/tomcat/conf/server.xml
sed -i
"s/Server port=\"8005\"/Server port=\"$TOMCAT_SERVER_PORT\"/" /usr/local/tomcat/conf/server.xml
echo "即将启动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';
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
Uncompress(){
export JAR_FILE=$(find
${APP_LIB_PATH} -iregex
${SERVICE_TARGET_REGEX} | xargs ls -ltr | awk {
'print $9'} | tail -
1);
echo "找到需要解压的Jar包,路径为:$JAR_FILE";
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;
.........