前言

项目用的是GitLab CE来作代码版本控制,用Jenkins来作CI/CD。

所以需要做到在提交代码(Git push 和 Merge merge request)后自动触发Jenkins build。

参考文档

原理

通过在Jenkins中安装GitLab plugin,可以对外提供一个专门供GitLab钩子调用的构建的REST API地址,再在GitLab中配置钩子来调用这个REST API。每当有代码提交时,这个钩子就会调用构建REST API,从而触发构建。

为了安全起见,需要做双向认证,即GitLab只会调用它认证的Jenkins的REST API,Jenkins也支持只允许它认证的GitLab来调用。双方认证的方式都为API Token。

配置步骤

假设Jenkins已经安装好,并且安装了Jenkins Git plugin。

生成GitLab user API token

确保用Jenkins上用来连接GitLab的账号有build的权限。

用该账号登陆GitLab,打开Profile -> Settings -> Private Token

输入Token Name

选择Expire Date,不填,表示永远不会过期。

勾选“api”

生成API Token,后面在Jenkins配置中会用到这个Token。

安装Jenkins GitLab plugin

在Jenkins上安装 Jenkins GitLab plugin , 安装完成后重启Jenkins。

添加Jenkins credential

在Jenkins上,打开Credentials -> System -> Global credentials -> Add credential

添加一个新的GitLab API token的credential.

  • ID为Jenkins上使用的GitLab的账号。
  • API token 为上面在GitLab中生成的该账号的token。

配置GitLab connection

在Jenkins上,打开Manage Jenkins -> Configure System,找到GitLab的配置项,填写GitLab的URL,选择上面步骤添加的GitLab API token credential。

注意:不要勾选“Enable authentication for /project end-point”,否则会导致后面测试GitLab webhook时出错,并导致无法自动触发Jenkins build。

Test connection时如果遇到500错误,请参考下面文档:
https://stackoverflow.com/questions/49626860/gitlab-webhook-get-error-500-internal-server-error-uriinvalidurierror

在Jenkins build job中启用GitLab trigger

打开指定的Jenkins build job,点击Configure,在Build triggers中勾选“”Build when a change is pushed to GitLab. GitLab webhook URL: xxx"

点击Advanced按钮,可以设置Secret Token。(建议不要设置)

这里的GitLab webhook 地址在下面配置GitLab webhook for Jenkins时会用到。

对Jenkins pipeline需要有额外的处理,以后再来补充。

配置GitLab webhook for Jenkins

在GitLab中使用有管理员权限的账号登陆,打开指定项目,点击 Settings -> Integrations。
在Webhooks中的URL中输入上面的GitLab webhook 的地址,Secret Token保留为空(如果上面在Jenkins build job中没有设置Secret Token)。

勾选Push events 和 Merge events,取消勾选SSL verification,然后生成webhook。

在新生成的webhook上点击Test来测试webhook是否可以正常工作。

如果遇到"URL is blocked…local network…"问题,则需要用管理员账号登录GitLab,打开Settings / Network /Outbound Request,勾选“Allow requests to the local network from hooks and services“

注意:GitLab CE版本不支持在Integrations -> Project services中通过Jenkins CI来配置,好像GitLab EE版本支持

测试自动触发

修改代码或文件后,在Git push后,在Jenkins上观察指定的Jenkins build job是否自动被触发运行。

多分支持续集成

比如在GitLab上有masterdevelop两条分支,希望在develop分支上改动时,可以自动触发develop分支的持续集成,而代码合并进master分支后,也可以自动触发master分支的持续集成。

可以通过Jenkins Multibranch Pipeline实现多分支构建和持续集成。

也可以通过以下变通方法来解决:

  1. 创建一个专门用于develop分支的CI freestyle job
  2. 在“Build when a change is pushed to GitLab…“下,点击Advanced按钮,选择Filter branches by name,输入要做持续集成的分支名称,比如develop
  3. 在“Source Code Management”下的Branches to build中填入对应的分支,比如*/develop
  4. 在GitLab上生成该job的Webhook
  5. 类似地,创建一个专门用于master分支的CI freestyle job
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐