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

 

 

 

### 回答1: 在 GitLab CI 中使用 Docker 时,可以在 .gitlab-ci.yml 文件中使用 chrome。这需要在 Dockerfile 中安装 chrome 浏览器和 chromedriver,并在 .gitlab-ci.yml 文件中配置启动 chrome 和 chromedriver。具体步骤如下: 1. 在 Dockerfile 中安装 chrome 浏览器和 chromedriver,可以使用以下命令: ``` RUN apt-get update && apt-get install -y google-chrome-stable RUN wget https://chromedriver.storage.googleapis.com/78.0.3904.70/chromedriver_linux64.zip RUN unzip chromedriver_linux64.zip -d /usr/bin/ ``` 2. 在 .gitlab-ci.yml 文件中配置启动 chrome 和 chromedriver。 ``` services: - chrome:latest before_script: - export CHROME_BIN=/usr/bin/google-chrome - export DISPLAY=:99.0 - sh -e /etc/init.d/xvfb start ``` 3. 在你的测试代码中配置使用chrome ``` from selenium import webdriver chrome_options = webdriver.ChromeOptions() chrome_options.binary_location = os.environ.get("CHROME_BIN") chrome_options.add_argument("--headless") chrome_options.add_argument("--disable-dev-shm-usage") chrome_options.add_argument("--no-sandbox") chrome_options.add_argument("--disable-extensions") chrome_options.add_argument("--disable-gpu") chrome_options.add_argument("--remote-debugging-port=9222") chrome_options.add_argument("start-maximized") chrome_options.add_argument("disable-infobars") chrome_options.add_argument("--disable-dev-shm-usage") chrome_options.add_argument("--disable-browser-side-navigation") chrome_options.add_argument("--disable-gpu") chrome_options.add_argument("--no-sandbox") chrome_options.add_argument("--remote-debugging-port=9222") chrome_options.add_argument("--disable-setuid-sandbox") chrome_options.add_argument("--disable-dev-shm-usage") chrome_options.add_argument("--disable-infobars") chrome_options.add_argument("--disable-extensions") chrome_options.add_argument("--disable-gpu") chrome_options.add_argument("--disable-gpu-sandbox") chrome_options.add_argument("--disable- ### 回答2: 在gitlab-ci的docker环境中使用chrome可以通过以下步骤实现: 1. 首先,在.gitlab-ci.yml文件中定义一个新的job,这个job将用来运行chrome。 ``` yml chrome_test: image: selenium/standalone-chrome script: - # 添加运行chrome的命令 ``` 2. 在上述job中使用selenium/standalone-chrome镜像作为基础镜像。这个镜像已经预装了chrome浏览器。 3. 在script脚本中可以添加需要运行的chrome命令。 ```yml chrome_test: image: selenium/standalone-chrome script: - google-chrome-stable --version - # 添加其他需要运行的chrome命令 ``` 上述脚本中的google-chrome-stable --version是一个示例命令,用于显示chrome浏览器的版本信息。你可以根据需要添加其他需要运行的chrome命令。 4. 确保在.gitlab-ci.yml文件中定义的job在pipeline中被执行。 通过以上步骤,就可以在gitlab-ci的docker环境中使用chrome浏览器了。你可以在script脚本中运行各种需要使用chrome的测试或其他命令。注意,由于使用的是selenium/standalone-chrome镜像,因此脚本中的命令需要以google-chrome-stable开头。 ### 回答3: 要在GitLab CI中的Docker容器中使用Chrome,需要按照以下步骤进行配置: 1. 在.gitlab-ci.yml文件中的job中定义Docker镜像,选择一个已包含Chrome的镜像,例如google/chrome。 示例: ``` image: google/chrome jobs: test: script: - chrome --version # 做一些其他的测试操作 ``` 2. 在Docker镜像中安装Chrome,可以通过在Dockerfile中使用apt-get命令或者直接使用chrome的Docker镜像。 Dockerfile示例: ```Dockerfile FROM ubuntu # 安装Chrome RUN apt-get update && apt-get -y install wget gnupg RUN wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - RUN echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google-chrome.list RUN apt-get -y update RUN apt-get install -y google-chrome-stable # 可以进行其他的Docker镜像配置操作 CMD ["/bin/bash"] ``` 3. 在job的脚本使用Chrome命令,运行相关的测试或操作。 示例: ```shell script: - google-chrome-stable --version - google-chrome-stable --headless --disable-gpu --remote-debugging-port=9222 http://your-website.com # 其他的测试或操作命令 ``` 通过以上步骤,你就可以在GitLab CI的Docker容器中成功使用Chrome进行相关的测试或操作了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值