如何参数化 Jenkins 管道中复制工件的选择器

Joe*_*g S 5 jenkins jenkins-plugins jenkins-pipeline

我们在 Jenkins 系统中大量使用管道作业,并且需要能够copyArtifacts使用Build selector for Copy Artifact作业参数对步骤进行参数化。

首先,我发现 - 虽然参数返回 a String- 该copyArtifacts步骤需要BuildSelector.

我找到了BuildSelectorParameter.getSelectorFromXml将参数转换为BuildSelector类似实例的方法:

properties([parameters([
    [$class: 'BuildSelectorParameter',
    defaultSelector: upstream(fallbackToLastSuccessful: true),
    description: '',
    name: 'copyArtifactSelector']])
])

@NonCPS
static BuildSelector getSelectorFromParam(String xmlText) {
    BuildSelectorParameter.getSelectorFromXml(xmlText)
}

node {
    def selector = getSelectorFromParam(params.copyArtifactSelector)
    copyArtifacts(
            projectName: 'sourceJob',
            selector: selector
    )
}
Run Code Online (Sandbox Code Playgroud)

但是我刚刚意识到BuildSelector创建的不是Serializable. 因此,我现在得到了预期的异常:

hudson.plugins.copyartifact.TriggeredBuildSelector
导致:java.io.NotSerializableException:hudson.plugins.copyartifact.TriggeredBuildSelector
    在 org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:860)
    在 org.jboss.marshalling.river.RiverMarshaller.doWriteFields(RiverMarshaller.java:1032)
    在 org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:988)
    在 org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:967)
    在 org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854)

之后,我尝试检查复制工件插件如何处理 - 不幸的是我在源代码中找不到任何线索。也许它只是偶然起作用?创建 a 的方法BuildSelector似乎没有创建任何类型的可序列化类。

但也许有人已经遇到过这个问题并有提示?

编辑

到目前为止我发现了什么:

  • 如果我将BuildSelector对象存储在某个变量中,它会将NotSerializableException.
  • 但是,如果我不把它先通过一些可变的,但做呼叫的方法调用copyArtifactsNotSerializableException不会发生-至少不是现在:

    node {
        copyArtifacts(
                projectName: 'sourceJob',
                selector: getSelectorFromParam(params.copyArtifactSelector)
        )
    }
    
    Run Code Online (Sandbox Code Playgroud)

想法

Copy Artifact 插件中是否有可能导致NotSerializableException异常发生的隐藏错误- 或者我是否遗漏了什么?

getSelectorFromParam像在更新的示例中那样使用我的方法是否安全?如果不安全,是否有安全的解决方案?

Dav*_*Tam 12

在花了几个小时之后,我遇到了同样的问题,我发现了这一点,它对我来说非常有效。

这里复制工件作业参数的构建选择器的名称是copyArtifactSelector,这里的上游作业名称是sourceJob

    copyArtifacts(projectName: 'sourceJob',
                  selector: [$class: 'ParameterizedBuildSelector', 
                             parameterName: 'copyArtifactSelector'] );
Run Code Online (Sandbox Code Playgroud)

注意:插件=“copyartifact@1.39.1”

编辑:同时 - 使用copyartifactV1.43 - 支持以下语法:

    copyArtifacts(projectName: 'sourceJob',
                  selector: buildParameter('copyArtifactSelector'));
Run Code Online (Sandbox Code Playgroud)