目的:gitlab push代码通过webhooks自动触发Jenkins构建设置
1、Jenkins下载与安装
安装包从https://jenkins.io/download/下载,最好下war包,然后执行 java -jar jenkins.war ,就可以通过 http://localhost:8080 访问(内置了Jetty Web容器)。可以通过--httpPort=8088 或 --httpsPort=8088 配置端口,小于1024的端口需要管理员权限。
Jenkins插件安装:在 系统关联 -> 插件关联 -> 可选插件 中安装 Gitlab Hook Plugin,GitLab Plugin
2、配置Jenkins所在机器免秘钥登录GitLab。略
3、配置Jenkins任务:(这里假设要自动构建的项目为Maven项目SenseStudyServer)
- "新建任务"
- "构建一个自由风格的软件项目" ,并取个项目名,可以取与你GitLab上项目名一样也可不一样,如SenseStudyServer
- 在 "源码管理" 的Repository URL里填入GitLab上项目Git地址,如:git@gitlab.xxx.com:SenseLab/SenseStudyServer.git。默认会拉取master分支来build,若要指定要build的分支,可在"Branches to build"指定,如:remotes/origin/jenkins_ss_exptool
- 在 "构建触发器" 勾选 "Build when a change is pushed to GitLab." ,会根据上面取的项目名 给出GitLab webhook URL: http://localhost:8080/project/SenseStudyServer,供后续GitLab上配置。默认任何分支提交都会触发build,可以"Allowed Branches"里指定
- 在 "构建" 中"增加构建步骤",选择 "执行Shell",由于我们要构建的项目是Maven项目,所以写入如下内容:
#!/bin/sh mvn clean package; echo pwd is `pwd` #kill old service tmpPid=`ps -ef|grep java|grep 8081|awk '{print $2}'` kill $tmpPid echo killed $tmpPid #start new service BUILD_ID=dontKillMe java -jar target/sensestudy-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev --server.port=8081 >log.log 2>&1 & echo started finished
这些命令的Contex为从GitLab pull下来的项目的根目录,根目录的名字为上面取的项目名。
4、GitLab项目配置:登录gitlab找到相应项目,在 "Settings" -> "Integrations" 中 "Add webhook",输入上面的GitLab webhook URL。注意将localhost改为Jenkins所在主机的地址,若Jenkins启动时改变了端口,则这里相应地需要改变端口。(配置了此webhook后,当项目下发生push等变动时会调用该URL向Jenkins post相关数据)
可以点击test以看是否能连上Jenkins,默认情况下会出现 executed successfully but returned HTTP 403 ,可以在Jenkins的 "系统关联" -> "全局安全配置" 中去掉 "防止跨站点请求伪造"
经过上述配置,每当GitLab上有代码更新时Jenkins变回拉取代码并执行第3步中定义的shell命令,完成自动构建。但存在一些问题:
- 默认情况下,向GitLab上该项目的任何分支下提交都会出发Jenkins重新构建,可以在Jenkins配置的 "构建触发器" 下指定在特定分支有更新时才除非构建,如正则表达式(Java下的正则) .*master ,来指定master源码有更新时才重新构建。
- 构建时,若没以后台执行的方式启动java程序如 java -jar target/sensestudy-0.0.1-SNAPSHOT.jar ,则会由于java服务一直在运行从而构建也一直在运行中未能结束,可以通过加 & 在后台运行,这时候构建可以正常完成。然而此时SenseStudyServer服务随着构建完成而被关闭了(因为是Jenkins的衍生进程)。
- 解决方法:在命令前加上BUILD_ID=dontKillMe 如 BUILD_ID=dontKillMe java -jar target/sensestudy-0.0.1-SNAPSHOT.jar --spring.profiles.active=prod & 。此时可以正常运行,但当又有代码提交触发自动构建时会由于原先服务占用了端口从而新服务起不来,所以需要添加杀旧服务的命令。
参考资料:
https://blog.csdn.net/guanshulixiao/article/details/76174731