詹金斯管道从Yaml中读取

Neo*_*Neo 2 jenkins jenkins-pipeline

如何从一个阶段读取的YAML文件中读取数据,并在另一阶段或该阶段之外使用它?

pipeline {
  agent any
  environment {
    MY_ENV_VAR1 = 'VALUE1'
  }
  parameters {
    string(name: 'DEPLOY_ENV', defaultValue: 'staging', description: 'Environment to deploy on')
    booleanParam(name: 'DEBUG_BUILD', defaultValue: true, description: 'Debug the build')
  }
  stages {
    stage('Stage1') {
      steps {
        script {
          def datas = readYaml file: 'release.yml'
          echo "Got version as ${datas.version} "
        }
        echo "Deploying to ${params.DEPLOY_ENV} with debug=${params.DEBUG_BUILD}"
      }
    }
    stage('Stage 2') {
      steps {
        sh 'run.sh datas.version'
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我想访问其中Stage 2提取的$ {datas.version}内部步骤Stage 1

我想让管道定义尽可能保持声明性。如果我正确阅读了文档,则只能在一个阶段内添加脚本部分。我在全局管道级别尝试了此操作,但出现了错误Undefined section "script" at line 10

我只是datas = readYaml file: 'release.yml'在管道级别添加,但收到错误消息Not a valid section definition: "datas = readYaml file: 'release.yml'". Some extra configuration is required line 10, column 3.

一次读取文件然后在任何阶段使用读取的数据的正确方法是什么?

Rob*_*les 5

这只是一个范围问题。如果datas在脚本块中声明变量 ( ),则它仅存在于该块的范围内。

有2种方法可以解决这个问题。您可以通过在管道之外声明变量来显式声明变量“全局”(不是真正的全局,我理解的 Groovy 术语)。或者对于管道,如果您没有在脚本中声明变量,而只是使用它,它就会被创建为“全局”变量。


Neo*_*Neo 5

似乎我需要node围绕readYaml代码的一节。然后,我可以${datas.version}在所有阶段访问。

node {
  datas = readYaml file: 'release.yml'
}
pipeline {

...
}
Run Code Online (Sandbox Code Playgroud)

这是一个正在跟踪的问题JENKINS-40167