首页 > 解决方案 > Jenkins 声明性管道从前一阶段的输出设置全局环境变量

问题描述

在 Jenkins 声明式管道中,有没有办法根据前一阶段的输出设置一个阶段的全局环境变量?我希望能够基于此动态设置代理。我有一个不起作用的代码(如下),但这说明了我正在尝试做的事情:

pipeline {
  agent { node { label 'standard' } }

  stages {
    stage ('first') {
      steps {
        sh 'MYSTRING=`myapp.py getstring`'
      }
    }
    stage ('second') {
      agent { node { label "${MYSTRING}-agent" } }
      ...
    }
  }
}

标签: jenkinsjenkins-pipeline

解决方案


这会奏效。

class Global{
    static nextNode
}

pipeline {
  agent { label 'standard' } 
  stages {
    stage ('first') {
      steps {
          script {
            Global.nextNode=sh(script: 'myapp.py getstring', returnStdout: true).trim()
          }
      }
    }
    stage ('second') {
      agent { label "${Global.nextNode}-agent" } 
    }
  }
}

但我强烈建议您忘记声明式管道语法,因为它可能会导致您很快长出白发!

下面是脚本模式下的示例。下面的例子实际上可以工作,而上面的例子需要两个执行者。在我的情况下,主节点只有一个,所以它不能工作,因为代理是嵌套的。

node('linux') {
  stage ('first') {
    nextNode=sh(script: 'echo \$NODE_NAME', returnStdout: true).trim()
    echo nextNode
  }
}

node ("${nextNode}") {
  stage ('second') {
    echo nextNode
    sh 'ls'
  }
}

推荐阅读