Auslösen spezifischer Pipeline-Builds für Monorepos in Jenkins

11

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.

  1. 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.

  2. 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 ?

YellowPillow
quelle
Wie werden Ihre Build-Hooks implementiert? Fragen Sie das Repository mit Jenkins ab? Haben Sie bei jedem Commit Git-Hooks?
PrestonM
Wir haben Githooks bei jedem Commit
YellowPillow

Antworten:

2
  1. Holen Sie sich eine Liste der geänderten Dateien und bestimmen Sie anhand dieser Liste , welche Tests ausgeführt werden sollen.

  2. Laden Sie zur Laufzeit externe Groovy-Skripte , um Ihre Bereitstellungen auszuführen.

jayhendren
quelle
Bitte kopieren Sie die relevanten Bits aus dem Link und veröffentlichen Sie sie in einem Anführungszeichenblock, um zu verhindern, dass Informationen verloren gehen, wenn der Link veraltet ist. Vielleicht könnten Sie auch Ihre persönliche Meinung hinzufügen: Welche Option würden Sie wählen und warum?
030
8

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:

pipeline {
    agent any
    stages {
        stage('build matchengine') {
            when {
                changeset "**/matchengine/*.*"
            }
            steps {
                echo 'building match engine'
            }
        }
        stage('build posttrade') {
            when {
                changeset "**/posttrade/*.*"
            }
            steps {
                echo 'building post trade'
            }
        }
    }
}

, anwendbar auf die unten gezeigte Monorepo-Projektstruktur:

 .(my-project)
   |-- Jenkinsfile
   |-- matchengine
   |-- posttrade
   |-- serverless
   |-- ui

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.

mancini0
quelle
Leider enthält das Änderungsset nicht alle Änderungen aus Änderungsanforderungen, sondern nur das Delta zwischen den letzten beiden Festschreibungen. Benutzerdefinierte Überprüfungen können jedoch einfach implementiert werden.
Kirtul