Как получить переменные из yaml и отобразить их в jenkinsfile? - PullRequest
0 голосов
/ 13 апреля 2020

У меня есть файл jenkins с декларативным конвейером. Я пытаюсь получить имена изображений ECR из config.yml, поместить их в карту и распечатать их с помощью al oop в Jenkins. Вот что я сделал до сих пор:

config.yml:

images:
  - "123.dkr.ecr.eu-west-1.amazonaws.com/image-1:latest"
  - "123.dkr.ecr.eu-west-1.amazonaws.com/image-2:latest"
  - "456.dkr.ecr.eu-west-1.amazonaws.com/image-9:latest"

jenkinsfile:

def account_info = readYaml file: "config.yml"
def image_info = "${account_info.images}"

def map = [
        ("image") : "${image_info}"
]

pipeline {  
  stages {
    stage('tests') {     
      steps {
        loopImages(map)
      }     
    }
  }
}

def loopImages(map){
  map.each { entry ->
    stage('test-' + entry.key) {
      catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE') {
        script {
          sh """
          echo "${image_info}"
        """
        }
      }
    }
  }
}

Wanted чтобы узнать, если вы порекомендуете мне сделать это по-другому? Я новичок в Jenkins и не знаю, как получить переменные из yaml и поместить их в карту.

При таком способе я получаю следующую ошибку:

Required context class hudson.FilePath is missing

Моя цель - иметь такую ​​карту:

def map = [
    ("image") : "123.dkr.ecr.eu-west-1.amazonaws.com/image-1:latest"
    ("image") : "123.dkr.ecr.eu-west-1.amazonaws.com/image-2:latest"
    ("image") : "456.dkr.ecr.eu-west-1.amazonaws.com/image-9:latest"    
]

1 Ответ

1 голос
/ 13 апреля 2020

Ошибка здесь в том, что вы пытаетесь использовать шаг (readYaml) вне блока pipeline. Это не работает, потому что шаги требуют контекста из конвейера, такого как текущий узел.

На самом деле вы должны видеть pipeline в качестве основной функции и ничего не делать вне ее, кроме простой инициализации переменных.

Для вещей, которые мне нужно инициализировать с помощью шагов, я обычно создаю Этап «Инициализация». Это держит вещи отдельно и следует принципу одноуровневой абстракции.

def account_info = null
def image_info = null
def map = null

pipeline {  
  stages {
    stage('initialize') {
      steps {
        initialize()
      }
    }
    stage('tests') {     
      steps {
        loopImages(map)
      }     
    }
  }
}

void initialize() {
  account_info = readYaml file: "config.yml"
  //... and so on
}
...