使用 readYaml 从声明性 Jenkinsfile 中的文件返回的对象

Amy*_*hir 2 yaml jenkins-groovy kubernetes-helm

我想通过 readYaml 实用程序读取声明性 Jenkinsfile 中的 yaml 文件的内容。我的理解是 readYaml 应该返回一个 Map,但是,我看到返回的对象类型是一个字符串。这首先违背了将数据放入 yaml 文件的目的。

具体来说,我想从 helm values.yaml 文件中获取一些值,以便在 Jenkinsfile 的全局环境部分中设置 env 值,以便所有后续阶段都能够使用。

println valuesYaml.getClass(),因为这个对象来自嵌套YAML文件,所以我想返回的对象应该是一个地图返回java.lang.String中我认为这是不正确的。

https://jenkins.io/doc/pipeline/steps/pipeline-utility-steps/#readyaml-read-yaml-from-files-in-the-workspace-or-text

当以下 echo 语句运行时,echo valuesYaml.appName.toString()它会出错并显示以下错误:

org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException:找不到这样的字段:字段java.lang.String appName

这是我正在尝试阅读的 values.yaml 的片段:

replicaCount: 1
appName: test
Run Code Online (Sandbox Code Playgroud)
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()
      }
    }
}
Run Code Online (Sandbox Code Playgroud)

edb*_*ead 6

您正在块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
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

或者,如果您想在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
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)