提交哪个构建哪个
或者
某个指定分支提交才构建
jenkins自己的restful接口在权限认证上比较麻烦,所以我选择了Jenkins的插件generic-webhook-trigger
使用下来感觉没有选错
1. 安装jenkins插件generic-webhook-trigger
在系统配置中去安装插件。
2. 在Jenkinsfile中配置
node {properties([pipelineTriggers([[$class: 'GenericTrigger',genericVariables: [[key: 'ref', value: '$.ref'],[key: 'before',value: '$.before',expressionType: 'JSONPath', //Optional, defaults to JSONPathregexpFilter: '', //Optional, defaults to empty stringdefaultValue: '' //Optional, defaults to empty string]],genericRequestVariables: [[key: 'requestWithNumber', regexpFilter: '[^0-9]'],[key: 'requestWithString', regexpFilter: '']],genericHeaderVariables: [[key: 'headerWithNumber', regexpFilter: '[^0-9]'],[key: 'headerWithString', regexpFilter: '']],causeString: 'Triggered on $ref',token: 'abc123',tokenCredentialId: '',printContributedVariables: true,printPostContent: true,silentResponse: false,// 这里只更新masterregexpFilterText: '$ref'+'/'+'master',regexpFilterExpression: 'refs/heads/master/'+ env.BRANCH_NAME]])])stage("build") {// other stage}
}
这里解释一下
// 这里只更新master
regexpFilterText: '$ref'+'/'+'master',
regexpFilterExpression: 'refs/heads/master/'+ env.BRANCH_NAME
$ref 的值为git更新后推送过来的分支,如果是master分支,则会是refs/heads/master,获取到对应值后,会与regexpFilterExpression进行正则比对。如果是每个分支提交对应构建对应的分支可以这么写:
// 这里只更新master
regexpFilterText: '$ref',
regexpFilterExpression: 'refs/heads/'+ env.BRANCH_NAME
如果只在某个分支提交时进行构建,则使用第一种我的写法,当提交分支与当前分支一致都为master才进行构建。
3. 将项目通过Jenkinsfile进行构建。
构建之后,就可以尝试用链接调用,验证是否生效
// jenkins地址
http://[xxx.xxx.xxx]//generic-webhook-trigger/invoke?token=abc123
通过浏览器或者postman进行调用,返回结果如下:
{"jobs": {"test/master": {"regexpFilterExpression": "refs/heads/master",// 这里显示true就是对应分支生效了。"triggered": true,"resolvedVariables": {"before": ""},"regexpFilterText": "refs/heads/master","id": 5337,"url": "queue/item/5337/"}},"message": "Triggered jobs."
}
4. 添加钩子到gitlab(用的什么代码管理工具就到哪里设置,这里使用gitlab)
将刚才的地址放在url就可以。尝试提交代码,看是否生效。