Was ist Jenkins? Der CI-Server erklärt

Jenkins bietet eine einfache Möglichkeit, eine CI / CD-Umgebung (Continuous Integration oder Continuous Delivery) für nahezu jede Kombination von Sprachen und Quellcode-Repositorys mithilfe von Pipelines einzurichten und andere Routineentwicklungsaufgaben zu automatisieren. Jenkins macht das Erstellen von Skripten für einzelne Schritte nicht überflüssig, bietet Ihnen jedoch eine schnellere und robustere Möglichkeit, Ihre gesamte Kette von Build-, Test- und Bereitstellungstools zu integrieren, als Sie selbst erstellen können.

"Brechen Sie nicht den nächtlichen Bau!" ist eine Grundregel in Softwareentwicklungsgeschäften, die jeden Morgen eine frisch erstellte Produktversion für ihre Tester veröffentlichen. Vor Jenkins war das Beste, was ein Entwickler tun konnte, um eine Unterbrechung des nächtlichen Builds zu vermeiden, das sorgfältige Erstellen und Testen auf einem lokalen Computer, bevor der Code festgeschrieben wurde. Aber das bedeutete, die eigenen Veränderungen isoliert zu testen, ohne die täglichen Verpflichtungen aller anderen. Es gab keine feste Garantie dafür, dass der nächtliche Bau das Engagement überleben würde.

Jenkins - ursprünglich Hudson - war eine direkte Antwort auf diese Einschränkung.

Hudson und Jenkins

Im Jahr 2004 war Kohsuke Kawaguchi Java-Entwickler bei Sun. Kawaguchi hatte es satt, Builds in seiner Entwicklungsarbeit zu brechen, und wollte einen Weg finden, um zu wissen, ob der Code funktionieren würde, bevor er Code in das Repository übertrug. Deshalb baute Kawaguchi in und für Java einen Automatisierungsserver namens Hudson, um dies zu ermöglichen. Hudson wurde bei Sun populär und verbreitete sich als Open Source auf andere Unternehmen.

Der schnelle Vorlauf bis 2011 und ein Streit zwischen Oracle (das Sun übernommen hatte) und der unabhängigen Open-Source-Community von Hudson führten zu einer Gabelung mit einer Namensänderung, Jenkins. 2014 wurde Kawaguchi CTO von CloudBees, das auf Jenkins basierende Produkte für die kontinuierliche Lieferung anbietet.

Beide Gabeln existierten weiter, obwohl Jenkins viel aktiver war. Das Jenkins-Projekt ist heute noch aktiv. Die Hudson-Website wurde am 31. Januar 2020 geschlossen.

Im März 2019 startete die Linux Foundation zusammen mit CloudBees, Google und einer Reihe anderer Unternehmen eine neue Open-Source-Software-Stiftung namens Continuous Delivery Foundation (CDF). Jenkins Mitwirkende beschlossen, dass ihr Projekt dieser neuen Stiftung beitreten sollte. Kawaguchi schrieb damals, dass sich für die Benutzer nichts von Bedeutung ändern würde.

Im Januar 2020 gab Kawaguchi bekannt, dass er zu seinem neuen Startup Launchable wechseln werde. Er sagte auch, dass er offiziell von Jenkins zurücktreten würde, obwohl er im Technical Oversight Committee der Continuous Delivery Foundation bleiben und seine Rolle bei CloudBees zu einem Berater wechseln würde.

Zugehöriges Video: So liefern Sie Code mit CI / CD schneller

Jenkins Automatisierung

Heute ist Jenkins der führende Open-Source-Automatisierungsserver mit rund 1.600 Plug-Ins, die die Automatisierung aller Arten von Entwicklungsaufgaben unterstützen. Das Problem, das Kawaguchi ursprünglich zu lösen versuchte, die kontinuierliche Integration und kontinuierliche Bereitstellung von Java-Code (dh Erstellen von Projekten, Ausführen von Tests, Analysieren statischen Codes und Bereitstellen), ist nur einer von vielen Prozessen, die Menschen mit Jenkins automatisieren. Diese 1.600 Plug-Ins umfassen fünf Bereiche: Plattformen, Benutzeroberfläche, Verwaltung, Quellcodeverwaltung und am häufigsten Buildverwaltung.

Wie Jenkins funktioniert

Jenkins wird als WAR-Archiv und als Installationspakete für die wichtigsten Betriebssysteme, als Homebrew-Paket, als Docker-Image und als Quellcode vertrieben. Der Quellcode ist hauptsächlich Java mit einigen Groovy-, Ruby- und Antlr-Dateien.

Sie können Jenkins WAR eigenständig oder als Servlet auf einem Java-Anwendungsserver wie Tomcat ausführen. In beiden Fällen wird eine Webbenutzeroberfläche erstellt und Aufrufe der REST-API akzeptiert.

Wenn Sie Jenkins zum ersten Mal ausführen, wird ein Administrator mit einem langen zufälligen Kennwort erstellt, das Sie in die ursprüngliche Webseite einfügen können, um die Installation zu entsperren.

Jenkins Plug-Ins

Nach der Installation können Sie mit Jenkins entweder die Standard-Plugin-Liste akzeptieren oder Ihre eigenen Plugins auswählen.

Wenn Sie Ihre ersten Plug-Ins ausgewählt haben, klicken Sie auf die Schaltfläche Installieren, und Jenkins fügt sie hinzu.

Der Jenkins-Hauptbildschirm zeigt die aktuelle Build-Warteschlange und den Executor-Status an und bietet Links zum Erstellen neuer Elemente (Jobs), Verwalten von Benutzern, Anzeigen von Build-Historien, Verwalten von Jenkins, Anzeigen Ihrer benutzerdefinierten Ansichten und Verwalten Ihrer Anmeldeinformationen.

Ein neues Jenkins-Element kann eine von sechs Arten von Jobs sowie einen Ordner zum Organisieren von Elementen sein.

Auf der Seite Jenkins verwalten können Sie 18 Dinge tun, einschließlich der Option zum Öffnen einer Befehlszeilenschnittstelle. An dieser Stelle sollten wir uns jedoch Pipelines ansehen, bei denen es sich um erweiterte Workflows handelt, die normalerweise durch Skripte definiert werden.

Jenkins Pipelines

Sobald Sie Jenkins konfiguriert haben, ist es Zeit, einige Projekte zu erstellen, die Jenkins für Sie erstellen kann. Während Sie können die Web - Benutzeroberfläche verwenden , Skripte zu erstellen, ist die derzeit beste Praxis eine Pipeline - Skript, mit dem Namen Jenkinsfile zu erstellen , und es in Ihr Repository zu überprüfen. Der folgende Screenshot zeigt das Konfigurations-Webformular für eine Mehrzweig-Pipeline.

Wie Sie sehen können, können Zweigquellen für diese Art von Pipeline in meiner grundlegenden Jenkins-Installation Git- oder Subversion-Repositorys sein, einschließlich GitHub. Wenn Sie andere Arten von Repositorys oder andere Online-Repository-Dienste benötigen, müssen Sie nur die entsprechenden Plug-Ins hinzufügen und Jenkins neu starten. Ich habe es versucht, konnte mir aber kein Quellcode-Management-System (SCM) vorstellen, in dem noch kein Jenkins-Plug-In aufgeführt ist.

Jenkins-Pipelines können deklarativ oder skriptbasiert sein. Eine deklarative Pipeline, die einfachere von beiden, verwendet die Groovy-kompatible Syntax. Wenn Sie möchten, können Sie die Datei mit starten #!groovy, um Ihren Code-Editor in die richtige Richtung zu lenken. Eine deklarative Pipeline beginnt mit einem pipelineBlock, definiert eine agentund definiert stagesdie ausführbare Datei steps, wie im folgenden dreistufigen Beispiel.

Pipeline {

    Agent beliebig

    Stufen {

        Bühne ('Build') {

            Schritte {

                Echo 'Gebäude ..'

            }}

        }}

        Bühne ('Test') {

            Schritte {

                Echo 'Testen ..'

            }}

        }}

        Bühne ('Bereitstellen') {

            Schritte {

                Echo 'Bereitstellen ....'

            }}

        }}

    }}

}}

pipelineist der obligatorische äußere Block zum Aufrufen des Jenkins-Pipeline-Plugins. agentDefiniert, wo Sie die Pipeline ausführen möchten. anysagt, einen verfügbaren Agenten zum Ausführen der Pipeline oder Stufe zu verwenden. Ein spezifischerer Agent kann einen Container für die Verwendung deklarieren, zum Beispiel:

Agent {

    Docker {

        Bild 'Maven: 3-alpin'

        label 'my-defined-label'

        Argumente '-v / tmp: / tmp'

    }}

}}

stageseine Folge von einer oder mehreren Stufenanweisungen enthalten. Im obigen Beispiel sind die drei Phasen Erstellen, Testen und Bereitstellen.

stepsmach die eigentliche Arbeit. Im obigen Beispiel wurden in den Schritten nur Nachrichten gedruckt. Ein nützlicherer Erstellungsschritt könnte folgendermaßen aussehen:

Pipeline {

    Agent beliebig

    Stufen {

        Bühne ('Build') {

            Schritte {

                sh 'machen'

                archiveArtifacts Artefakte: '** / target / *. jar', Fingerabdruck: true

            }}

        }}

    }}

}}

Hier rufen wir makevon einer Shell aus auf und archivieren dann alle produzierten JAR-Dateien im Jenkins-Archiv.

In diesem postAbschnitt werden Aktionen definiert, die am Ende des Pipeline-Laufs oder der Pipeline-Phase ausgeführt werden. Sie können eine Reihe von Post-Zustand Blöcke innerhalb des post - Abschnitt verwenden: always, changed, failure, success, unstable, und aborted.

In der folgenden Jenkins-Datei wird JUnit beispielsweise nach der Testphase immer ausgeführt, es wird jedoch nur dann eine E-Mail gesendet, wenn die Pipeline ausfällt.

Pipeline {

    Agent beliebig

    Stufen {

        Bühne ('Test') {

            Schritte {

                sh 'Scheck machen'

            }}

        }}

    }}

    post {

        immer {

            junit '** / target / *. xml'

        }}

        Fehler {

            Mail an: [email protected], Betreff: 'Die Pipeline ist fehlgeschlagen :('

        }}

    }}

}}

Die deklarative Pipeline kann das meiste ausdrücken, was Sie zum Definieren von Pipelines benötigen, und ist viel einfacher zu erlernen als die Skript-Pipeline-Syntax, bei der es sich um eine Groovy-basierte DSL handelt. Die Skript-Pipeline ist in der Tat eine vollständige Programmierumgebung.

Zum Vergleich sind die folgenden zwei Jenkins-Dateien völlig gleichwertig.

Deklarative Pipeline

Pipeline {

    Agent {Docker 'Knoten: 6.3'}

    Stufen {

        Bühne ('bauen') {

            Schritte {

                sh 'npm - Version'

            }}

        }}

    }}

}} 

Skript-Pipeline

Knoten ('Docker') {

    Kasse scm

    Bühne ('Build') {

        docker.image ('node: 6.3'). inside {

            sh 'npm - Version'

        }}

    }}

}}

Blue Ocean, die Jenkins-GUI

Wenn Sie die neueste und beste Jenkins-Benutzeroberfläche möchten, können Sie das Blue Ocean-Plug-In verwenden, das eine grafische Benutzererfahrung bietet. Sie können das Blue Ocean-Plug-In zu Ihrer vorhandenen Jenkins-Installation hinzufügen oder einen Jenkins / Blue Ocean Docker-Container ausführen. Wenn Blue Ocean installiert ist, verfügt Ihr Jenkins-Hauptmenü über ein zusätzliches Symbol:

Sie können Blue Ocean direkt öffnen, wenn Sie möchten. Es befindet sich im Ordner / blue auf dem Jenkins-Server. Die Pipeline-Erstellung in Blue Ocean ist etwas grafischer als in einfachen Jenkins:

Jenkins Docker

Wie bereits erwähnt, wird Jenkins auch als Docker-Image verteilt. Der Prozess umfasst nicht viel mehr: Sobald Sie den SCM-Typ ausgewählt haben, geben Sie eine URL und Anmeldeinformationen ein, erstellen eine Pipeline aus einem einzelnen Repository oder scannen alle Repositorys in der Organisation. Jeder Zweig mit einer Jenkins-Datei erhält eine Pipeline.

Hier führe ich ein Blue Ocean Docker-Image aus, auf dem einige Git-Service-Plug-Ins installiert sind als in der Standardliste der SCM-Anbieter:

Sobald Sie einige Pipelines betrieben haben, zeigt das Blue Ocean-Plug-In ihren Status an, wie oben gezeigt. Sie können eine einzelne Pipeline vergrößern, um die Stufen und Schritte anzuzeigen:

Sie können auch Zweige (oben) und Aktivitäten (unten) vergrößern:  

- -

Warum Jenkins verwenden?

Das von uns verwendete Jenkins-Pipeline-Plug-In unterstützt einen allgemeinen CICD-Anwendungsfall (Continuous Integration / Continuous Delivery), der wahrscheinlich die häufigste Verwendung für Jenkins ist. Für einige andere Anwendungsfälle gibt es spezielle Überlegungen.

Java-Projekte waren die ursprüngliche Existenzberechtigung von Jenkins. Wir haben bereits gesehen, dass Jenkins das Bauen mit Maven unterstützt. Es funktioniert auch mit Ant, Gradle, JUnit, Nexus und Artifactory.

Android führt eine Art Java aus, führt jedoch die Frage ein, wie auf einer Vielzahl von Android-Geräten getestet werden kann. Mit dem Android-Emulator-Plug-In können Sie so viele emulierte Geräte erstellen und testen, wie Sie definieren möchten. Mit dem Google Play Publisher-Plug-In können Sie Builds zur Veröffentlichung oder weiteren Prüfung auf tatsächlichen Geräten an einen Alpha-Kanal in Google Play senden.

Ich habe Beispiele gezeigt, in denen wir einen Docker-Container als Agenten für eine Pipeline angegeben haben und in denen Jenkins und Blue Ocean in einem Docker-Container ausgeführt wurden. Docker-Container sind in einer Jenkins-Umgebung sehr nützlich, um Geschwindigkeit, Skalierbarkeit und Konsistenz zu verbessern.

Es gibt zwei Hauptanwendungsfälle für Jenkins und GitHub. Eine davon ist die Build-Integration, die einen Service-Hook enthalten kann, der Jenkins bei jedem Commit in Ihr GitHub-Repository auslöst. Die zweite ist die Verwendung der GitHub-Authentifizierung, um den Zugriff auf Jenkins über OAuth zu steuern.

Jenkins unterstützt neben Java viele andere Sprachen. Für C / C ++ gibt es Plug-Ins, mit denen Fehler und Warnungen von der Konsole erfasst, Build-Skripte mit CMake generiert, Komponententests ausgeführt und statische Code-Analysen durchgeführt werden können. Jenkins hat eine Reihe von Integrationen mit PHP-Tools.

Während Python-Code nicht erstellt werden muss (es sei denn, Sie verwenden beispielsweise Cython oder erstellen ein Python-Rad für die Installation), ist es nützlich, dass Jenkins in Python-Test- und Berichterstellungstools wie Nose2 und Pytest sowie die Codequalität integriert ist Werkzeuge wie Pylint. In ähnlicher Weise lässt sich Jenkins in Ruby-Tools wie Rake, Cucumber, Brakeman und CI :: Reporter integrieren.

Jenkins für CI / CD

Insgesamt bietet Jenkins eine einfache Möglichkeit, eine CI / CD-Umgebung für nahezu jede Kombination von Sprachen und Quellcode-Repositorys mithilfe von Pipelines einzurichten und eine Reihe anderer Routineentwicklungsaufgaben zu automatisieren. Jenkins macht das Erstellen von Skripten für einzelne Schritte nicht überflüssig, bietet Ihnen jedoch eine schnellere und robustere Möglichkeit, Ihre gesamte Kette von Build-, Test- und Bereitstellungstools zu integrieren, als Sie es einfach selbst erstellen könnten.