jenkins pipeline之自动构建(gitlab webhook 和 Generic Webhook Trigger集成)

需求:

  • 1.开发在哪个分支上提交代码,jenkins就自动发布相对应的分支。
  • 2.实现既能手动发布jenkins,也要实现自动webhook发布

约定:

和开发约定分支对应的环境,比如 debug对应开发环境,develop对应测试环境,master对应预生产环境。

一、jenkins 安装插件 Generic Webhook Trigger

jenkins pipeline之自动构建(gitlab webhook 和 Generic Webhook Trigger集成)_第1张图片
安装后会暴露出来一个公共API,GWT插件接收到 JSON 或 XML 的 HTTP POST 请求后,根据我们配置的规则决定触发哪个Jenkins项目。后面的gitlab也是基于http://JENKINS_URL/generic-webhook-trigger/invoke 来实现curl 请求post 来实现发布的。

二、创建jenkins job

1.创建job
jenkins pipeline之自动构建(gitlab webhook 和 Generic Webhook Trigger集成)_第2张图片
2.编辑job 配置你的jenkins脚本,脚本最好放到git上统一版本控制。下面有我的测试pipeline脚本
jenkins pipeline之自动构建(gitlab webhook 和 Generic Webhook Trigger集成)_第3张图片

三、pipeline 脚本

#!groovy
@Library('htjfPipeline@master') _
pipeline {
  agent any
  environment {
    repoUrl = "开发人员给你的工程项目git地址"
  }
  parameters {
    string(name:'repoBranch', defaultValue: '', description: 'git分支名称')  
  }
  triggers {
    GenericTrigger(
            genericVariables: [
              [key: 'branch', value: '$.ref']
            ],
            token: 'testpipeline-yxgj-marketing-job_PUSH' ,
            causeString: ' Triggered on $branch' ,
            printContributedVariables: true,
            printPostContent: true
        )
  }
  stages {
    stage('getBranch'){
      steps{
        script{
          try{                    
            if("${branch}" != ""){ 
              println "----------webhook式触发-----------"
              branchName = branch - "refs/heads"
              branchName = sh(returnStdout: true,script: "echo ${branchName}|awk -F '/' '{print \$NF}'").trim()
              println "webhook触发的分支是: " + "${branchName}"
            }
          } catch(exc) { }           
            if("${params.repoBranch}" != ""){
              println "-----------手动方式触发------------"
              branchName = "${params.repoBranch}"
              println "手动触发的分支是: " + "${branchName}"
            }           
        }  
      } 
    }    
    stage('checkOut') {
      steps{
        checkout([$class: 'GitSCM', branches: [[name: "${branchName}"]], doGenerateSubmoduleConfigurations: false, extensions: [[$class: 'CleanBeforeCheckout']], submoduleCfg: [], userRemoteConfigs: [[credentialsId: '4axxx', url: "${repoUrl}"]]])
      }
    }
  }
}

提交代码后自动发布,实现获取git分支基本原理是:
1.开发提交代码触发钩子,其实就是发送post请求给jenkins 的Generic Webhook Trigger插件
2.Generic Webhook Trigger插件接收到后发布job,具体怎么发布还是在你的pipeline脚本里去定义。

其中triggers段 是定义Generic Webhook Trigger插件配置信息。
genericVariables:定义了branch变量 值对应的是post请求返回的$.ref 的值 也就是分支名字,不过这里的全名是 例如 refs/heads/debug 这种格式的分支pipeline scm不会识别到 需要转化只留下debug,这个才是分支名字。脚本中通过sed实现的
token: 必须定义触发钩子带的token 不配置会返回404
printContributedVariables: true, printPostContent: true:打开日志输出
脚本中其他的就不多说了 能懂的。

四、gitlab配置webhook

jenkins pipeline之自动构建(gitlab webhook 和 Generic Webhook Trigger集成)_第4张图片
URL:填写http://JENKINS_URL/generic-webhook-trigger/invoke?token=你定义的token
Secret Token:为空就行
最确认添加

测试下是否通信正常
jenkins pipeline之自动构建(gitlab webhook 和 Generic Webhook Trigger集成)_第5张图片
第一次test的时候会报404错误
jenkins pipeline之自动构建(gitlab webhook 和 Generic Webhook Trigger集成)_第6张图片
原因是你的job还没有跑过一次,插件配置还没设置成你想要的配置,去你刚才创建的job 里设置Generic Webhook Trigger 插件里的token为你脚本自己定义的token。也可以手动触发你的job 先把配置填充进job里。然后再次test 返回200 就算成功了,不出意外的话你的job自动发布了。那证明提交代码自动发布的配置成功了。
jenkins pipeline之自动构建(gitlab webhook 和 Generic Webhook Trigger集成)_第7张图片

五、实现手动发布job

            if("${params.repoBranch}" != ""){
              println "-----------手动方式触发------------"
              branchName = "${params.repoBranch}"
              println "手动触发的分支是: " + "${branchName}"
            }   

这段代码即实现了手动发布的判断逻辑。需要手动输入分支。
jenkins pipeline之自动构建(gitlab webhook 和 Generic Webhook Trigger集成)_第8张图片

jenkins pipeline之自动构建(gitlab webhook 和 Generic Webhook Trigger集成)_第9张图片

秀下整体的发布流程
jenkins pipeline之自动构建(gitlab webhook 和 Generic Webhook Trigger集成)_第10张图片

你可能感兴趣的:(CI/CD)