I sottomoduli Git non si aggiornano nella build di Jenkins


86

Ho un sottomodulo in un progetto a Jenkins. Ho abilitato l'impostazione avanzata per aggiornare in modo ricorsivo i sottomoduli.

Quando eseguo la build, vedo che l'area di lavoro contiene i file dal sottomodulo. Il problema è che sembra essere la prima revisione del sottomodulo. Quando eseguo il push delle modifiche (repository ospitato su GitHub), Jenkins non sembra aggiornare il sottomodulo per ottenere le modifiche giuste. Qualcuno l'ha mai visto?

Risposte:


98

Tieni presente che il plug-in Git 2.0 di Jenkins avrà "comportamenti avanzati dei sottomoduli", che dovrebbero garantire gli aggiornamenti corretti dei sottomoduli:

git 2.0

Come commentato da vikramvi:

Advanced sub-modules behavior> " Path of the reference repo to use during submodule update" in questo campo, aggiungi l'URL del sottomodulo git.

Sentiero


Owen B menziona nei commenti :

Per il problema di autenticazione, ora è disponibile l'opzione "Usa credenziali dal telecomando predefinito del repository principale"

Visto qui in JENKINS-20941 :

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


6
Ma come? Potete anche fornire passaggi dettagliati, quali opzioni scegliere? Grazie.
zavié

8
@ zavié Penso che dovresti scegliere "Comportamento avanzato dei sottomoduli" e poi selezionare la casella "Aggiorna ricorsivamente i sottomoduli" che apparirà e fare clic su Salva.
KajMagnus

9
Questo non funziona se stai usando un repository privato.
Erik

1
Ha funzionato perfettamente per me con un repo privato
davegallant

3
Funziona solo se il tuo repository non richiede l'autenticazione per leggere il tuo sottomodulo git. Insetto di Jenkins.
Ernst Kuschke

33

Questo è trattato nella documentazione del plugin Git sul sito di Jenkins nella sezione: sottomoduli ricorsivi .

estratto

Il plugin GIT supporta repository con sottomoduli che a loro volta hanno sottomoduli stessi. Questo deve essere attivato però: in Configurazione lavoro -> Sezione Gestione codice sorgente , Git -> Pulsante Avanzate (sotto Rami da compilare) -> Aggiorna ricorsivamente i sottomoduli .

Esempio

Dalla schermata di configurazione del tuo lavoro, nella sezione Gestione del codice sorgente, fai clic sul pulsante Aggiungi e seleziona "Comportamento avanzato dei sottomoduli".

   s1

                                 s2

Quindi seleziona "Aggiorna ricorsivamente i sottomoduli":

   s3


1
grazie ma questo non ha funzionato nel momento in cui l'ho provato (quasi 2 anni fa)
Ben

@ Ben - OK, ho appena provato e ha funzionato per me. Potrebbe essere correlato alle tue versioni.
slm

1
Funziona solo se il tuo repository non richiede l'autenticazione per leggere il tuo sottomodulo git.
Ernst Kuschke

@ErnstKuschke - Credo che a Jenkins possa essere fornita una chiave SSH in modo che anch'essa possa interagire con i repository che richiedono l'autenticazione.
slm

30

Sei consapevole che il tuo repository Git fa sempre riferimento a una particolare revisione di un sottomodulo? Jenkins non cambierà automaticamente la revisione.

Se vuoi usare una revisione più recente del sottomodulo, devi farlo nel tuo repository Git locale:

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

Quando lo fai in questo modo, Jenkins controllerà la stessa identica revisione del sottomodulo durante la compilazione. Jenkins non decide da solo quale revisione del sottomodulo utilizzare. Questa è la differenza fondamentale tra i sottomoduli Git e gli esterni SVN.

Potresti leggere un buon riferimento sui sottomoduli, ad esempio http://progit.org/book/ch6-6.html .


1
Il collegamento ProGit fornito da @sti non è aggiornato. Penso che questo sia l'equivalente corrente https://git-scm.com/book/en/v2/Git-Tools-Submodules
Stevel

Il collegamento è interrotto (correlato a HTTPS?) - "502 Bad Gateway" .
Peter Mortensen

17

Finalmente sono incappato in un modo per farlo ed è semplice.

Il problema:

Il clone iniziale con credenziali funziona submodulecorrettamente ma la clonazione successiva non riesce con credenziali errate.

  1. Clonazione automatica avanzata del sottomodulo Source Code Management >> Additional Behaviours >> Advanced sub-modules behaviours:: genera un errore di credenziale.
  2. git submodule update --initnella Execute Shellsezione fallisce anche con errore di credenziali.

La soluzione:

Sto usando jenkins-1.574.

  1. Seleziona la Build Environment >> SSH Agentcasella.
  2. Seleziona le credenziali corrette (probabilmente le stesse selezionate nella Source Code Managementsezione
  3. Aggiorna i sottomoduli nella Execute Shellsezione

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

Ecco una schermatainserisci qui la descrizione dell'immagine


3
Non esiste più tale casella di controllo.
adi518

11

Sembra che abbia trovato una soluzione:

Ho aggiunto un passaggio di compilazione per eseguire i seguenti comandi della shell:

git submodule foreach git checkout master
git submodule foreach git pull

Dopo aver eseguito questi comandi, potrebbe essere necessario eseguire il commit nel superprogetto, poiché l'HEAD nei sottomoduli sarà stato aggiornato.
slacy

Ciao Ben, potresti condividere la tua soluzione con un po 'più di dettagli? Voglio fare la stessa cosa. Inoltre, solo per confermare, la tua soluzione git submodule aggiornerà i sottomoduli di un progetto in WORKSPACE, sì?
Kim Stacks

non ci sono molti più dettagli di così. Ho appena aggiunto quelle 2 linee al mio processo di compilazione e tira sempre l'ultima versione del sottomodulo.
Ben

10
Come dice @sti in un'altra risposta qui, sembra che tu stia cercando di utilizzare sottomoduli Git come gli esterni SVN. Invece di aggiungere questi comandi a Jenkins, sarebbe meglio eseguire il commit delle versioni del sottomodulo appropriate nel repository Git principale. Jenkins controllerà sempre la stessa versione dei sottomoduli durante la creazione di una particolare versione del progetto. Le build riproducibili sono una buona cosa.
Cody Casterline

4
@ben Mi sono imbattuto in questo comando che potresti trovare più utile, soprattutto se non stai usando il ramo master nel sottomodulo git submodule update --init --recursive
Corey Scott

7

Se stai usando il modulo Git di Jenkins, puoi impostarlo su "Wipe out workspace before build", in questo modo otterrà sempre il sottomodulo corretto.


2

Sto usando il pipelining con script con il plug-in di checkout. Se vuoi che i sottomoduli siano gli stessi del tuo repository, disattiva semplicemente l'opzione trackingSubmodules in questo modo:

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']]])
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.