gitlab-ci-使用脚本替换数据源

使用脚本替换数据源

 

项目需求:

 

目前公司项目分为3个环境,开发环境(内网的本地环境),测试环境(内网的gitlab-runner发布),生产环境(外网).

公司决定在内网使用gitlab作为代码仓库,启动gitfow工作流,把开发环境和测试环境作为同一个项目的不同分支.只在测试环境上使用gitlab-ci,达到自动化部署的效果.那么其中就会产生一个问题,这两个分支如果使用gitlab应用进行合并,那么无法忽视数据源文件,这样就导致测试环境项目的数据源文件被替换成了开发环境的,与原本用意相违背.

此外,由于目前改革过于保守的限制,内网测试环境到外网生产环境的过程中,还是使用增量更新的办法,以后会慢慢改到使用完整镜像放到外网生产环境

 

 

开发思路:

首先是要写一个能够替换数据源的脚本文件

在构建项目所在镜像(tomcat,ant,jdk环境)的时候,先把项目解包

把脚本文件放进镜像里,并在启动容器的时候执行脚本.

 

具体实现

 

这里采用外部传递环境变量的方式把数据源信息传进脚本内做修改

参考:

http://landcareweb.com/questions/350/ru-he-jiang-huan-jing-bian-liang-chuan-di-gei-dockerrong-qi?tdsourcetag=s_pcqq_aiomsg

在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

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值