jenkins - 获取流水线中其他作业的参数

标签 jenkins groovy jenkins-pipeline

我有两份工作。第一个是使用一些参数手动触发的(例如需要的数字)。我有第二份工作,它使用参数来选择上一份工作的特定构建(运行参数)。

现在,我需要从第一份工作中获取参数(在本例中为数字),第二份工作也需要这些参数。我想防止让用户第二次给出 number 参数。

与此同时,我找到了一种通过以下方式从第一个作业中提取参数的方法:

@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)

但没有运气。有人知道如何解决这个问题吗?也许另一种获取参数的方法?

最佳答案

一种解决方法,但在源构建中,您可以生成包含所需参数值的附加工件,例如Java 属性文件。然后您可以将此工件复制到您的管道并提取值

关于jenkins - 获取流水线中其他作业的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43627950/

相关文章:

node.js - 如何将 jenkins 管道与 nvm 包装器插件一起使用?

java - 仅当 SonarQube 服务器在线时才对 Jenkins 执行 SonarQube 分析

java - Groovy Script 非法使用非虚函数调用

json - Groovy/Grails-Json Web服务,收到的 map 带有其他属性

jenkins - 如何使用管道在 jenkinsFIle jenkins 2.x 中调用注入(inject)环境变量到构建过程插件

groovy - 使用 Gradle 创建 FAT 纯源 jar

mysql - Openshift 上的 Jenkins-Sonar 通信

java - Docker maven 镜像正在创建 root 拥有的目标文件夹,并且 Jenkins 无法将其从其工作区中删除

jenkins - 如何在 Jenkins 声明性管道中设置 PATH

json - 无法将 `json` 字符串传递到 Jenkins 管道中的 `sh` 步骤