docker 持续集成(6) - 配置 jenkins,实现每日构建、发布、打标签


我们将 docker 宿主机作为测试服务器。通过 jenkins、gitlab 实现工程的每日定时构建、发布、给git仓库打标签的功能。

前期准备工作,首先在 docker 宿主机上安装 git。

yum install git -y

然后,在工程git仓库根目录下新建一个shell脚本,取名叫 “build_deploy.sh”,内容如下:

#!/bin/bash

docker stop $(docker ps -qa --filter name='tomcat')

sleep 3

cd ~/easygo-web && git pull

# 编译工程
docker run --rm -v "$(pwd)":/project  -v /usr/tmp/.m2:/root/.m2  -w /project maven:3.5.3-jdk-8 mvn package

# 将编译后的 war 包映射到 tomcat 容器中,并启动运行 tomcat 容器。
docker run -d --rm -p 8089:8080 -v $PWD/target/easygo-web.war:/usr/local/tomcat/webapps/easygo.war --name tomcat  tomcat:7.0.85-jre7

这个脚本的作用是:删除运行中的tomcat容器,git pull更新工程代码,maven编译代码,将编译后的war包映射到tomcat容器的目录,启动tomcat。

然后我们登陆到测试服务器,生成ssh key,通过ssh方式免密码下载代码。

ssh-keygen -t rsa -C "xxxx@gmail.com" -b 4096

根据提示一路回车,最后在当前登陆用户home目录下生成一个 .ssh 文件夹,拷贝该文件夹下公钥 id_rsa.pub 文件里的内容。

然后登陆到gitlab,找到当前工程,进入工程下的 Settings - Repository, 展开 Deploy Keys,将拷贝的公钥填入到 key 里,title 填写该 key 的名称。Deploy Keys 只允许下载代码,不允许其他操作,这里我们将测试服务器的公钥作为 Deploy Keys,能够保证测试服务器只具有下载代码的权限,其他人登陆到测试服务器,不会对仓库进行更新代码等危险操作。

回到测试服务器,我们需要在服务器中建立一个工作文件夹,然后在该文件夹下 git clone 仓库地址。

git clone https://gitee.com/zhuxulu/project.git

然后登陆到jenkins,对 jenkins 进行配置,实现定时构建、发布、给gitlab仓库打标签。实际上上文中的shell脚本的作用是构建、发布,jenkins只需要配置定时调用该脚本、给gitlab仓库打标签即可。配置方法如下。

credentials - system - global credentials 中,新增一个凭证,kind 选择 Username with Password, 填写 docker 宿主机的用户名和密码。

系统管理 - 系统设置 - SSH remote hosts 中,填入 docker 宿主机的 ip 地址和端口,Credentials 选择刚才我们填写的凭证。

以上的作用是使 jenkins 能够登陆到测试服务器,并在测试服务器上执行命令。

然后在 credentials - system - global credentials 中,再新增一个凭证,kind 选择 GitLab API token,然后我们用对仓库有管理权限的账号登陆到gitlab,在 User Settings - Access Tokens 中生成 API token,注意 token 生成后只显示一次,一定要及时复制,之后不会再显示了。将生成的 token 填入到 jenkins 的凭证中,然后保存。

之前安装jenkins时我们已经安装了gitlab插件,现在转到Jenkins的系统管理 - 系统设置 - Gitlab 中,填写 gitlab 的信息,Connection name 可以填 “gitlab”,Gitlab host URL填写你的gitlab地址,Credentials 选择刚才建立的 GitLab API token 凭证。

以上的作用是使 jenkins 能够连接访问 gitlab,能够给 gitlab 的仓库进行相关操作,例如后续我们需要的打标签操作。

最后开始配置任务,新建一个任务,选择第一项的自由风格,取名叫 easygo-web-nightly-build-deploy-tagGeneral 中的 GitLab connection 选择之前系统设置中配置的gitlab

源码管理中,选择git,在Repository URL中填写仓库地址,因为仓库是私有的,因此需要在下方选择凭证。

我们需要点击图中的 add 按钮,将对仓库有管理权限的账号密码填入。

这里的凭证我们也可以更换为 ssh key,需要在jenkins所在服务器生成,但是由于我们的Jenkins是运行在docker容器中,并且没有将docker宿主机中的.ssh目录映射到容器中,所以我们采用用户名密码的凭证方式,缺点是gitlab不是https方式访问,不安全。

构建触发器中,我们按照定时触发的方式来执行任务,选择Build periodically,在日程表中填写:

TZ=Asia/Chongqing
@midnight

这段代码的意思是,午夜执行,时区设置为亚洲重庆。如下图:

构建中,选择之前配置的 ssh siteCommand中填写:

~/easygo-web/build_deploy.sh

意思是去执行easygo-web目录下的build_deploy.sh这个脚本。前面的~代表是登陆用户的home目录,可以更换为上文中所说的工作文件夹,一定要是绝对路径,并且确保jenkins系统管理中配置的ssh账号对该目录有读写执行权限。

注意:当真正去执行Jenkins的这个任务时,可能会出现build_deploy.sh文件没有执行权限的错误,需要在git提交时对文件权限做相应的修改,使用如下代码:

git update-index --chmod=+x build_deploy.sh

然后我们在构建后操作中,点击增加构建后操作步骤,选择Git Publisher,勾选第一项Push Only If Build Succeeds,只有在构建成功后才操作。然后在Tags中的Tag to Push,填写tag的名称,一般情况下只能用Jenkins的内置变量,例如构建编号$BUILD_NUMBER,假如我们还想用日期作为tag的名称,就需要用到插件。

之前我们在安装jenkins时安装了一个Build Timestamp Plugin插件,这个插件的作用就是生成日期变量。在Jenkins的系统管理 - 系统设置 - Gitlab 中找到Build Timestamp,配置新的日期参数,如下图:

然后回到刚才的任务配置界面,在Tag to Push中填写tag名称时,就可以使用这个变量,例如:

nightly-$BUILD_NUMBER-$BUILD_DATE

然后勾选上Create new tagTarget remote name填写 “origin”。

最后保存任务,这个任务将会在每天的北京时间凌晨12点多运行,运行的步骤和结果是:关闭正在运行的tomcat、拉取代码、编译代码、发布到tomcat、运行tomcat。构建成功后,可以打开浏览器访问 tomcat 了。

也可以手动触发任务执行,测试下任务配置是否有问题。

任务日志可在Jenkins中查看,当然也可以配置邮件通知功能,将日志通过邮件发送给相关人员。

ZHU /
Published in categories dev  tagged with ci  docker  jenkins  gitlab  java  maven  tomcat