我有两份工作。第一个打开是通过一些参数手动触发的(例如需要的数字)。我有第二个工作,它使用参数来选择上一个作业的特定构建(运行参数)。
现在我需要从第一份工作中得到参数(在这种情况下是数字),这也是第二份工作所需要的。我想阻止让用户第二次给出数字参数。
与此同时,我找到了一种方法,通过以下方式从第一份工作中提取参数:
@NonCPS
def getParameters(def item) {
def result = ""
def p = item?.actions.find{ it -> it instanceof ParametersAction }?.parameters
p.each { it ->
echo "parameter ${it.name}: ${it.value}"
if (it.name.equals("NUMBER")) {
result = it.value.toString()
}
}
return result
}
...
node (..) {
def item = hudson.model.Hudson.instance.getItem("${SELECTED_JOBNAME}")
def number = Integer.parseInt("${SELECTED_NUMBER}")
def x = item.getBuildByNumber(number)
def newNumber = getParameters(x)
出现的问题是获得以下内容:
parameter NUMBER: 16
[Pipeline] echo
org.jenkinsci.plugins.workflow.job.WorkflowJob@1776388d[XX-YY]
[Pipeline] echo
XX-YY #48
[Pipeline] echo
newNumber: 16
[Pipeline] stage
[Pipeline] { (First)
[Pipeline] }
[Pipeline] }
[Pipeline] End of Pipeline
java.io.NotSerializableException: org.jenkinsci.plugins.workflow.job.WorkflowJob
at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:860)
at org.jboss.marshalling.river.BlockMarshaller.doWriteObject(BlockMarshaller.java:65)
at org.jboss.marshalling.river.BlockMarshaller.writeObject(BlockMarshaller.java:56)
at org.jboss.marshalling.MarshallerObjectOutputStream.writeObjectOverride(MarshallerObjectOutputStream.java:50)
at org.jboss.marshalling.river.RiverObjectOutputStream.writeObjectOverride(RiverObjectOutputStream.java:179)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:343)
at java.util.HashMap.writeObject(HashMap.java:1129)
我已尝试在多个位置使用@NonCPS
node (..) {
@NonCPS
def item = hudson.model.Hudson.instance.getItem("${SELECTED_JOBNAME}")
@NonCPS
def number = Integer.parseInt("${SELECTED_NUMBER}")
@NonCPS
def x = item.getBuildByNumber(number)
@NonCPS
def newNumber = getParameters(x)
但没有运气。有人知道如何解决这个问题吗?也许另一种方法来获取参数?