最近遇到一个比较难搞的需求, 通过API调用Jenkins构建,这还没啥,关键。。。一个Job需要是适应各种构建时需要的不同参数,简单说就是,调用Jenkins 的 buildwithparaters API时,对方传过来什么参数,我这边就得有什么构建参数,而且这些构建参数都是不确定的,所以我需要做到的就是要动态的去生成这些 构建参数。
找了一些文档,最后这篇文档给我一些启发:
https://wiki.jenkins.io/display/JENKINS/Parameterized+System+groovy+script
既然他能通过Groovy脚本去获取到已有的 构建参数,那是不是也有对应的方法去创建 构建参数呢?
然后 脚本导入的 import hudson.model.* ,难道可以直接调用Jenkins 代码不成?
顺着这个思路,翻了下Jenkins源码,https://github.com/jenkinsci/jenkins/blob/master/core/src/main/java/hudson/model/ParametersAction.java
实例化 ParametersAction 时,给构建方法传入 List
最后在Jenkins build时,添加Groovy执行脚本,这里就直接演示设置和获取构建参数。
import hudson.model.*
// get current thread / Executor
def thr = Thread.currentThread()
// get current build
def build = thr?.executable
println thr
//set parameters
def npl =new ArrayList<StringParameterValue>();
npl.add(new StringParameterValue("caseIds","6860725937783177217,c5dirwx5do80"));
def newPa = new ParametersAction(npl);
build.actions.add(newPa);
// get parameters
def parameters = build?.actions.find{ it instanceof ParametersAction }?.parameters
parameters.each {
println "parameter ${it.name}:"
println "parameter ${it.value}:"
println it.dump()
println "-" * 80
}
最终脚本
import hudson.model.*
import groovy.json.JsonSlurper
// get current thread / Executor
def thr = Thread.currentThread()
// get current build
def build = thr?.executable
println thr
def jsonStr ="";
def parameters = build?.actions.find{ it instanceof ParametersAction }?.parameters
parameters.each {
if("otp_parameters".equals(it.name)){
jsonStr=it.value;
}
}
println jsonStr
println "-" * 80
// 遍历json 获取所有的key,并set parameters
def arraylistParameters =new ArrayList<StringParameterValue>();
def jsonSlurper = new JsonSlurper()
def object = jsonSlurper.parseText(jsonStr)
for (parameter in object) {
println parameter.key
println parameter.value
arraylistParameters.add(new StringParameterValue(parameter.key,parameter.value))
}
def newParameters = new ParametersAction(arraylistParameters);
build.actions.add(newParameters);
// 输出最后的 动态入参和值
for (element in newParameters) {
println element
println "*" * 100
}