Использование проектов с несколькими конфигурациями с Jenkinsfile (сборка конвейера)

Я пытаюсь создать проект с несколькими конфигурациями, который проверяет кучу построений, который определяет матрицу совместимости (например, браузером и os). Я хотел бы определить шаги для одной комбинации с помощью Jenkinsfile.

Как я могу это достичь? Я могу создать сконфигурированную конвейерную сборку, которая зависит от JenkinsFile, но я не могу понять, как подключить ее к сборке с несколькими конфигурациями.

Ответы

Ответ 1

Кажется, что невозможно создать Jenkinsfile как buildstep в проекте с несколькими конфигурациями. Файл Jenkins используется в задании Pipeline, которое также является типом работы, а Jenkins не поддерживает (легко) преобразование между типами заданий. В дополнение к этому, buildstep подразумевает, что он запускается на определенном node в слоте исполнителя. Однако Jenkinsfile оценивается мастером и сам определяет buildsteps (с их метками node), которые по своей сути сталкивались бы, если бы они выполнялись в самом сборке.

Можно запустить конвейер через задание с несколькими конфигурациями и предоставить ему параметры из задания с несколькими конфигурациями. (Я также использовал параметризованный триггерный плагин для этого)

У моего задания конвейера есть два текстовых параметра: label и version с примером Jenkinsfile, который выглядит так:

node(this.label){
  println this.version   
}

Мое задание с несколькими конфигурациями имеет следующую конфигурацию:

  • Пользовательская ось version со значениями alpha beta gamma и ведомая ось label с выбранным node
  • Строка "Триггер/вызов строит на других проектах" для запуска моего задания на конвейер с предопределенными параметрами version=${version} и label=${label}

Эта настройка приводит к тому, что задание конвейера вызывается 3 раза (поскольку у меня есть только один node), каждый раз с другой версией и выполняющейся на моей указанной метке. Вот один из журналов:

[Pipeline] node
Running on master in /var/lib/jenkins/jobs/pipelinejob/workspace
[Pipeline] {
[Pipeline] echo
gamma
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS

Это решение работает, если вы хотите передавать только текстовые параметры или имена ярлыков. Это будет значительно сложнее использовать, если вы хотите сделать что-то вроде "build with different jdks". Я надеюсь, что это все же полезно.