Оформить заказ на несколько репозиториев git в одной рабочей области Jenkins

127

Использование Jenkins 1.501 и Jenkins Git plugin 1.1.26

У меня есть 3 разных репозитория git, каждый с несколькими проектами.

Теперь мне нужно проверить все проекты из трех репозиториев git в одной рабочей области на ведомом устройстве Jenkins. Я определил каждое репозиторий git в: Управление исходным кодом: несколько SCM . Но каждый раз, когда репо проверяется, предыдущее репо (и связанные с ним проекты) удаляются.

Я прочитал это:

http://jenkins.361315.n4.nabble.com/multiple-git-repos-in-one-job-td4633300.html

но это действительно не помогает. Я попытался указать ту же папку в локальном подкаталоге для репо (необязательно) для всех репозиториев, но это дает тот же результат.

Если это просто невозможно с использованием Jenkins, я предполагаю, что для перемещения проектов в нужное место можно использовать некоторый шаг / сценарий перед сборкой. Это не вариант для изменения конфигурации сборки проектов.

U123
источник

Ответы:

69

Проверка нескольких репозиториев за раз в одной рабочей области невозможна с помощью Jenkins + Git Plugin.

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

Раньше плагин Multiple SCM мог помочь с этой проблемой, но теперь он устарел. На странице плагина Multiple SCM: «Пользователи должны перейти на https://wiki.jenkins-ci.org/display/JENKINS/Pipeline+Plugin . Pipeline предлагает лучший способ проверки нескольких SCM и поддерживается Jenkins. основная команда разработчиков ".

CIGuy
источник
Почему первый подход проблематичен? Разделение работы кажется хорошей практикой.
CurtainDog 02
1
В целом это хорошая практика, но когда вам нужно несколько касс в одном и том же физическом месте, обслуживание становится огромной проблемой. Например, если вы хотите создать сборку ветки, вам нужно будет клонировать 4 задания, а затем индивидуально изменить пути для каждого из них. Конечно, есть плагины, которые помогут с этим, но проще просто оформить заказ на относительный путь из одного задания. Затем вы можете клонировать сколько угодно, не меняя настроек.
CIGuy 02
1
Вам нужно изменить его на правильный ответ, поскольку он больше не актуален.
Dvir669
2
Конвейеры требуют, чтобы вы изучили новый DSL, что немного слишком для очень простой работы (проверка кода из нескольких репозиториев), которую мы хотим сделать. Придерживайтесь плагина Multiple SCM, пока вокруг DSL конвейера Jenkins не появится достойный графический интерфейс. Могу сообщить, что с Jenkins 2.17 он отлично работает
Бурак Арслан
2
Я просто столкнулся с теми же проблемами с несколькими репозиториями. Сейчас я использую плагин Pipeline, хотя я так же скептически, как и @BurakArslan, относился к новому DSL. На самом деле это не так плохо, как я думал, и поставляется с довольно приличным генератором фрагментов. После использования всего 2 часа я теперь предпочитаю этот подход, так как в конечном итоге я могу передать скрипты сборки конвейера в git вместе с остальным кодом.
Бен
81

С помощью плагина Multiple SCMs:

  • создайте отдельную запись репозитория для каждого репозитория, который необходимо проверить (основной проект или зависимый проект.

  • для каждого проекта в «расширенном» меню (второе «расширенное» меню, есть две кнопки, помеченные как «расширенный» для каждого репозитория), найдите текстовое поле «Локальный подкаталог для репо (необязательно)». Вы можете указать там подкаталог в каталоге «рабочая область», в который вы хотите скопировать проект. Вы можете сопоставить файловую систему моего компьютера разработки.

«Второе расширенное меню» больше не существует, вместо этого нужно использовать кнопку «Добавить» (в разделе «Дополнительные поведения») и выбрать «Проверить в подкаталог».

  • если вы используете ant, поскольку теперь файл build.xml с целями сборки находится не в корневом каталоге рабочей области, а в подкаталоге, вы должны отразить это в конфигурации «Invoke Ant». Для этого в «Invoke ant» нажмите «Advanced» и введите текст «Build file», включая имя подкаталога, в котором находится build.xml.

Надеюсь, это поможет.

GaRRaPeTa
источник
3
Это должно быть устаревшим. На момент написания плагина Multiple SCMs фрагмент GIT не содержал необязательного вложенного пути.
AlexeiOst
12
В каждом репозитории есть выпадающий список с названием «Добавить». В нем вы можете найти опцию «Оформить заказ в подкаталог», которая выполняет то же самое.
Gary Ye
1
Я последовал вашему руководству с несколькими плагинами SCM и git, но у меня есть еще одна забавная проблема. Кажется, не хочется правильно проверять одну и ту же ветку (разрабатывать) для разных репозиториев. Он пытается проверить фиксацию по хешу (который действителен только в первом репозитории). Есть идеи, как с этим справиться?
Лефтерис
Самая большая проблема с несколькими плагинами SCM заключается в следующем: «Триггеры типа после фиксации в настоящее время не работают (по крайней мере, для подрывной деятельности), поэтому необходимо настроить опрос типа cron».
Grayaii
1
Конвейеры требуют, чтобы вы изучили новый DSL, что немного слишком для очень простой работы (проверка кода из нескольких репозиториев), которую мы хотим сделать. Придерживайтесь плагина Multiple SCM, пока вокруг DSL конвейера Jenkins не появится достойный графический интерфейс. Я могу сообщить, что он отлично работает с Jenkins 2.17
Бурак Арслан
41

Поскольку подключаемый модуль Multiple SCM устарел.

С помощью Jenkins Pipeline можно проверить несколько репозиториев git и после его создания с помощью gradle

node {   
def gradleHome

stage('Prepare/Checkout') { // for display purposes
    git branch: 'develop', url: 'https://github.com/WtfJoke/Any.git'

    dir('a-child-repo') {
       git branch: 'develop', url: 'https://github.com/WtfJoke/AnyChild.git'
    }

    env.JAVA_HOME="${tool 'JDK8'}"
    env.PATH="${env.JAVA_HOME}/bin:${env.PATH}" // set java home in jdk environment
    gradleHome = tool '3.4.1' 
}

stage('Build') {
  // Run the gradle build
  if (isUnix()) {
     sh "'${gradleHome}/bin/gradle' clean build"
  } else {
     bat(/"${gradleHome}\bin\gradle" clean build/)
  }
}
}

Возможно, вы захотите использовать подмодули git вместо подобного настраиваемого конвейера.

джокер
источник
Спасибо!!! dirБлок является ключевым, я не мог понять, почему я только видел самый новые клонируют репо в рабочем пространстве моего задания.
Привет, 02
как понятие «изменения» рассматривается в нескольких SCM? Это просто сумма изменений, наблюдаемых во всех репозиториях, которые составляют задания? Было бы неплохо перечислить их по каждому, если возможно, 23 changes from repo XXX, 3 changes from repo YYYили что-то более компактное в этом роде.
jxramos
20

Я успешно использовал подключаемый модуль Multiple SCMs вместе с подключаемым модулем Git с Jenkins.

Фредерик Девеердт
источник
3
спасибо, отлично, я могу поместить 2 пути к битбакету в раздел репозитория, и теперь как я могу указать ветку «разработка» для проверки репо 1 и ветку «исправления» для проверки репо 2? Я вижу ветки для создания части в jenkins, как я могу настроить имя репозитория и Refsec в спецификаторе ветки (пусто для «любой»), чтобы каждый мог проверить соответствующую ветку, которую я хочу? или я делаю это раньше и должен щелкнуть логическое значение "Несколько SCM"?
Pelos
@pelos Вы смогли найти решение?
Govind
на данный момент мы не используем файл YML и мы сделали два различные рабочие процессы с регулярными задачами
Pelos
5

В зависимости от взаимосвязей репозиториев существует другой подход, заключающийся в добавлении другого репозитория (репозиториев) в качестве подмодулей git в один из репозиториев. Подмодуль git создает ссылку на другие репозитории. Эти репозитории подмодулей не клонируются, если вы не укажете --recursiveфлаг при клонировании «суперпроекта» (официальный термин).

Вот команда для добавления подмодуля в текущий проект:

git submodule add <repository URI path to clone>

Мы используем Jenkins v1.645, а git SCM будет готов к рекурсивному клонированию суперпроектов. Вуаля, вы получаете файлы суперпроекта и все зависимые (подмодульные) файлы репо в их собственных соответствующих каталогах в той же рабочей области Jenkins.

Не ручаюсь, что это правильный подход, скорее это подход.

mikehwang
источник
5

Дженкинс: несколько SCM - не рекомендуется. Плагин GIT - не работает для нескольких репозиториев.

Сценарии / конвейер как код - это правильный путь.

АКС
источник
2

У меня тоже была такая проблема. Я решил это с помощью сборок триггера / вызова в других проектах. Для каждого репозитория я вызываю последующий проект, используя параметры.

Основной проект:

This project is parameterized
String Parameters: PREFIX, MARKETNAME, BRANCH, TAG
Use Custom workspace: ${PREFIX}/${MARKETNAME}
Source code management: None

Затем для каждого репозитория я вызываю следующий проект следующим образом:

Trigger/call builds on other projects: 
Projects to build: Linux-Tag-Checkout
Current Build Parameters
Predefined Parameters: REPOSITORY=<name>

Последующий проект: Linux-Tag-Checkout:

This project is parameterized
String Parameters: PREFIX, MARKETNAME, REPOSITORY, BRANCH, TAG
Use Custom workspace:${PREFIX}/${MARKETNAME}/${REPOSITORY}-${BRANCH}
Source code management: Git
git@<host>:${REPOSITORY}
refspec: +refs/tags/${TAG}:refs/remotes/origin/tags/${TAG}
Branch Specifier: */tags/${TAG} 
Торбьорн Гард
источник
1

Покидаем более одного репо в то время в одной рабочей области является возможным с Jenkins + Git плагин (может быть , только в более поздних версиях?).

В разделе «Управление исходным кодом» выберите не «Git», а «Несколько SCM» и добавьте несколько репозиториев git.

Убедитесь, что во всех, кроме одного, вы добавляете в качестве «Дополнительного поведения» действие «Извлечь в подкаталог» и указываете отдельный подкаталог.

JRA_TLL
источник
Я считаю, что таким образом вы используете (устаревший) плагин Multiple SCM, а не ванильный плагин Git.
Роберт
0

Мы используем git-repo для управления несколькими нашими репозиториями GIT. Существует также плагин Jenkins Repo, который позволяет проверять все или часть репозиториев, управляемых git-repo, в той же рабочей области Jenkins.

vladisld
источник
Как именно вы решите проблему, заданную в этом вопросе? Я установил упомянутый вами плагин и прочитал о репо и плагине, но я не вижу, как настроить Jenkins для клонирования двух репозиториев для выполнения в одном проекте ...
GreenAsJade 01
Чтобы использовать Repo, необходимо создать специальный репозиторий, который будет содержать только файлы манифеста. В этом файле вы указываете всю информацию о других репозиториях. Точный формат файлов манифеста описан в файле docs / manifest-format.txt проекта git-repo ( gerrit.googlesource.com/git-repo/+/master/docs/… ). При настройке части задания Jenkins Repo - вы указываете расположение репозитория «манифеста» и, при необходимости, имя файлов «манифеста» (у вас может быть несколько). Все репозитории, указанные в манифесте, будут клонированы.
vladisld