最近遇到一个比较难搞的需求, 通过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 / Executordef thr = Thread.currentThread()// get current builddef build = thr?.executableprintln thr//set parametersdef npl =new ArrayList<StringParameterValue>();npl.add(new StringParameterValue("caseIds","6860725937783177217,c5dirwx5do80"));def newPa = new ParametersAction(npl);build.actions.add(newPa);// get parametersdef parameters = build?.actions.find{ it instanceof ParametersAction }?.parametersparameters.each {println "parameter ${it.name}:"println "parameter ${it.value}:"println it.dump()println "-" * 80}
最终脚本
import hudson.model.*import groovy.json.JsonSlurper// get current thread / Executordef thr = Thread.currentThread()// get current builddef build = thr?.executableprintln thrdef jsonStr ="";def parameters = build?.actions.find{ it instanceof ParametersAction }?.parametersparameters.each {if("otp_parameters".equals(it.name)){jsonStr=it.value;}}println jsonStrprintln "-" * 80// 遍历json 获取所有的key,并set parametersdef arraylistParameters =new ArrayList<StringParameterValue>();def jsonSlurper = new JsonSlurper()def object = jsonSlurper.parseText(jsonStr)for (parameter in object) {println parameter.keyprintln parameter.valuearraylistParameters.add(new StringParameterValue(parameter.key,parameter.value))}def newParameters = new ParametersAction(arraylistParameters);build.actions.add(newParameters);// 输出最后的 动态入参和值for (element in newParameters) {println elementprintln "*" * 100}
