如何将jenkins管道阶段执行定向到从参数派生的特定节点代理?

时间:2018-10-14 17:43:50

标签: jenkins jenkins-pipeline

我有多种Jenkins节点代理,包括“ master”,“ tiering_agent1”和“ cirrus”。我正在尝试通过参数{}设置来设置执行舞台的节点。

我有这个管道代码

def BuildAgentLabel='tiering_agent1'

pipeline {

    agent { label 'master' } 

    parameters { 
        string( 
            name:         'NEW_LABEL', 
            defaultValue: '',  
            description:  ''
        )
    }
    stages {
        stage( 'Init') {
            steps {
                script {
                    if ( params.NEW_LABEL != '' ){
                        echo "Setting BuildAgentLabel to '${params.NEW_LABEL}'" 
                        BuildAgentLabel = params.NEW_LABEL
                        echo "BuildAgentLabel is now '${BuildAgentLabel}'" 
                    } 
                } 
            }
        }
        stage( "Build") {
            agent { label BuildAgentLabel } 
            steps {
                echo "Performing Stage '${STAGE_NAME}' on NODE '${env.NODE_NAME}'"
                echo "BuildAgentLabel=${BuildAgentLabel}"
            }
        }
    }
}

尽管'Init'阶段将全局变量 BuildAgentLabel 设置为其他值(如果NEW_LABEL参数是长度大于0的字符串),则'Build'阶段始终在任何节点上执行“ def BuildAgentLabel”语句最初设置为。

运行的控制台输出与此相呼应:

[Pipeline] node
Running on Jenkins in ...
[Pipeline] {
.
.
.
[Pipeline] stage
[Pipeline] { (Init)
[Pipeline] script
[Pipeline] {
[Pipeline] echo
Setting BuildAgentLabel to 'master'
[Pipeline] echo
BuildAgentLabel is now 'master'
.
.
.
[Pipeline] stage
[Pipeline] { (Build)
[Pipeline] node
Running on tiering_agent1 in /opt/jenkins-agent/workspace/ine-multibranch-test_master-RGJIAQXOIAPL7XDIJW6DOGF4KUE5KBRXCAZ7U4IUW2YOTZVQTWCA
[Pipeline] {
.
.
.
[Pipeline] {
[Pipeline] echo
Performing Stage 'Build' on NODE 'tiering_agent1'
[Pipeline] echo
BuildAgentLabel=master
.
.
.
[Pipeline] End of Pipeline
Finished: SUCCESS

就像stage {}对象几乎同时实例化并在那时捕获其代理标签一样,但是阶段执行是在此之后执行的。

我希望'Init'阶段能够影响在其上执行'Build'阶段的节点,但似乎无法使其工作。如何获得想要的结果?

2 个答案:

答案 0 :(得分:0)

问题是agent { label BuildAgentLabel }不能将变量BuildAgentLabel解析为其值,可能是由于此错误-https://issues.jenkins-ci.org/browse/JENKINS-9665造成的,我猜测您的节点代理'tiering_agent1'被配置为{{1} },并且默认使用此代理。

但是,直接将标签设置为参数Use this node as much as possible

答案 1 :(得分:0)

如果我没记错的话,您不能更改 params 项。至少,当我尝试过时,我会收到某种“静态/无法访问的地图”错误。但是,您可以更改环境变量,只要它们尚未在父 environment 声明式 (see this link for complete details) 中实例化。而且我还相信您可以将任何 param.name 变量作为 env.name 访问,并且那个可能是可变的。这可能取决于具体情况。如果不是,你总是可以设置一个新的 env var 作为传入参数的值,这肯定是可变的。