如何读取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.
在任何阶段读取文件一次然后使用读取数据的正确方法是什么?
答案 0 :(得分:5)
我似乎需要围绕node
代码的readYaml
部分。然后我可以在所有阶段访问${datas.version}
。
node {
datas = readYaml file: 'release.yml'
}
pipeline {
...
}
这是一个被跟踪的问题JENKINS-40167
答案 1 :(得分:2)
这只是一个范围问题。如果在脚本块中声明变量(datas
),则它仅存在于该块的范围内。
有两种方法可以解决这个问题。您可以明确声明变量"全局" (并不是真正的全局,Groovy的术语,正如我所理解的那样)通过在管道之外声明它。或者使用管道,如果你不在脚本中声明一个变量,但只是使用它,它就会被创建为一个"全局"变量。