Acquista più repository git nello stesso spazio di lavoro di Jenkins


127

Utilizzo di Jenkins 1.501 e Jenkins Git plugin 1.1.26

Ho 3 diversi repository git ciascuno con più progetti.

Ora devo controllare tutti i progetti dai repository git 3 nello stesso spazio di lavoro su uno slave Jenkins. Ho definito ogni repository git in: Gestione del codice sorgente: più SCM . Ma ogni volta che viene verificato un repository, il repository precedente (e i relativi progetti associati) viene eliminato.

Ho letto questo:

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

ma non aiuta davvero. Ho provato a specificare la stessa cartella nella sottodirectory Local per repository (opzionale) per tutti i repository ma dà lo stesso risultato.

Se questo è semplicemente impossibile usando Jenkins, suppongo che alcuni passaggi / script pre-compilati potrebbero essere usati per spostare i progetti nella giusta posizione. Non è un'opzione per modificare la configurazione di build dei progetti.

Risposte:


69

Con Jenkins + Git Plugin non è possibile controllare più di un repository alla volta in un unico spazio di lavoro.

Per ovviare al problema, è possibile disporre di più processi upstream che eseguono il checkout di un singolo repository ciascuno e quindi copiarli nell'area di lavoro finale del progetto (Problema su un numero di livelli), oppure è possibile impostare un passaggio di script della shell che verifica ogni repository necessario per l'area di lavoro del lavoro al momento della creazione.

In precedenza il plug-in SCM multiplo poteva aiutare con questo problema, ma ora è obsoleto. Dalla pagina del plug-in SCM multiplo: "Gli utenti dovrebbero migrare su https://wiki.jenkins-ci.org/display/JENKINS/Pipeline+Plugin . Pipeline offre un modo migliore di estrarre più SCM ed è supportato da Jenkins core team di sviluppo ".


Perché il primo approccio è problematico? Suddividere i lavori sembra una buona pratica.
CurtainDog

1
È una buona pratica in generale, ma quando sono necessari più checkout nella stessa posizione fisica, la manutenzione diventa una grande preoccupazione. Ad esempio, se si desidera creare una build del ramo, è necessario clonare 4 lavori e quindi modificare singolarmente i percorsi per ognuno. Ovviamente ci sono plugin per aiutare in questo, ma è più semplice fare il checkout su un percorso relativo da un singolo lavoro. Quindi puoi clonare quanto vuoi senza cambiare le impostazioni.
CIGuy

1
Devi cambiarlo dalla risposta corretta in quanto non è più rilevante.
Dvir669,

2
Le pipeline richiedono di imparare un nuovo DSL, che è un po 'troppo per il lavoro molto semplice (controlla il codice da più repository) che vogliamo che faccia. Attenersi al plug-in SCM multiplo fino a quando non appare una GUI decente attorno alla DSL della pipeline Jenkins. Posso riferire che ha funzionato bene con Jenkins 2.17
Burak Arslan,

2
Ho appena incontrato gli stessi problemi con più repository. Ora sto usando il plug-in Pipeline anche se ero scettico quanto @BurakArslan riguardo al nuovo DSL. In realtà non è così male come pensavo e viene fornito con un generatore di snippet ragionevolmente decente. Dopo averlo usato solo per 2 ore, ora preferisco questo approccio, poiché alla fine posso eseguire il commit degli script di compilazione della pipeline da eseguire insieme al resto del codice.
Ben

81

Con il plug-in SCM multipli:

  • creare una voce di repository diversa per ciascun repository necessario per il checkout (progetto principale o progetto di dipendenza.

  • per ogni progetto, nel menu "avanzato" (il secondo menu "avanzato", ci sono due pulsanti etichettati "avanzato" per ciascun repository), trova il campo di testo "Sottodirectory locale per repository (opzionale)". È possibile specificare lì la sottodirectory nella directory "area di lavoro" in cui si desidera copiare il progetto. Potresti mappare il filesystem del mio computer di sviluppo.

Il "secondo menu avanzato" non esiste più, invece è necessario utilizzare il pulsante "Aggiungi" (nella sezione "Comportamenti aggiuntivi") e scegliere "Esegui il checkout in una sottodirectory"

  • se si utilizza ant, come ora il file build.xml con le destinazioni di compilazione non si trova nella directory principale dell'area di lavoro ma in una sottodirectory, è necessario rifletterlo nella configurazione "Invoke Ant". Per fare ciò, in "Invoca formica", premi "Avanzate" e compila il testo di input "Build file", incluso il nome della sottodirectory in cui si trova build.xml.

Spero che aiuti.


3
Questo deve essere obsoleto. Al momento della stesura del frammento GIT del plug-in SCM multiplo non è presente il percorso secondario opzionale.
Alexei il

12
In ogni repository c'è un elenco a discesa chiamato "Aggiungi". In esso puoi trovare l'opzione "Acquista in una sottodirectory", che esegue lo stesso.
Gary Ye,

1
Ho seguito la tua guida con il plugin SCM multiplo e git ma ho un altro problema divertente. Sembra non voler controllare correttamente lo stesso ramo (sviluppare) per diversi repository. Prova a eseguire il checkout di un commit tramite hash (che è valido solo nel primo repository). Qualche idea su come affrontare questo?
Lefteris,

Il problema più grande con più plug-in SCM è questo: "I trigger di tipo post-commit non funzionano attualmente (almeno per la sovversione), quindi è necessario configurare il polling di tipo" cron "."
grayaii,

1
Le pipeline richiedono di imparare un nuovo DSL, che è un po 'troppo per il lavoro molto semplice (controlla il codice da più repository) che vogliamo che faccia. Attenersi al plug-in SCM multiplo fino a quando non appare una GUI decente attorno alla DSL della pipeline Jenkins. Posso riferire che ha funzionato bene con Jenkins 2.17
Burak Arslan,

41

Poiché il plug-in SCM multipli è obsoleto.

Con Jenkins Pipeline è possibile effettuare il checkout di più repository git e dopo averlo creato usando 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/)
  }
}
}

Potresti prendere in considerazione l'utilizzo di sottomoduli git invece di una pipeline personalizzata come questa.


Grazie!!! Il dirblocco è fondamentale, non riuscivo a capire perché stavo vedendo solo il repository clonato più recente nell'area di lavoro del mio lavoro.
bonh,

come viene considerata la nozione di "cambiamenti" nell'ambito di più SCM? È solo la somma dei cambiamenti visti da tutti i repository che compongono i lavori? Sarebbe bello distinguerli da ciascuno, se possibile, 23 changes from repo XXX, 3 changes from repo YYYo qualcosa di più compatto lungo quelle linee.
jxramos,

20

Ho usato il plug- in SCM multipli insieme al plug-in Git con successo con Jenkins.


3
grazie è fantastico, sono in grado di inserire 2 percorsi bitbucket nella sezione repository, e ora come posso dire al ramo "sviluppo" di repo 1 checkout e per il ramo "correzioni" di repo 2? vedo i rami per creare una porzione in jenkins, come posso impostare il nome del repository e Refsec nell'identificatore di ramo (vuoto per 'qualsiasi') in modo che ognuno possa controllare il ramo corrispondente che voglio? o lo sto facendo e non dovrei fare clic sul valore booleano che dice "Multiple SCMs"?
pelos,

@pelos Sei riuscito a trovare la soluzione?
Govind

al momento non stiamo usando il file yml e abbiamo fatto i due diversi flussi di lavoro con le normali attività
pelos

5

A seconda delle relazioni dei repository, un altro approccio consiste nell'aggiungere l'altro repository (repository) come sottomoduli git a uno dei repository. Un sottomodulo git crea un riferimento agli altri repository. Quei repository del sottomodulo non vengono clonati a meno che non si specifichi il--recursive bandiera durante la clonazione del "superprogetto" (termine ufficiale).

Ecco il comando per aggiungere un sottomodulo al progetto corrente:

git submodule add <repository URI path to clone>

Stiamo usando Jenkins v1.645 e git SCM eseguirà immediatamente un clone ricorsivo per i superprogetti. Voilà si ottengono i file superproject e tutti i file repo dipendenti (sottomodulo) nelle rispettive directory nello stesso spazio di lavoro Jenkins.

Non garantendo che questo è l' approccio corretto , piuttosto è un approccio.


5

Jenkins: SCM multiplo - obsoleto. GIT Plugin - non funziona per più repository.

Scripting / pipeline come codice - è la strada da percorrere.


2

Ho avuto anche questo problema. Ho risolto usando Trigger / call build su altri progetti. Per ogni repository chiamo il progetto downstream usando parametri.

Progetto principale:

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

Quindi per ogni repository chiamo un progetto a valle come questo:

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

Progetto a valle: 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

Check-out più di un pronti contro termine alla volta in un unico spazio di lavoro è possibile con Jenkins + Git Plugin (forse solo nelle versioni più recenti?).

Nella sezione "Gestione del codice sorgente", non selezionare "Git", ma "Multiple SCMs" e aggiungere diversi repository git.

Assicurati che in tutti tranne uno aggiungi come "Comportamento aggiuntivo" l'azione "Verifica in una sottodirectory" e specifica una singola sottodirectory.


Credo in questo modo che tu stia utilizzando il plug-in SCM multiplo (obsoleto) anziché il plug-in Git vaniglia.
Robert

0

Stiamo usando git-repo per gestire i nostri repository GIT multipli. Esiste anche un plug-in Jenkins Repo che consente di effettuare il checkout di tutti o parte dei repository gestiti da git-repo nello stesso spazio di lavoro Jenkins.


Come risolvi esattamente il problema posto in questa domanda? Ho installato il plug-in che hai citato e letto sul repository e sul plug-in, ma non riesco a vedere come configurare Jenkins per clonare due repository da eseguire in un progetto ...
GreenAsJade

Per utilizzare Repo, è necessario creare il repository speciale che conterrà solo i file manifest. In questo file si specificano tutte le informazioni su altri repository. Il formato esatto dei file manifest è descritto nel file docs / manifest-format.txt del progetto git-repo ( gerrit.googlesource.com/git-repo/+/master/docs/… ). Quando si configura Jenkins Repo parte del lavoro, si specifica la posizione del repository 'manifest' e facoltativamente il nome dei file 'manifest' (si possono avere diversi). Tutti i repository specificati nel manifest verranno clonati.
Vladisld,
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.