【问题标题】:Jenkins declarative pipeline set global environment var from output of previous stageJenkins 声明性管道从前一阶段的输出设置全局环境变量
【发布时间】:2019-02-27 01:03:23
【问题描述】:

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

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

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

【问题讨论】:

  • 您正在将一个临时 shell 变量设置为标准输出的值。您需要将 Jenkins 变量设置为标准输出的值。

标签: jenkins jenkins-pipeline


【解决方案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'
  }
}

【讨论】:

  • 谢谢!你能详细说明一下为什么我应该忘记声明性管道吗?
  • 抱歉,我很快就联系上了。管道挂在“第二”阶段,等待“空代理”。似乎该变量能够在设置它的同一阶段(第一)解决,但不能在后续阶段(第二)
  • 正确,如果您只有一个执行程序,并且第二阶段与第一个阶段在同一节点上运行,则声明性示例将挂起
  • 就像为什么要使用脚本一样,它只是工作。当您跳过简单的 hello world 示例时,声明式有许多您将不得不遇到的问题。节省一些时间并使用脚本。
猜你喜欢
  • 2018-01-26
  • 1970-01-01
  • 2021-05-24
  • 1970-01-01
  • 2020-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多