Многоотраслевой конвейер Jenkins с файлом Jenkins из другого репозитория

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

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


person Kolargol00    schedule 19.08.2016    source источник
comment
Доступна ли эта опция в новых версиях или все та же ситуация?   -  person ImranRazaKhan    schedule 04.07.2018


Ответы (5)


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

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

Новый многоотраслевой проект Freestyle

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

Тогда реализация должна быть простой:

  1. Укажите свой SCM репозиторий в многоотраслевой конфигурации
  2. Вызовите другую сборку как часть вашей сборки / пост-сборки, как и в стандартном проекте фристайла, за исключением того, что вам нужно вызвать параметризованное задание (назовем его build-job) и передать ему информацию о вашем репозитории, то есть URL-адрес Git и текущую ветку (для этой цели можно использовать предварительно определенные переменные $GIT_URL и $GIT_BRANCH)
  3. В вашем build-job просто определите либо встроенный конвейер, либо сценарий конвейера, извлеченный из SCM, а внутри этого сценария выполните проверку 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, чтобы найти реальную проблему вашей сборки.

person Pom12    schedule 24.08.2016
comment
Эта фристайл-мультиотраслевая опция, похоже, теперь официально устарела. Jenkins не в настоящее время предлагает возможность делать многоотраслевые сборки для проектов, где Jenkinsfile вообще отсутствует. Что действительно отстой - person kert; 29.04.2017

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

Способ 1

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

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

Способ 2

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

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

person Lee Meador    schedule 08.01.2019
comment
Какую версию плагина Pipeline вы используете? Последняя версия - 2.6, и в ней нет опции Custom Script. - person Basilevs; 04.02.2019
comment
Я нашел это только в документах Cloudbees, так что я предполагаю, что это исходит от какого-то платного плагина. Кто знает! - person ZombieDev; 18.06.2019
comment
Ссылка @ZombieDev кажется устаревшей; Я думаю, что эта часть это то, что он имел в виду. - person De117; 12.12.2019
comment
Примечание. Это доступно только в Cloudbees Jenkins Enterprise, но не в ванильном Jenkins. - person JavaTechnical; 06.05.2021

Вы можете использовать этот плагин https://github.com/jenkinsci/pipeline-multibranch-defaults-plugin/blob/master/README.md Где нам нужно настроить jenkinsfile на jenkins вместо того, чтобы иметь его в каждой ветке вашего репо.

person Lakeesh Anand AN    schedule 13.06.2020

Лучший способ, который я нашел, - это использовать плагин Remote Jenkinsfile Provider. https://plugins.jenkins.io/remote-file/

Это добавит опцию плагина Remote Jenkinsfile Provider в разделе Build Configuration ›Mode, после чего вы сможете указать на другое репо, где находится Jenkinsfile. Я считаю, что это гораздо лучшее решение, чем плагин Pipeline Multibranch Defaults, который позволяет хранить файл Jenkins в самом Jenkins, а не в системе управления версиями.

person jsnow    schedule 24.06.2021
comment
Это должен быть правильный ответ, спасибо. - person Mahmoud; 28.07.2021

В моем случае у меня есть сценарий с проектом gitlab, основанным на gradle, у которого есть зависимости от другого preject gitlab на основе gradle (та же панель инструментов, но разные коммиты, разные разработчики).

Я добавил следующие строки в свой Jenkinsfile (тот, который зависит)

stage('Build') { 
            steps {
                git branch: 'dev', credentialsId: 'jenkins-generated-ssh-key', url: '[email protected]:root/coreProject.git'
                sh './gradlew clean'  
            }                 
        }

Примечание: обратите внимание на порядок в предложениях. Если у вас есть сомнения относительно того, как создать jenkins-generated-ssh-key, спросите меня

person Matias Camargo    schedule 23.02.2019