我们在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
方法安全吗?如果不安全,是否有安全的解决方案?
有点跑题,但是如果你想使用来自上游触发的管道作业的参数(例如直接来自“源作业”),你可以使用以下方法:
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')
}
我希望有人觉得这有用。
在花了好几个小时在这上面之后,我也遇到了同样的问题,我发现这对我来说非常有效。
复制工件作业参数的生成选择器名称此处为copyArtifactSelector,上游作业名称此处为sourceJob:
copyArtifacts(projectName: 'sourceJob',
selector: [$class: 'ParameterizedBuildSelector',
parameterName: 'copyArtifactSelector'] );
注意:插件=”copyartifact@1.39.1"
编辑:同时-使用copyartifact
V1。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