詹金斯变量,不同的执行者

时间:2017-10-16 08:12:37

标签: jenkins groovy jenkins-pipeline

我不是詹金斯大师所以请耐心等待。 :-)

我有一个管道,几乎就像这样简单:

def hash = ''
node {
      stage('Checkout') {
         …
      }

      stage('Build') {
         …
      }

      stage('Tests') {
         …
      }
}

stage('Ask deploy') {
    input 'Deploy?'
}

node {
      stage('Deploy') {
      }
}

我想在第一个节点中设置哈希变量的值,如果手动输入为正,则在下一个节点中读取它。这可能和安全吗?这是正确的方法吗?

请注意,涉及多个执行程序和手动输入。在Jenkins docs中,它暗示了一个节点:

  

只要执行者在节点上空闲,步骤就会一直运行。

这意味着两个节点可以在不同的执行器中运行,对吗?他们仍然共享相同的全局变量吗?提前感谢您的任何澄清!

2 个答案:

答案 0 :(得分:0)

如果Jenkins中有多个从属设备,则管道将在其中一个从属设备中启动。每个奴隶都不同。

你管道中的每个阶段都会在同一个奴隶中启动,所以如果你有变量" hash"在您的管道的第一行,您将无法在所有管道中读取它,但如果您必须从不同的构建中访问此变量值,则无法访问。

如果您需要一个全局变量来在不同的版本中读取它,您可以使用Global Variables String Parameter Plugin

定义一个全局变量

答案 1 :(得分:0)

hash变量是全局的,它的值在不同的执行器中可用,这对我来说似乎是合乎逻辑的。所以看起来我做的就是好的,除非我错过了什么,否则它会以这种方式工作。

以下是我验证的内容(为了简洁起见,详细信息):

我创建了一个类似的管道并杀死了运行第一个节点的执行程序:

def gitHash;

node {
  withCredentials(...) {
      //Step 1:
      //Check out from the SCM
      stage('Prepare') {
        echo "Checking out the project from source control.."
        scmInfo = checkout scm
        gitHash = scmInfo.GIT_COMMIT
        echo "Project checked out, the GIT hash of the last commit is: ${gitHash}"
      }
  }
}

stage('Ask deploy') {
    input 'Deploy?'
}

node {
    withCredentials(...) {
      stage('Deploy') {
        echo "TODO, hash ${gitHash}"
      }
    }
}

Jenkins的输出如下(详情跳过):

Obtained Jenkinsfile from 7adc4bb98524b31de93e0c1ae16bf967ca3df47c
Running on jnlp-13775fa128a47 in /root/workspace/...
[Pipeline] {
[Pipeline] withCredentials
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Prepare)
[Pipeline] echo
Project checked out, the GIT hash of the last commit is: 7adc4bb98524b31de93e0c1ae16bf967ca3df47c
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage

[Pipeline] stage
[Pipeline] { (Ask deploy)
[Pipeline] input
Deploy?
Proceed or Abort
Approved by admin
[Pipeline] }
[Pipeline] // stage
[Pipeline] node
Running on jnlp-1383bdf520c9d in /root/workspace/...
[Pipeline] {
[Pipeline] withCredentials
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Deploy)
[Pipeline] echo
TODO, hash 7adc4bb98524b31de93e0c1ae16bf967ca3df47c
[Pipeline] End of Pipeline
Finished: SUCCESS

如第一个节点在执行器jnlp-13775fa128a47上运行,第二个节点在jnlp-1383bdf520c9d上运行,但可以在那里读取全局范围变量的值。