Jenkins管道从yaml读取
问题描述:
如何从一个阶段中读取YAML文件中的数据并在另一个阶段或阶段之外使用它?Jenkins管道从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'
}
}
}
}
我想访问$ {} datas.version里面的Stage 2
步骤,在Stage 1
是牵强。
我想保持我的管道定义尽可能的声明。 如果我正确阅读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.
什么是正确的方法来一次读取该文件,然后使用在任何阶段中读取数据的?
答
看来我需要一个围绕readYaml
代码的node
部分。然后我可以在所有阶段访问${datas.version}
。
node {
datas = readYaml file: 'release.yml'
}
pipeline {
...
}
这是被跟踪JENKINS-40167
答
这只是一个范围问题。如果您在脚本块中声明变量(datas
),则它只存在于该块的范围内。
有两种方法可以解决这个问题。通过在管道之外声明变量,你可以明确地声明变量“全局”(并非真正的全局,Groovy术语,据我了解)。或者用管道,如果你没有在脚本中声明一个变量,但只是使用它,它会被创建为一个“全局”变量。
我更新了我的发现在管段定义'readYaml'一部分,但它似乎是一个插件不喜欢的问题。 – Neo
不喜欢什么?我给的语法与插件无关。这是基本的常规变量范围。 –
Groovy代码可能很好,但问题是管道无效。 – Neo