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

时间:2019-07-29 21:45:24

标签: yaml kubernetes-helm jenkins-groovy

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

具体来说,我想从helm values.yaml文件中获取一些值,以便在Jenkinsfile的global environment部分中设置env值,以供所有后续阶段使用。

println valuesYaml.getClass()返回java.lang.String,我认为这是不正确的,因为此对象来自嵌套的yaml文件,因此我认为返回的对象应该是地图。

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
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()
      }
    }
}

1 个答案:

答案 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
        }
      }
    }
  }
}