Jenkins声明式管道根据前一阶段的输出设置了全局环境var

时间:2019-02-27 01:03:23

标签: jenkins jenkins-pipeline

在Jenkins声明式管道中,是否有一种方法可以根据前一阶段的输出来设置该阶段的全局环境var?我希望能够基于此动态设置代理。我有一个无效的代码(如下),但这说明了我正在尝试做的事情:

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

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

1 个答案:

答案 0 :(得分:1)

这可以。

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'
  }
}