Я хочу прочитать содержимое файла yaml в декларативном Jenkinsfile с помощью утилиты readYaml. Насколько я понимаю, readYaml должен возвращать карту, однако тип объекта, который я вижу, — это строка. Это противоречит цели помещения данных в файл yaml в первую очередь.
В частности, я хочу получить некоторые значения из файла helm values.yaml, чтобы установить значения env в разделе глобальной среды файла Jenkins, чтобы их можно было использовать на всех последующих этапах.
println valuesYaml.getClass()
возвращает java.lang.String, что я считаю неправильным, потому что этот объект исходит из вложенного файла yaml, поэтому я думаю, что возвращаемый объект должен быть картой.
Когда запускается следующий оператор эха 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()
}
}
}
Вы устанавливаете переменную valuesYaml
внутри блока environment
, что делает ее нить. Переместите объявление вашей переменной в блок 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
}
}
}
}
}
Большой! Теперь, как разобрать значение в разделе «параметры» файла template.yaml. Я пытаюсь использовать valueYaml.parameters["имя-параметра"], но это не удается с исключением RejectedAccessException.