Lernprogramm: Bereitstellen auf virtuellen Linux-Computern mit Jenkins und Azure DevOps Services

Continuous Integration (CI) und Continuous Deployment (CD) bilden eine Pipeline, über die Sie Ihren Code erstellen, freigeben und bereitstellen können. Azure DevOps Services umfasst eine vollständige Gruppe von CI/CD-Automatisierungstools mit vollem Funktionsumfang für die Bereitstellung in Azure. Jenkins ist ein gängiges serverbasiertes CI/CD-Drittanbietertool, das auch CI/CD-Automatisierung beinhaltet. Sie können Azure DevOps Services und Jenkins zusammen verwenden und so die Bereitstellung Ihrer Cloud-Apps oder Clouddienste anpassen.

In diesem Tutorial erstellen Sie mithilfe von Jenkins eine Node.js-Web-App. Anschließend stellen Sie diese mit Azure DevOps

für eine Bereitstellungsgruppe bereit, die virtuelle Linux-Computer (VMs) enthält. Folgendes wird vermittelt:

  • Abrufen der Beispiel-App
  • Konfigurieren von Jenkins-Plug-Ins
  • Konfigurieren eines Jenkins Freestyle-Projekts für Node.js
  • Konfigurieren von Jenkins für die Azure DevOps Services-Integration
  • Erstellen eines Jenkins-Dienstendpunkts
  • Erstellen einer Bereitstellungsgruppe für die virtuellen Azure-Computer
  • Erstellen einer Azure Pipelines-Releasepipeline.
  • Ausführen manueller und durch CI ausgelöster Bereitstellungen

Voraussetzungen

Abrufen der Beispiel-App

Für die Bereitstellung benötigen Sie eine in einem Git-Repository gespeicherte App. Für dieses Tutorial empfiehlt sich diese über GitHub verfügbare Beispiel-App. Dieses Tutorial enthält ein Beispielskript, das verwendet wird, um Node.js und eine Anwendung zu installieren. Wenn Sie Ihr eigenes Repository verwenden möchten, sollten Sie ein ähnliches Beispiel konfigurieren.

Erstellen Sie einen Fork dieser App, und notieren Sie den Speicherort (URL) zur Verwendung in nachfolgenden Schritten in diesem Tutorial. Weitere Informationen finden Sie unter Fork a repo (Forken eines Repositorys).

Hinweis

Die App wurde über Yeoman erstellt. Sie verwendet Express, Bower und Grunt. Darüber hinaus verfügt sie über einige npm-Pakete als Abhängigkeiten. Die Beispiel-App enthält zudem ein Skript, über das Nginx eingerichtet und die App bereitgestellt wird. Es wird auf den virtuellen Computern ausgeführt. Das Skript führt folgende Aktionen aus:

  1. Es installiert Node, Nginx und PM2.
  2. Es konfiguriert Nginx und PM2.
  3. Es startet die Node-App.

Konfigurieren von Jenkins-Plug-Ins

Als Erstes müssen zwei Jenkins-Plug-Ins konfiguriert werden: NodeJS und VS Team Services Continuous Deployment.

  1. Öffnen Sie Ihr Jenkins-Konto, und klicken Sie auf Manage Jenkins (Jenkins verwalten) aus.
  2. Klicken Sie auf der Seite Manage Jenkins (Jenkins verwalten) auf Manage Plugins (Plug-Ins verwalten).
  3. Filtern Sie die Liste, um das Plug-In NodeJS zu finden, und klicken Sie anschließend auf Install without restart (Ohne Neustart installieren). Adding the NodeJS plug-in to Jenkins
  4. Filtern Sie die Liste, um das Plug-In VS Team Services Continuous Deployment zu finden, und klicken Sie anschließend auf Install without restart (Ohne Neustart installieren).
  5. Navigieren Sie wieder zum Jenkins-Dashboard, und klicken Sie auf Manage Jenkins (Jenkins verwalten).
  6. Klicken Sie auf Global Tool Configuration (Globale Toolkonfiguration). Suchen Sie nach NodeJS, und klicken Sie auf NodeJS installations (NodeJS-Installationen).
  7. Klicken Sie auf Install automatically (Automatisch installieren), und geben Sie einen Wert für Name ein.
  8. Wählen Sie Speichern.

Konfigurieren eines Jenkins Freestyle-Projekts für Node.js

  1. Wählen Sie Neues Element aus. Geben Sie einen Elementnamen ein.
  2. Klicken Sie auf Freestyle Project (Freestyle-Projekt). Klickan Sie auf OK.
  3. Wählen Sie auf der Registerkarte Source Code Management (Quellcodeverwaltung) die Option Git aus, und geben Sie die Repositorydetails sowie den Branch mit Ihrem App-Code ein.
    Add a repo to your build
  4. Wählen Sie auf der Registerkarte Build Triggers (Buildtrigger) die Option Poll SCM (SCM abrufen) aus, und geben Sie den Zeitplan H/03 * * * * ein, um alle drei Minuten Änderungen im Git-Repository abzurufen.
  5. Wählen Sie auf der Registerkarte "Buildumgebung " die Option "Node & npm bin/folder PATH " und dann den NodeJS-Installationswert aus. Behalten Sie für npmrc file (NPMRC-Datei) die Einstellung use system default (Systemstandard verwenden) bei.
  6. Wählen Sie auf der Registerkarte Build die Option Execute shell (Shell ausführen) aus, und geben Sie den Befehl npm install ein, um sicherzustellen, dass alle Abhängigkeiten aktualisiert werden.

Konfigurieren von Jenkins für die Azure DevOps Services-Integration

Hinweis

Stellen sie sicher, dass das für die folgenden Schritte verwendete persönliche Zugriffstoken (Personal Access Token, PAT) die Berechtigung Release (Lesen, Schreiben, Ausführen und Verwalten) in Azure DevOps Services enthält.

  1. Erstellen Sie ein persönliches Zugriffstoken in Ihrer Azure DevOps Services-Organisation, wenn Sie noch keines besitzen. In Jenkins sind diese Informationen für den Zugriff auf Ihre Azure DevOps Services-Organisation erforderlich. Speichern Sie die Tokeninformationen für die folgenden Schritte in diesem Abschnitt.

    Informationen zum Generieren eines Tokens finden Sie unter Authentifizieren Zugriffs mit persönlichen Zugriffstoken für Azure DevOps Services.

  2. Klicken Sie auf der Registerkarte Post-build Actions (Postbuildaktionen) auf Add post-build action (Postbuildaktion hinzufügen). Klicken Sie auf Archive the artifacts (Artefakte archivieren).

  3. Geben Sie für Files to archive (Dateien zur Archivierung) den Wert **/* ein, um alle Dateien einzuschließen.

  4. Klicken Sie zum Erstellen einer weiteren Aktion auf Add post-build action (Postbuildaktion hinzufügen).

  5. Klicken Sie auf Trigger release in TFS/Team Services (Release in TFS/Team Services auslösen). Geben Sie den URI für Ihre Azure DevOps Services-Organisation ein wie z.B. https://{your-organization-name}.visualstudio.com.

  6. Geben Sie den Projektnamen ein.

  7. Wählen Sie einen Namen für die Releasepipeline aus. (Sie können diese Releasepipeline später in Azure DevOps Services erstellen.)

  8. Wählen Sie die Anmeldeinformationen für die Verbindung mit Ihrer Azure DevOps Services- oder Azure DevOps Server-Umgebung aus:

    • Lassen Sie bei Verwendung von Azure DevOps Services das Feld Benutzername leer.
    • Geben Sie bei Verwendung einer lokalen Version von Azure DevOps Server einen Benutzernamen und ein Kennwort ein.
      Configuring Jenkins post-build actions
  9. Speichern Sie das Jenkins-Projekt.

Erstellen eines Jenkins-Dienstendpunkts

Über einen Dienstendpunkt kann eine Verbindung zwischen Azure DevOps Services und Jenkins hergestellt werden.

  1. Öffnen Sie in Azure DevOps Services die Seite Dienste, öffnen Sie die Liste Neuer Dienstendpunkt, und wählen Sie Jenkins aus. Add a Jenkins endpoint
  2. Geben Sie einen Namen für die Verbindung ein.
  3. Geben Sie die URL Ihres Jenkins-Servers ein, und klicken Sie auf die Option Nicht vertrauenswürdige SSL-Zertifikate annehmen. Beispiel-URL: http://{Ihre Jenkins-URL}.westcentralus.cloudapp.azure.com
  4. Geben Sie den Benutzernamen und das Kennwort für Ihr Jenkins-Konto ein.
  5. Klicken Sie auf Verbindung überprüfen, um zu überprüfen, ob die Informationen korrekt sind.
  6. Klicken Sie auf OK, um den Dienstendpunkt zu erstellen.

Erstellen einer Bereitstellungsgruppe für virtuelle Azure-Computer

Sie benötigen eine Bereitstellungsgruppe für die Registrierung des Azure DevOps Services-Agents, damit die Releasepipeline auf dem virtuellen Computer bereitgestellt werden kann. Mit Bereitstellungsgruppen können Sie komfortabel logische Gruppen von Zielcomputern für die Bereitstellung definieren und den erforderlichen Agent auf den einzelnen Computern installieren.

Hinweis

Achten Sie bei der folgenden Prozedur darauf, die erforderlichen Komponenten zu installieren und das Skript nicht mit sudo-Berechtigungen auszuführen.

  1. Öffnen Sie die Registerkarte "Versionen " des Build & Release-Hubs , öffnen Sie Bereitstellungsgruppen, und wählen Sie +Neu.
  2. Geben Sie einen Namen und eine optionale Beschreibung für die Bereitstellungsgruppe ein. Wählen Sie dann Erstellen aus.
  3. Wählen Sie das Betriebssystem für den virtuellen Zielcomputer der Bereitstellung aus. Wählen Sie also beispielsweise Ubuntu 16.04+ aus.
  4. Klicken Sie auf Verwenden Sie für die Authentifizierung ein persönliches Zugriffstoken im Skript.
  5. Wählen Sie den Link Systemvoraussetzungen aus. Installieren Sie die erforderlichen Komponenten für Ihr Betriebssystem.
  6. Klicken Sie auf Skript in die Zwischenablage kopieren, um das Skript zu kopieren.
  7. Melden Sie sich bei dem virtuellen Zielcomputer der Bereitstellung an, und führen Sie das Skript aus. Führen Sie das Skript nicht mit sudo-Berechtigungen aus.
  8. Nach der Installation werden Sie aufgefordert, Bereitstellungsgruppenmarkierungen anzugeben. Übernehmen Sie die Standardeinstellungen.
  9. Suchen Sie den neu registrierten virtuellen Computer in Azure DevOps Services unter Bereitstellungsgruppen (in Ziele).

Erstellen einer Azure Pipelines-Releasepipeline

Eine Releasepipeline gibt den Prozess an, der in Azure Pipelines zum Bereitstellen der App verwendet wird. In diesem Beispiel führen Sie ein Shellskript aus.

So erstellen Sie die Releasepipeline in Azure Pipelines:

  1. Öffnen Sie die Registerkarte "Versionen " des Build & Release-Hubs , und wählen Sie " Releasepipeline erstellen" aus.
  2. Wählen Sie die Vorlage Leer aus, indem Sie mit einem leeren Prozess starten.
  3. Klicken Sie im Abschnitt Artefakte auf + Artefakt hinzufügen, und wählen Sie unter Quelltyp die Option Jenkins aus. Wählen Sie Ihre Jenkins-Dienstendpunktverbindung aus. Wählen Sie dann den Jenkins-Quellauftrag aus, und klicken Sie auf Hinzufügen.
  4. Klicken Sie auf die Auslassungspunkte neben Umgebung 1. Klicken Sie auf Bereitstellungsgruppenphase hinzufügen.
  5. Wählen Sie Ihre Bereitstellungsgruppe aus.
  6. Klicken Sie auf +, um Bereitstellungsgruppenphase eine Aufgabe hinzuzufügen.
  7. Wählen Sie die Aufgabe Shellskript aus, und klicken Sie anschließend auf Hinzufügen. Die Aufgabe Shellskript gibt die Konfiguration für ein Skript an, das auf jedem Server ausgeführt wird, um Node.js zu installieren und die App zu starten.
  8. Geben Sie für Skriptpfad Folgendes ein: $(System.DefaultWorkingDirectory)/Fabrikam-Node/deployscript.sh.
  9. Klicken Sie auf Erweitert, und aktivieren Sie dann Arbeitsverzeichnis angeben.
  10. Geben Sie für Arbeitsverzeichnis Folgendes ein: $(System.DefaultWorkingDirectory)/Fabrikam-Node.
  11. Ändern Sie den Namen der Releasepipeline in den Namen, den Sie auf der Registerkarte Postbuildaktionen des Builds in Jenkins angegeben haben. Dieser Name ist in Jenkins erforderlich, damit eine neue Freigabe ausgelöst werden kann, wenn die Quellartefakte aktualisiert werden.
  12. Klicken Sie auf Speichern und dann auf OK, um die Releasepipeline zu speichern.

Ausführen manueller und durch CI ausgelöster Bereitstellungen

  1. Klicken Sie auf + Release und anschließend auf Release erstellen.
  2. Wählen Sie in der hervorgehobenen Dropdownliste den abgeschlossenen Build aus, und klicken Sie anschließend auf Warteschlange.
  3. Klicken Sie in der Popupmeldung auf den Releaselink. Beispiel: „Freigabe Freigabe-1 wurde erstellt.“
  4. Öffnen Sie die Registerkarte Protokolle, um die Konsolenausgabe der Freigabe anzuzeigen.
  5. Öffnen Sie im Browser die URL für einen der Server, die Sie der Bereitstellungsgruppe hinzugefügt haben. Geben Sie dazu beispielsweise http://{IP-Adresse des Servers} ein.
  6. Wechseln Sie zum Git-Quellrepository, und ändern Sie den Inhalt der Überschrift h1 in der Datei „app/views/index.jade“ durch geänderten Text.
  7. Committen Sie die Änderung.
  8. Nach einigen Minuten wird auf der Seite Releases von Azure DevOps eine neu erstellte Freigabe angezeigt. Öffnen Sie die Freigabe, um anzuzeigen, wie die Bereitstellung durchgeführt wird. Herzlichen Glückwunsch!

Behandeln von Problemen mit dem Jenkins-Plug-In

Sollten Fehler für das Jenkins-Plug-In auftreten, können Sie diese auf der Jenkins-JIRA-Seite für die jeweilige Komponente melden.

Nächste Schritte

In diesem Tutorial haben Sie die Bereitstellung einer App in Azure mit Jenkins (für den Build) und Azure DevOps (für das Release) automatisiert. Sie haben Folgendes gelernt:

  • Erstellen der App in Jenkins
  • Konfigurieren von Jenkins für die Azure DevOps Services-Integration
  • Erstellen einer Bereitstellungsgruppe für die virtuellen Azure-Computer
  • Erstellen einer Azure Pipeline-Instanz zum Konfigurieren der virtuellen Computer und zum Bereitstellen der App.

Informationen zur Verwendung von Azure Pipelines für Build- und Releaseschritte finden Sie hier.

Informationen zum Erstellen einer YAML-basierten CI/CD-Pipeline für die Bereitstellung auf virtuellen Computern finden Sie im nächsten Tutorial.