Einführung in Jenkins 2 und die Kraft der Pipelines

1. Übersicht

In diesem Artikel werden wir die Verwendung von Pipelines anhand eines Beispiels für die kontinuierliche Lieferung mit Jenkins veranschaulichen.

Wir werden für unser Beispielprojekt eine einfache, aber recht nützliche Pipeline erstellen:

  • Zusammenstellung
  • Einfache statische Analyse (parallel zur Kompilierung)
  • Unit-Tests
  • Integrationstests (parallel zu Unit-Tests)
  • Einsatz

2. Jenkins einrichten

Zunächst müssen wir die neueste stabile Version von Jenkins herunterladen (2.73.3 zum Zeitpunkt des Schreibens dieses Artikels).

Navigieren wir zu dem Ordner, in dem sich unsere Datei befindet, und führen Sie sie mit dem Befehl java -jar jenkins.war aus . Beachten Sie, dass wir Jenkins ohne ein erstes Benutzer-Setup nicht verwenden können.

Nach dem Entsperren von Jenkins mithilfe des vom Administrator generierten Kennworts müssen wir die Profilinformationen des ersten Administrators eingeben und alle empfohlenen Plugins installieren.

Jetzt haben wir eine neue Installation von Jenkins zur Verwendung bereit.

Alle verfügbaren Versionen von Jenkins finden Sie hier.

3. Pipelines

Jenkins 2 verfügt über eine großartige Funktion namens Pipelines , die sehr erweiterbar ist, wenn wir eine kontinuierliche Integrationsumgebung für ein Projekt definieren müssen.

Eine Pipeline ist eine weitere Möglichkeit, einige Jenkins-Schritte mithilfe von Code zu definieren und den Prozess der Bereitstellung von Software zu automatisieren.

Es wird eine domänenspezifische Sprache (DSL) mit zwei verschiedenen Syntaxen verwendet:

  • Deklarative Pipeline
  • Skript-Pipeline

In unseren Beispielen verwenden wir die Scripted Pipeline, die einem zwingenderen Programmiermodell folgt, das mit Groovy erstellt wurde .

Lassen Sie uns einige Eigenschaften des Pipeline- Plugins durchgehen :

  • Pipelines werden in eine Textdatei geschrieben und als Code behandelt. Dies bedeutet, dass sie zur Versionskontrolle hinzugefügt und später geändert werden können
  • Sie bleiben nach dem Neustart des Jenkins-Servers erhalten
  • Wir können optional Pipelines anhalten
  • Sie unterstützen komplexe Anforderungen wie die parallele Ausführung von Arbeiten
  • Das Pipeline-Plugin kann auch erweitert oder in andere Plugins integriert werden

Mit anderen Worten, das Einrichten eines Pipeline-Projekts bedeutet das Schreiben eines Skripts, das nacheinander einige Schritte des Prozesses ausführt, den wir ausführen möchten.

Um Pipelines verwenden zu können, müssen wir das Pipeline-Plugin installieren , mit dem einfache und komplexe Automatisierungen erstellt werden können.

Optional können Sie auch die Pipeline-Phasenansicht verwenden, sodass beim Ausführen eines Builds alle von uns konfigurierten Phasen angezeigt werden.

4. Ein kurzes Beispiel

In unserem Beispiel verwenden wir eine kleine Spring Boot-Anwendung. Anschließend erstellen wir eine Pipeline, die das Projekt klont, erstellt, mehrere Tests ausführt und anschließend die Anwendung ausführt.

Lassen Sie uns die Plugins Checkstyle , Static Analysis Collector und JUnit installieren , die jeweils zum Sammeln von Checkstyle- Ergebnissen nützlich sind, ein kombiniertes Analysediagramm der Testberichte erstellen und erfolgreich ausgeführte und fehlgeschlagene Tests veranschaulichen.

Lassen Sie uns zunächst den Grund für Checkstyle hier verstehen: Es ist ein Entwicklungstool, mit dem Programmierer besseren Java-Code nach anerkannten und bekannten Standards schreiben können.

Static Analysis Collector ist ein Add-On, das verschiedene Analyseergebnisse sammelt und die Ergebnisse in einem kombinierten Trenddiagramm druckt. Darüber hinaus bietet das Plug-In basierend auf diesen gruppierten Ergebnissen Integritätsberichte und Build-Stabilität.

Schließlich bietet das JUnit- Plugin einen Herausgeber, der XML-Testberichte verwendet, die während der Erstellung generiert wurden, und detaillierte und aussagekräftige Informationen zu den Tests eines Projekts ausgibt.

Wir werden Checkstyle auch in der pom.xml unserer Anwendung konfigurieren :

 org.apache.maven.plugins maven-checkstyle-plugin 2.17 

5. Erstellen eines Pipeline-Skripts

Zuerst müssen wir einen neuen Jenkins-Job erstellen. Stellen Sie sicher, dass Sie Pipeline als Typ auswählen, bevor Sie auf die Schaltfläche OK klicken, wie in diesem Screenshot beschrieben:

Auf dem nächsten Bildschirm können wir weitere Details zu den verschiedenen Schritten unseres Jenkins-Jobs eingeben, z. B. Beschreibung , Auslöser und einige erweiterte Projektoptionen:

Lassen Sie uns in den wichtigsten und wichtigsten Teil dieser Art von Arbeit eintauchen, indem Sie auf die Registerkarte Pipeline klicken .

Wählen Sie dann für die Definition das Pipeline-Skript aus und aktivieren Sie die Option Groovy Sandbox verwenden.

Hier ist das Arbeitsskript für eine Unix-Umgebung:

node { stage 'Clone the project' git '//github.com/eugenp/tutorials.git' dir('spring-jenkins-pipeline') { stage("Compilation and Analysis") { parallel 'Compilation': { sh "./mvnw clean install -DskipTests" }, 'Static Analysis': { stage("Checkstyle") { sh "./mvnw checkstyle:checkstyle" step([$class: 'CheckStylePublisher', canRunOnFailed: true, defaultEncoding: '', healthy: '100', pattern: '**/target/checkstyle-result.xml', unHealthy: '90', useStableBuildAsReference: true ]) } } } stage("Tests and Deployment") { parallel 'Unit tests': { stage("Runing unit tests") { try { sh "./mvnw test -Punit" } catch(err) { step([$class: 'JUnitResultArchiver', testResults: '**/target/surefire-reports/TEST-*UnitTest.xml']) throw err } step([$class: 'JUnitResultArchiver', testResults: '**/target/surefire-reports/TEST-*UnitTest.xml']) } }, 'Integration tests': { stage("Runing integration tests") { try { sh "./mvnw test -Pintegration" } catch(err) { step([$class: 'JUnitResultArchiver', testResults: '**/target/surefire-reports/TEST-' + '*IntegrationTest.xml']) throw err } step([$class: 'JUnitResultArchiver', testResults: '**/target/surefire-reports/TEST-' + '*IntegrationTest.xml']) } } stage("Staging") { sh "pid=\$(lsof -i:8989 -t); kill -TERM \$pid " + "|| kill -KILL \$pid" withEnv(['JENKINS_NODE_COOKIE=dontkill']) { sh 'nohup ./mvnw spring-boot:run -Dserver.port=8989 &' } } } } }

Zuerst klonen wir das Repository von GitHub und ändern dann das Verzeichnis in unser Projekt, das Spring-Jenkins-Pipeline heißt.

Als nächstes haben wir das Projekt kompiliert und die Checkstyle- Analyse parallel angewendet.

Der folgende Schritt stellt eine parallele Ausführung von Komponententests und Integrationstests und die anschließende Bereitstellung der App dar.

Parallelität wird verwendet, um die Pipeline zu optimieren und den Job schneller auszuführen. In Jenkins ist es eine bewährte Methode, gleichzeitig einige unabhängige Aktionen auszuführen, die viel Zeit in Anspruch nehmen können.

Zum Beispiel haben wir in einem realen Projekt normalerweise viele Unit- und Integrationstests, die länger dauern können.

Beachten Sie, dass bei einem fehlgeschlagenen Test das BUILD ebenfalls als FEHLGESCHLAGEN markiert wird und die Bereitstellung nicht erfolgt.

Außerdem verwenden wir JENKINS_NODE_COOKIE , um ein sofortiges Herunterfahren unserer Anwendung zu verhindern, wenn die Pipeline das Ende erreicht.

Überprüfen Sie das GitHub-Repository, um zu sehen, wie ein allgemeineres Skript auf anderen Systemen funktioniert.

6. Analysebericht

Nachdem wir den Job erstellt haben, speichern wir unser Skript und klicken auf "Jetzt erstellen" auf der Startseite unseres Jenkins-Dashboards.

Hier ist eine Übersicht über die Builds:

Etwas weiter unten finden Sie die Bühnenansicht der Pipeline mit dem Ergebnis jeder Etappe:

Auf jede Ausgabe kann zugegriffen werden, wenn Sie den Mauszeiger über eine Stufenzelle bewegen und auf die Schaltfläche Protokolle klicken , um die in diesem Schritt gedruckten Protokollnachrichten anzuzeigen.

We can also find more details of the code analysis. Let's click on the desired build from the Build History on the right menu and hit Checkstyle Warnings.

Here we see 60 high priority warnings browsable by clicking:

The Details tab displays pieces of information that highlight warnings and enable the developer to understand the causes behind them.

In the same way, the full test report is accessible by clicking on Test Result link. Let's see the results of the com.baeldung package:

Here we can see each test file with its duration and status.

7. Conclusion

In diesem Artikel haben wir eine einfache Umgebung für die kontinuierliche Bereitstellung eingerichtet, in der statische Code-Analysen und Testberichte in Jenkins über einen Pipeline- Job ausgeführt und angezeigt werden .

Wie immer finden Sie den Quellcode für diesen Artikel auf GitHub.