Kasse mehrere Git-Repos in denselben Jenkins-Arbeitsbereich

126

Verwenden von Jenkins 1.501 und Jenkins Git Plugin 1.1.26

Ich habe 3 verschiedene Git-Repos mit jeweils mehreren Projekten.

Jetzt muss ich alle Projekte aus den 3 Git Repos in den gleichen Arbeitsbereich auf einem Jenkins Slave auschecken. Ich habe jedes Git-Repo definiert in: Quellcodeverwaltung: Mehrere SCMs . Jedes Mal, wenn ein Repo ausgecheckt wird, wird das vorherige Repo (und die zugehörigen Projekte) gelöscht.

Ich habe folgendes gelesen:

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

aber es hilft nicht wirklich. Ich habe versucht, denselben Ordner im lokalen Unterverzeichnis für Repo (optional) für alle Repos anzugeben, aber es gibt das gleiche Ergebnis.

Wenn dies mit Jenkins einfach unmöglich ist, könnten einige vorgefertigte Schritte / Skripte verwendet werden, um die Projekte an den richtigen Ort zu verschieben. Es ist keine Option, die Build-Konfiguration der Projekte zu ändern.

u123
quelle

Antworten:

67

Das Auschecken von mehr als einem Repo gleichzeitig in einem einzelnen Arbeitsbereich ist mit dem Jenkins + Git Plugin nicht möglich.

Um dieses Problem zu umgehen, können Sie entweder mehrere Upstream-Jobs haben, die jeweils ein einzelnes Repo auschecken und dann in Ihren endgültigen Projektarbeitsbereich kopieren (auf mehreren Ebenen problematisch), oder Sie können einen Shell-Scripting-Schritt einrichten, in dem jedes erforderliche Repo ausgecheckt wird der Jobarbeitsbereich zur Erstellungszeit.

Früher konnte das Multiple SCM-Plugin bei diesem Problem helfen, aber es ist jetzt veraltet. Auf der Plugin-Seite für mehrere SCMs : "Benutzer sollten zu https://wiki.jenkins-ci.org/display/JENKINS/Pipeline+Plugin migrieren . Die Pipeline bietet eine bessere Möglichkeit zum Auschecken mehrerer SCMs und wird von Jenkins unterstützt Kernentwicklungsteam. "

CIGuy
quelle
Warum ist der erste Ansatz problematisch? Die Aufteilung von Arbeitsplätzen scheint eine gute Praxis zu sein.
CurtainDog
1
Dies ist im Allgemeinen eine gute Vorgehensweise, aber wenn Sie mehrere Kassen am selben Standort benötigen, wird die Wartung zu einem großen Problem. Wenn Sie beispielsweise einen Zweigstellenaufbau erstellen möchten, müssen Sie 4 Jobs klonen und dann die Pfade für jeden einzeln ändern. Es gibt natürlich Plugins, die dabei helfen, aber es ist einfacher, von einem einzelnen Job aus zu einem relativen Pfad zu wechseln. Dann können Sie so viel klonen, wie Sie möchten, ohne die Einstellungen zu ändern.
CIGuy
1
Sie müssen die richtige Antwort ändern, da sie nicht mehr relevant ist.
Dvir669
2
Für Pipelines müssen Sie ein neues DSL lernen, was für den sehr einfachen Job (Code aus mehreren Repositorys auschecken), den wir möchten, etwas zu viel ist. Halten Sie sich an das Multiple SCM-Plugin, bis eine anständige Benutzeroberfläche um die Jenkins-Pipeline DSL angezeigt wird. Ich kann berichten, dass es mit Jenkins 2.17
Burak Arslan
2
Ich bin gerade auf die gleichen Probleme mit mehreren Repos gestoßen. Ich benutze jetzt das Pipeline-Plugin, obwohl ich in Bezug auf das neue DSL genauso skeptisch war wie @BurakArslan. Es ist eigentlich nicht so schlimm wie ich dachte und kommt mit einem einigermaßen anständigen Snippet-Generator. Nachdem ich es nur 2 Stunden lang verwendet habe, bevorzuge ich jetzt diesen Ansatz, da ich die Pipeline-Build-Skripte schließlich zusammen mit dem Rest des Codes für Git festlegen kann.
Ben
81

Mit dem Multiple SCMs Plugin:

  • Erstellen Sie einen anderen Repository-Eintrag für jedes Repository, das Sie auschecken müssen (Hauptprojekt oder Abhängigkeitsprojekt).

  • Suchen Sie für jedes Projekt im Menü "Erweitert" (im zweiten Menü "Erweitert" gibt es zwei Schaltflächen mit der Bezeichnung "Erweitert" für jedes Repository) das Textfeld "Lokales Unterverzeichnis für Repo (optional)". Dort können Sie das Unterverzeichnis im Verzeichnis "Arbeitsbereich" angeben, in das Sie das Projekt kopieren möchten. Sie könnten das Dateisystem meines Entwicklungscomputers zuordnen.

Das "zweite erweiterte Menü" existiert nicht mehr. Stattdessen müssen Sie die Schaltfläche "Hinzufügen" (im Abschnitt "Zusätzliche Verhaltensweisen") verwenden und "In ein Unterverzeichnis auschecken" auswählen.

  • Wenn Sie ant verwenden, wie jetzt die Datei build.xml mit den Build-Zielen nicht im Stammverzeichnis des Arbeitsbereichs, sondern in einem Unterverzeichnis, müssen Sie dies in der Konfiguration "Ant aufrufen" berücksichtigen. Drücken Sie dazu unter "Ant aufrufen" auf "Erweitert" und geben Sie den Eingabetext "Datei erstellen" ein, einschließlich des Namens des Unterverzeichnisses, in dem sich die Datei build.xml befindet.

Hoffentlich hilft das.

GaRRaPeTa
quelle
3
Dies muss veraltet sein. Zum Zeitpunkt des Schreibens des Plugins für mehrere SCMs enthält das GIT-Snippet keinen optionalen Unterpfad.
AlexeiOst
12
In jedem Repository gibt es eine Dropdown-Liste mit dem Namen "Hinzufügen". Darin finden Sie die Option "In ein Unterverzeichnis auschecken", die dasselbe ausführt.
Gary Ye
1
Ich bin Ihrer Anleitung mit dem mehrfachen SCM-Plugin und Git gefolgt, aber ich habe ein anderes lustiges Problem. Es scheint nicht wollen, dass derselbe Zweig (Entwicklung) für verschiedene Repositorys richtig ausgecheckt werden soll. Es wird versucht, ein Commit per Hash auszuchecken (was nur im ersten Repository gültig ist). Irgendeine Idee, wie man das angeht?
Lefteris
Das größte Problem bei mehreren SCM-Plugins ist das folgende: "Post-Commit-Typ-Trigger funktionieren derzeit nicht (zumindest für Subversion), daher ist es erforderlich, die Abfrage vom Typ" Cron "zu konfigurieren."
Grayaii
1
Für Pipelines müssen Sie ein neues DSL lernen, was für den sehr einfachen Job (Code aus mehreren Repositorys auschecken), den wir möchten, etwas zu viel ist. Halten Sie sich an das Multiple SCM-Plugin, bis eine anständige Benutzeroberfläche um die Jenkins-Pipeline DSL angezeigt wird. Ich kann berichten, dass es mit Jenkins 2.17
Burak Arslan
40

Da Multiple SCMs Plugin veraltet ist.

Mit Jenkins Pipeline ist es möglich, mehrere Git-Repos auszuchecken und nach dem Erstellen mit 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/)
  }
}
}

Möglicherweise möchten Sie die Verwendung von Git-Submodulen anstelle einer benutzerdefinierten Pipeline wie dieser in Betracht ziehen .

Joker
quelle
Danke dir!!! Der dirBlock ist der Schlüssel, ich konnte nicht herausfinden, warum ich nur das zuletzt geklonte Repo im Arbeitsbereich meines Jobs sah.
Bonh
Wie wird der Begriff "Änderungen" bei mehreren SCMs berücksichtigt? Ist es nur die Summe der Änderungen, die von allen Repos gesehen wurden, die die Jobs ausmachen? Wäre gut, wenn möglich, sie von jedem aufzulisten, 23 changes from repo XXX, 3 changes from repo YYYoder etwas kompakteres in dieser Richtung.
Jxramos
20

Ich habe das Multiple SCMs Plugin in Verbindung mit dem Git Plugin erfolgreich mit Jenkins verwendet.

Frederik Deweerdt
quelle
3
danke, das ist großartig, ich kann 2 Bitbucket-Pfade in den Repository-Bereich einfügen, und wie kann ich nun dem Zweig "Entwickeln" von Repo 1 Checkout und dem Zweig "Fixes" von Repo 2 Checkout mitteilen? Ich sehe die Zweige, um einen Teil in Jenkins zu erstellen. Wie kann ich den Repository-Namen und Refsec im Zweig-Bezeichner einrichten (leer für 'any'), damit jeder den entsprechenden Zweig überprüfen kann, den ich möchte? oder ich mache es falsch und ich sollte auf den Booleschen Wert klicken, der "Mehrere SCMs" sagt?
Pelos
@pelos Konnten Sie die Lösung finden?
Govind
Im Moment verwenden wir die yml-Datei nicht und haben die zwei verschiedenen Workflows mit den regulären Aufgaben ausgeführt
pelos
5

Abhängig von den Beziehungen der Repositorys besteht ein anderer Ansatz darin, das andere Repository (Repositorys) als Git-Submodule zu einem der Repositorys hinzuzufügen . Ein Git-Submodul erstellt einen Verweis auf die anderen Repos. Diese Submodul-Repos werden nur geklont, wenn Sie --recursivebeim Klonen des "Superprojekts" das Flag angeben. (offizieller Begriff) .

Hier ist der Befehl zum Hinzufügen eines Submoduls zum aktuellen Projekt:

git submodule add <repository URI path to clone>

Wir verwenden Jenkins v1.645 und das Git-SCM erstellt sofort einen rekursiven Klon für Superprojekte. Voila Sie erhalten die Superprojektdateien und alle abhängigen (Submodul-) Repodateien in ihren jeweiligen Verzeichnissen im selben Jenkins-Jobarbeitsbereich.

Nicht dafür bürgen, dass dies der richtige Ansatz ist, sondern ein Ansatz.

mikehwang
quelle
5

Jenkins: Multiple SCM - veraltet. GIT Plugin - funktioniert nicht für mehrere Repos.

Scripting / Pipeline als Code - ist der richtige Weg.

AKS
quelle
2

Ich hatte auch dieses Problem. Ich habe es mit Trigger / Call Builds für andere Projekte gelöst. Für jedes Repository rufe ich das Downstream-Projekt mit Parametern auf.

Hauptprojekt:

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

Dann rufe ich für jedes Repository ein nachgeschaltetes Projekt wie folgt auf:

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

Downstream-Projekt: 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} 
Torbjörn Gard
quelle
1

Das Auschecken von mehr als einem Repo gleichzeitig in einem einzelnen Arbeitsbereich ist möglich mit Jenkins + Git Plugin (vielleicht nur in neueren Versionen?).

Wählen Sie im Abschnitt "Source-Code-Management" nicht "Git", sondern "Multiple SCMs" und fügen Sie mehrere Git-Repositorys hinzu.

Stellen Sie sicher, dass Sie in allen außer einem als "Zusätzliches Verhalten" die Aktion "In ein Unterverzeichnis auschecken" hinzufügen und ein einzelnes Unterverzeichnis angeben.

JRA_TLL
quelle
Ich glaube, auf diese Weise verwenden Sie das (veraltete) Multiple SCM-Plugin anstelle des Vanilla Git-Plugins.
Robert
0

Wir verwenden Git-Repo , um unsere mehreren GIT-Repositorys zu verwalten. Es gibt auch ein Jenkins Repo-Plugin , mit dem Sie alle oder einen Teil der von git-repo verwalteten Repositorys im selben Jenkins-Jobarbeitsbereich auschecken können.

vladisld
quelle
Wie genau lösen Sie das in dieser Frage gestellte Problem? Ich habe das von Ihnen erwähnte Plugin installiert und über Repo und das Plugin gelesen, aber ich kann nicht sehen, wie Jenkins so eingerichtet wird, dass zwei Repos
geklont werden
Um Repo verwenden zu können, muss ein spezielles Repository erstellt werden, das nur die Manifestdatei (en) enthält. In dieser Datei geben Sie alle Informationen zu anderen Repositorys an. Das genaue Format der Manifestdateien ist in der Datei docs / manifest-format.txt des Git-Repo-Projekts ( gerrit.googlesource.com/git-repo/+/master/docs/… ) beschrieben. Bei der Konfiguration des Jenkins Repo-Teils des Jobs geben Sie den Speicherort des 'Manifest'-Repositorys und optional den Namen der' Manifest'-Dateien an (möglicherweise haben Sie mehrere). Alle im Manifest angegebenen Repositorys werden geklont.
Vladisld