jenkins 在Jenkinx矩阵的初始代理上执行了一个阶段后,如何返回到初始代理?

e5nszbig  于 2023-03-01  发布在  Jenkins
关注(0)|答案(1)|浏览(169)

在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。

附录

当在普通线性管道中使用每级代理时,该问题也可能存在。

2hh7jdfx

2hh7jdfx1#

我自己想到的解决方案是将应该在另一个代理上运行的阶段 Package 在一个script块中,该块包含一个node(从而启动另一个代理),其中包含该阶段所需的步骤。

stage('Things to do on another agent') {
  steps {
    script {
      node('${PLATFORM}') {
        stage('Do things on another agent') {
         <The steps to do >
        }
      }
    }
  }
}

节点完成后,执行将返回到初始代理。当然,默认情况下,其他代理上的工作区不像初始代理那样设置(例如,不 checkout 资料档案库),必须显式设置。
这个解决方案应用于我上面的示例,如下所示

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') {
                        steps {
                            script {
                                node("natives-${PLATFORM}") {
                                    stage('Build binariess') {
                                        unstash "sources.${PLATFORM}"
                                        <Build native binaries from unstashed sources into 'libs' folder >
                                        dir('libs') {
                                            stash "binaries.${PLATFORM}"
                                        }
                                    }
                                }
                            }
                        }
                    }
                    stage('Collect and distribute binaries') {
                        steps {
                            dir("libs.${PLATFORM}") {
                                unstash "binaries.${PLATFORM}"
                            }
                        }
                    }
                }
            }
        }
        stage('Bundle and distribute') {
            ...
        }
    }
}

相关问题