GitLab集成Jenkins构建pipeline流水线任务

2020-07-29 11:26

CI持续集成(Continuous Integration),CD持续部署(Continuous Deployment)

Jenkins是一个优秀的持续集成和持续部署平台,有丰富的插件支持,可以满足各种个性化build场景。

GitLab可以自主选择触发条件,如push/merge/发表评论等,都可以触发jenkins执行build。

整个架构的原理就是GitLab和Jenkins互相配置对方的api,然后就可以在执行相关操作的时候通知到对方。

GitLab主要是在系统里配置jenkins的api。

jenkins不仅要在系统里配置GitLab的api,Pipeline流水线脚本也要进行配置,才能正确通知到GitLab。Jenkins主要会把两种事件通知给GitLab,一种是创建build的任务事件,一种是更新任务状态的事件。

需要安装的插件

  1. gitlab-hook
  2. pipeline
  3. git
  4. blue ocean
  5. blueocean-i18n(没有此i18n国际化插件,打开blue ocean网页会卡住)

Jenkins配置触发条件

触发条件

Build when a change is pushed to GitLa此选项需要安装gitlab-hook插件。后面的url是hook地址,用于提供给git仓库,在满足触发条件的时候,通知jenkins执行此build构建。

其中Comment (regex) for triggering a build是说在git仓库,发送“build-all”或"build-test"关键字,也会触发执行此build构建。

点击Advanced…可以生成token。

这里的url和token是jenkins的api,可以提供给GtiLab使用,在代码合并/发表commit/push代码等操作时,通知Jenkins执行build操作。

发表评论触发正则检测,符合条件,会触发构建,正则内容可以是多个,使用“|”连接,如“(/build-all|/build-test)

编写Jenkins流水线脚本

Pipeline流水线脚本可以直接填写代码内容,也可以是放在Git代码仓库里文件,Jenkins会拉取仓库,然后读取指定的文件内容。

Definition选项Pipeline script表示流水线使用脚本

直接的流水线脚本

Definition选项Pipeline script from SCM表示从代码仓库读取脚本内容,Script Path是批脚本的相对路径(包含文件名的相对路径),这里直接填写文件名Jenkinsfile,也可以使用其它的名字。

Definition选项Pipeline script from SCM表示流水线使用代码仓库中的脚本,如Git仓库,这里SCM为None,表示没有安装仓库支持插件,安装后选项才可用,如下图所示。

Pipeline script from SCM

Credentials填写此仓库的鉴权信息,可以是用户名密码也可以是ssh共享密钥登录。

GitLab项目填写集成信息

指的是Jenkins提供的api,把jenkins的api告诉GitLab,这样GitLab才能通知Jenkins去执行build操作。

GitLab → Settings → Integration

Url和Secret Token填写前面步骤“Jenkins配置触发条件”里的url和token。下面是触发条件trigger condition,表示在什么情况下触发Jenkins执行build操作。

生成GitLab站点Access Tokens

这个是GitLab的api接口的token,可以提供给Jenkins,这样Jenkins就可以把Pipeline任务的状态及时通知给GitLab

GitLab → User Settings → Access Tokens → Persion Access Tokens

点击Create personal access token会生成一个32位的字符串,此字符串只显示一次,要复制并备份才可以,否则丢掉后就找不到了。

Jenkins配置GitLab信息

在Jenkins填写GitLab仓库的地址,可以添加多个GitLab仓库地址,每个连接地址都有一个唯一标识的名字,如下图里的“test”

Jenkins Home → Manage Jenkins → System Configuration → Configure System → GitLab

配置GitLab

Connection name里的“test”,需要与测试脚本“Jenkinsfile”里配置gitLabConnection('test')一致。

GitLab host URL填写GitLab的首页地址。

Credentials选择Gitlab API token,token就是上一个步骤“生成GitLab站点Access Tokens”里生成的token。

测试脚本Jenkinsfile

#!/usr/bin/groovy

pipeline{
    agent any
    post {
      failure {
        updateGitlabCommitStatus name: 'getcode', state: 'failed'
        updateGitlabCommitStatus name: 'package', state: 'failed'
        updateGitlabCommitStatus name: 'deploy', state: 'failed'
      }
      success {
        updateGitlabCommitStatus name: 'getcode', state: 'success'
        updateGitlabCommitStatus name: 'package', state: 'success'
        updateGitlabCommitStatus name: 'deploy', state: 'success'
      }
    }
    options {
      gitLabConnection('test')
      gitlabBuilds(builds: ['getcode', 'package', 'deploy'])
    }
    stages{
        stage("getcode"){
           steps{
               echo "get code from scm"
           }
        }
        stage("package"){
            steps{
                echo "packge code"
            }
        }
        stage("deploy"){
            steps{
                echo "deploy packge to node1"
            }
        }
    }
}

关于脚本里的stages和steps,请参考相关资料。

构建完成视图

Jenkins视图
gitlab视图

 

常见问题

jenkins常见问题

 

参考文章:

  1. jenkins Pipeline脚本jenkinsfile实操指南
  2. Jenkins Pipeline项目
  3. Pipeline script from SCM
  4. jenkins+gitlab实现自动部署第一节实验环境