Jenkins derlemesinde Git alt modülleri güncellenmiyor


86

Jenkins'teki bir projede bir alt modülüm var. Alt modülleri yinelemeli olarak güncellemek için gelişmiş ayarı etkinleştirdim.

Yapıyı çalıştırdığımda, çalışma alanının alt modüldeki dosyalara sahip olduğunu görüyorum. Sorun şu ki, alt modülün ilk revizyonu gibi görünüyor. Değişiklikleri gönderdiğimde (GitHub'da barındırılan depo) Jenkins, doğru değişiklikleri almak için alt modülü güncellemiyor gibi görünüyor. Bunu gören oldu mu?

Yanıtlar:


98

O Not 2.0 eklentisi Jenkins Git Altmodüllerin uygun güncellemelerini sağlamalıdır olan "avans alt modülü davranışlar" sahip olacaktır:

git 2.0

Gibi yorumladı tarafından vikramvi:

Advanced sub-modules behavior> " Path of the reference repo to use during submodule update" bu alana karşı, git url alt modülünü ekleyin.

Yol


Owen B yorumlarda şöyle diyor :

Kimlik doğrulama sorunu için artık "Ana deponun varsayılan uzaktan kumandasından kimlik bilgilerini kullan" seçeneği var

JENKINS-20941'de burada görülüyor :

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


6
Ama nasıl? Hangi seçenekleri seçeceğiniz konusunda ayrıntılı adımlar da sağlayabilir misiniz? Teşekkürler.
zavié

8
@ zavié "Gelişmiş alt modül davranışı" nı seçmeniz ve ardından görünecek olan "Alt modülleri yinelemeli olarak güncelle" onay kutusunu işaretlemeniz ve Kaydet'e tıklamanız gerektiğini düşünüyorum.
KajMagnus

9
Özel bir depo kullanıyorsanız bu pek işe yaramaz.
Erik

1
Özel bir
depoyla

3
Bu, yalnızca deponuz git alt modülünüzü okumak için kimlik doğrulaması gerektirmiyorsa çalışır. Jenkins hatası.
Ernst Kuschke

33

Bu, Jenkins sitesinde, Yinelemeli alt modüller bölümünün altındaki Git Eklentisi belgelerinde ele alınmıştır .

alıntı

GIT eklentisi, alt modülleri olan depoları destekler. Ancak bu açık olmalıdır: İş Yapılandırması -> Bölüm Kaynak Kodu Yönetimi , Git -> Gelişmiş Düğme (oluşturulacak Dallar altında) -> Alt modülleri yinelemeli olarak güncelleyin .

Misal

İşinizin yapılandırma ekranından Kaynak Kod Yönetimi bölümünde, Ekle düğmesini aşağı çekin "Gelişmiş alt modül davranışı" nı seçin.

   s1

                                 s2

Ardından "Alt modülleri yinelemeli olarak güncelle" yi seçin:

   s3


1
teşekkür ederim ama bunu denediğimde (neredeyse 2 yıl önce) bu işe yaramadı
Ben

@Ben - Tamam, bunu denedim ve benim için çalıştı. Sürümlerinizle ilgili olabilir.
slm

1
Bu yalnızca deponuz git alt modülünüzü okumak için kimlik doğrulaması gerektirmiyorsa çalışır.
Ernst Kuschke

@ErnstKuschke - Ben, Jenkins'e bir SSH anahtarı verilebileceğine inanıyorum, böylece yetkilendirme gerektiren depolarla etkileşime girebilir.
slm

30

Git deponuzun her zaman bir alt modülün belirli bir revizyonuna başvurduğunun farkında mısınız ? Jenkins, revizyonu otomatik olarak değiştirmeyecek.

Alt modülün daha yeni bir revizyonunu kullanıma almak istiyorsanız, bunu yerel Git deponuzda yapmanız gerekir:

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

Bunu böyle yaptığınızda, Jenkins derleme sırasında alt modülün aynı revizyonunu kontrol edecektir. Jenkins, alt modülün hangi revizyonunu kullanacağına kendi başına karar vermez. Bu, Git alt modülleri ile SVN harici modülleri arasındaki temel farktır.

Alt modüller hakkında iyi bir referans okumak isteyebilirsiniz, örneğin http://progit.org/book/ch6-6.html .


1
@Sti'nin verdiği ProGit bağlantısı güncel değil. Bunun şu anki eşdeğeri olduğunu düşünüyorum https://git-scm.com/book/en/v2/Git-Tools-Submodules
Stevel

Bağlantı bozuk (HTTPS ile ilgili mi?) - "502 Hatalı Ağ Geçidi" .
Peter Mortensen

17

Sonunda bunu yapmanın bir yolunu buldum ve çok basit.

Sorun:

Kimlik bilgilerine sahip ilk klon iyi çalışıyor, ancak sonraki submoduleklonlama yanlış kimlik bilgileriyle başarısız oluyor.

  1. Otomatik gelişmiş alt modül klonlama:: Source Code Management >> Additional Behaviours >> Advanced sub-modules behaviourskimlik bilgisi hatasına neden olur.
  2. git submodule update --initiçinde Execute Shellbölüm de kimlik bilgileri hata ile başarısız olur.

Çözüm:

Kullanıyorum jenkins-1.574.

  1. Kontrol Build Environment >> SSH Agentkutusu.
  2. Doğru kimlik bilgilerini seçin (muhtemelen Source Code Managementbölümde seçilenle aynıdır)
  3. Güncelleme altmodüller Execute Shellbölümünde

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

İşte bir ekran görüntüsügörüntü açıklamasını buraya girin


3
Artık böyle bir onay kutusu yok.
adi518

11

Görünüşe göre bir çözüm buldum:

Aşağıdaki kabuk komutlarını çalıştırmak için bir yapı adımı ekledim:

git submodule foreach git checkout master
git submodule foreach git pull

Bu komutları uyguladıktan sonra, alt modüllerinizdeki HEAD güncellenmiş olacağından, süper projede işlem yapmanız gerekebilir.
slacy

Merhaba Ben, çözümünüzü biraz daha detaylı paylaşır mısınız? Ben de aynı şeyi yapmak istiyorum. Ayrıca, sadece onaylamak için, çözümünüz git alt modülü bir projenin alt modüllerini ÇALIŞMA ALANI'na güncelleyecektir, evet?
Kim Yığınları

bundan çok daha fazla detay yok. Bu 2 satırı derleme sürecime ekledim ve her zaman alt modülün en son sürümünü çekiyor.
Ben

10
@Sti'nin burada başka bir yanıtta söylediği gibi, SVN dış modülleri gibi Git alt modüllerini kullanmaya çalışıyorsunuz gibi görünüyor. Bu komutları Jenkins'e eklemek yerine, uygun alt modül versiyonlarını ana Git deponuza işlemek daha iyi olacaktır. Daha sonra Jenkins, projenizin belirli bir sürümünü oluştururken her zaman alt modüllerin aynı sürümünü kontrol edecektir. Tekrarlanabilir yapılar iyi bir şeydir.
Cody Casterline

4
@ben Özellikle alt modülde ana dalı kullanmıyorsanız daha yararlı bulabileceğiniz bu komutla karşılaştım git submodule update --init --recursive
Corey Scott

7

Jenkins Git modülünü kullanıyorsanız, bunu "Derlemeden önce çalışma alanını sil" olarak ayarlayabilirsiniz, bu şekilde her zaman doğru alt modülü alır.


2

Kontrol eklentisi ile komut dizili ardışık düzen kullanıyorum. Alt modüllerin deponuzdakiyle aynı olmasını istiyorsanız, aşağıdaki gibi izleme alt modülleri seçeneğini kapatmanız yeterlidir:

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']]])
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.