背景:
需要能够在每次提交到Gitlab仓库后,触发Jenkins自动编译与测试
前提:
- 已经在Jenkins上安装Git,Gitlab plugin。
- 已经在Gitlab上创建的项目,并配置了Jenkinsfile。
步骤:
在Jenkins服务器上生成SSH公钥和私钥,并将私钥添加至Jenkins Credentials,将公钥添加至Gitlab SSH Keys
-
在Gitlab上生成Access Token(具体权限根据需求做调整),并将Token添加至Jenkins Credentials
-
在Manage Jenkins->Configure System下配置Gitlab。
注意事项:
- Enable authentication 选项不能打勾,如果打勾需要在Jenkins里创建一个专用于此的账号,或者在Jenkins的项目配置里创建Secret Token并在创建Gitlab Token时添加进去。因为目前我没有那个需求,所以这里我选择了不打勾。
- 添加后务必点击Test Connection进行连接测试,测试成功再进入下一步。这里格外需要注意的是,如果Jenkins和Gitlab装在同一个OS,共享同一个IP(用端口区分),需要以root权限登录Gitlab,并在/admin/application_settings/network(浏览器中访问)中选择Allow requests to the local network from web hooks and services
- 在Jenkins下创建项目,配置trigger和pipeline
注意事项:
- 如果Jenkins和Gitlab装在同一个OS,共享同一个IP(用端口区分),这里的repository URL应该使用docker container内部IP(可以通过docker inspect查看)
- Name需要填写为repository的名字
- Refspec需要填写为+refs/heads/*:refs/remotes/origin/* +refs/merge-requests/*/head:refs/remotes/origin/merge-requests/*
- Branch需要填写为origin/{gitlabBranch},这里我写的是master
- 在Gitlab下配置Webhooks
在具体项目的setting->integrations中将上一步在trigger中产生的Gitlab Webhook URL填写在此处的URL(如果有创建SecretToken也一并填写)
注意事项:
- 如果Jenkins和Gitlab装在同一个OS,共享同一个IP(用端口区分),需要在防火墙中增加允许172.17网段可以访问的设置
firewall-cmd --permanent --zone=public --add-rich-rule='rule family=ipv4 source address=172.27.0.0/16 accept'
,firewall-cmd --reload
测试Webhooks是否正常工作
至此,我们已经完成了所有的配置项。
-
验证下能否正常触发Jenkins产生Job
编写Helloworld.c,push到Gitlab后,Jenkins产生Job,并输出结果。验证OK
参考文档
Continuous Integration with Jenkins and GitLab
Webhooks and insecure internal web services
Web hook fails when Jenkins Anonymous user does not have job/build permission
Docker - No route to host