Jenkins-Konfiguration für Monorepos

Jenkins-Konfiguration für Monorepos

Autor-Bild
von Sven Woltmann – 28. August 2020

Im Artikel "Monorepos – Vor- und Nachteile" habe ich Vor- und Nachteile von Monorepos gegenübergestellt. Monorepo-Kritiker führen gerne an, dass Monorepos die Build-Pipeline komplizierter machen.

In diesem Artikel zeige ich, dass das nicht der Fall sein muss!

Ich zeige dir, Schritt für Schritt, wie man Jenkins konfiguriert, um ein Teilprojekt eines Git-Monorepos zu bauen.

Beispiel-Projekt

Ich beschränke mich auf einen rudimentären Jenkins-Job, der ein einfaches Maven-Projekt aus einem Unterverzeichnis des main-Branches des Monorepos auscheckt und compiliert.

Das Beispiel-Projekt findest du in diesem GitHub-Repository.

Zusätzliche Features wie die Auswahl eines Branches oder das Erstellen und Taggen eines Releases sind nicht Monorepo-spezifisch und würden den Rahmen dieses Artikels sprengen. Ich verweise stattdessen auf mein Jenkins-Tutorial zu Build- und Release-Jobs.

Im nächsten Abschnitt liest du, wie du einen Monorepo-Jenkins-Job über das User Interface anlegst. Der darauf folgende Abschnitt zeigt, wie du das Projekt mittels Jenkins Job DSL als Code schreiben kannst.

Monorepo-Jenkins-Job über das User Interface konfigurieren

Lege zunächst einen neuen Maven-Job an und gebe ihm einen Namen, z. B. "Sparse Checkout Demo". Im "General"-Tab kannst du eine kurze Beschreibung eintragen:

Git-Monorepo in Jenkins konfigurieren - Allgemeine Einstellungen
Git-Monorepo in Jenkins konfigurieren – Allgemeine Einstellungen

Unter "Source Code Management" wählst du "Git" und gibst das Repository an, z. B. https://github.com/SvenWoltmann/sparse-checkout-demo.git (du kannst dieses Repo gerne zum Testen verwenden). Als Branch Specifier trägst du "main" ein.

Klicke unter "Additional Behaviours" auf "Add" ("Hinzufügen" in der deutschen Version) und wähle "Sparse Checkout paths" aus. Als Pfad gibst du z. B. "project-a/" an (eines der zwei Projektverzeichnisse im Demo-Monorepo).

Klicke ein zweites Mal auf "Add" und wähle "Polling ignores commits in certain paths" aus. Unter "Included Regions" gibst du noch einmal das Projektverzeichnis an, also "project-a/" im Beispiel. Diese Einstellung bewirkt, dass der Job nur dann ausgeführt wird, wenn Dateien im Projektverzeichnis geändert wurden.

Git-Monorepo in Jenkins konfigurieren – Source Code Management
Git-Monorepo in Jenkins konfigurieren – Source Code Management

Schließlich trägst du unter "Build" als Root POM ("Stamm-POM" in der deutschen Jenkins-Version) die pom.xml-Datei des Projektverzeichnisses an (im Beispiel: "project-a/pom.xml") sowie das Maven Goal "clean install":

Git-Monorepo in Jenkins konfigurieren - Build
Git-Monorepo in Jenkins konfigurieren – Build

Damit ist die Job-Konfiguration abgeschlossen, und der Job kann ausgeführt werden.

Monorepo-Jenkins-Job als Code (Jenkins Job DSL)

Dieser Abschnitt zeigt, wie du den gleichen Job als Code schreiben kannst. Grundsätzlich empfehle ich immer die Code-Variante, da du so mit wenig Aufwand einheitliche Jobs für alle deine Prokjekte automatisiert und reproduzierbar erstellen kannst.

Eine tiefergehende Einführung in das Thema Jenkins-Job als Code findest du in meinem Jenkins-Job-DSL-Tutorial.

Stelle zunächst sicher, dass in deiner Jenkins-Installation das Job-DSL-Plugin installiert ist.

Dann erstellst du ein neues "Freestyle-Projekt", legst einen Build-Step "Process Job DSLs" an und trägst den folgenden Code ein:

mavenJob('Sparse Checkout Demo') { description 'This is a demo for building a project in a sub-directory of a Git Monorepo.' def sparseCheckoutPath = 'project-a' scm { git { remote { name 'origin' url 'https://github.com/SvenWoltmann/sparse-checkout-demo.git' } branch 'main' configure { git -> git / 'extensions' / 'hudson.plugins.git.extensions.impl.SparseCheckoutPaths' / 'sparseCheckoutPaths' { 'hudson.plugins.git.extensions.impl.SparseCheckoutPath' { path "$sparseCheckoutPath/" } } git / 'extensions' / 'hudson.plugins.git.extensions.impl.PathRestriction' { includedRegions "$sparseCheckoutPath/.*" } } } } rootPOM "$sparseCheckoutPath/pom.xml" goals 'clean install' }
Code-Sprache: Groovy (groovy)

Den Sparse Checkout Path und den Polling-Filter musst du hierbei über sogenannte "Extensions" konfigurieren, da die Jenkins Job DSL diese (durch das Git-Plugin hinzugefügten) Features nicht nativ unterstützt.

Fazit

Dieser Artikel hat gezeigt, wie du einen Jenkins-Job konfigurierst, der ein Teilprojekt eines Monorepos baut. Tiefergehende Informationen zu Jenkins findest du in meinem Jenkins-Tutorial.

Wenn dir der Artikel gefallen hat, teile ihn gerne über einen der Share-Buttons und hinterlasse mir einen Kommentar: Welche Erfahrungen hast du mit Monorepos gemacht? Teilst du meine Einschätzung der Vor- und Nachteile?

Möchtest du informiert werden, wenn neue Artikel auf HappyCoders.eu veröffentlicht werden? Dann klicke hier, um dich für den HappyCoders.eu-Newsletter anzumelden.