Verwalten von Jenkins mit Rancher unter Ubuntu 14.04

Ein Artikel von Rancher

Einführung

Effektive Continuous Integration (CI) ist eine Grundvoraussetzung für ein erfolgreiches Entwicklungsteam. Da CI kein Front-Line-Service ist, wird es häufig auf Mid-Tier-Hardware oder überschüssiger Hardware ausgeführt. Das Hinzufügen von Builds für Pull-Anforderungen, automatisierte Bereitstellungen, Akzeptanztests, Hochladen von Inhalten und eine Vielzahl anderer Aufgaben kann die Ressourcen des Build-Computers schnell überfordern - insbesondere kurz vor dem Start, wenn viele Commits und Bereitstellungsaktivitäten ausgeführt werden.

In diesem Artikel erstellen wir ein verteiltes Build-System mit Docker zum Erstellen und Ausführen unserer Jenkins-Images und Rancher zum Orchestrieren unseres Docker-Clusters. Jenkins ist eine der bekanntesten Open-Source-CI-Lösungen. Docker automatisiert die Anwendungsbereitstellung in Software-Containern und Rancher bietet eine vollständige Plattform für die Verwaltung von Docker in der Produktion.

Dieser Artikel behandelt eine ausschließlich cloudbasierte Jenkins-Bereitstellung. Eine Alternative besteht jedoch darin, einen internen Jenkins-Master mit Cloud-Servern zu verwenden, um Überlaufkapazität bereitzustellen, wenn mehr Ressourcen benötigt werden. Hier strahlen Docker und Rancher aus: Docker bietet nahezu identische Bereitstellungsumgebungen auf jedem Knoten, und mit Rancher können wir Knoten verschiedener Cloud-Anbieter oder firmeninterner Server in einem einzigen Cluster zusammenfassen, der über ein eigenes VPN ausgeführt wird. Am Ende dieses Lernprogramms sollten Sie in der Lage sein, auf einfache Weise eine Dockerized Jenkins-Bereitstellung mit einer beliebigen Anzahl von Slaves einzurichten.

Voraussetzungen

In diesem Lernprogramm werden insgesamt drei Droplets verwendet: eines für einen Rancher-Server, eines für einen Rancher-Rechenknoten, auf dem der Jenkins-Master ausgeführt wird, und eines für einen zweiten Rancher-Rechenknoten, auf dem der Jenkins-Slave ausgeführt wird.

Wir verweisen auf die IP-Adressen dieser Droplets mit "", "" bzw. "++". Ersetzen Sie diese Variablen, wo immer Sie sie in diesem Lernprogramm sehen, durch die entsprechende IP-Adresse.

Zunächst erstellen wir ein Droplet für den Rancher-Server. Die Erstellung der beiden Rechenknoten wird in einem späteren Schritt behandelt. Um dieses Tutorial zu beginnen, benötigen Sie:

  • Ein Ubuntu 14.04 Droplet mit dem Docker 1.5.0 Image. Da dieses Droplet ausschließlich als Rancher-Server verwendet wird, können Sie eine kleine Droplet-Größe auswählen.

Sie finden die Docker 1.5.0-Image-Option auf der Droplet-Erstellungsseite auf der Registerkarte * Programme * unter * Image auswählen *. Dieses Droplet erfordert auch benutzerdefinierte Benutzerdaten. Um dies hinzuzufügen, klicken Sie auf * Benutzerdaten aktivieren * im Abschnitt * Verfügbare Einstellungen * und geben Sie das folgende Skript in das angezeigte Textfeld ein. Dieses Skript weist das Droplet an, beim Start einen Rancher-Server auszuführen.

#!/bin/bash
docker run -d --name rancher-server -p 8080:8080 rancher/server

Schritt 1 - Konfigurieren der Authentifizierung

Sobald Ihr Rancher-Server erstellt wurde, können Sie über einen Browser, der auf "+ http: //: 8080 / +" zeigt, auf seine Benutzeroberfläche zugreifen. Da der Rancher-Server für das Internet geöffnet ist, empfiehlt es sich, die Authentifizierung einzurichten. In diesem Schritt richten wir die Github OAuth-basierte Authentifizierung ein, die Rancher derzeit unterstützt.

In der oberen rechten Ecke wird eine Warnung angezeigt, die besagt, dass * Access Control nicht konfiguriert ist *, gefolgt von einem Link zu * Settings *. Klicken Sie auf * Einstellungen * und befolgen Sie die dort gegebenen Anweisungen, um eine neue Anwendung bei Github zu registrieren. Kopieren Sie die Client-ID und das Geheimnis in die entsprechenden Textfelder.

Wenn Sie fertig sind, klicken Sie auf * Mit Github authentifizieren * und anschließend im folgenden Fenster auf * Anwendung autorisieren *. Sobald Sie dies tun, wird die Seite neu geladen und die Anweisungen zum Einrichten von OAuth werden durch den Abschnitt * Configure Authorization * (Autorisierung konfigurieren) ersetzt. Fügen Sie zusätzliche Benutzer und Organisationen hinzu, die Zugriff auf Rancher erhalten sollen. Wenn Sie Änderungen vornehmen, wird eine Schaltfläche mit der Aufschrift * Berechtigungskonfiguration speichern * angezeigt. Klicken Sie darauf, wenn Sie fertig sind.

Sobald Sie die Autorisierungskonfiguration gespeichert haben, sollte die Warnung in der oberen rechten Ecke durch Ihr Github-Profilbild und ein Projektauswahlmenü (das anfangs * Standard * lautet) ersetzt werden. Klicken Sie auf * Standard *, um das Projektauswahlmenü zu öffnen. Klicken Sie dann auf * Projekte verwalten * und schließlich auf * Projekt erstellen *. Fügen Sie ein Projekt mit dem Namen Jenkins hinzu und wählen Sie das Jenkins-Projekt über das Projektauswahlmenü erneut aus.

Auf diese Weise bleibt Ihre Rancher-Benutzeroberfläche übersichtlich, da die verschiedenen Projekte, die Sie auf Rancher ausführen, isoliert bleiben. Sie können zusätzliche Projekte erstellen (für die zusätzliche Rechenknoten erforderlich sind), wenn Sie zusätzlich zu Jenkins weitere Dienste auf demselben Rancher-Cluster ausführen möchten. Beachten Sie außerdem, dass das Standardprojekt für den angemeldeten Benutzer spezifisch ist. Wenn Sie also mehreren Personen Zugriff auf Ihre Rancher-Agenten gewähren möchten, sollten Sie nicht das Standardprojekt verwenden.

Schritt 2 - Registrieren der Rancher-Rechenknoten

Nachdem der Server und die Authentifizierung eingerichtet sind, können wir einige Rechenknoten registrieren, auf denen unsere Jenkins-Bereitstellungen ausgeführt werden.

  • Hinweis *: Vor der Authentifizierung können Rancher-Rechenknoten registriert werden, ohne ein Registrierungstoken bereitzustellen. Da wir jedoch die Authentifizierung aktiviert haben, müssen alle Agenten ein Registrierungstoken bereitstellen, um dem Cluster hinzugefügt zu werden.

Klicken Sie in der Rancher-Benutzeroberfläche auf * Hosts * (im Menü links) und dann auf * Neuen Host registrieren *. Kopieren Sie den Docker-Befehl run aus dem angezeigten Fenster und schließen Sie das Fenster. Kehren Sie zum DigitalOcean-Kontrollfeld zurück und erstellen Sie mit dem Docker 1.5.0-Image zwei zusätzliche Droplets, wie z. B. den Rancher-Server. Sie können eine größere Instanzgröße für diese beiden Droplets auswählen, wenn Ihre Builds ressourcenintensiv sind.

Fügen Sie für die Benutzerdaten in diesen beiden Droplets "+ #! / Bin / bash +" hinzu, gefolgt von dem Docker-Befehl "run", den Sie zuvor kopiert haben. Es sollte ungefähr so ​​aussehen.

#!/bin/bash
sudo docker run -d --privileged
 -v /var/run/docker.sock:/var/run/docker.sock rancher/agent
 http://:8080/v1/scripts/

Die lange Folge von Zahlen und Buchstaben am Ende unterscheidet sich für Ihren Befehl. Bitte stellen Sie sicher, dass Sie Ihr Projekt ausgewählt haben, bevor Sie auf * Neuen Host registrieren * klicken, da das Token für jedes Projekt eindeutig ist.

Nach einigen Minuten sollten Sie beide Rancher-Rechenknoten in der Rancher-Benutzeroberfläche sehen können. In der Abbildung unten sehen Sie die Namen Ihrer Tröpfchen, auf denen * RancherAgent * steht.

Schritt 3 - Starten des Jenkins-Masterknotens

Jetzt können wir unseren Jenkins-Masterknoten mit dem offiziellen Jenkins-Image starten.

Klicken Sie zum Starten des Containers unter dem zu verwendenden Rechenknoten auf "Container hinzufügen" und fügen Sie die folgenden Optionen hinzu:

  • Verwenden Sie als Containernamen * Master * im Textfeld neben * Name *.

  • Verwenden Sie * jenkins * als Quellbild im Textfeld neben * Bild auswählen *.

Klicken Sie anschließend auf das * + * neben * Port Map *. Füllen Sie in beiden Feldern 8080 aus und lassen Sie TCP als Protokoll. Dadurch erhalten wir Zugriff auf die Jenkins-Weboberfläche. Klicken Sie erneut auf * + * und fügen Sie in beiden Feldern den Port 50000 hinzu. Lassen Sie dann TCP als Protokoll. Dadurch können sich Slaves mit dem Master verbinden.

Klicken Sie anschließend auf * Erweiterte Optionen * und dann auf die Registerkarte * Volumes *. Klicken Sie auf * + * neben * Volumes * und geben Sie in das Textfeld + / var / jenkins_home + ein. Wenn Sie Ihr Jenkins-Ausgangsverzeichnis auf einem Volume haben, können Sie Ihre Konfiguration beibehalten, wenn Sie den Container neu starten. Außerdem können Sie den Container mit den Volumes einer anderen Containerfunktion sichern.

Klicken Sie abschließend auf * Erstellen *, um Ihren Jenkins-Container zu starten.

[[step-4-­--launching-the-jenkins-slave-node]] === Schritt 4 - Starten des Jenkins-Slave-Knotens

In diesem Schritt starten wir den Jenkins-Sklaven.

Zeigen Sie mit Ihrem Browser auf "+ http: //: 8080 +", um die Jenkins-Benutzeroberfläche zu laden.

Erstellen Sie in der Jenkins-Benutzeroberfläche eine Knotenkonfiguration, indem Sie links zu * Jenkins verwalten *, dann im nächsten Menü zu * Knoten verwalten * und schließlich auf der letzten Seite links zu * Neuer Knoten * navigieren. Geben Sie im nächsten Menü einen Namen für Ihren Slave in das Textfeld neben * Knotenname * ein (und merken Sie sich diesen - wir brauchen ihn gleich wieder), wählen Sie als Typ * Dumb Slave * und klicken Sie auf * OK *.

Sie werden zu einer Seite mit Details zu diesem Knoten weitergeleitet. Geben Sie für * Remote-Stammverzeichnis * + / var / jenkins ein. Wählen Sie für * Startmethode * * Slave-Agenten über Java Web Start starten *. Möglicherweise möchten Sie auch die * # of executors * -Einstellung auf einen höheren Wert als den Standardwert von 1 aktualisieren, um die Anzahl der auf dem Slave zulässigen parallelen Builds zu erhöhen. Die restlichen Einstellungen können auf ihre Standardwerte zurückgesetzt werden. Klicken Sie auf * Speichern *, um die Slave-Konfiguration zu übernehmen.

Jetzt können wir unseren Sklavencontainer starten. Klicken Sie in der Rancher-Benutzeroberfläche auf dem verbleibenden Rechenknoten auf "Container hinzufügen" und fügen Sie die folgenden Optionen hinzu:

  • Verwenden Sie als Containernamen * Slave 1 * im Textfeld neben * Name *.

  • Verwenden Sie als Quellbild * usman / jenkins-slave * im Textfeld neben * Select Image *.

Klicken Sie dann auf * Erweiterte Optionen *. Sie beginnen auf der Registerkarte "Befehl". Klicken Sie auf * + * neben * Umgebungsvariablen * und fügen Sie einen Eintrag mit * Name * als + MASTER_HOST + und * Wert * als ++ hinzu. Klicken Sie erneut auf * + * und fügen Sie einen weiteren Eintrag mit * Name * als + NODE + und * Value * als Name Ihres Jenkins-Slaves hinzu, wie im Menü * New Node * über die Jenkins-Benutzeroberfläche weiter oben in diesem Schritt angegeben.

Klicken Sie anschließend auf die Registerkarte * Volumes *. Klicken Sie auf * + * neben * Volumes * und geben Sie in das Textfeld + / var / jenkins + ein.

Klicken Sie abschließend auf * Erstellen *.

Der Container "+ jenkins-slave +" lädt eine JAR-Datei vom Jenkins-Master herunter und führt einen Jenkins-Slave-Knoten aus. Wenn der Slave startet, sollten Sie seinen Status sehen können, nachdem Sie die Seite * Knoten verwalten * aktualisiert haben, auf der wir in der Jenkins-Benutzeroberfläche aufgehört haben. Sie sollten Ihren Slave-Knoten mit einem Antwortzeitwert und keinem roten X über dem Computersymbol sehen, wie unten gezeigt.

Fazit

In diesem Artikel haben wir eine Jenkins-CI-Bereitstellung mit Docker und Rancher eingerichtet. Unser Jenkins-Cluster kann nun weiter konfiguriert und Build-Jobs erstellt werden.

Docker bietet uns eine konsistente Umgebung für die Ausführung von Jenkins, und Rancher ermöglicht die Vernetzung zwischen dem Host und die Verwaltung des Clusters über die Web-Benutzeroberfläche, ohne manuell auf die Droplets oder Bereitstellungsserver zugreifen zu müssen. Mit diesem Toolset können wir die Ressourcen unseres Build-Systems schnell vergrößern und verkleinern. Dies kann für die Aufrechterhaltung unauffälliger Build-Systeme in kritischen Zeiten wie Starts von entscheidender Bedeutung sein.