Підмодулі Git, які не оновлюються у побудові Jenkins


85

У мене є підмодуль у проекті у Дженкінсі. Я ввімкнув розширені налаштування для рекурсивного оновлення підмодулів.

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

Відповіді:


96

Зверніть увагу, що плагін Jenkins Git 2.0 матиме "попередню поведінку підмодуля", що має забезпечити належне оновлення підмодулів:

git 2.0

Як зазначив по vikramvi:

Advanced sub-modules behavior> " Path of the reference repo to use during submodule update" проти цього поля додайте підмодуль git url.

Шлях


Оуен Б згадує в коментарях :

Що стосується проблеми автентифікації, тепер існує опція "Використовувати облікові дані із віддаленого батьківського сховища за замовчуванням"

Тут, у JENKINS-20941 :

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


6
Але як? Чи можете ви також надати детальні кроки, які варіанти вибрати? Дякую.
zavié

8
@ zavié Я думаю, вам слід вибрати "Розширена поведінка підмодулів", а потім встановити прапорець "Рекурсивно оновлювати підмодулі", який з'явиться, і натиснути Зберегти.
KajMagnus

9
Це не зовсім працює, якщо ви використовуєте приватне сховище.
Ерік,

1
У мене чудово працювало приватне репо
davegallant

3
Це працює, лише якщо ваше репо не вимагає автентифікації для читання вашого підмодуля git. Помилка Дженкінса.
Ернст Кушке

33

Це висвітлено в документації до плагіна Git на сайті Jenkins у розділі: Рекурсивні підмодулі .

уривок

Плагін GIT підтримує сховища з підмодулями, які в свою чергу мають самі підмодулі. Однак це потрібно ввімкнути: у конфігурації завдання -> Розділ Керування вихідним кодом , Git -> Розширена кнопка (у розділі Відділення для побудови) -> Рекурсивне оновлення підмодулів .

Приклад

На екрані конфігурації вашої роботи, у розділі Керування вихідним кодом, натисніть кнопку " Додати" вниз і виберіть "Розширена поведінка підмодулів".

   s1

                                 s2

Потім виберіть "Рекурсивно оновлювати підмодулі":

   s3


1
дякую, але це не спрацювало на той момент, коли я спробував це (майже 2 роки тому)
Бен,

@Ben - Добре, я щойно спробував це, і це мені вдалося. Може бути пов’язано з вашими версіями.
slm

1
Це працює, лише якщо ваше репо не вимагає автентифікації для читання вашого підмодуля git.
Ернст Кушке

@ErnstKuschke - Я вважаю, що Дженкінс може отримати ключ SSH, щоб він також міг взаємодіяти з репозиторіями, які вимагають авторизації.
slm

29

Чи знаєте ви, що ваше сховище 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 .


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,

11

Схоже, я знайшов рішення:

Я додав крок збірки для виконання наступних команд оболонки:

git submodule foreach git checkout master
git submodule foreach git pull

Після того, як ви виконаєте ці команди, можливо, вам доведеться зробити коміт у суперпроекті, оскільки HEAD у ваших підмодулях буде оновлено.
slacy

Привіт, Бен, ти міг би поділитися своїм рішенням трохи детальніше? Я хочу зробити те саме. Крім того, лише для підтвердження, ваше рішення підмодуль git оновить підмодулі проекту у WORKSPACE, так?
Кім Стек

немає набагато більше деталей, ніж це. Я щойно додав ці 2 рядки до мого процесу збірки, і він завжди тягне останню версію підмодуля.
Бен

10
Як каже @sti в іншій відповіді тут, здається, ви намагаєтесь використовувати підмодулі Git, такі як зовнішні SVN. Замість того, щоб додавати ці команди до Дженкінса, було б краще зафіксувати відповідні версії підмодулів для вашого основного репозиторію Git. Потім Дженкінс завжди перевіряє ту саму версію підмодулів під час створення певної версії вашого проекту. Відтворювані збірки - це добре.
Коді Кастерлайн,

4
@ben Я натрапив на цю команду, яка може виявитися вам більш корисною, особливо, якщо ви не використовуєте головну гілку в підмодулі git submodule update --init --recursive
Корі Скотт,

7

Якщо ви використовуєте модуль Jenkins Git, ви можете встановити для нього "Видалити робочу область перед збіркою", таким чином він завжди отримуватиме правильний підмодуль.


2

Я використовую сценарій конвеєризації з плагіном checkout. Якщо ви хочете, щоб підмодулі були такими ж, як у вашому сховищі, просто вимкніть параметр trackSubmodules таким чином:

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']]])
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.