詹金斯管道从yaml读取

时间:2017-10-15 02:25:59

标签: 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'
      }
    }
  }
}

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

我希望尽可能将管道定义保持为声明性。 如果我正确读取docs,则脚本部分只能添加到一个阶段中。我在全局管道级别上尝试了这个但是出现了错误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.

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

2 个答案:

答案 0 :(得分:5)

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

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

...
}

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

答案 1 :(得分:2)

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

有两种方法可以解决这个问题。您可以明确声明变量"全局" (并不是真正的全局,Groovy的术语,正如我所理解的那样)通过在管道之外声明它。或者使用管道,如果你不在脚本中声明一个变量,但只是使用它,它就会被创建为一个"全局"变量。