Jenkins
Was ist Jenkins?
Jenkins ist ein Open Source Tool für Continuous Integration/Continuous Delivery (CI/CD), sowie Automatisierung und DevOps, das in der Programmiersprache Java geschrieben ist. Mit dem Programm lassen sich CI/CD-Workflows, sogenannte Pipelines, implementieren.
Pipelines automatisieren Tests und Berichte zu isolierten Änderungen in einer größeren Codebasis in Echtzeit und erleichtern die Integration unterschiedlicher Codezweige in einen Hauptzweig. Sie erkennen auch schnell Fehler in einer Codebasis, erstellen die Software, automatisieren das Testen ihrer Builds, bereiten die Codebasis für die Bereitstellung (Auslieferung) vor und stellen schließlich Code in Containern und virtuellen Maschinen sowie Bare-Metal- und Cloud-Servern bereit.
Es gibt mehrere kommerzielle Versionen von Jenkins. Diese Definition beschreibt nur das Upstream-Open-Source-Projekt.
Geschichte von Jenkins
Jenkins ist ein Fork eines Projekts namens Hudson, das von Oracle markenrechtlich geschützt wurde. Hudson wurde schließlich der Eclipse Foundation gespendet und befindet sich nicht mehr in der Entwicklung. Die Entwicklung von Jenkins wird als Open-Source-Projekt unter der Leitung der CD Foundation, einer Organisation innerhalb der Linux Foundation, verwaltet.
Kontinuierliche Integration hat sich seit ihrer Erfindung weiterentwickelt. Ursprünglich war es die Norm, das Teams einen Build pro Tag veröffentlichen. Nun ist es die übliche Regel, dass jedes Teammitglied täglich (oder häufiger) Arbeit einreicht, die als Commit bezeichnet wird, und dass bei jeder wesentlichen Änderung ein Build durchgeführt wird. Bei richtiger Anwendung bietet Continuous Integration verschiedene Vorteile, wie zum Beispiel ständige Rückmeldungen zum Status der Software. Da CI Mängel frühzeitig in der Entwicklung erkennt, sind Fehler in der Regel kleiner, weniger komplex und leichter zu beheben.
Jenkins und CI/CD
Im Laufe der Zeit wurden Jenkins Continuous Delivery und Deployment hinzugefügt. Continuous Delivery bedeutet, dass das Erstellen und Packen von Code für die spätere Bereitstellung in Test-, Staging- und Produktionsumgebungen automatisiert wird. Continuous Deployment automatisiert den letzten Schritt der Bereitstellung des Codes an seinem endgültigen Ziel.
In beiden Fällen reduziert die Automatisierung die Anzahl der auftretenden Fehler, da die richtigen Schritte und Best Practices in Jenkins kodiert sind. Jenkins beschreibt einen gewünschten Zustand und der Automatisierungsserver stellt sicher, dass dieser Zustand erreicht wird. Darüber hinaus macht diese Automatisierung die Bereitstellung schneller, da Vorgänge nicht mehr an personelle Beschränkungen gebunden sind. Schließlich reduziert Jenkins die Belastung des Entwicklungs- und Betriebsteams, indem es die Notwendigkeit von Rollouts mitten in der Nacht und am Wochenende beseitigt.
Jenkins und Microservices
Jenkins bewährt sich besonders in Microservices-Architekturen. Da es eines der Ziele von Microservices ist, Anwendungen und Dienste häufig zu aktualisieren, sollten Sie dafür sorgen, dass Ihre Bandbreite die Releases nicht verzögert. Mehr und kleinere Dienste mit schnelleren Update-Intervallen lassen sich nur durch Automatisierung gut umsetzen – und dafür ist Jenkins gedacht.
Jenkins X
Das Jenkins X-Projekt wurde zuvor 2018 mit dem Ziel gestartet, ein modernes, Cloud-natives Jenkins zu schaffen. Es ist auch ein Projekt unter der Leitung der CD Foundation. Seine Architektur, Technologie und Pipeline-Sprache unterscheiden sich vollständig von Jenkins. Jenkins X ist für Kubernetes konzipiert und verwendet es in einer eigenen Implementierung. Andere Cloud-native Technologien, die Jenkins X verwendet, sind Helm und Tekton.
So funktioniert Jenkins
Jenkins läuft auf einer Vielzahl von Plattformen, darunter Windows, macOS, Unix-Varianten und insbesondere auf Linux. Es erfordert eine Java 8 VM und höher und kann auf Oracle JRE oder OpenJDK ausgeführt werden. Normalerweise läuft Jenkins als Java-Servlet innerhalb eines Jetty-Anwendungsservers. Es kann aber auch auf anderen Java-Anwendungsservern wie Apache Tomcat ausgeführt werden. In jüngerer Zeit wurde Jenkins für die Ausführung in einem Docker-Container angepasst. Im Docker Hub-Online-Repository sind schreibgeschützte Jenkins-Images verfügbar.
Um Jenkins zu betreiben, werden Pipelines erstellt. Eine Pipeline ist eine Reihe von Schritten, die der Jenkins-Server ausführt. Sie sind in einem Jenkinsfile in Klartext gespeichert. Das Jenkinsfile verwendet eine Syntax mit geschweifter Klammer, die JSON ähnlich sieht. Schritte in der Pipeline werden als Befehle mit Parametern deklariert und in geschweifte Klammern gekapselt. Der Jenkins-Server liest dann das Jenkinsfile und führt seine Befehle aus, wobei der Code die Pipeline vom festgeschriebenen Quellcode zur Produktionslaufzeit weiterleitet. Ein Jenkinsfile kann über eine GUI oder durch direktes Schreiben von Code erstellt werden.
Plug-ins
Für Jenkins sind eine Reihe von Plug-ins verfügbar, damit Jenkins mit anderen Tools zusammenarbeiten kann, oder um die Funktionen der Software zu erweitern. Plug-ins können aus dem Online-Repository für Jenkins-Plug-ins heruntergeladen und über die Jenkins-Webbenutzeroberfläche oder -CLI (Kommandozeile, Command Line Interface) geladen werden. Derzeit schätzt die Jenkins-Community, dass über 1.700 Plug-ins für eine Vielzahl von Anwendungen verfügbar sind.
Plug-ins unterstützen bei der Integration anderer Entwickler-Tools in die Jenkins-Umgebung, fügen der Jenkins-Web-UI neue Elemente hinzu, und erleichtern die Verwaltung und Benutzung im Allgemeinen. Ein wichtiges Einsatzgebiet von Plug-ins ist das Bereitstellen von Integrationspunkten für CI/CD-Quellen und -Ziele. Dazu gehören Software-Versionskontrollsysteme (SVCs) wie Git und Atlassian BitBucket, Container-Laufzeitsysteme – insbesondere Docker, sowie Hypervisoren wie VMware vSphere, Public-Cloud-Instanzen wie Google Cloud und AWS und schließlich Private-Cloud-Systeme wie OpenStack. Es gibt auch Plug-ins, welche die Kommunikation mit Betriebssystemen über FTP, CIFS und SSH unterstützen.
Plug-ins verwenden ihren eigenen Satz von Java-Annotationen und Designmustern, die definieren, wie sie instanziert werden, Erweiterungspunkte, die Funktionen des Plug-ins und die UI-Darstellung in der Jenkins-Web-UI. Die Plug-in-Entwicklung nutzt außerdem die Maven-Bereitstellung für Jenkins.
Sicherheit
Bei der Sicherheit für Jenkins geht es vor allem darum, den Server und die Benutzer zu schützen. Die Serversicherheit wird auf die gleiche Weise erreicht, wie jeder andere Server gesichert wird. Der Zugriff auf den Standort, beispielsweise eine VM oder einen Bare-Metal-Server, ist so konfiguriert, dass möglichst wenige Prozesse mit dem Server kommunizieren können. Dies wird durch typische Serverbetriebssysteme und Netzwerksicherheitsfunktionen erreicht.
Darüber hinaus ist der Zugriff auf den Server über die Jenkins-Benutzeroberfläche mit Standardtechniken wie der Multi-Faktor-Authentifizierung ebenfalls auf die geringste Anzahl von Benutzern beschränkt. Das erreichen Sie, indem Sie die Benutzersicherheitsfunktionen des HTTP-Servers nutzen, auf dem die Benutzeroberfläche läuft.
Jenkins enthält außerdem Sicherheitsfunktionen für seine interne Nutzerdatenbank. Auf diese Funktionen greifen Sie über die Jenkins-Webbenutzeroberfläche zu. Jenkins unterscheidet zwei Sicherheitsbereiche: den Sicherheitsbereich und den Autorisierungsbereich. Im Sicherheitsbereich regeln Administratoren, wer Zugriff auf Jenkins hat, und im Autorisierungsbereich bestimmen sie, was er mit diesem Zugriff tun kann.
Vorteile und Nachteile
Wie bei der meisten Software gibt es auch bei Jenkins Vor- und Nachteile. Ein großer Vorteil von Jenkins sind seine Plug-ins. Sie tragen zur Flexibilität von Jenkins bei, ebenso wie die umfangreichen Skript- und deklarativen Sprachen, mit denen sich stark benutzerdefinierte Pipelines umsetzen lassen. Da Jenkins weitgehend neutral ist, passt es gut in die meisten Umgebungen, einschließlich komplexer Hybrid- und Multi-Cloud-Systeme.
Jenkins gibt es schon viel länger als andere Lösungen in diesem Bereich. Deshalb sind eine breite Wissensbasis, umfangreiche Dokumentation und zahlreichen Community-Ressourcen verfügbar. Diese Ressourcen erleichtern die Installation, Verwaltung und Fehlerbehebung in Jenkins.
Schließlich basieren Jenkins und seine Plug-ins auf Java. Java ist eine bewährte Entwicklungssprache für Unternehmen mit einem breiten Ökosystem. Damit steht Jenkins auf einer soliden Basis, die mit gängigen Designmustern und Frameworks erweitert werden kann.
Jenkins hat aber trotzdem Nachteile. Die Installation gilt zwar als verhältnismäßig einfach, aber die Integration in die Produktionsumgebung ist kompliziert. Die Entwicklung von Produktionspipelines mit Jenkinsfiles erfordert eine Codierung entweder in der deklarativen oder in der Skriptsprache. Insbesondere komplexe Pipelines können schwierig zu codieren, zu debuggen und zu warten sein.
Das Open-Source-System ist außerdem eine Single-Server-Architektur. Das schränkt die Ressourcen auf einen einzigen Computer, eine virtuelle Maschine oder einen Container ein. Jenkins unterstützt keine Cluster – das kann die Leistung begrenzen. Es kann auch dazu führen, dass es zum Server-Sprawl kommt und das Unternehmen den Überblick über all die einzelnen Jenkins-Server verliert.
Jenkins stützt sich auf ältere Java-Architekturen und -Technologien, insbesondere auf Servlets und Maven. Die Jenkins Docker-Installation erfordert immer noch, dass der Jenkins-Code und die Servlet-Middleware zusammen in einen Container gepackt werden, um die monolithische Architektur beizubehalten. Darüber hinaus ist es nicht dafür ausgelegt, mit neuerer Java-Technologie wie Spring Boot oder GraalVM implementiert zu werden.