远程触发 Jenkins 的 Pipeline 任务
欢迎访问我的 GitHub
这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos
场景
虽然能配置提交代码到 Git 时触发 Jenkins 任务,但有时并不需要每次提交代码都触发,而是仅在有需要时才执行。
除了在 Jenkins 页面上手动执行任务,还可以向 Jenkins 网站发起 HTTP 请求,触发指定任务的执行,本文就来实战通过 Http 请求同时触发多个 Jenkins 任务执行。
概述
对于 pipeline 类型的 Jenkins 任务,一般是通过插件 Generic Webhook Trigger 来支持远程触发的,在使用过程中以下三点需要注意:
远程触发 Jenkin 任务,请求的 URL 怎么写;
Http 请求的参数,如何作为 pipeline 脚本的参数;
假设有 Jenkins 任务 A,某时刻有 10 个触发该任务的请求同时到达,Jenkins 如何处理?(后面会重点讨论此问题)
针对上述问题,我们来做一次实战:
向 Jenkins 服务发起 http 请求;
请求参数是一个 Github 代码仓库的地址和分支名;
Jenkins 收到这个请求后,执行一个 pipeline 任务;
该任务是下载指定的 Github 仓库的代码,流程如下图所示:
环境信息
操作系统:CentOS 7.7
Jenkins:2.190.3
Generic Webhook Trigger 插件:1.66
关于 Jenkins 的部署,请参考文章《Helm部署和体验jenkins》
实战
先来安装插件,如下图,进入插件管理页面:
安装插件的操作步骤如下图所示,请按照红框数字的顺序操作:
稍等片刻,插件在线安装成功,如下图,接下来创建个 pipeline 任务试试:
新建名为 remote-test 的 pipeline 任务:
进入设置页面,如下图红框所示,出现了 Generic Webhook Trigger 选项:
勾选 Generic Webhook Trigger 之后页面会发生变化,如下图,在红框位置,先设置 token 的值为 token-remote-test ,这样 http 请求中的 token 参数的值如果等于 token-remote-test ,就会触发当前任务:
接下来设置请求参数,如下图红框所示,先输入固定的 ref 参数(插件用到的,必须输入),然后再把 repositoryURL 和 branch 也设置好,即 Github 代码仓库地址和分支名,这样 http 请求中 repositoryURL 和 branch 参数就能传递到后面的 pipeline 脚本中去了;
接下来可以写 pipeline 脚本了:
上述脚本有以下几个关键点:
a. triggers 、GenericTrigger、genericVariables 这几个参数是固定的,按上述示例去写即可;
b. printContributedVariables 和 printPostContent 为 true,会在执行任务时打印出请求参数的内容来;
c. 这里一共有两个 stage,在执行 show-param 的时候,会将 http 请求参数全部打印出来;
d. checkout 是 pipeline 提供的 API,用于下载 Github 仓库的代码,其 branches 参数的值用上了 http 的请求参数 branch,userRemoteConfigs.url 参数的值用上了 http 的请求参数 repositoryURL
将上述 pipeline 脚本写在下图红框位置,然后点击底部的 Save 按钮保存:
任务配置完成,接下来用 Postman 向 Jenkins 发起请求,验证通过 Http 请求触发 Jenkins 任务;
验证
我这边 jenkins 网站的地址是: http://192.168.133.149:32049 ,因此触发任务的请求地址是: **http://192.168.133.149:32049/generic-webhook-trigger/invoke?token=token-remote-test ** ,注意 token 参数的值和任务设置中的 token 值必须一致;
在 Postman 上的配置如下图所示,请按照数字顺序配置,repositoryURL 参数的值为 https://github.com/zq2599/jenkinsdemo.git ,这是我放在 Github 上的一个 java 工程,可以正常下载:
配置完成后点击 Send 按钮发送请求,正常情况下收到的返回码是 200,如下图红框,如果非 200(例如 404),请检查参数和 Jenkins 任务的参数设置(例如 token 不一致):
回到 Jenkins 页面查看日志,如下图红框,请求参数都被打印出来了:
继续往下,可见 Github 源码成功下载:
至此,通过 Http 触发 Jenkins 的 pipeline 实战就完成了,我们可以通过程序、脚本等各种手段,按照不同的需求来触发 Jenkins 任务,并传给任务不同的参数。
并发问题
远程触发 Jenkins 任务虽然灵活方便,但是在处理并发请求时会有问题:10 个请求同时到达, 只有一个会执行 ,这个问题的详情和解决办法在下一篇文章《远程触发 Jenkins 的 Pipeline 任务的并发问题处理》详细讨论;
源码下载
我的 Github 地址如下所示:
里面有多个工程,请使用 jenkinsremotedemo ,如下图红框所示,这是个 Java 工程,里面的 remote-test 文件就是本文用到的 pipeline 脚本,另外这个工程的 Java 代码(App.java)可以向 Jenkins 同时发起多个远程触发请求:
欢迎关注 InfoQ:程序员欣宸
版权声明: 本文为 InfoQ 作者【程序员欣宸】的原创文章。
原文链接:【http://xie.infoq.cn/article/f293cbb6f2c17c809e5dd435c】。文章转载请联系作者。
评论