Jenkins 提供了远程调用API,其中就包括了构建的API。
Jenkins的远程调用构建API 分两种,一种是构建时不需要带参数 JENKINS_URL/job/JOBNAME/build ,一种是构建时需要带参数 JENKINS_URL/job/JOBNAME/buildWithParameters。
不需要带参数就不演示了,带参数的可以通过 使用 Post 或者 Get 请求
Get 请求方式
想通过Get 得先去 Job上设置个token ,有了token后直接把token作为get的请求参数,这样job就允许带有该token的请求通过,否则直接请求通常会报 403 错误。
我们见到通过Postman 简单模拟调用下Get 请求,其中 CaseFile等是为参数化构建的参数, delay 为是否立即构建或者 pending 状态:
Post 请求方式
get 请求方式固然是简单,但是会有几个问题
- 如果你的参数很多又非常大,可能超过URL 长度的限制,就如我需要通过A平台把 CaseID传给Jenkins 去执行,CaseID 上K个,这时Get就满足不了;
- 如果参数的value 是json时,往往需要用
document.write(encodeURIComponent()
方法来转义特殊字符
所以这时可能得考虑用Post的请求方式, 但是用Post有个坑,使用类似Get的token来授权是过不去一直报403,可能是Jenkins设置了安全矩阵的原因,那这时我们可能需要用到的就不是简单的 job设置token,而是需要用户生成一个 API Token , 进入系统管理->用户管理,点击用户的修改,去生成一个API Token 。
有了API Token 后我们请求的地址也将做个变化
http://USER_NAME:API_Token@JENKINS_URL/job/JOB_NAME/buildWithParameters,然后使用Post请求方式,并带上对应的参数,例如下Postman 所示
Post 请求可以通过token方式调用,但是需要注意的是,需要在jenkins的全局安全配置中,关闭
但Jenkins 2.204.6版本后,全局安全配置去掉了该UI配置选项,这时可以通过Groovy脚本的方式来实现。
打开Jenkins 系统管理的执行命令行,执行如下groovy脚本关闭:
import jenkins.model.Jenkins
def instance = Jenkins.instance
instance.setCrumbIssuer(null)
如果后续需要打开,则执行如下脚本:
import hudson.security.csrf.DefaultCrumbIssuer
import jenkins.model.Jenkins
def jenkins = Jenkins.instance;
jenkins.setCrumbIssuer(new DefaultCrumbIssuer(false));
jenkins.save();