在Jenkins声明性管道的矩阵单元格中,在同一单元格的前一个阶段已经在另一个代理(由标签标识)上执行之后,是否可以在管道的“初始/主”代理上执行后一个阶段?
为了将其应用到上下文中,我想使用矩阵阶段在Jenkins声明性管道中为不同平台构建本机二进制文件,其中每个单元负责
1.收集该平台的本机源代码
1.从该平台的源代码构建本机二进制文件
1.收集刚刚构建的本机二进制文件,并将它们分发到特定于平台的工件
第二步必须在特殊代理上执行,这些代理准备为特定平台构建二进制文件,并通过其标签进行标识。第一步和第三步必须在初始代理上执行,管道的“主”代理,其中源代码从SCM检出。最后,本机二进制文件被捆绑在一起,并从管道的初始/主代理分发。要传输源代码和二进制文件,请使用stash/unstash
。
示例性的、简化的伪流水线将看起来像:
pipeline {
agent { label 'basic' }
// Declarative SCM checkout configured in the mutli-branch pipeline job-config
stages {
stage('Build binaries') {
matrix {
axes {
axis {
name 'PLATFORM'
values 'linux', 'windows'
}
}
stages {
stage("Collect sources") {
steps {
<Collect native's sources for ${PLATFORM}> in "${WORKSPACE}/native.sources.${PLATFORM}"
dir("native.sources.${PLATFORM}") {
stash "sources.${PLATFORM}"
}
}
}
stage('Build binaries') {
options { skipDefaultCheckout() }
agent { label "natives-${PLATFORM}" }
steps {
unstash "sources.${PLATFORM}"
<Build native binaries from unstashed sources into 'libs' folder >
dir('libs') {
stash "binaries.${PLATFORM}"
}
}
}
stage('Collect and distribute binaries') {
agent {
<initial/pipeline-agent>
}
steps {
dir("libs.${PLATFORM}") {
unstash "binaries.${PLATFORM}"
}
}
}
}
}
}
stage('Bundle and distribute') {
...
}
}
}
但问题是,如何让Jenkins再次在初始/管道代理上执行矩阵的第三阶段?如果我只是不指定第三阶段的代理,则执行为:
1.管道代理阶段
1.本机构建代理阶段
1.本机构建代理阶段
但我想:
1.管道代理阶段
1.本机构建代理阶段
1.管道代理阶段
在syntax-reference中,我没有找到像agent { <initial/pipeline-agent> }
这样的代理参数:
- https://www.jenkins.io/doc/book/pipeline/syntax/#agent
- https://www.jenkins.io/doc/book/pipeline/syntax/#matrix-cell-directives
agent部分描述了一个布尔选项reuseNode
,但它只是“valid for docker and dockerfile
“。
到目前为止,我找到的唯一解决方法是定义第二个矩阵,并将第三阶段的执行移到该矩阵。这按预期工作,阶段在管道代理上执行,但缺点是矩阵阶段必须指定两次及其when-conditions。
附录
当在普通线性管道中使用每级代理时,该问题也可能存在。
1条答案
按热度按时间2hh7jdfx1#
我自己想到的解决方案是将应该在另一个代理上运行的阶段 Package 在一个
script
块中,该块包含一个node
(从而启动另一个代理),其中包含该阶段所需的步骤。节点完成后,执行将返回到初始代理。当然,默认情况下,其他代理上的工作区不像初始代理那样设置(例如,不 checkout 资料档案库),必须显式设置。
这个解决方案应用于我上面的示例,如下所示