Einrichten von Continuous Integration Pipelines in Jenkins unter Ubuntu 16.04

Einführung

Jenkins ist ein Open Source-Automatisierungsserver zur Automatisierung sich wiederholender technischer Aufgaben bei der kontinuierlichen Integration und Bereitstellung von Software. Mit einem robusten Ökosystem aus Plugins und umfassender Unterstützung kann Jenkins eine Vielzahl von Workloads verarbeiten, um Anwendungen zu erstellen, zu testen und bereitzustellen.

In früheren Anleitungen haben wirinstalled Jenkins on an Ubuntu 16.04 server undconfigured Jenkins with SSL using an Nginx reverse proxy. In diesem Handbuch wird gezeigt, wie Sie Jenkins so einrichten, dass eine Anwendung automatisch getestet wird, wenn Änderungen in ein Repository übertragen werden.

In diesem Tutorial werden wir Jenkins in GitHub integrieren, damit Jenkins benachrichtigt wird, wenn neuer Code in das Repository verschoben wird. Wenn Jenkins benachrichtigt wird, wird der Code ausgecheckt und anschließend in Docker-Containern getestet, um die Testumgebung vom Jenkins-Hostcomputer zu isolieren. Wir werden eine Beispielanwendung von Node.js verwenden, um zu zeigen, wie der CI / CD-Prozess für ein Projekt definiert wird.

Voraussetzungen

Um diesem Handbuch folgen zu können, benötigen Sie einen Ubuntu 16.04-Server mit mindestens 1 GB RAM, der mit einer sicheren Jenkins-Installation konfiguriert wurde. Um das Webinterface ordnungsgemäß zu sichern, müssen Sie dem Jenkins-Server einen Domainnamen zuweisen. Befolgen Sie diese Anleitungen, um zu erfahren, wie Sie Jenkins im erwarteten Format einrichten:

Um unsere Testumgebung optimal zu steuern, werden die Tests unserer Anwendung in Docker-Containern ausgeführt. Installieren Sie Docker nach dem Start von Jenkins auf dem Server, indem Sie die Schritte eins und zwei dieses Handbuchs ausführen:

Wenn Sie die obigen Anleitungen ausgefüllt haben, können Sie mit diesem Artikel fortfahren.

Fügen Sie den Jenkins-Benutzer der Docker-Gruppe hinzu

Nachdem Sie die Voraussetzungen erfüllt haben, werden sowohl Jenkins als auch Docker auf Ihrem Server installiert. Standardmäßig kann der Linux-Benutzer, der für die Ausführung des Jenkins-Prozesses verantwortlich ist, jedoch nicht auf Docker zugreifen.

Um dies zu beheben, müssen wir den Benutzerjenkinsmit dem Befehlusermod zur Gruppedockerhinzufügen:

sudo usermod -aG docker jenkins

Sie können die Mitglieder der Gruppedockerauflisten, um zu bestätigen, dass der Benutzerjenkinserfolgreich hinzugefügt wurde:

grep docker /etc/group
Outputdocker:x:999:sammy,jenkins

Damit die Jenkins ihre neue Mitgliedschaft verwenden können, müssen Sie den Prozess neu starten:

sudo systemctl restart jenkins

Mithilfe einiger Standard-Plugins, die wir während der Installation aktiviert haben, kann Jenkins jetzt Docker zum Ausführen von Build- und Testaufgaben verwenden.

Erstellen Sie ein persönliches Zugriffstoken in GitHub

Damit Jenkins Ihre GitHub-Projekte ansehen kann, müssen Sie in unserem GitHub-Konto ein persönliches Zugriffstoken erstellen.

Besuchen Sie zunächstGitHub und melden Sie sich in Ihrem Konto an, falls Sie dies noch nicht getan haben. Klicken Sie anschließend oben rechts auf Ihr Benutzersymbol und wählen SieSettings aus dem Dropdown-Menü aus:

GitHub settings item

Suchen Sie auf der folgenden Seite den AbschnittDeveloper settings im linken Menü und klicken Sie aufPersonal access tokens:

GitHub personal access tokens link

Klicken Sie auf der nächsten Seite auf die SchaltflächeGenerate new token:

GitHub generate new token button

Sie werden zu einer Seite weitergeleitet, auf der Sie den Bereich für Ihr neues Token definieren können.

Fügen Sie im FeldToken description eine Beschreibung hinzu, mit der Sie sie später erkennen können:

GitHub token description

Aktivieren Sie im AbschnittSelect scopes die Kontrollkästchenrepo:status,repo:public_repo undadmin:org_hook. Auf diese Weise kann Jenkins den Commit-Status aktualisieren und Webhooks für das Projekt erstellen. Wenn Sie ein privates Repository verwenden, müssen Sie anstelle der Repo-Unterelemente die allgemeine Berechtigungrepoauswählen:

GitHub token scope

Wenn Sie fertig sind, klicken Sie unten aufGenerate token.

Sie werden zurück zur Indexseite für persönliche Zugriffstoken geleitet und Ihr neues Token wird angezeigt:

GitHub view new token

Kopieren Sie das Token jetzt, damit wir später darauf verweisen können. Wie aus der Meldung hervorgeht, kann das Token nach dem Verlassen dieser Seite nicht mehr abgerufen werden.

[.note] #Note: Wie im obigen Screenshot erwähnt, gibt es aus Sicherheitsgründen keine Möglichkeit, das Token erneut anzuzeigen, sobald Sie diese Seite verlassen. Wenn Sie Ihr Token verlieren, löschen Sie das aktuelle Token aus Ihrem GitHub-Konto und erstellen Sie ein neues.
#

Nachdem Sie ein persönliches Zugriffstoken für Ihr GitHub-Konto haben, können wir Jenkins so konfigurieren, dass das Repository Ihres Projekts überwacht wird.

Fügen Sie den GitHub Personal Access Token zu Jenkins hinzu

Nachdem wir ein Token haben, müssen wir es unserem Jenkins-Server hinzufügen, damit er automatisch Webhooks einrichten kann. Melden Sie sich bei Ihrer Jenkins-Weboberfläche mit dem Administratorkonto an, das Sie während der Installation konfiguriert haben.

Klicken Sie im Haupt-Dashboard im linken Menü aufCredentials:

Jenkins credentials item

Klicken Sie auf der nächsten Seite auf den Pfeil neben(global) innerhalb des Bereichs vonJenkins. Klicken Sie im angezeigten Feld aufAdd credentials:

Jenkins add credentials button

Sie werden zu einem Formular weitergeleitet, in dem Sie neue Anmeldeinformationen hinzufügen können.

Wählen Sie im Dropdown-MenüKind die OptionSecret text aus. Fügen Sie im FeldSecret Ihr persönliches GitHub-Zugriffstoken ein. Füllen Sie das FeldDescriptionaus, damit Sie diesen Eintrag zu einem späteren Zeitpunkt identifizieren können. Sie können den Bereich als global und das ID-Feld leer lassen:

Jenkins credentials form

Klicken Sie auf die SchaltflächeOK, wenn Sie fertig sind.

Sie können jetzt auf diese Anmeldeinformationen aus anderen Teilen von Jenkins verweisen, um die Konfiguration zu erleichtern.

Richten Sie Jenkins Access to GitHub ein

Klicken Sie im Haupt-Dashboard von Jenkins im linken Menü aufManage Jenkins:

Jenkins credentials item

Klicken Sie in der Liste der Links auf der folgenden Seite aufConfigure System:

Jenkins configure system link

Scrollen Sie durch die Optionen auf der nächsten Seite, bis Sie den AbschnittGitHub finden. Klicken Sie auf die SchaltflächeAdd GitHub Server und wählen Sie dannGitHub Server aus:

Jenkins add GitHub server

Der Abschnitt wird erweitert, um zusätzliche Informationen einzugeben. Wählen Sie im Dropdown-MenüCredentials Ihr persönliches GitHub-Zugriffstoken aus, das Sie im letzten Abschnitt hinzugefügt haben:

Jenkins select GitHub credentials

Klicken Sie auf die SchaltflächeTest connection. Jenkins ruft eine Test-API für Ihr Konto auf und überprüft die Konnektivität:

Jenkins test GitHub credentials

Wenn Sie fertig sind, klicken Sie auf die SchaltflächeSave, um Ihre Änderungen zu übernehmen.

Richten Sie die Demo-Anwendung in Ihrem GitHub-Konto ein

Um zu demonstrieren, wie Jenkins zum Testen einer Anwendung verwendet wird, verwenden wir einfache“hello world” program, die mitHapi.js erstellt wurden. Da wir Jenkins so einrichten, dass es auf Pushs an das Repository reagiert, benötigen Sie eine eigene Kopie des Demo-Codes.

Besuchen Sie dieproject repository und klicken Sie auf die SchaltflächeFork in der oberen rechten Ecke, um eine Kopie des Repositorys in Ihrem Konto zu erstellen:

Fork example project

Eine Kopie des Repositorys wird Ihrem Konto hinzugefügt.

Das Repository enthält einepackage.json-Datei, die die Laufzeit- und Entwicklungsabhängigkeiten sowie die Ausführung der enthaltenen Testsuite definiert. Die Abhängigkeiten können durch Ausführen vonnpm install installiert werden, und die Tests können mitnpm test ausgeführt werden.

Wir haben dem Repo auch einJenkinsfile hinzugefügt. Jenkins liest diese Datei, um die Aktionen zu ermitteln, die für das Repository ausgeführt werden müssen, um es zu erstellen, zu testen oder bereitzustellen. Es wird mit der deklarativen Version der JenkinsPipeline DSL geschrieben.

Die im Repository vonhello-hapienthaltenenJenkinsfile sehen folgendermaßen aus:

Jenkinsfile

#!/usr/bin/env groovy

pipeline {

    agent {
        docker {
            image 'node'
            args '-u root'
        }
    }

    stages {
        stage('Build') {
            steps {
                echo 'Building...'
                sh 'npm install'
            }
        }
        stage('Test') {
            steps {
                echo 'Testing...'
                sh 'npm test'
            }
        }
    }
}

Daspipeline enthält die gesamte Definition, die Jenkins auswerten wird. Im Inneren befindet sich ein Abschnittagent, der angibt, wo die Aktionen in der Pipeline ausgeführt werden. Um unsere Umgebungen vom Hostsystem zu isolieren, werden wir in Docker-Containern testen, die vom Agentendockerangegeben werden.

Da Hapi.js ein Framework für Node.js ist, verwenden wir das Docker-Image vonnodeals Basis. Wir geben den Benutzerroot im Container an, damit der Benutzer gleichzeitig sowohl auf das angehängte Volume mit dem ausgecheckten Code als auch auf das Volume schreiben kann, auf das das Skript seine Ausgabe schreibt.

Als nächstes definiert die Datei zwei Phasen, die nur logische Arbeitsteile sind. Wir haben den ersten "Build" und den zweiten "Test" genannt. Der Erstellungsschritt druckt eine Diagnosemeldung und führt dannnpm install aus, um die erforderlichen Abhängigkeiten zu erhalten. Der Testschritt druckt eine weitere Nachricht und führt dann die Tests aus, wie in der Dateipackage.jsondefiniert.

Nachdem Sie ein Repository mit einem gültigenJenkinsfile haben, können wir Jenkins so einrichten, dass es dieses Repository überwacht und die Datei ausführt, wenn Änderungen vorgenommen werden.

Erstellen Sie eine neue Pipeline in Jenkins

Als nächstes können wir Jenkins so einrichten, dass er den persönlichen Zugriffstoken von GitHub verwendet, um unser Repository zu überwachen.

Klicken Sie im Haupt-Dashboard von Jenkins im linken Menü aufNew Item:

Jenkins side menu

Geben Sie im FeldEnter an item nameeinen Namen für Ihre neue Pipeline ein. Wählen Sie anschließendPipeline als Elementtyp aus:

Jenkins pipeline type

Klicken Sie unten auf die SchaltflächeOK, um fortzufahren.

Aktivieren Sie im nächsten Bildschirm das KontrollkästchenGitHub project. Geben Sie im angezeigten FeldProject url die GitHub-Repository-URL Ihres Projekts ein.

[.note] #Note: Stellen Sie sicher, dass Sie auf Ihre Abzweigung der Hello Hapi-Anwendung zeigen, damit Jenkins die Berechtigung zum Konfigurieren von Webhooks hat.
#

Jenkins add GitHub project

Aktivieren Sie als Nächstes im AbschnittBuild Triggers das KontrollkästchenGitHub hook trigger for GITScm polling:

Jenkins GitHub hook box

Im AbschnittPipeline müssen wir Jenkins anweisen, die inJenkinsfile definierte Pipeline in unserem Repository auszuführen. Ändern Sie den TypDefinition inPipeline script from SCM.

Wählen Sie im neuen AbschnittGit im MenüSCM aus. Geben Sie im angezeigten FeldRepository URL erneut die URL zu Ihrer Verzweigung des Repositorys ein:

[.note] #Note: Stellen Sie erneut sicher, dass Sie auf Ihre Abzweigung der Hello Hapi-Anwendung zeigen.
#

Jenkins GitHub add pipeline repository

[.note] #Note: In unserem Beispiel wird aufJenkinsfile verwiesen, die in einem öffentlichen Repository verfügbar sind. Wenn Ihr Projekt nicht öffentlich zugänglich ist, müssen Sie die Schaltflächeadd credentials verwenden, um zusätzlichen Zugriff auf das Repository hinzuzufügen. Sie können ein persönliches Zugriffstoken hinzufügen, wie wir es zuvor mit der Hooks-Konfiguration getan haben.
#

Wenn Sie fertig sind, klicken Sie unten auf der Seite auf die SchaltflächeSave.

Durchführen eines ersten Builds und Konfigurieren der Webhooks

Zum Zeitpunkt dieses Schreibens (Juni 2017) konfiguriert Jenkins Webhooks nicht automatisch, wenn Sie die Pipeline für das Repository in der Schnittstelle definieren.

Um Jenkins zum Einrichten der entsprechenden Hooks zu veranlassen, müssen wir beim ersten Mal eine manuelle Erstellung durchführen.

Klicken Sie auf der Hauptseite Ihrer Pipeline im linken Menü aufBuild Now:

Jenkins build pipeline now

Ein neuer Build wird geplant. Im FeldBuild History in der unteren linken Ecke sollte in Kürze ein neuer Build angezeigt werden. Zusätzlich wird im Hauptbereich der Schnittstelle einStage View gezeichnet. Dadurch wird der Fortschritt Ihres Testlaufs nach Abschluss der verschiedenen Phasen verfolgt:

Jenkins build progress

Klicken Sie im FeldBuild History auf die dem Build zugeordnete Nummer, um zur Build-Detailseite zu gelangen. Von hier aus können Sie im linken Menü auf die SchaltflächeConsole Output klicken, um Details zu den ausgeführten Schritten anzuzeigen:

Jenkins console output

Klicken Sie im Menü auf der linken Seite auf das ElementBack to Project, wenn Sie fertig sind, um zur Hauptansicht der Pipeline zurückzukehren.

Nachdem wir das Projekt einmal erstellt haben, kann Jenkins die Webhooks für unser Projekt erstellen. Klicken Sie im linken Menü der Pipeline aufConfigure:

Jenkins configure item

Auf diesem Bildschirm sind keine Änderungen erforderlich. Klicken Sie einfach unten auf die SchaltflächeSave. Jetzt, da die Jenkins Informationen über das Projekt vom ersten Erstellungsprozess an haben, registriert sie beim Speichern der Seite einen Webhook bei unserem GitHub-Projekt.

Sie können dies überprüfen, indem Sie in Ihrem GitHub-Repository auf die SchaltflächeSettings klicken. Klicken Sie auf der nächsten Seite im Seitenmenü aufWebhooks. Sie sollten Ihren Jenkins-Server-Webhook in der Hauptoberfläche sehen:

Jenkins view webhooks

Wenn Sie nun neue Änderungen an Ihrem Repository vornehmen, wird Jenkins benachrichtigt. Anschließend wird der neue Code abgerufen und auf die gleiche Weise erneut getestet.

Um dies zu approximieren, können Sie auf unserer Repository-Seite auf GitHub auf die SchaltflächeCreate new file links neben der grünen SchaltflächeClone or download klicken:

Jenkins create new file button

Wählen Sie auf der nächsten Seite einen Dateinamen und einige Dummy-Inhalte aus:

Jenkins new file contents

Klicken Sie unten auf die SchaltflächeCommit new file, wenn Sie fertig sind.

Wenn Sie zu Ihrer Jenkins-Oberfläche zurückkehren, wird automatisch ein neuer Build gestartet:

Jenkins new build started

Sie können zusätzliche Builds starten, indem Sie Commits für eine lokale Kopie des Repositorys vornehmen und es wieder auf GitHub übertragen.

Fazit

In diesem Handbuch haben wir Jenkins so konfiguriert, dass es ein GitHub-Projekt überwacht und alle neuen, festgeschriebenen Änderungen automatisch testet. Jenkins ruft Code aus dem Repository ab und führt dann die Erstellungs- und Testprozeduren in isolierten Docker-Containern aus. Der resultierende Code kann bereitgestellt oder gespeichert werden, indem zusätzliche Anweisungen zu denselbenJenkinsfile hinzugefügt werden.