Tutorial: Erstellen einer Jenkins-Pipeline mit GitHub und DockerTutorial: Create a Jenkins pipeline using GitHub and Docker

Sie können zum Automatisieren der Erstellungs- und Testphase der Anwendungsentwicklung eine Pipeline für Continuous Integration und Deployment (CI/CD) verwenden.To automate the build and test phase of application development, you can use a continuous integration and deployment (CI/CD) pipeline. In diesem Tutorial erstellen Sie eine CI/CD-Pipeline auf einer Azure-VM und erfahren, wie Sie:In this tutorial, you create a CI/CD pipeline on an Azure VM including how to:

  • eine Jenkins-VM erstellen könnenCreate a Jenkins VM
  • Jenkins installieren und konfigurieren könnenInstall and configure Jenkins
  • eine Webhookintegrations zwischen GitHub und Jenkins erstellen könnenCreate webhook integration between GitHub and Jenkins
  • Jenkins-Buildauftrag aus GitHub-Commits erstellen und auslösen könnenCreate and trigger Jenkins build jobs from GitHub commits
  • ein Docker-Image für Ihre Anwendung erstellen könnenCreate a Docker image for your app
  • überprüfen können, ob GitHub-Commits neue Docker-Images und -Updates für die ausgeführte Anwendung erstellenVerify GitHub commits build new Docker image and updates running app

Dieses Tutorial verwendet die CLI innerhalb des Diensts Azure Cloud Shell, der ständig auf die neueste Version aktualisiert wird.This tutorial uses the CLI within the Azure Cloud Shell, which is constantly updated to the latest version. Wählen Sie zum Öffnen von Cloud Shell oben in einem Codeblock die Option Ausprobieren aus.To open the Cloud Shell, select Try it from the top of any code block.

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.If you choose to install and use the CLI locally, this tutorial requires that you are running the Azure CLI version 2.0.30 or later. Führen Sie az --version aus, um die Version zu ermitteln.Run az --version to find the version. Informationen zum Durchführen einer Installation oder eines Upgrades finden Sie bei Bedarf unter Installieren der Azure CLI.If you need to install or upgrade, see Install Azure CLI.

Erstellen einer Jenkins-InstanzCreate Jenkins instance

In einem vorherigen Tutorial zum Anpassen eines virtuellen Linux-Computers beim ersten Start haben Sie erfahren, wie die Anpassung für virtuelle Computer mit cloud-init automatisiert wird.In a previous tutorial on How to customize a Linux virtual machine on first boot, you learned how to automate VM customization with cloud-init. In diesem Tutorial wird eine cloud-init-Datei verwendet, um Jenkins und Docker auf einer VM zu installieren.This tutorial uses a cloud-init file to install Jenkins and Docker on a VM. Jenkins ist ein beliebter Open-Source-Automatisierungsserver, der sich problemlos in Azure integrieren lässt, um Continuous Integration (CI) und Continuous Delivery (CD) zu ermöglichen.Jenkins is a popular open-source automation server that integrates seamlessly with Azure to enable continuous integration (CI) and continuous delivery (CD). Weitere Tutorials zur Verwendung von Jenkins finden Sie unter der Jenkins in Azure-Hubs.For more tutorials on how to use Jenkins, see the Jenkins in Azure hub.

Erstellen Sie in der aktuellen Shell eine Datei namens cloud-init-jenkins.txt, und fügen Sie die folgende Konfiguration ein.In your current shell, create a file named cloud-init-jenkins.txt and paste the following configuration. Erstellen Sie die Datei beispielsweise in Cloud Shell, nicht auf dem lokalen Computer.For example, create the file in the Cloud Shell not on your local machine. Geben Sie sensible-editor cloud-init-jenkins.txt ein, um die Datei zu erstellen und eine Liste der verfügbaren Editoren anzuzeigen.Enter sensible-editor cloud-init-jenkins.txt to create the file and see a list of available editors. Stellen Sie sicher, dass die gesamte Datei „cloud-init“ ordnungsgemäß kopiert wird, insbesondere die erste Zeile:Make sure that the whole cloud-init file is copied correctly, especially the first line:

#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.Before you can create a VM, create a resource group with az group create. In folgendem Beispiel wird eine Ressourcengruppe mit dem Namen myResourceGroupJenkins am Standort eastus erstellt:The following example creates a resource group named myResourceGroupJenkins in the eastus location:

az group create --name myResourceGroupJenkins --location eastus

Jetzt können Sie mit az vm create einen virtuellen Computer erstellen.Now create a VM with az vm create. Verwenden Sie den --custom-data-Parameter, um Ihre cloud-init-Konfigurationsdatei zu übergeben.Use the --custom-data parameter to pass in your cloud-init config file. Geben Sie den vollständigen Pfad von cloud-init-jenkins.txt an, wenn Sie die Datei außerhalb Ihres vorhandenen Arbeitsverzeichnisses gespeichert haben.Provide the full path to cloud-init-jenkins.txt if you saved the file outside of your present working directory.

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

Die Erstellung und Konfigurieren der VM dauert einige Minuten.It takes a few minutes for the VM to be created and configured.

Verwenden Sie az vm open-port, um Port 8080 für den Jenkins-Datenverkehr zu öffnen, und verwenden Sie Port 1337 für die Anwendung „node.js“, die zum Ausführen einer Beispiel-App verwendet wird. Damit lassen Sie den Webdatenverkehr zu:To allow web traffic to reach your VM, use az vm open-port to open port 8080 for Jenkins traffic and port 1337 for the Node.js app that is used to run a sample app:

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 JenkinsConfigure Jenkins

Rufen Sie die öffentliche IP-Adresse Ihrer VM ab, um auf die Jenkins-Instanz zuzugreifen:To access your Jenkins instance, obtain the public IP address of your VM:

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

Aus Sicherheitsgründen müssen Sie das ursprüngliche Administratorkennwort eingeben, dass in einer Textdatei auf Ihrer VM gespeichert ist, um mit der Installation von Jenkins beginnen zu können.For security purposes, you need to enter the initial admin password that is stored in a text file on your VM to start the Jenkins install. Verwenden Sie die öffentliche IP-Adresse, die Sie im vorherigen Schritt abgerufen haben, um eine SSH-Verbindung mit Ihrer VM herzustellen:Use the public IP address obtained in the previous step to SSH to your VM:

ssh azureuser@<publicIps>

Vergewissern Sie sich mithilfe des Befehls service, dass Jenkins ausgeführt wird:Verify Jenkins is running using the service command:

$ 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 das initialAdminPassword für Ihre Jenkins-Installation an, und kopieren Sie es:View the initialAdminPassword for your Jenkins install and copy it:

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

Sollte die Datei noch nicht verfügbar sein, warten Sie noch einige Minuten, bis die Installation von Jenkins und Docker abgeschlossen ist.If the file isn't available yet, wait a couple more minutes for cloud-init to complete the Jenkins and Docker install.

Öffnen Sie anschließend einen Webbrowser, und gehen Sie zu http://<publicIps>:8080.Now open a web browser and go to http://<publicIps>:8080. Schließen Sie das anfängliche Jenkins-Setup wie folgt ab:Complete the initial Jenkins setup as follows:

  • Wählen Sie Select plugins to install (Zu installierende Plug-Ins auswählen).Choose Select plugins to install
  • Suchen Sie im Textfeld im oberen Bereich nach GitHub.Search for GitHub in the text box across the top. Aktivieren Sie das Kontrollkästchen für GitHub, und klicken Sie anschließend auf Installieren.Check the box for GitHub, then select Install
  • Erstellen Sie den ersten Administratorbenutzer.Create the first admin user. Geben Sie einen Benutzernamen (beispielsweise admin) und anschließend ein sicheres Kennwort ein.Enter a username, such as admin, then provide your own secure password. Geben Sie abschließend einen vollständigen Namen und eine E-Mail-Adresse an.Finally, type a full name and e-mail address.
  • Klicken Sie auf Speichern und Beenden.Select Save and Finish
  • Klicken Sie auf Start using Jenkins (Jenkins verwenden), sobald Jenkins bereit ist.Once Jenkins is ready, select Start using Jenkins
    • Sollte in Ihrem Browser beim Start von Jenkins eine leere Seite angezeigt werden, starten Sie den Jenkins-Dienst neu.If your web browser displays a blank page when you start using Jenkins, restart the Jenkins service. Geben Sie in Ihrer SSH-Sitzung sudo service jenkins restart ein, und aktualisieren Sie anschließend Ihren Webbrowser.From your SSH session, type sudo service jenkins restart, then refresh you web browser.
  • Melden Sie sich bei Bedarf mit dem erstellten Benutzernamen und Kennwort bei Jenkins an.If needed, log in to Jenkins with the username and password you created.

Erstellen eines GitHub-WebhooksCreate GitHub webhook

Öffnen Sie die node.js-Beispielapp „Hello World“ aus dem Azure-Beispielrepository, um die Integration in GitHub zu konfigurieren.To configure the integration with GitHub, open the Node.js Hello World sample app from the Azure samples repo. Wählen Sie die Schaltfläche Fork (Verzweigen) in der rechten oberen Ecke aus, um das Repository in Ihr GitHub-Konto zu verzweigen.To fork the repo to your own GitHub account, select the Fork button in the top right-hand corner.

Erstellen eines Webhooks in der von Ihnen erstellten Verzweigung:Create a webhook inside the fork you created:

  • Wählen Sie Einstellungen und anschließend Webhooks auf der linken Seite aus.Select Settings, then select Webhooks on the left-hand side.
  • Wählen Sie Add webhook (Webhook hinzufügen) aus, und geben Sie anschließend Jenkins in das Filterfeld ein.Choose Add webhook, then enter Jenkins in filter box.
  • Geben Sie unter Payload URL (Nutzlast-URL) Folgendes ein: http://<publicIps>:8080/github-webhook/.For the Payload URL, enter http://<publicIps>:8080/github-webhook/. Stellen Sie sicher, dass Sie den nachstehenden Schrägstrich (/) hinzufügenMake sure you include the trailing /
  • Wählen Sie unter Content type (Inhaltstyp) die Option application/x-www-form-urlencoded aus.For Content type, select application/x-www-form-urlencoded.
  • Wählen Sie unter Which events would you like to trigger this webhook? (Welche Ereignisse sollen durch diesen Webhook ausgelöst werden?) die Option Just the push event (Nur das Push-Ereignis) aus.For Which events would you like to trigger this webhook?, select Just the push event.
  • Aktivieren Sie das Kontrollkästchen Active (Aktiv).Set Active to checked.
  • Klicken Sie auf Add webhook (Webhook hinzufügen).Click Add webhook.

Hinzufügen eines GitHub-Webhooks in Ihr verzweigtes Repository

Erstellen eines Jenkins-AuftragsCreate Jenkins job

Erstellen Sie einen Jenkins-Auftrag, damit Jenkins auf ein Ereignis in GitHub, wie z.B. das Entwickeln von Code, reagieren kann.To have Jenkins respond to an event in GitHub such as committing code, create a Jenkins job. Verwenden Sie die URLs für Ihre eigene GitHub-Verzweigung.Use the URLs for your own GitHub fork.

Klicken Sie auf Ihrer Jenkins-Website auf der Startseite auf Create new jobs (Neue Aufträge erstellen):In your Jenkins website, select Create new jobs from the home page:

  • Geben Sie HelloWorld als den Namen des Auftrags ein.Enter HelloWorld as job name. Wählen Sie Freestyle Project und anschließend OK aus.Choose Freestyle project, then select OK.
  • Wählen Sie im Abschnitt Allgemein die Option für GitHub-Projekt aus, und geben Sie die URL Ihres verzweigten Repositorys ein (beispielsweise https://github.com/cynthn/nodejs-docs-hello-world).Under the General section, select GitHub project and enter your forked repo URL, such as https://github.com/cynthn/nodejs-docs-hello-world
  • Wählen Sie im Bereich Quellcodeverwaltung die Option Git aus, und geben Sie die URL vom Typ .git Ihres verzweigten Repositorys ein (beispielsweise https://github.com/cynthn/nodejs-docs-hello-world.git).Under the Source code management section, select Git, enter your forked repo .git URL, such as https://github.com/cynthn/nodejs-docs-hello-world.git
  • Wählen Sie im Bereich Build Triggers (Trigger erstellen) die Option GitHub hook trigger for GITScm polling (GitHub-Hooktrigger für GITScm-Abruf) aus.Under the Build Triggers section, select GitHub hook trigger for GITscm polling.
  • Wählen Sie im Abschnitt Build die Option Buildschritt hinzufügen aus.Under the Build section, choose Add build step. Wählen Sie Execute shell (Shell ausführen) aus, und geben Sie dann echo "Test" im Befehlsfenster ein.Select Execute shell, then enter echo "Test" in the command window.
  • Wählen Sie unten auf der Auftragsseite Speichern aus.Select Save at the bottom of the jobs window.

Testen der GitHub-IntegrationTest GitHub integration

Übernehmen Sie eine Änderung in Ihrer Verzweigung, um die GitHub-Integration mit Jenkins zu testen.To test the GitHub integration with Jenkins, commit a change in your fork.

Kehren Sie zur GitHub-Web-UI zurück, und wählen Sie Ihr verzweigtes Repository aus. Wählen Sie anschließend die Datei index.js aus.Back in GitHub web UI, select your forked repo, and then select the index.js file. Wählen Sie das Stiftsymbol, um diese Datei zu bearbeiten, sodass in der sechsten Zeile Folgendes steht:Select the pencil icon to edit this file so line 6 reads:

response.end("Hello World!");

Wählen Sie die Schaltfläche Commit Changes (Änderungen übernehmen) am unteren Rand aus, um die Änderungen zu übernehmen.To commit your changes, select the Commit changes button at the bottom.

In Jenkins können Sie mit einem neuen Build im Bereich Build history (Buildverlauf) in der unteren linken Ecke der Auftragsseite beginnen.In Jenkins, a new build starts under the Build history section of the bottom left-hand corner of your job page. Wählen Sie den Link der Buildnummer und dann auf der linken Seite Konsolenausgabe aus.Choose the build number link and select Console output on the left-hand side. Sie können sich die von Jenkins durchgeführten Schritte anschauen, während ein Pullvorgang für Ihren Code aus GitHub durchgeführt wird. Der Buildvorgang gibt die Meldung Test an die Konsole aus.You can view the steps Jenkins takes as your code is pulled from GitHub and the build action outputs the message Test to the console. Jedes Mal, wenn ein Commit in GitHub ausgeführt wird, wendet sich der Webhook an Jenkins und löst so einen neuen Build aus.Each time a commit is made in GitHub, the webhook reaches out to Jenkins and triggers a new build in this way.

Definieren eines Docker-BuildimagesDefine Docker build image

Erstellen Sie ein Docker-Image zum Ausführen der Anwendung, um das auf Ihren GitHub-Commits basierte Ausführen der node.js-App zu sehen.To see the Node.js app running based on your GitHub commits, lets build a Docker image to run the app. Das Image wird aus einer Dockerfile-Datei erstellt, die die Konfiguration des Containers definiert, der die App ausführt.The image is built from a Dockerfile that defines how to configure the container that runs the app.

Wechseln Sie von der SSH-Verbindung mit Ihrer VM zum Jenkins-Arbeitsbereichsverzeichnis, das nach dem von Ihnen in einem vorherigen Schritt erstellten Auftrag benannt ist.From the SSH connection to your VM, change to the Jenkins workspace directory named after the job you created in a previous step. In diesem Beispiel hieß es HelloWorld.In this example, that was named HelloWorld.

cd /var/lib/jenkins/workspace/HelloWorld

Erstellen Sie in diesem Arbeitsbereichsverzeichnis mithilfe von sudo sensible-editor Dockerfile eine Datei, und fügen Sie den folgenden Inhalt ein.Create a file in this workspace directory with sudo sensible-editor Dockerfile and paste the following contents. Stellen Sie sicher, dass die gesamte Dockerfile-Datei ordnungsgemäß kopiert wird, insbesondere die erste Zeile:Make sure that the whole Dockerfile is copied correctly, especially the first line:

FROM node:alpine

EXPOSE 1337

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

Diese Dockerfile-Datei verwendet das node.js-Basisimage mithilfe von Alpine Linux, macht Port 1337 verfügbar, auf dem die Anwendung „Hello World“ ausgeführt wird, und kopiert anschließend die Anwendungsdateien und initialisiert sie.This Dockerfile uses the base Node.js image using Alpine Linux, exposes port 1337 that the Hello World app runs on, then copies the app files and initializes it.

Erstellen von Jenkins-BuildregelnCreate Jenkins build rules

Sie haben in einem vorherigen Schritt eine einfache Jenkins-Buildregel erstellt, die eine Meldung an die Konsole ausgegeben hat.In a previous step, you created a basic Jenkins build rule that output a message to the console. Erstellen Sie die Buildschritte, mit denen Sie die Dockerfile-Datei verwenden und die Anwendung ausführen können.Lets create the build step to use our Dockerfile and run the app.

Kehren Sie zu Ihrer Jenkins-Instanz zurück, und wählen Sie den Auftrag aus, den Sie in einem vorherigen Schritt erstellt haben.Back in your Jenkins instance, select the job you created in a previous step. Wählen Sie links Configure (Konfigurieren), und scrollen Sie nach unten zum Bereich Build:Select Configure on the left-hand side and scroll down to the Build section:

  • Entfernen Sie den vorhandenen Buildschritt echo "Test".Remove your existing echo "Test" build step. Wählen Sie dazu das rote Kreuz in der oberen rechten Ecke des Felds des vorhandenen Buildschritts aus.Select the red cross on the top right-hand corner of the existing build step box.

  • Wählen Sie Add build step (Buildschritt hinzufügen) und anschließend Execute shell (Shell ausführen) aus.Choose Add build step, then select Execute shell

  • Geben Sie im Feld Befehl die folgenden Docker-Befehle ein, und wählen Sie anschließend Speichern aus:In the Command box, enter the following Docker commands, then select Save:

    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 markieren es mit der Jenkins-Buildnummer, damit Sie einen Verlauf der Images erhalten.The Docker build steps create an image and tag it with the Jenkins build number so you can maintain a history of images. Alle vorhandenen Container, die die Anwendung ausführen, werden beendet und entfernt.Any existing containers running the app are stopped and then removed. Ein neuer Container wird dann mithilfe des Images gestartet. Er führt die node.js-Anwendung auf Grundlage der letzten Commits in GitHub aus.A new container is then started using the image and runs your Node.js app based on the latest commits in GitHub.

Testen Ihrer PipelineTest your pipeline

Bearbeiten Sie erneut die Datei index.js in Ihrem verzweigten GitHub-Repository, und wählen Sie Änderungen übernehmen aus.To see the whole pipeline in action, edit the index.js file in your forked GitHub repo again and select Commit change. In Jenkins wird ein neuer Auftrag auf Grundlage des Webhooks für GitHub gestartet.A new job starts in Jenkins based on the webhook for GitHub. Das Erstellen des Docker-Images und das Starten Ihrer Anwendung in einem neuen Container nimmt einige Sekunden in Anspruch.It takes a few seconds to create the Docker image and start your app in a new container.

Falls dies vonnöten ist, können Sie die öffentliche IP-Adresse Ihrer VM erneut abrufen:If needed, obtain the public IP address of your VM again:

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

Öffnen Sie einen Webbrowser, und geben Sie http://<publicIps>:1337 ein.Open a web browser and enter http://<publicIps>:1337. Ihre node.js-Anwendung wird wie folgt mit den letzten Änderungen in Ihrer GitHub-Verzweigung angezeigt:Your Node.js app is displayed and reflects the latest commits in your GitHub fork as follows:

Ausgeführte Node.js-App

Bearbeiten Sie anschließend die Datei index.js noch einmal in GitHub, und übernehmen Sie die Änderungen.Now make another edit to the index.js file in GitHub and commit the change. Das Abschließen des Auftrags in Jenkins nimmt einige Sekunden in Anspruch. Aktualisieren Sie danach Ihren Webbrowser, um die aktualisierte Version Ihrer in einem neuen Container ausgeführten App wie folgt anzuzeigen:Wait a few seconds for the job to complete in Jenkins, then refresh your web browser to see the updated version of your app running in a new container as follows:

Ausführen der node.js-Anwendung nach einem weiteren GitHub-Commitvorgang

Nächste SchritteNext steps

In diesem Tutorial haben Sie GitHub so konfiguriert, dass es einen Jenkins-Buildauftrag bei jedem Code-Commit ausführt und anschließend einen Docker-Container zum Testen der Anwendung bereitstellt.In this tutorial, you configured GitHub to run a Jenkins build job on each code commit and then deploy a Docker container to test your app. Sie haben Folgendes gelernt:You learned how to:

  • eine Jenkins-VM erstellen könnenCreate a Jenkins VM
  • Jenkins installieren und konfigurieren könnenInstall and configure Jenkins
  • eine Webhookintegrations zwischen GitHub und Jenkins erstellen könnenCreate webhook integration between GitHub and Jenkins
  • Jenkins-Buildauftrag aus GitHub-Commits erstellen und auslösen könnenCreate and trigger Jenkins build jobs from GitHub commits
  • ein Docker-Image für Ihre Anwendung erstellen könnenCreate a Docker image for your app
  • überprüfen können, ob GitHub-Commits neue Docker-Images und -Updates für die ausgeführte Anwendung erstellenVerify GitHub commits build new Docker image and updates running app

Im nächsten Tutorial erhalten Sie Informationen zum Integrieren von Jenkins in Azure DevOps Services.Advance to the next tutorial to learn more about how to integrate Jenkins with Azure DevOps Services.