Использовать объект, возвращенный readYaml из файла в декларативном Jenkinsfile

Я хочу прочитать содержимое файла yaml в декларативном Jenkinsfile с помощью утилиты readYaml. Насколько я понимаю, readYaml должен возвращать карту, однако тип объекта, который я вижу, — это строка. Это противоречит цели помещения данных в файл yaml в первую очередь.

В частности, я хочу получить некоторые значения из файла helm values.yaml, чтобы установить значения env в разделе глобальной среды файла Jenkins, чтобы их можно было использовать на всех последующих этапах.

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 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()
      }
    }
}
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
9 566
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы устанавливаете переменную 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.

mobibob 16.04.2021 23:41

Другие вопросы по теме