使用脚本替换数据源
项目需求:
目前公司项目分为3个环境,开发环境(内网的本地环境),测试环境(内网的gitlab-runner发布),生产环境(外网).
公司决定在内网使用gitlab作为代码仓库,启动gitfow工作流,把开发环境和测试环境作为同一个项目的不同分支.只在测试环境上使用gitlab-ci,达到自动化部署的效果.那么其中就会产生一个问题,这两个分支如果使用gitlab应用进行合并,那么无法忽视数据源文件,这样就导致测试环境项目的数据源文件被替换成了开发环境的,与原本用意相违背.
此外,由于目前改革过于保守的限制,内网测试环境到外网生产环境的过程中,还是使用增量更新的办法,以后会慢慢改到使用完整镜像放到外网生产环境
开发思路:
首先是要写一个能够替换数据源的脚本文件
在构建项目所在镜像(tomcat,ant,jdk环境)的时候,先把项目解包
把脚本文件放进镜像里,并在启动容器的时候执行脚本.
具体实现
这里采用外部传递环境变量的方式把数据源信息传进脚本内做修改
参考:
在gitlab-ci.yml文件,也就是自动化部署执行文件中,对docker run命令添加 -e环境变量参数,写法比较特殊.
#测试环境
deploy-test:
stage: deploy
script:
- docker rm -f ebpm_ep_test || true
- >-
docker run -e CHART_URL=''
-e JDBC_URL=''
-e JDBC_URL_A=''
-e JDBC_URL_B=''
-e JDBC_URL_C=''
-e JDBC_URL_PESTRO=''
-e REDIS_HOST=''
-e MONGO_HOST=''
-e MONGO_PORT=''
--name ebpm_ep_test
-p 8090:8080
-d "192.168.1.30:5000/library/ebpm_ep_test:$C7N_VERSION"
only:
- /^hostfix-.*/
- test
在构建镜像的时候,对dockerfile文件作出修改
FROM 192.168.1.30:5000/library/tomcat:8.5.38
RUN rm -rf /usr/local/tomcat/webapps
COPY target/ROOT.war /usr/local/tomcat/webapps/ROOT.war
#解压项目
RUN unzip -o -q /usr/local/tomcat/webapps/ROOT.war -d /usr/local/tomcat/webapps/ROOT
#拷贝文件到镜像里
COPY entrypoint.sh .
#运行容器时再执行脚本
ENTRYPOINT ["sh","./entrypoint.sh"]
脚本文件的思路来源于如下实例:
https://rdc.hand-china.com/gitlab/HAP/hap/blob/master/docker/entrypoint.sh
经过修改:
entrypoint.sh脚本
# 报错公共方法
error(){
echo "Error" "$*"
exit 1
}
# 警告公共方法
ignore(){
echo "Ignore" "$*"
}
#------------------------------------------------------------------------------------------------------------------#
# Begin #
#------------------------------------------------------------------------------------------------------------------#
if [ -z ${CHART_URL} ]; then
error "CHART_URL nodejs地址未设置!"
fi
if [ -z ${JDBC_URL} ]; then
error "JDBC_URL oracle数据库链接地址未设置。"
fi
if [ -z ${JDBC_URL_A} ]; then
error "JDBC_URL_A oracle数据库链接地址未设置。"
fi
if [ -z ${JDBC_URL_B} ]; then
error "JDBC_URL_B oracle数据库链接地址未设置。"
fi
if [ -z ${JDBC_URL_C} ]; then
error "JDBC_URL_C oracle数据库链接地址未设置。"
fi
if [ -z ${JDBC_URL_PESTRO} ]; then
error "JDBC_URL_PESTRO oracle数据库链接地址未设置。"
fi
if [ -z ${REDIS_HOST} ]; then
error "REDIS_HOST REDIS数据库链接地址未设置。"
fi
if [ -z ${MONGO_HOST} ]; then
error "MONGO_HOST MONGO数据库链接地址未设置。"
fi
if [ -z ${MONGO_PORT} ]; then
error "MONGO_PORT MONGO数据库端口未设置。"
fi
#本例中的sed 指令分析:
#-i 直接对内容进行修改
#'s/原本的内容/要修改的内容/g'
#/:定界符
#s:替换掉匹配的内容
#g:替换掉所有的,如果不加,则默认替换每行第一个
#注意:最后两条sed指令采用分号作为定界符,因为替换的内容中已有/,且替换的内容中有双引号,所以需要转义字符转义一下.
# 替换oracle数据库链接数据
sed -i 's/^jdbc.url=.*$/jdbc.url='${JDBC_URL}'/g' webapps/ROOT/WEB-INF/classes/database.properties
sed -i 's/^jdbc.url.a=.*$/jdbc.url.a='${JDBC_URL_A}'/g' webapps/ROOT/WEB-INF/classes/database.properties
sed -i 's/^jdbc.url.b=.*$/jdbc.url.b='${JDBC_URL_B}'/g' webapps/ROOT/WEB-INF/classes/database.properties
sed -i 's/^jdbc.url.c=.*$/jdbc.url.c='${JDBC_URL_C}'/g' webapps/ROOT/WEB-INF/classes/database.properties
sed -i 's/^jdbc.url.persto=.*$/jdbc.url.persto='${JDBC_URL_PESTRO}'/g' webapps/ROOT/WEB-INF/classes/database.properties
# 替换Redis数据库链接数据
sed -i 's/^redis.host=.*$/redis.host='${REDIS_HOST}'/g' webapps/ROOT/WEB-INF/classes/redis.properties
# 替换postgresql数据库连接数据
sed -i 's;<mongo:mongo-client.*</mongo:mongo-client>;<mongo:mongo-client host='\"${MONGO_HOST}\"' port='\"${MONGO_PORT}\"'></mongo:mongo-client>;g' webapps/ROOT/WEB-INF/classes/applicationContext.xml
# 替换nodejs服务器链接数据
sed -i 's;^chart_url=.*$;chart_url='${CHART_URL}';g' webapps/ROOT/WEB-INF/classes/project.properties
# 启动Tomcat容器
catalina.sh run
后期验证
项目ci运行成功后,请进入容器内的项目查看那些数据源配置文件是否修改成功
在验证过程中,applicationContext.xml文件内容比较多(mongodb数据源的配置在前面),容器内没有vi 和vim指令,使用cat指令无法查看最前面的代码(不知道为什么),最后使用more指令查看文件,很强的指令
https://www.cnblogs.com/aijianshi/p/5750911.html