Дженкинс мультибрендовый конвейер с файлом Jenkins из другого хранилища

У меня есть репозиторий Git с кодом, который я хотел бы построить, но мне не разрешено добавлять Jenkinsfile в свой корневой каталог (это пакет Debian, поэтому я не могу добавлять файлы вверх по течению источник). Есть ли способ сохранить Jenkinsfile в одном репозитории и создать код из другого репозитория? Так как у моего репозитория кода есть несколько веток для сборки (по одному для каждого выпуска Debian), это должен быть мультибрендовый конвейер. Записи в репозиториях кода или Jenkinsfile должны запускать сборку.

Бонусная сложность: У меня есть несколько репозиториев кода/упаковки, подобных этому, и я бы хотел использовать один и тот же Jenkinsfile для всех. Таким образом, он должен каким-то образом динамически извлекать правильный URL Git для использования. Построенные ветки имеют одинаковые имена во всех репозиториях.

Ответы

Ответ 1

Короткий ответ: вы не можете сделать это с помощью multibranch pipeline. Многоканальные конвейеры разрабатываются (по крайней мере, на данный момент) для выполнения конкретного конвейера в стиле Pipeline script from SCM с фиксированным Jenkinsfile в корне проекта.

Однако вы можете использовать плагин Multi-Branch Project, созданный для проектов с несколькими каналами фристайл. Во-первых, вам нужно определить свой multibranch freestyle configuration так же, как и с multibranch pipeline configuration. Выберите этот новый элемент, как показано ниже:

Новый проект с несколькими веткими Freestyle

Этот тип конфигурации будет вести себя точно так же, как тип multibranch pipeline, т.е. создаст вам папку с именем вашей конфигурации и подпроектом для каждой автоматически обнаруженной ветки.

Затем реализация должна быть частью торта:

  • Укажите репозиторий SCM в конфигурации с несколькими каналами
  • Вызовите другую сборку как часть своей сборки/пост-сборки так же, как и в стандартном проекте фристайла, за исключением того, что вам нужно вызвать параметризованное задание (позвоните ему build-job) и передайте ему информацию своего репозитория, т.е. Git URL и текущая ветка (для этой цели вы можете использовать предварительно определенные переменные $GIT_URL и $GIT_BRANCH)
  • В build-job просто укажите либо встроенный конвейер, либо конвейер script, извлеченный из SCM, и внутри этого script выполните проверку SCM и продолжите шаги, которые вам нужно собрать. Пример содержимого конвейера build-job:

.

node() {
  stage 'Checkout'
  checkout scm: [$class: 'GitSCM', branches: [[name: '*/${GIT_BRANCH}']], userRemoteConfigs: [[url: '${GIT_URL}']]]

  stage 'Build'
  // Build steps...
}

Конечно, если ваши разные проекты с несколькими фильтрами нужно обрабатывать несколько иначе, вы также можете использовать промежуточные проекты (скажем build-project-A, build-project-B,...), которые в свою очередь вызовут общий конвейер build-job)

Одним из основных недостатков этого решения является то, что у вас будет только одна работа, ответственная за все ваши сборки, что затрудняет отладку. В случае успеха/ошибки у вас все еще будут многоцветные проекты, которые будут синими/красными, но вам придется вернуться к вызываемому build-job, чтобы найти реальную проблему вашей сборки.

Ответ 2

У меня версия 2.121, и вы можете сделать это двумя способами:

Способ 1

В конфигурации многоотраслевого конвейера> Конфигурация сборки> Режим> Выберите "Настраиваемый сценарий" и укажите "Файл маркера" под именем файла, который вы будете использовать для определения веток, для которых вы хотите создавать сборки.

Затем, ниже этого, в Pipeline> Definition выберите "Конвейерный скрипт из SCM" и введите информацию "SCM", чтобы найти "Jenkinsfile", содержащий скрипт, который вы хотите запустить. Он может находиться в том же репо, в котором вы находите ветки для создания заданий (если вы добавляете ту же информацию репозитория GitHub), но я не могу найти способ указать, что вы просто используете одну и ту же ветку для файла.

Способ 2

То же, что и выше, в конфигурации многоотраслевого конвейера> Конфигурация сборки> Режим> Выберите "Пользовательский сценарий" и поместите в "Файл маркера" под именем файла, который вы будете использовать для идентификации веток, для которых вы хотите иметь сборки.

Затем, ниже этого, в Pipeline> Definition выберите "Pipeline Script" и поместите немного Groovy в текстовое поле, чтобы загрузить все, что вы хотите, или запустить какой-нибудь скрипт, который уже загружен в рабочую область.