Ich bin gerade dabei, mehrere Repositorys in ein einziges Repository zu konvertieren. Unser bevorzugtes CI-Tool ist Jenkins, da mehrere Repository-Strukturen in ein einziges konvertiert wurden. 2 Hauptprobleme sind aufgetreten.
Die Build- / Testzeiten haben sich erheblich erhöht, da alle Builds / Tests für jedes einzelne Commit ausgeführt werden müssen. Dies wird teilweise durch die Verwendung eines Build-Tools behoben. In unserem Fall haben wir Buck verwendet.
Nachdem alle mit dem festgeschriebenen Code verknüpften Tests ausgeführt wurden, habe ich für jedes Projekt eine Jenkins-Bereitstellungsdatei. Wie kann ich die Jenkins-Dateien nur für Projekte auslösen, die erneut bereitgestellt werden müssen? Und wenn ich dazu in der Lage bin, ist das eine richtige Praxis ?
quelle
Antworten:
Holen Sie sich eine Liste der geänderten Dateien und bestimmen Sie anhand dieser Liste , welche Tests ausgeführt werden sollen.
Laden Sie zur Laufzeit externe Groovy-Skripte , um Ihre Bereitstellungen auszuführen.
quelle
Sie können den " when " -Block in Kombination mit der integrierten "Changeset" -Bedingung verwenden, um nur bestimmte Phasen der Pipeline Ihres Monorepo bedingt auszuführen. Aus der Dokumentation zu when.changeset:
Changeset - Führt die Phase aus, wenn das SCM-Changeset des Builds eine oder mehrere Dateien enthält, die der angegebenen Zeichenfolge oder dem angegebenen Glob entsprechen. Beispiel: wenn {Änderungssatz "** / *. Js"}
Hier ist ein Beispiel für eine Jenkins-Datei mit dieser Strategie:
, anwendbar auf die unten gezeigte Monorepo-Projektstruktur:
Diese Strategie lässt sich nicht über kleine Codebasen hinaus skalieren, da es schwierig ist, zu verfolgen, welche Module voneinander abhängig sind. Sie sollten ein Build-System wie Bazel verwenden. Ihr CI-Job würde einfach einen Bazel-Build // ... (alles erstellen) ausgeben, und Bazel würde berechnen, was tatsächlich erstellt und was getestet werden muss. Darüber hinaus gibt es sogar Bazel-Regeln wie rules_docker und rules_k8s, mit denen berechnet werden kann, welche Ihrer Container neu erstellt und in eine Containerregistrierung verschoben werden müssen und welche Ihrer Anwendungen erneut in Kubernetes bereitgestellt werden müssen.
quelle