当前位置: 首页 > 知识库问答 >
问题:

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

经炜
2023-03-14

我们在Jenkins系统中大量使用管道作业,需要能够使用复制工件的构建选择器作业参数来参数化复制工件步骤。

首先,我发现当参数返回一个字符串时,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
    )
}

然而,我刚刚意识到创建的BuildSelector不是Serializable。因此,我现在得到了预期的例外:


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

在那之后,我试图检查复制工件插件是如何处理这个问题的——但很遗憾,我在源代码中找不到任何线索。也许这只是偶然发生的?创建BuildSelector的方法似乎没有创建任何类型的可序列化类。

但也许有人已经意识到了这个问题,并且有了一个暗示?

到目前为止,我发现:

>

node {
    copyArtifacts(
            projectName: 'sourceJob',
            selector: getSelectorFromParam(params.copyArtifactSelector)
    )
}

复制人工制品插件中是否甚至可能存在隐藏的错误,这可能导致出现NotSeriazableExc0019异常-或者我错过了什么?

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


共有2个答案

邓驰
2023-03-14

有点跑题,但是如果你想使用来自上游触发的管道作业的参数(例如直接来自“源作业”),你可以使用以下方法:

steps {
    build
        job: 'downstream-copyartifacts-parametrized-job',
        propagate: false,
        wait: false,
        parameters: [
            [$class: 'StringParameterValue', name: 'copyArtifactSelector', value: "<TriggeredBuildSelector />"]
        ]
}

在本例中,TriggeredBuildSelector将使用来自上游作业的工件。如果您想触发使用“sourceJob”生成的工件的第二个后续作业,这可能非常有用。“下游copyartifacts参数化作业”中的参数定义可以如下所示:

parameters {
    buildSelector(
        name: 'copyArtifactSelector',
        defaultSelector: lastSuccessful(),
        description: 'A build to take the artifacts from'
    )
}

管道中构建参数的用法可以类似于上面所述:

steps {
    copyArtifacts
        filter: "/some/artifact/to/copy.zip",
        fingerprintArtifacts: true,
        projectName: 'sourceJob',  
        selector: buildParameter('copyArtifactSelector')
}

我希望有人觉得这有用。

酆高翰
2023-03-14

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

复制工件作业参数的生成选择器名称此处为copyArtifactSelector,上游作业名称此处为sourceJob:

    copyArtifacts(projectName: 'sourceJob',
                  selector: [$class: 'ParameterizedBuildSelector', 
                             parameterName: 'copyArtifactSelector'] );

注意:插件=”copyartifact@1.39.1"

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

    copyArtifacts(projectName: 'sourceJob',
                  selector: buildParameter('copyArtifactSelector'));
 类似资料:
  • 问题内容: 扩展选择参数插件很棒,我在通过UI https://wiki.jenkins- ci.org/display/JENKINS/Extended+Choice+Parameter+plugin 配置的作业中使用它 但是,我正在努力使其在样式管道脚本中运行。由于Jenkins管道语法生成器创建了以下代码段,因此扩展选择参数插件似乎尚未与管道脚本完全兼容: 如果我手动创建参数,则会得到与ht

  • 我是詹金的新手,我在比特桶里有4个回购,比如甲、乙、丙、丁。我必须去拿甲、乙 在Jenkinsfile中添加了上面的脚本,我将其放在repo中。 现在,我已经创建了一个多分支管道来获取所有和分支内的源- 我在源代码管理方面创造了自由式的新工作- 任何帮助都很感激。

  • 问题内容: 我在jenkinsfile中使用管道,但不确定如何在Jenkins和管道中正确链接作业。 我在jenkinsfile中定义了参数(有些具有默认值,有些 没有 ),并使用来自jenkins gui的参数进行初始化。问题是,它接缝了管道中的参数以覆盖我的作业参数, 即使在 管道中 未指定默认值时也是如此, 这意味着管道正在覆盖jenkins中的作业设置。 例如,我的一项工作是设置为使用一些

  • 我有一个 Jenkins 管道工作,如下所示: 后来我有这样的条件逻辑: 然而,触发器没有被激活。也就是说,“not triggered by timerTrigger”即使在parameterizedCron运行时也似乎是真的。 我从这里的文档中得到了这个例子。 我的问题是,如果我希望我的构建/发布阶段仅在branch == master上执行,而不是在参数化Cron执行期间执行,我该怎么做?

  • 问题内容: 有任何方法可以从具有参数的另一个管道触发管道作业,我已经尝试过 也尝试过 和 没有运气,它说: 项目类型不支持参数 问题答案: 由于子作业是另一个多分支管道项目,因此我需要指定我要运行的分支 现在可以用了

  • 我从Jenkins管道开始,我想从任何jenkins目录外部复制一些视频文件到我的作业工作区目录。我正在使用文件操作插件为我的其他作业执行一些文件操作。有了这个插件,我可以将文件从我的工作区内部复制到外部: 例如,通过这一步,我可以将位于我的工作区中的4个视频文件复制到位于另一个磁盘中的上述目录中。 但我想做相反的事。我想将视频文件从另一个磁盘的源目录复制到工作区。我尝试了几种方法,但似乎“inc