需求:
- 1.开发在哪个分支上提交代码,jenkins就自动发布相对应的分支。
- 2.实现既能手动发布jenkins,也要实现自动webhook发布
约定:
和开发约定分支对应的环境,比如 debug对应开发环境,develop对应测试环境,master对应预生产环境。
一、jenkins 安装插件 Generic Webhook Trigger
安装后会暴露出来一个公共API,GWT插件接收到 JSON 或 XML 的 HTTP POST 请求后,根据我们配置的规则决定触发哪个Jenkins项目。后面的gitlab也是基于http://JENKINS_URL/generic-webhook-trigger/invoke 来实现curl 请求post 来实现发布的。
二、创建jenkins job
1.创建job
2.编辑job 配置你的jenkins脚本,脚本最好放到git上统一版本控制。下面有我的测试pipeline脚本
三、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
URL:填写http://JENKINS_URL/generic-webhook-trigger/invoke?token=你定义的token
Secret Token:为空就行
最确认添加
测试下是否通信正常
第一次test的时候会报404错误
原因是你的job还没有跑过一次,插件配置还没设置成你想要的配置,去你刚才创建的job 里设置Generic Webhook Trigger 插件里的token为你脚本自己定义的token。也可以手动触发你的job 先把配置填充进job里。然后再次test 返回200 就算成功了,不出意外的话你的job自动发布了。那证明提交代码自动发布的配置成功了。
五、实现手动发布job
if("${params.repoBranch}" != ""){
println "-----------手动方式触发------------"
branchName = "${params.repoBranch}"
println "手动触发的分支是: " + "${branchName}"
}
这段代码即实现了手动发布的判断逻辑。需要手动输入分支。
秀下整体的发布流程