Jenkins使用gitlab-plugin来自动触发任务构建

980次阅读
没有评论

共计 6156 个字符,预计需要花费 16 分钟才能阅读完成。

Jenkins使用gitlab-plugin来自动触发任务构建

使用gitlab webhook+jenkins的联动,以仓库事件触发jenknis执行流水线任务

此篇用jenkins的Gitlab-plugin插件完成,官方文档:https://plugins.jenkins.io/gitlab-plugin/

文档中提供了三个常用的configuration

  • Git configuration:配置代码检索
  • Job trigger configuration:配置任务触发器
  • Build status configuration:配置pipeline任务状态提交至gitlab中

需要自动触发任务,那就需要配置触发器,有以下两种方式

白屏上设置触发器

简单pipeline示例

pipeline {
    agent any
    options {
        // 发布包最多保留10个,构建记录最多保留30个
        buildDiscarder logRotator(artifactDaysToKeepStr: '', artifactNumToKeepStr: '2', daysToKeepStr: '', numToKeepStr: '4')
        
        // 在worspace中的字目录中检出代码
        checkoutToSubdirectory 'project_code'
 
        // 关闭并发构建,如果当前任务在运行中,则关闭运行中的任务,使用最新的触发来运行
        disableConcurrentBuilds abortPrevious: true
 
        // 关闭master节点重启后的自动恢复流水线功能
        disableResume()
 
        // 设置任务启动开始的等待时间,单位为second
        quietPeriod 3
 
        // 设置重试次数,比如博主这边用的公共仓库,时常会因网络问题导致cnpm/mvn/composer等失败,所以会加个重试,单在此处则为全局重试
        // 比较少在此处定义重试,经常在单独的stage或step块里配置
        retry(3)
 
        // 超时时间1个小时,单位可以MILLISECONDS,SECONDS,MINUTES,DAYS等
        timeout(time: 1, unit: 'HOURS') 
 
        // console中记录每个步骤的执行时间
        timestamps()
 
        // 使用parallel进行并发构建时,若存在一个任务失败,则快速全局失败
        parallelsAlwaysFailFast()
    }    
    stages {
        stage('Get Code') {
            steps {
                git branch: 'master', credentialsId: 'gitlab-user-jenkins', url: 'http://gitlab.xadocker.cn/frontend/weixin-chat.git'
            }
        }
        stage('test'){
            steps {
                sh 'ls'
                sh 'cat README.md'
                sh 'env'
                // println(gitlabActionType)
            }
        }
    }
}

pipeline只由以上内容时,则需要自己手动点击构建。若要配置触发器则需要按如下配置任务:

1.进入任务配置构建触发器,并将webhook链接复制

Jenkins使用gitlab-plugin来自动触发任务构建

2.选择分支过滤,最后配置token并复制

Jenkins使用gitlab-plugin来自动触发任务构建

3.登录gitlab仓库配置webhook,将1,2步骤中webhooke链接和token填入

Jenkins使用gitlab-plugin来自动触发任务构建

4.gitlab配置完webhook后可以测试模拟

Jenkins使用gitlab-plugin来自动触发任务构建

但此时不会触发我们jenkins任务,因为我们的任务只有指定分支的push事件才可以触发,这种默认测试只是用master的分支作为基础。所以我们在代码上指定分支上提交信息测试


[root@jenkins-manager weixin-chat]# echo '### test' >> README.md
[root@jenkins-manager weixin-chat]# git branch
* dev-test
  master
[root@jenkins-manager weixin-chat]# git commit -am '测试触发'
[dev-test f9bba60] 测试触发
 1 file changed, 1 insertion(+)
[root@jenkins-manager weixin-chat]# git push
warning: push.default is unset; its implicit value is changing in
Git 2.0 from 'matching' to 'simple'. To squelch this message
and maintain the current behavior after the default changes, use:

  git config --global push.default matching

To squelch this message and adopt the new behavior now, use:

  git config --global push.default simple

See 'git help config' and search for 'push.default' for further information.
(the 'simple' mode was introduced in Git 1.7.11. Use the similar mode
'current' instead of 'simple' if you sometimes use older versions of Git)

Counting objects: 5, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 422 bytes | 0 bytes/s, done.
Total 3 (delta 1), reused 0 (delta 0)
remote:
remote: To create a merge request for dev-test, visit:
remote:   http://gitlab.xadocker.cn/frontend/weixin-chat/-/merge_requests/new?merge_request%5Bsource_branch%5D=dev-test
remote:
To http://gitlab.xadocker.cn/frontend/weixin-chat.git
   759c86d..f9bba60  dev-test -> dev-test
Jenkins使用gitlab-plugin来自动触发任务构建

但是此时构建的分支却不是我们指定的分支,因为我们pipeline中写的是

git branch: 'master', credentialsId: 'gitlab-user-jenkins', url: 'http://gitlab.xadocker.cn/frontend/weixin-chat.git'

需要重新调整下分支即可

git branch: 'dev-test', credentialsId: 'gitlab-user-jenkins', url: 'http://gitlab.xadocker.cn/frontend/weixin-chat.git'

当然也可以把分支这里用变量代替,将从gitlab传来的参数做成变量即可。官方提供的变量有

// 使用println(gitlabBranch) 打印测试
gitlabBranch
gitlabSourceBranch
gitlabActionType
gitlabUserName
gitlabUserUsername
gitlabUserEmail
gitlabSourceRepoHomepage
gitlabSourceRepoName
gitlabSourceNamespace
gitlabSourceRepoURL
gitlabSourceRepoSshUrl
gitlabSourceRepoHttpUrl
gitlabMergeRequestTitle
gitlabMergeRequestDescription
gitlabMergeRequestId
gitlabMergeRequestIid
gitlabMergeRequestState
gitlabMergedByUser
gitlabMergeRequestAssignee
gitlabMergeRequestLastCommit
gitlabMergeRequestTargetProjectId
gitlabTargetBranch
gitlabTargetRepoName
gitlabTargetNamespace
gitlabTargetRepoSshUrl
gitlabTargetRepoHttpUrl
gitlabBefore
gitlabAfter
gitlabTriggerPhrase

此时我们的pipeline可以改成如下

println(env.gitlabActionType)
println(env.gitlabBranch)
pipeline {
    agent any
    options {
        // 发布包最多保留10个,构建记录最多保留30个
        buildDiscarder logRotator(artifactDaysToKeepStr: '', artifactNumToKeepStr: '2', daysToKeepStr: '', numToKeepStr: '4')
        
        // 在worspace中的字目录中检出代码
        checkoutToSubdirectory 'project_code'
 
        // 关闭并发构建,如果当前任务在运行中,则关闭运行中的任务,使用最新的触发来运行
        disableConcurrentBuilds abortPrevious: true
 
        // 关闭master节点重启后的自动恢复流水线功能
        disableResume()
 
        // 设置任务启动开始的等待时间,单位为second
        quietPeriod 3
 
        // 设置重试次数,比如博主这边用的公共仓库,时常会因网络问题导致cnpm/mvn/composer等失败,所以会加个重试,单在此处则为全局重试
        // 比较少在此处定义重试,经常在单独的stage或step块里配置
        retry(3)
 
        // 超时时间1个小时,单位可以MILLISECONDS,SECONDS,MINUTES,DAYS等
        timeout(time: 1, unit: 'HOURS') 
 
        // console中记录每个步骤的执行时间
        timestamps()
 
        // 使用parallel进行并发构建时,若存在一个任务失败,则快速全局失败
        parallelsAlwaysFailFast()
    }    
    stages {
        stage('Get Code') {
            steps {
                git branch: "${env.gitlabBranch}", credentialsId: 'gitlab-user-jenkins', url: 'http://gitlab.xadocker.cn/frontend/weixin-chat.git'
            }
        }
        stage('test'){
            steps {
                sh 'ls'
                sh 'cat README.md'
                sh 'env'
            }
        }
    }
}

pipeline上设置触发器

上文提到的是在白屏界面上配置jenkins的触发器,此处直接使用pipeline来配置,减少手工配置,此时pipeline如下:

pipeline {
    agent any
    options {
        // 发布包最多保留10个,构建记录最多保留30个
        buildDiscarder logRotator(artifactDaysToKeepStr: '', artifactNumToKeepStr: '2', daysToKeepStr: '', numToKeepStr: '4')
        
        // 在worspace中的字目录中检出代码
        checkoutToSubdirectory 'project_code'
 
        // 关闭并发构建,如果当前任务在运行中,则关闭运行中的任务,使用最新的触发来运行
        disableConcurrentBuilds abortPrevious: true
 
        // 关闭master节点重启后的自动恢复流水线功能
        disableResume()
 
        // 设置任务启动开始的等待时间,单位为second
        quietPeriod 3
 
        // 设置重试次数,比如博主这边用的公共仓库,时常会因网络问题导致cnpm/mvn/composer等失败,所以会加个重试,单在此处则为全局重试
        // 比较少在此处定义重试,经常在单独的stage或step块里配置
        retry(3)
 
        // 超时时间1个小时,单位可以MILLISECONDS,SECONDS,MINUTES,DAYS等
        timeout(time: 1, unit: 'HOURS') 
 
        // console中记录每个步骤的执行时间
        timestamps()
 
        // 使用parallel进行并发构建时,若存在一个任务失败,则快速全局失败
        parallelsAlwaysFailFast()
    }
    triggers {
        gitlab(
            triggerOnPush: true,
            triggerOnMergeRequest: false, triggerOpenMergeRequestOnPush: "never",
            triggerOnNoteRequest: false,
            noteRegex: "Jenkins please retry a build",
            skipWorkInProgressMergeRequest: true,
            ciSkip: false,
            setBuildDescription: true,
            addNoteOnMergeRequest: true,
            addCiMessage: true,
            addVoteOnMergeRequest: true,
            acceptMergeRequestOnSuccess: false,
            branchFilterType: "NameBasedFilter",
            includeBranchesSpec: "dev-test",
            excludeBranchesSpec: "",
            pendingBuildName: "Jenkins",
            cancelPendingBuildsOnUpdate: false,
            secretToken: "abcdefghijklmnopqrstuvwxyz0123456789ABCDEF")
    }    
    stages {
        stage('Get Code') {
            steps {
                git branch: "${env.gitlabBranch}", credentialsId: 'gitlab-user-jenkins', url: 'http://gitlab.xadocker.cn/frontend/weixin-chat.git'

                sh "ls -l"
                sh 'cat README.md'
            }
        }
        stage('test'){
            
            steps {
                sh 'env'
                println(gitlabActionType)
            }
        }
    }
}

注意:初次运行需要初始化加载配置,即需要在控制台手动点击构建,不然第一次构建若是直接用push事件是触发不任务的。也不知道jenkins咋想的,博主也想直接保存任务后,它就能解析配置,没想到不能。。。。第一次构建用手动点击必然报错,因为我们的分支用的变量${env.gitlabBranch},不是gitlab触发所以拿不到值就会拉取报错的

正文完
 1
xadocker
版权声明:本站原创文章,由 xadocker 2019-08-25发表,共计6156字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)