Kontinuierliche Integration mit Jenkins

Rückblickend auf die Entwicklung und Bereitstellung von Software vor 15 Jahren scheint es überraschend, dass unsere Anwendungen tatsächlich funktionierten. In jenen Tagen bestand ein Softwareentwicklungslebenszyklus darin, Builds auf einem lokalen Computer auszuführen, die Artefakte manuell auf einen Staging-Server zu kopieren und jede Anwendung manuell durch mehrere Iterationen zu testen. Wenn das Entwicklerteam mit dem Build zufrieden war, stellten wir die Anwendung manuell in der Produktion bereit. Das Beständigste an diesem Entwicklungsstil war die Inkonsistenz - im Prozess und in den Ergebnissen.

Vor über einem Jahrzehnt begannen agile Entwickler, testgetriebene Entwicklung und kontinuierliche Integration (CI) zu begrüßen und zu fördern. Mit diesen Techniken konnten wir automatisch Quellcode erstellen, wenn ein Entwickler ihn in ein Quellrepository eincheckte und eine umfassende Unit-Test-Suite ausführte, um sicherzustellen, dass eine Anwendung ordnungsgemäß funktionierte. Viele testgetriebene Entwickler haben auch begonnen, Integrationstests und Leistungstests in einem sekundären CI-Prozess durchzuführen.

Durch die kontinuierliche Integration konnten wir Fehler schneller erkennen und Code viel schneller veröffentlichen als in den Vorjahren. Es ist keine Übertreibung zu sagen, dass CI die "Build" -Seite des Build-and-Deployment-Zyklus gezähmt hat. Heutzutage sind viele Entwicklerteams über CI zu CD übergegangen, was entweder für kontinuierliche Lieferung oder kontinuierliche Bereitstellung steht. Unabhängig von der Bezeichnung ist CD ein Prozess, bei dem Software vom Einchecken des Codes zum Staging oder sogar zur Bereitstellung in der Produktion verschoben wird.

Diese Ausgabe von Open Source Java-Projekten führt die kontinuierliche Integration mit Jenkins ein, einem führenden Automatisierungsserver für CI / CD. Wir beginnen mit einem Überblick über den CI- und CD-Prozess und richten dann ein Java-Webprojekt mit Maven und Jenkins ein. Sie lernen, wie Sie das Projekt in Jenkins mit JUnit erstellen und testen und wie Sie Buildfehler beheben. Sie werden auch eine Handvoll beliebter Jenkins-Plugins installieren und ausführen, um statische Code-Analysen zu testen und Berichte zu erstellen.

Einführung in CI / CD

In einem kontinuierlichen Integrationsprozess kann Code, der in ein Quellcode-Repository eingecheckt wurde, automatisch ausgecheckt, erstellt, auf verschiedene Arten getestet und in einem Repository veröffentlicht werden. Damit die kontinuierliche Integration funktioniert, benötigen Sie einen CI-Server wie Jenkins, der Ihr Quellcode-Repository auf neue Änderungen überwachen und auf konfigurierbare Weise reagieren kann.

Nehmen Sie als Beispiel eine Java-Anwendung, die mit Maven erstellt wurde. Beim Erkennen von Codeänderungen kann Ihr CI-Server mit der Ausführung von a reagieren mvn clean install. In einer typischen Maven-Build-Konfiguration würde ein neuer Satz von Komponententests als Teil des Build-Befehls ausgeführt. Während der Erstellung des Quellcodes konnte der Server eine beliebige Anzahl zusätzlicher Aktionen ausführen:

  • Führen Sie Ihren Feature-Zweig wieder in Ihrem Haupt- oder Hauptzweig zusammen, sobald der festgeschriebene Code den Komponententest bestanden hat.
  • Führen Sie eine statische Code-Analyse durch, z. B. Codeabdeckung, Code-Komplexität, Überprüfung auf häufige Fehler usw.
  • Veröffentlichen Sie Ihre Build-Artefakte in einem Repository wie Artifactory oder Sonatype Nexus
  • Stellen Sie Ihre Anwendung in einer Integrationstestumgebung bereit
  • Führen Sie Integrationstests durch
  • Stellen Sie Ihre Anwendung in einer Leistungstestumgebung bereit
  • Führen Sie einen Auslastungstest für Ihre Anwendung durch
  • Stellen Sie Ihre Anwendung in einer UAT (User Acceptance Testing Environment) bereit.
  • Stellen Sie Ihre Anwendung für die Produktion bereit

Diese Schritte sind alle Arten von Aktivitäten, die Sie möglicherweise als Teil eines CI / CD-Prozesses ausführen. CI umfasst normalerweise die Erstellungs- und Testphasen des Entwicklungslebenszyklus, während CD diesen Prozess auf die Bereitstellung eines Build-Artefakts auf einem Server zum Testen erweitert. In einigen Umgebungen reicht die CD bis zur Produktion.

Die kontinuierliche Integration erfolgt normalerweise mit einem Tool wie Jenkins, Bamboo oder TeamCity, das Ihre Build-Schritte in eine Integrationspipeline koordiniert. Jenkins ist wahrscheinlich das beliebteste CI / CD-Produkt und passt gut zu Docker.

Laden Sie Jenkins herunter und installieren Sie es

Jenkins ist ein Continuous Integration Server und mehr. Es besteht aus einer Automatisierungs-Engine und einem Plugin-Ökosystem, das kontinuierliche Integration, automatisierte Tests und kontinuierliche Bereitstellung unterstützt. Sie passen die Lieferpipeline an Ihre Bedürfnisse an.

Es gibt viele Möglichkeiten, Jenkins auszuführen:

  1. Laden Sie eine WAR-Datei herunter und installieren Sie sie auf einem Servlet-Container auf Ihrem lokalen Computer.
  2. Richten Sie eine virtuelle Maschine in einer öffentlichen Cloud wie AWS ein und hosten Sie dort Jenkins.
  3. Nutzen Sie einen Jenkins-Cloud-Anbieter wie CloudBees.
  4. Richten Sie Jenkins in einer Testinstallation mit Docker ein.

Ich zeige Ihnen, wie Sie sowohl die lokale Installation als auch die Docker-Testinstallation einrichten.

Laden Sie Jenkins lokal herunter und installieren Sie es

Laden Sie zunächst Jenkins herunter und wählen Sie auf der Jenkins-Homepage die Version Long-Term Support (LTS) aus. Da ich auf einem Mac bin, hat die Installation automatisch eine pkgDatei heruntergeladen , die jenkins.warin meinem Application/JenkinsOrdner abgelegt wurde . Die WAR-Datei kann in jedem Servlet-Container bereitgestellt werden.

Sie möchten auch Apache Tomcat herunterladen und installieren. Zum jetzigen Zeitpunkt ist die aktuellste Version von Tomcat 8.5.4, Sie sollten jedoch in der Lage sein, jede neuere Version auszuführen. Laden Sie die Datei zipoder herunter tar.gzund dekomprimieren Sie sie auf Ihre Festplatte. Kopieren Sie die Datei jenkins.war in den webappsOrdner von Tomcat und führen Sie die Datei bin/startup.shoder aus bin/startup.bat. Sie können testen, ob es ausgeführt wird, indem Sie Ihren Browser auf Folgendes öffnen : //localhost:8080.

Öffnen Sie zum Starten von Jenkins einen Browser mit der URL: // localhost: 8080 / jenkins.

Sie sollten einen Bildschirm erhalten, der wie in Abbildung 1 aussieht.

Steven Haines

Als Nächstes erstellt Jenkins ein Administrationskennwort und schreibt dieses sowohl in die logs/catalina.outProtokolldatei von Tomcat als auch in das folgende Ausgangsverzeichnis : .jenkins/secrets/initialAdminPassword. Rufen Sie das Kennwort ab, geben Sie es in das Formularelement Administratorkennwort ein (siehe Abbildung 1) und klicken Sie auf Weiter . Sie werden aufgefordert, entweder die vorgeschlagenen Plugins zu installieren oder die zu installierenden Plugins auszuwählen. Im Moment empfehle ich die Installation der vorgeschlagenen Plugins.

Jetzt werden Sie aufgefordert, einen Administrator zu erstellen. Geben Sie Ihre Administrator-Benutzerinformationen ein und klicken Sie auf Speichern und Fertig stellen . Klicken Sie abschließend auf Mit Jenkins starten . Sie sehen nun die Jenkins-Homepage (siehe Abbildung 2).

Steven Haines

Konfigurieren Sie die Beispiel-App mit Maven

Before we can use Jenkins to build a Java web project with Maven, we need to setup both of these technologies. Under-the-hood, Jenkins will checkout source code from a source code repository to a local directory and execute the Maven targets that you specify. For that to work, you need to install one or more versions of Maven, tell Jenkins where they're installed, and configure the version of Maven that you want Jenkins to use when building your application.

Klicken Sie im Jenkins-Dashboard auf Jenkins verwalten und wählen Sie Globale Toolkonfiguration . Als erstes konfigurieren wir ein JDK. Klicken Sie im Abschnitt JDK auf JDK hinzufügen, geben Sie ihm einen Namen (meiner ist "JDK8") und lassen Sie die Standardinstallation von java.sun.com aktiviert . Akzeptieren Sie die Oracle-Lizenzvereinbarung und klicken Sie auf den Link "Bitte geben Sie Ihren Benutzernamen / Ihr Passwort ein". Geben Sie Ihren Oracle-Benutzernamen und Ihr Kennwort ein und klicken Sie auf Schließen . Ihnen wird ein Bildschirm ähnlich Abbildung 3 angezeigt.

Steven Haines

Klicken Sie auf Übernehmen , um Ihre Arbeit zu speichern. Scrollen Sie dann zum Abschnitt Maven und klicken Sie auf Maven hinzufügen . Geben Sie einen Namen für Maven ein (meiner ist "Maven 3.3.9"), lassen Sie "Automatisch installieren" und "Von Apache installieren" aktiviert. Klicken Sie auf Speichern, wenn Sie bereit sind. Ihnen sollte ein Bildschirm ähnlich Abbildung 4 angezeigt werden.

Steven Haines

Git ist mit Jenkins vorkonfiguriert, daher sollten jetzt alle Tools installiert sein, die Sie zum Auschecken und Erstellen eines Java-Projekts von Git mit Maven benötigen.

Installieren Sie Jenkins in einem Docker-Container

If you don't want to install Jenkins on your local machine, you have the option of running it in a Docker container. The official Jenkins Docker image lets you run and test an installation of Jenkins without actually configuring it on a local machine.

Installing Docker

See my introduction to Docker for a beginner's guide to Docker, including installation and setup instructions.

Assuming you already have Docker setup in your development environment, you can launch Jenkins from the Docker the command line:

 docker run -p 8080:8080 -p 50000:50000 -v /your/home/jenkins:/var/jenkins_home -d jenkins 

This command tells Docker to run the latest release of jenkins with the following options:

  • -p 8080:8080: Maps port 8080 on the Docker container to port 8080 on the Docker host, so that you can connect to the Jenkins web app on port 8080.
  • -p 50000:50000: Maps port 50000 on the Docker container to port 50000 on the Docker host. Jenkins uses this port internally to allow build slave executors to connect to the master Jenkins server.
  • -v /your/home/jenkins:/var/jenkins_home: Maps Jenkins data storage to your local directory, so that you can restart your Docker container without losing your data.
  • -d: Lets you run the Docker container in a detached mode, or as a daemon process.

The following shows the output for running these commands:

 $ docker run -p 8000:8080 -v /Users/shaines/jenkins/:/var/jenkins_home -d jenkins cc16573ce71ae424d4122e9e4afd3a294fda6606e0333838fe332fc4e11d0d53 

Because we're running our Docker container in detached mode, we need to follow the logs that are output by Jenkins. You can do so with the docker logs -f command. Just pass in the first few hexadecimal numbers of the container ID, in this case cc16573ce71ae424d4122e9e4afd3a294fda6606e0333838fe332fc4e11d0d53:

 $ docker logs -f cc1 Running from: /usr/share/jenkins/jenkins.war webroot: EnvVars.masterEnvVars.get("JENKINS_HOME") ... ************************************************************* ************************************************************* ************************************************************* Jenkins initial setup is required. An admin user has been created and a password generated. Please use the following password to proceed to installation: 205be6fe69c447dd933a3c9ce7420496 This may also be found at: /var/jenkins_home/secrets/initialAdminPassword ************************************************************* ************************************************************* ************************************************************* 

Setup Jenkins CI for a Java web app

Als Nächstes richten wir einen einfachen Java-Webanwendungsjob in Jenkins ein. Da die Anwendung für dieses Tutorial nicht wichtig ist, verwenden wir meine einfache Hello, World Servlet-Beispiel-App, die ich auf GitHub gehostet habe.

Um Jenkins zu testen, müssen Sie in der Lage sein, Änderungen an einem Quellcode-Repository festzuschreiben. Daher sollten Sie dieses Repository jetzt erstellen. Klicken Sie auf der Jenkins-Startseite auf die Schaltfläche Neue Jobs erstellen und geben Sie den Namen Ihres Projekts ein. Sie werden aufgefordert, den Projekttyp auszuwählen (siehe Abbildung 5).

Steven Haines

Wir werden den Freestyle-Projekttyp für dieses Projekt auswählen, aber Sie sollten sich Ihrer Optionen bewusst sein:

  • Freestyle-Projekt: Mit diesem am häufigsten verwendeten Projekttyp können Sie ein Quellcode-Repository überwachen und jedes Build-System wie Maven und Ant verwenden.
  • Pipeline: Choose this project type for complicated projects with moving parts that you need to coordinate across multiple build slaves.
  • External job: Use this to configure an automated external job that you want to track in Jenkins as part of your build.
  • Multi-configuration project: This is the job type for projects that require different configurations for different environments, such as production, staging, and test.
  • Folder: When you have a complicated build then you might want to organize things into folders, each with their own distinct namespace.
  • Multi-branch pipeline: automatically create a set of pipeline projects, based on the code branches that are defined in your source code repository

Enter a project name, in this case "hello-world-servlet", and choose "OK". Next, choose GitHub project, then enter the GitHub URL of your project: //github.com/ligado/hello-world-servlet.

Under Source Code Management, choose Git and enter the same project URL.

In the Build Triggers section, choose Build when a change is pushed to GitHub so that Jenkins will build your code anytime you push a change to GitHub.

Im Build - Abschnitt, fügen Sie einen neuen Build - Schritt, wählen Sie Invoke Top-Level - Maven Ziele , wählen Sie die Maven - Instanz, die Sie konfiguriert zuvor (wie „Maven 3.3.9“) und geben Sie saubere Installation im Feld Ziele. Lassen Sie die Post-Build-Aktionen vorerst leer. Wenn Sie fertig sind, drücken Sie Speichern .

Wenn Sie zum Dashboard zurückkehren, sollte ein Bildschirm ähnlich Abbildung 6 angezeigt werden.

Steven Haines

Um Ihre Konfiguration zu testen, klicken Sie auf die Schaltfläche Jetzt erstellen neben dem Hallo-Welt-Servlet-Projekt. Im Build-Verlauf auf der linken Seite der Projektseite (siehe Abbildung 7) sollte ein Build erfolgreich ausgeführt werden.

Steven Haines

Um genau zu sehen, was passiert ist, klicken Sie auf den Build und dann auf Konsolenausgabe. Daraufhin werden alle von Jenkins ausgeführten Schritte und deren Ergebnisse angezeigt. Die Konsolenausgabe ist unten.