Подмодули Git не обновляются в сборке Jenkins

86

У меня есть подмодуль в проекте в Jenkins. Я включил расширенную настройку для рекурсивного обновления подмодулей.

Когда я запускаю сборку, я вижу, что в рабочей области есть файлы из подмодуля. Проблема в том, что это вроде первая ревизия подмодуля. Когда я нажимаю изменения (репозиторий, размещенный на GitHub), Дженкинс, похоже, не обновляет подмодуль, чтобы получить правильные изменения. Кто-нибудь видел такое?

Бен
источник

Ответы:

98

Обратите внимание, что плагин Jenkins Git 2.0 будет иметь «расширенное поведение подмодулей», которое должно гарантировать правильное обновление подмодулей:

git 2.0

Как отметил по vikramvi:

Advanced sub-modules behavior> " Path of the reference repo to use during submodule update" напротив этого поля добавьте URL-адрес подмодуля git.

Путь


Оуэн Би упоминает в комментариях :

Для проблемы аутентификации теперь есть опция «Использовать учетные данные из удаленного по умолчанию родительского репозитория».

Здесь в JENKINS-20941 :

https://issues.jenkins-ci.org/secure/attachment/33245/Screen%20Shot%202016-07-08%20at%2010.09.17.png

VonC
источник
6
Но как? Можете ли вы также подробно описать шаги, какие варианты выбрать? Благодарю.
zavié
8
@ zavié Я думаю, вам следует выбрать «Расширенное поведение подмодулей», а затем установить флажок «Рекурсивно обновлять подмодули», который появится, и нажать «Сохранить».
KajMagnus 08
9
Это не совсем работает, если вы используете частный репозиторий.
Эрик
1
У меня отлично
сработало
3
Это работает только в том случае, если ваше репо не требует аутентификации для чтения вашего подмодуля git. Ошибка Дженкинса.
Эрнст Кушке
33

Это описано в документации подключаемого модуля Git на сайте Jenkins в разделе: Рекурсивные подмодули. .

выдержка

Плагин GIT поддерживает репозитории с подмодулями, которые, в свою очередь, сами имеют подмодули. Тем не менее, это должно быть включено: в конфигурации задания -> Управление исходным кодом раздела , Git -> Расширенная кнопка (в разделе Ветви для сборки) -> Рекурсивно обновлять подмодули .

пример

На экране конфигурации вашего задания в разделе «Управление исходным кодом» потяните кнопку « Добавить» вниз и выберите «Расширенное поведение подмодулей».

   s1

                                 s2

Затем выберите «Рекурсивно обновлять подмодули»:

   s3

slm
источник
1
спасибо, но это не сработало в то время, когда я пробовал это (почти 2 года назад)
Бен
@Ben - Хорошо, я просто попробовал это, и у меня это сработало. Может быть связано с вашими версиями.
slm
1
Это работает только в том случае, если ваше репо не требует аутентификации для чтения вашего подмодуля git.
Эрнст Кушке
@ErnstKuschke - Я считаю, что Дженкинсу можно дать ключ SSH, чтобы он тоже мог взаимодействовать с репозиториями, требующими аутентификации.
slm
30

Знаете ли вы, что ваш репозиторий Git всегда ссылается на конкретную ревизию? подмодуля? Дженкинс не собирается автоматически менять ревизию.

Если вы хотите использовать новую версию подмодуля, вы должны сделать это в своем локальном репозитории Git:

cd submoduledir
git pull
cd ..
git add submoduledir
git commit -m 'Updated to latest revision of submoduledir'
git push # Go and watch Jenkins build with the new revision of the submodule

Когда вы это сделаете, Дженкинс проверит ту же самую ревизию подмодуля во время сборки. Дженкинс сам по себе не решает, какую версию подмодуля использовать. Это фундаментальное различие между подмодулями Git и внешними модулями SVN.

Возможно, вы захотите прочитать хороший справочник по подмодулям, например http://progit.org/book/ch6-6.html .

sti
источник
1
Ссылка ProGit, которую дал @sti, устарела. Я думаю, что это текущий эквивалент https://git-scm.com/book/en/v2/Git-Tools-Submodules
Stevel
Ссылка не работает (связано с HTTPS?) - «502 Bad Gateway» .
Питер Мортенсен
17

Наконец наткнулся на способ сделать это, и это просто.

Проблема:

Первоначальный клон с учетными данными работает нормально, но последующее submoduleклонирование не удается с неверными учетными данными.

  1. Автоматическое клонирование расширенного подмодуля Source Code Management >> Additional Behaviours >> Advanced sub-modules behaviours:: приводит к ошибке учетных данных.
  2. git submodule update --initв Execute Shellразделе также происходит сбой с ошибкой учетных данных.

Решение:

Я использую jenkins-1.574.

  1. Установите Build Environment >> SSH Agentфлажок.
  2. Выберите правильные учетные данные (возможно, те же, что указаны в Source Code Managementразделе
  3. Обновить подмодули в Execute Shellразделе

    git submodule sync
    git submodule update --init --recursive
    

Вот скриншотвведите описание изображения здесь

потенция
источник
3
Такого флажка больше нет.
adi518 02
11

Похоже, я нашел решение:

Я добавил этап сборки для выполнения следующих команд оболочки:

git submodule foreach git checkout master
git submodule foreach git pull
Бен
источник
После того, как вы выполните эти команды, вам может потребоваться выполнить фиксацию в суперпроекте, так как HEAD в ваших подмодулях будет обновлен.
слэси
Привет, Бен, не могли бы вы подробнее рассказать о своем решении? Я хочу сделать то же самое. Кроме того, просто для подтверждения, ваше решение будет git submodule обновлять подмодули проекта в WORKSPACE, да?
Ким Стэкс
более подробной информации нет. Я просто добавил эти две строки в свой процесс сборки, и он всегда извлекает последнюю версию подмодуля.
Бен
10
Как говорит @sti в другом ответе здесь, похоже, что вы пытаетесь использовать подмодули Git, такие как внешние элементы SVN. Вместо того, чтобы добавлять эти команды в Jenkins, было бы лучше зафиксировать правильные версии подмодулей в вашем основном репозитории Git. Затем Дженкинс всегда будет проверять одну и ту же версию подмодулей при сборке конкретной версии вашего проекта. Воспроизводимые сборки - это хорошо.
Коди Кастерлайн
4
@ben Я наткнулся на эту команду, которая может показаться вам более полезной, особенно если вы не используете основную ветку в подмодулеgit submodule update --init --recursive
Кори Скотт
7

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

Амин Y
источник
2

Я использую конвейерную обработку сценариев с плагином проверки. Если вы хотите, чтобы подмодули были такими же, как в вашем репозитории, просто отключите параметр trackingSubmodules следующим образом:

checkout([$class: 'GitSCM', branches: [[name: '*/develop']], doGenerateSubmoduleConfigurations: false, extensions: [[$class: 'SubmoduleOption', disableSubmodules: false, parentCredentials: true, recursiveSubmodules: false, reference: '', trackingSubmodules: false]], submoduleCfg: [], userRemoteConfigs: [[credentialsId: '[myCredentials]', url: 'https://git.myRepo.git']]])
Йохен Гунцельманн
источник