Freigeben über


Lernprogramm: Erstellen einer Jenkins-Pipeline mit GitHub und Docker

Von Bedeutung

Während viele Azure-Dienste über Jenkins-Plug-Ins verfügen, endete der Support für die meisten dieser Plug-Ins ab dem 29. Februar 2024. Azure CLI ist die derzeit empfohlene Methode zum Integrieren von Jenkins in Azure-Dienste. Weitere Informationen finden Sie im Artikel Jenkins-Plug-Ins für Azure.

Um die Erstellungs- und Testphase der Anwendungsentwicklung zu automatisieren, können Sie eine kontinuierliche Integrations- und Bereitstellungspipeline (CI/CD) verwenden. In diesem Lernprogramm erstellen Sie eine CI/CD-Pipeline auf einem virtuellen Azure-Computer, einschließlich der folgenden Vorgehensweise:

  • Erstellen einer Jenkins-VM
  • Installieren und Konfigurieren von Jenkins
  • Erstellen der Webhook-Integration zwischen GitHub und Jenkins
  • Erstellen und Auslösen von Jenkins-Buildaufträgen aus GitHub-Commits
  • Erstellen eines Docker-Images für Ihre App
  • Überprüfen, ob GitHub-Commits ein neues Docker-Image erstellen und die laufende App aktualisieren

Dieses Tutorial verwendet die CLI innerhalb des Diensts Azure Cloud Shell, der ständig auf die neueste Version aktualisiert wird. Wählen Sie zum Öffnen von Cloud Shell oben in einem Codeblock die Option Ausprobieren aus.

Wenn Sie die CLI lokal installieren und verwenden möchten, müssen Sie für dieses Tutorial die Azure CLI-Version 2.0.30 oder höher ausführen. Führen Sie az --version aus, um die Version zu ermitteln. Wenn Sie eine Installation oder ein Upgrade durchführen müssen, finden Sie weitere Informationen unter Azure CLI installieren.

Erstellen einer Jenkins-Instanz

In einem vorherigen Lernprogramm zum Anpassen eines virtuellen Linux-Computers beim ersten Start haben Sie erfahren, wie Sie die VM-Anpassung mit cloudinit automatisieren. In diesem Lernprogramm wird eine Cloud-Init-Datei zum Installieren von Jenkins und Docker auf einer VM verwendet. Jenkins ist ein beliebter Open-Source-Automatisierungsserver, der nahtlos in Azure integriert wird, um eine kontinuierliche Integration (CI) und eine kontinuierliche Bereitstellung (Continuous Delivery, CD) zu ermöglichen. Weitere Lernprogramme zur Verwendung von Jenkins finden Sie in den Jenkins im Azure-Hub.

Erstellen Sie in Der aktuellen Shell eine Datei mit dem Namen cloud-init-jenkins.txt , und fügen Sie die folgende Konfiguration ein. Erstellen Sie die Datei beispielsweise in Cloud Shell, nicht auf dem lokalen Computer. Geben Sie sensible-editor cloud-init-jenkins.txt ein, um die Datei zu erstellen und eine Liste der verfügbaren Editoren anzuzeigen. Stellen Sie sicher, dass die gesamte Datei „cloud-init“ ordnungsgemäß kopiert wird, insbesondere die erste Zeile:

#cloud-config
package_upgrade: true
write_files:
  - path: /etc/systemd/system/docker.service.d/docker.conf
    content: |
      [Service]
        ExecStart=
        ExecStart=/usr/bin/dockerd
  - path: /etc/docker/daemon.json
    content: |
      {
        "hosts": ["fd://","tcp://127.0.0.1:2375"]
      }
runcmd:
  - apt install openjdk-8-jre-headless -y
  - wget -q -O - https://pkg.jenkins.io/debian/jenkins-ci.org.key | sudo apt-key add -
  - sh -c 'echo deb https://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list'
  - apt-get update && apt-get install jenkins -y
  - curl -sSL https://get.docker.com/ | sh
  - usermod -aG docker azureuser
  - usermod -aG docker jenkins
  - service jenkins restart

Vor der Erstellung eines virtuellen Computers müssen Sie zunächst mit az group create eine Ressourcengruppe erstellen. Im folgenden Beispiel wird eine Ressourcengruppe mit dem Namen "myResourceGroupJenkins" in der Region East US erstellt.

az group create --name myResourceGroupJenkins --location eastus

Jetzt können Sie mit az vm create einen virtuellen Computer erstellen. Verwenden Sie den --custom-data-Parameter, um Ihre cloud-init-Konfigurationsdatei zu übergeben. Geben Sie den vollständigen Pfad zu cloud-init-jenkins.txt an, wenn Sie die Datei außerhalb Des aktuellen Arbeitsverzeichnisses gespeichert haben.

az vm create --resource-group myResourceGroupJenkins \
    --name myVM \
    --image UbuntuLTS \
    --admin-username azureuser \
    --generate-ssh-keys \
    --custom-data cloud-init-jenkins.txt

Es dauert ein paar Minuten, bis der virtuelle Computer erstellt und konfiguriert wird.

Verwenden Sie "az vm open-port ", um Port 8080 für Jenkins-Datenverkehr und Port 1337 für die Node.js-App zu öffnen, die zum Ausführen einer Beispiel-App verwendet wird:

az vm open-port --resource-group myResourceGroupJenkins --name myVM --port 8080 --priority 1001
az vm open-port --resource-group myResourceGroupJenkins --name myVM --port 1337 --priority 1002

Konfigurieren von Jenkins

Um auf Ihre Jenkins-Instanz zuzugreifen, rufen Sie die öffentliche IP-Adresse Ihrer VM ab:

az vm show --resource-group myResourceGroupJenkins --name myVM -d --query [publicIps] --o tsv

Für Sicherheitszwecke müssen Sie das anfängliche Administratorkennwort eingeben, das in einer Textdatei auf Ihrer VM gespeichert ist, um die Installation von Jenkins zu starten. Verwenden Sie die im vorherigen Schritt abgerufene öffentliche IP-Adresse für SSH auf Ihren virtuellen Computer:

ssh azureuser@<publicIps>

Überprüfen Sie, ob Jenkins mit dem service Befehl ausgeführt wird:

$ service jenkins status
● jenkins.service - LSB: Start Jenkins at boot time
   Loaded: loaded (/etc/init.d/jenkins; generated)
   Active: active (exited) since Tue 2019-02-12 16:16:11 UTC; 55s ago
     Docs: man:systemd-sysv-generator(8)
    Tasks: 0 (limit: 4103)
   CGroup: /system.slice/jenkins.service

Feb 12 16:16:10 myVM systemd[1]: Starting LSB: Start Jenkins at boot time...
...

Zeigen Sie die initialAdminPassword für Ihre Jenkins-Installation an, und kopieren Sie sie.

sudo cat /var/lib/jenkins/secrets/initialAdminPassword

Wenn die Datei noch nicht verfügbar ist, warten Sie ein paar Minuten, bis Cloud init die Installation von Jenkins und Docker abgeschlossen hat.

Öffnen Sie nun einen Webbrowser, und wechseln Sie zu http://<publicIps>:8080. Schließen Sie das anfängliche Jenkins-Setup wie folgt ab:

  • Zu installierende Plug-Ins auswählen
  • Suchen Sie im Textfeld oben nach GitHub . Aktivieren Sie das Kontrollkästchen für GitHub, und wählen Sie dann "Installieren" aus.
  • Erstellen Sie den ersten Administratorbenutzer. Geben Sie einen Benutzernamen ein, z. B. einen Administrator, und geben Sie dann Ihr eigenes sicheres Kennwort ein. Geben Sie schließlich einen vollständigen Namen und eine E-Mail-Adresse ein.
  • Wählen Sie "Speichern" und "Fertig stellen" aus.
  • Sobald Jenkins bereit ist, wählen Sie "Beginnen mit Jenkins" aus.
    • Wenn Ihr Webbrowser beim Starten der Verwendung von Jenkins eine leere Seite anzeigt, starten Sie den Jenkins-Dienst neu. Geben Sie sudo service jenkins restart in Ihrer SSH-Sitzung ein und aktualisieren Sie dann Ihren Webbrowser.
  • Melden Sie sich bei Jenkins bei Bedarf mit dem Benutzernamen und kennwort an, den Sie erstellt haben.

Erstellen von GitHub-Webhook

Um die Integration mit GitHub zu konfigurieren, öffnen Sie die Node.js Hello World-Beispiel-App aus dem Azure-Beispiel-Repository. Um das Repository in Ihr eigenes GitHub-Konto zu "forken", wählen Sie die Schaltfläche "Fork" oben rechts aus.

Erstellen Sie einen Webhook in dem von Ihnen erstellten Fork.

  • Wählen Sie "Einstellungen" und dann " Webhooks " auf der linken Seite aus.
  • Wählen Sie "Webhook hinzufügen" aus, und geben Sie dann "Jenkins " in das Filterfeld ein.
  • Geben Sie für die http://<publicIps>:8080/github-webhook/ ein. Stellen Sie sicher, dass Sie den nachgestellten /
  • Wählen Sie für den Inhaltstyp"application/x-www-form-urlencoded" aus.
  • Für welche Ereignisse möchten Sie diesen Webhook auslösen?, wählen Sie einfach das Pushereignis aus.
  • " Aktiv " auf "Aktiviert" festlegen.
  • Klicke auf Add webhook (Webhook hinzufügen).

Fügen Sie einen GitHub-Webhook zu Ihrem verzweigten Repository hinzu

Erstellen eines Jenkins-Auftrags

Damit Jenkins auf ein Ereignis in GitHub reagiert, z. B. einen Code-Commit, erstellen Sie einen Jenkins-Job. Verwenden Sie die URLs für Ihren eigenen GitHub-Fork.

Wählen Sie auf Ihrer Jenkins-Website auf der Startseite " Neue Aufträge erstellen " aus:

  • Geben Sie HelloWorld als Auftragsname ein. Wählen Sie "Freestyle-Projekt" und dann "OK" aus.
  • Wählen Sie unter dem Abschnitt "Allgemein " das GitHub-Projekt aus, und geben Sie Ihre verzweigte Repository-URL ein, z. B. https://github.com/cynthn/nodejs-docs-hello-world
  • Wählen Sie unter dem Abschnitt "Quellcodeverwaltung" Die Option "Git" aus, geben Sie Ihre verzweigte Git-URL ein, z. B.https://github.com/cynthn/nodejs-docs-hello-world.git
  • Wählen Sie im Abschnitt "Build-Auslöser"den GitHub-Hook-Trigger für GITscm-Polling aus.
  • Wählen Sie im Abschnitt " Build " die Option " Buildschritt hinzufügen" aus. Wählen Sie "Shell ausführen" aus, und geben Sie echo "Test" dann in das Befehlsfenster ein.
  • Wählen Sie unten im Auftragsfenster " Speichern " aus.

Testen der GitHub-Integration

Um die GitHub-Integration mit Jenkins zu testen, committen Sie eine Änderung in Ihrem Fork.

Wählen Sie in der GitHub-Webbenutzeroberfläche Ihr geforktes Repository aus, und wählen Sie dann die index.js Datei aus. Wählen Sie das Bleistiftsymbol aus, um diese Datei zu bearbeiten, sodass Zeile 6 Folgendes liest:

response.end("Hello World!");

Um Ihre Änderungen zu übernehmen, wählen Sie unten die Schaltfläche " Änderungen übernehmen " aus.

In Jenkins beginnt ein neuer Build im Abschnitt Bauteverlauf in der unteren linken Ecke Ihrer Auftragsseite. Wählen Sie den Link "Buildnummer" und dann die Konsolenausgabe auf der linken Seite aus. Sie können die Schritte anzeigen, die Jenkins ausführt, während Ihr Code von GitHub abgerufen wird, und die Buildaktion gibt die Nachricht Test an die Konsole aus. Jedes Mal, wenn ein Commit in GitHub erfolgt, erreicht der Webhook Jenkins und löst auf diese Weise einen neuen Build aus.

Definieren des Docker-Buildimages

Wenn Sie die Node.js-App anzeigen möchten, die auf Ihren GitHub-Commits basiert, können Sie ein Docker-Image erstellen, um die App auszuführen. Das Image basiert auf einer Dockerfile-Datei, die definiert, wie der Container konfiguriert wird, der die App ausführt.

Wechseln Sie von der SSH-Verbindung zu Ihrem virtuellen Computer in das Arbeitsbereichsverzeichnis jenkins, das nach dem Auftrag benannt wurde, den Sie in einem vorherigen Schritt erstellt haben. In diesem Beispiel wurde " HelloWorld" genannt.

cd /var/lib/jenkins/workspace/HelloWorld

Erstellen Sie eine Datei in diesem Arbeitsbereichsverzeichnis, und sudo sensible-editor Dockerfile fügen Sie den folgenden Inhalt ein. Stellen Sie sicher, dass die gesamte Dockerfile-Datei ordnungsgemäß kopiert wird, insbesondere die erste Zeile:

FROM node:alpine

EXPOSE 1337

WORKDIR /var/www
COPY package.json /var/www/
RUN npm install
COPY index.js /var/www/

Diese Dockerfile nutzt das Basisabbild Node.js mit Alpine Linux, macht den Port 1337 verfügbar, auf dem die Hello-World-App ausgeführt wird, dann werden die App-Dateien kopiert und sie wird initialisiert.

Erstellen von Jenkins-Buildregeln

In einem vorherigen Schritt haben Sie eine grundlegende Jenkins-Buildregel erstellt, mit der eine Nachricht an die Konsole ausgegeben wird. Lass uns den Build-Schritt erstellen, um unsere Dockerfile zu verwenden und die App auszuführen.

Wählen Sie in Ihrer Jenkins-Instanz den Auftrag aus, den Sie in einem vorherigen Schritt erstellt haben. Wählen Sie " Konfigurieren" auf der linken Seite aus, und scrollen Sie nach unten zum Abschnitt " Build ":

  • Entfernen Sie Ihren vorhandenen echo "Test" Build-Schritt. Wählen Sie das rote Kreuz in der oberen rechten Ecke des vorhandenen Buildschrittfelds aus.

  • Wählen Sie Build-Schritt hinzufügen, dann Shell ausführen aus.

  • Geben Sie im Befehlsfeld die folgenden Docker-Befehle ein, und wählen Sie dann "Speichern" aus:

    docker build --tag helloworld:$BUILD_NUMBER .
    docker stop helloworld && docker rm helloworld
    docker run --name helloworld -p 1337:1337 helloworld:$BUILD_NUMBER node /var/www/index.js &
    

Die Docker-Buildschritte erstellen ein Image und kennzeichnen es mit der Jenkins-Buildnummer, damit Sie einen Verlauf von Images verwalten können. Alle vorhandenen Container, die die App ausführen, werden beendet und dann entfernt. Anschließend wird ein neuer Container mit dem Image gestartet und ihre Node.js App basierend auf den neuesten Commits in GitHub ausgeführt.

Teste deine Pipeline

Um die gesamte Pipeline in Aktion zu sehen, bearbeiten Sie die index.js Datei in Ihrem verzweigten GitHub-Repository erneut, und wählen Sie "Commit ändern" aus. Ein neuer Job startet in Jenkins, ausgelöst durch den Webhook für GitHub. Es dauert ein paar Sekunden, um das Docker-Image zu erstellen und Ihre App in einem neuen Container zu starten.

Falls erforderlich, rufen Sie die öffentliche IP-Adresse Ihrer VM erneut ab:

az vm show --resource-group myResourceGroupJenkins --name myVM -d --query [publicIps] --o tsv

Öffnen Sie einen Webbrowser, und geben Sie ein http://<publicIps>:1337. Ihre Node.js-App wird angezeigt und zeigt die neuesten Commits in Ihrem GitHub-Fork wie folgt an:

Ausführen von Node.js-Anwendung

Nehmen Sie nun eine weitere Bearbeitung an der index.js-Datei in GitHub vor, und übernehmen Sie die Änderung. Warten Sie einige Sekunden, bis der Auftrag in Jenkins abgeschlossen ist, und aktualisieren Sie dann Ihren Webbrowser, um die aktualisierte Version Ihrer App anzuzeigen, die in einem neuen Container ausgeführt wird:

Die Node.js-App nach einem anschließenden GitHub-Commit ausführen

Nächste Schritte

In diesem Lernprogramm haben Sie GitHub so konfiguriert, dass für jeden Code-Commit ein Jenkins-Buildauftrag ausgeführt wird, und stellen Sie dann einen Docker-Container bereit, um Ihre App zu testen. Sie haben gelernt, wie Sie:

  • Erstellen einer Jenkins-VM
  • Installieren und Konfigurieren von Jenkins
  • Erstellen der Webhook-Integration zwischen GitHub und Jenkins
  • Erstellen und Auslösen von Jenkins-Buildaufträgen aus GitHub-Commits
  • Erstellen eines Docker-Images für Ihre App
  • Überprüfen, ob GitHub-Commits ein neues Docker-Image erstellen und die laufende App aktualisieren

Wechseln Sie zum nächsten Lernprogramm, um mehr über die Integration von Jenkins in Azure DevOps Services zu erfahren.