Как запустить конвейер Jenkins несколько раз, основываясь на нескольких / разных параметрах. (Пожалуйста, обратитесь к описанию для более подробной информации) - PullRequest
0 голосов
/ 08 ноября 2019

У меня есть строковый параметр, используемый в конвейере. names = "name1, name2" (в одном текстовом поле пользователь будет вводить имена, разделенные запятыми)

Я преобразую эту строку в список, используя метод tokenize. После этого список будет иметь [name1, name2]

У меня есть конвейерный скрипт с 3 этапами (Build, Test, Deploy). В приведенном выше случае есть только 2 имени. Итак, этот конвейер должен быть выполнен 2 раза. Точно так же, исходя из того, сколько имен мы передаем, конвейер должен запускаться столько раз.

Вы получите представление о том, что я на самом деле спрашиваю, увидев приведенный ниже код.

//Getting values using String Parameter in Jenkins. "name1, name2" is entered for "NAMES" as input
//Tokenize will turn "name1, name2" to [name1, name2]

namesList = params.NAMES.tokenize(',') 

for(name in namesList){
     .......
     //Pipeline should be triggered using 'name1' and 'name2', either one by one or parallel.   

}
pipeline{
   agent any
   stages{
      stage('build'){
         steps{
            sh 'curl https://abc.xyz/'+ name +'/sample'   //name should be passed to run this command
         }
      }
      stage('test'){
         ......
      }
      stage('deploy'){
         ......
      }
}

1-я итерация: имя1 должно быть передано в конвейер.

2-я итерация: имя2 должно быть передано в конвейер.

Выполнение может выполняться по одному или параллельно. Оба ответа приветствуются.

1 Ответ

0 голосов
/ 08 ноября 2019

К сожалению, насколько я знаю, это не может быть сделано с декларативным конвейером, потому что нет никакого способа иметь динамические этапы и / или параллельные ветви (у меня нет источника для этого факта, но насколько яможно сказать из документации и реализации, это не представляется возможным). К счастью, скриптовый конвейер гораздо более динамичен и способен помочь вам в том, что вам нужно. Следующий код должен работать как нужно:

def namesList = params.NAMES.tokenize(',')

def parts = [:]
namesList.each { name ->
    parts[name] = {
        stage('build'){
            echo "build for ${name}"
        }
        stage('test'){
            echo "test for ${name}"
        }
        stage('deploy'){
            echo "deploy for ${name}"
        }
    }
}
parallel parts

Код очень прост, мы токенизируем входной параметр, объявляем карту для хранения различных ветвей. Перебирая имена, для каждого имени мы назначаем элемент в ветви с замыканием, определяющим шаги для потока. Затем мы выполняем ветви, используя параллельный шаг.

...