我想通过readYaml实用程序读取声明性Jenkinsfile中yaml文件的内容。我的理解是readYaml应该返回一个Map,但是,我看到的返回的对象类型是String。首先,这违反了将数据放在yaml文件中的目的。
具体来说,我想从helm values.yaml文件中获取一些值,以便在Jenkinsfile的global environment部分中设置env值,以供所有后续阶段使用。
println valuesYaml.getClass()
返回java.lang.String,我认为这是不正确的,因为此对象来自嵌套的yaml文件,因此我认为返回的对象应该是地图。
当以下echo语句运行echo valuesYaml.appName.toString()
时,它将出错并显示以下错误:
org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException:找不到这样的字段:字段java.lang.String appName
这是values.yaml的片段,我正在尝试阅读:
replicaCount: 1
appName: test
def loadValuesYaml(){
def valuesYaml = readYaml (file: './chart/values.yaml')
return valuesYaml;
}
pipeline {
agent {
label "jenkins-maven"
}
environment {
valuesYaml = loadValuesYaml()
}
stages {
stage('CICD Initialize') {
steps {
script{
echo valuesYaml
println valuesYaml.getClass()
}
echo valuesYaml.appName.toString()
}
}
}
答案 0 :(得分:1)
您正在valuesYaml
块中设置environment
变量,这使其成为 string 。将变量声明移至script
块,该变量将在后续阶段中访问。
def loadValuesYaml(){
def valuesYaml = readYaml (file: './chart/values.yaml')
return valuesYaml;
}
pipeline {
agent {
label "jenkins-maven"
}
stages {
stage('CICD Initialize') {
steps {
script{
valuesYaml = loadValuesYaml()
println valuesYaml.getClass()
}
}
}
stage('Deploy') {
steps {
echo valuesYaml.appName
}
}
}
}
或者,如果要在environment
块中声明它们,则可以重写loadValuesYaml
函数以返回特定的字符串,但是,它将多次调用readYaml
。>
def loadValuesYaml(x){
def valuesYaml = readYaml (file: './chart/values.yaml')
return valuesYaml[x];
}
pipeline {
agent {
label "jenkins-maven"
}
environment {
APP=loadValuesYaml('appName')
REPLICACOUNT=loadValuesYaml('replicaCount')
}
stages {
stage('CICD Initialize') {
steps {
script{
println APP
println REPLICACOUNT
}
}
}
}
}