最近遇到一个比较难搞的需求, 通过API调用Jenkins构建,这还没啥,关键。。。一个Job需要是适应各种构建时需要的不同参数,简单说就是,调用Jenkins 的 buildwithparaters API时,对方传过来什么参数,我这边就得有什么构建参数,而且这些构建参数都是不确定的,所以我需要做到的就是要动态的去生成这些 构建参数。

    找了一些文档,最后这篇文档给我一些启发:
    https://wiki.jenkins.io/display/JENKINS/Parameterized+System+groovy+script
    image.png
    既然他能通过Groovy脚本去获取到已有的 构建参数,那是不是也有对应的方法去创建 构建参数呢?
    然后 脚本导入的 import hudson.model.* ,难道可以直接调用Jenkins 代码不成?
    顺着这个思路,翻了下Jenkins源码,https://github.com/jenkinsci/jenkins/blob/master/core/src/main/java/hudson/model/ParametersAction.java
    实例化 ParametersAction 时,给构建方法传入 List parameters ,好像就可以设置了 构建参数。
    最后在Jenkins build时,添加Groovy执行脚本,这里就直接演示设置和获取构建参数。

    1. import hudson.model.*
    2. // get current thread / Executor
    3. def thr = Thread.currentThread()
    4. // get current build
    5. def build = thr?.executable
    6. println thr
    7. //set parameters
    8. def npl =new ArrayList<StringParameterValue>();
    9. npl.add(new StringParameterValue("caseIds","6860725937783177217,c5dirwx5do80"));
    10. def newPa = new ParametersAction(npl);
    11. build.actions.add(newPa);
    12. // get parameters
    13. def parameters = build?.actions.find{ it instanceof ParametersAction }?.parameters
    14. parameters.each {
    15. println "parameter ${it.name}:"
    16. println "parameter ${it.value}:"
    17. println it.dump()
    18. println "-" * 80
    19. }

    最终脚本

    1. import hudson.model.*
    2. import groovy.json.JsonSlurper
    3. // get current thread / Executor
    4. def thr = Thread.currentThread()
    5. // get current build
    6. def build = thr?.executable
    7. println thr
    8. def jsonStr ="";
    9. def parameters = build?.actions.find{ it instanceof ParametersAction }?.parameters
    10. parameters.each {
    11. if("otp_parameters".equals(it.name)){
    12. jsonStr=it.value;
    13. }
    14. }
    15. println jsonStr
    16. println "-" * 80
    17. // 遍历json 获取所有的key,并set parameters
    18. def arraylistParameters =new ArrayList<StringParameterValue>();
    19. def jsonSlurper = new JsonSlurper()
    20. def object = jsonSlurper.parseText(jsonStr)
    21. for (parameter in object) {
    22. println parameter.key
    23. println parameter.value
    24. arraylistParameters.add(new StringParameterValue(parameter.key,parameter.value))
    25. }
    26. def newParameters = new ParametersAction(arraylistParameters);
    27. build.actions.add(newParameters);
    28. // 输出最后的 动态入参和值
    29. for (element in newParameters) {
    30. println element
    31. println "*" * 100
    32. }