Warum arbeiten wir mit Jenkins Pipeline? Rund 50 Entwickler arbeiten bei Ackee daran, Apps für unsere anspruchsvollen Kunden zu entwickeln, zu testen und auszuliefern. Dafür nutzen wir verschiedene Methoden. Bei mehreren Git Pushes und Merge Requests pro Stunde benötigen wir einen schnellen und optimierten Prozess. Die CI/CD mittels vielfältiger Methoden und Clouds bzw. anderenEinsatzzielenzu automatisieren ist sehr wichtig für uns. Deshalb nutzen wir die leistungsstarke Jenkins Pipeline mit der Shared Pipeline Libraryzusammenmit Jenkins und Gitlab.

Unser Backendbasierthauptsächlich auf Kubernetes Cluster sowie auf NodeJS, MongoDB, MySQL und einigen PHP Containern. Das Frontend mit React , Middleman und weiteren Methoden muss schnell getestet und auf den entsprechenden Webservern bereitgestellt werden. Das kann Google Storage Buckets oder FTP Webhosting sein – je nachdem wie der Kunde es haben will.

Auch das Android- und das iOS-Team benötigen eine schnelle und zuverlässigeCI/CD. Generell brauchen alle Teams einen Weg um Merge Requestsaufzubauenund zu testen. Zudem gibt es ständig den Bedarf, etwas an der Infrastruktur zu automatisieren. Deshalb hat für uns diegeskriptete Automatisierungsplattformfür das DevOps-Team eine hohe Priorität.

Jenkins Pipeline ist die bessere Alternative

Vor einiger Zeit haben wir Jenkins Freestyle Jobs genutzt, um ein Repository auszuprobieren. Wir haben es mit einfachenBash Snippets indieKonsoleeingebaut und es anderen Servern mittels SSH, Rsync, etc. zur Verfügung gestellt.

Dann kam Jenkins Pipeline. Jenkins Pipeline ist eine Sammlung von Plugins, die das Einbinden und Integrieren von ständig aktiven Liefer-Pipelines zu Jenkins unterstützen. Also eine Alternative zu den alten Freestyle Jobs.
Mit Jenkins Pipeline muss man nur noch eine Pipeline oder einen Multibranch Pipeline Job erstellen unddie Pipeline als Code definieren. Der Code kann Teil der Job Definition oder auch direkt als Jenkins File im Projekt Repository enthalten sein.

Beispiel Jenkinsfile:

Was Jenkins Pipeline leistet

Die Jenkins Pipeline hat verschiedeneLevels, die dank des Visualizer Plugins sichtbar sind. Was die Jenkins Pipeline kann, ist Folgendes:

– Sie baut die Node App mitNPM(“sh” bedeutetShell Call),
– Sie testet das Ganze
– Sie baut einDocker Imageund verwaltet es
– Sie räumt denWorkspaceauf und
– sie benachrichtigt Slack über das Pipeline Ergebnis.

slackNotify ist einSlack Plugin Call. Das bedeutet, dass Plugins die Syntax der Jenkins Pipeline unterstützen müssen, um als hilfreiche Funktion mit einer Auswahl von Parametern zu gelten.

jenkins pipeline
Jenkins pipeline – stages visualizer

Jenkins Pipeline ist überaus leistungsstark. Sie macht mehr oder weniger alles, was man von ihr will. Da sie die Groovy Sprache nutzt, kann man Java Libraries in der Pipeline verwenden.

Jenkins Shared Pipeline Library

Da wir an vielen Projekten gleichzeitig arbeiten, hätten wir so eine Menge ähnlichen Codes oder das exakt gleiche Jenkinsfile in allen NodeJS und andere Repositorys.

Man stelle sich vor, dass eine einfache Änderung in derslackNotify Funktion Call Syntaxoder einer anderenCIi Client Syntaxbedeuten würde, dass wir den Pipeline Code in allen Repositorys undBranchesändern müssen!
Das ist übrigens neulich passiert beiGCloud cli API Client Syntax. Die alte Syntax wurde abgelehnt und hatGCloud Docker Push zuGCloud Docker — push geändert. In unserem Fall wollen wir die Pipeline Logik nicht im Projekt Repository vorfinden. Das einzige, was wir dort haben wollen, ist die Pipeline Konfiguration. Das kann man ganz einfach erreichen, in dem manJenkins Shared Pipeline Library verwendet. Das ist ein Groovy Git Repository mit der folgendenOrdnerStruktur. 

Dieses shared Pipeline Repository wird jedes Mal überprüft, wenn ein Pipeline Job startet. Man kann es in sein Jenkinsfile einfügen und dort nutzen. Man kann sogar Branches definieren.

Oder man lädt esimplizit. Das kann man in den Jenkins Konfigurationseinstellungen festlegen.

Konfiguration von Jenkinsfile

Wenn man die shared Pipeline Library nutzt, kann das Jenkinsfile im Projekt Repository folgendermaßen aussehen:

Beispiel für eine Jenkins Pipeline

The Jenkinsfile im vorhergehenden Abschnitt ruft eine Funktion PipelineNodeJS auf. Das ist eine globale Funktion, die in der Shared Pipeline Library in vars/PipelineNodeJS.groovy definiert ist.

FürAndroid,iOS,React,middleman, etc. gibt es auch andere Pipelines.

Merge Request Builder

Für den Merge Request Flow mit Gitlab skripten wir einen Jenkins Pipeline Job, der das Gitlab Integration Plugin nutzt.
Hier kommt das Merge Request Builder Job Beispiel für iOS:

Nutze GitLabBuild und GitlabCommitStatus, um die Jenkins Pipeline in Gitlab zu visualisieren und das mergen des MR in Gitlab zu erlauben bzw. zu verbieten. Dieser Job kann global für alle iOS Merge Requests verwendet werden. Setze den WebHook für diesen Jenkins Job von deinem Repository aus – und fertig.

Ein nerviger aber wichtiger Schritt ist derSCM Checkout, bei dem Source undTarget Branchzusammengeführt werden. Die ENV Daten (env.gitlabSourceBranch und env.gitlabTargetBranch) werden vom Gitlab Webhook geparst.
Man kann das Rebuilding des Merge Requests leicht wieder einrichten, wenn ein neuer Push auf Source oder Target Branch erfolgt ist.

Ein weiteres cooles Feature ist, dass man die Jenkins Pipeline durch einen Kommentar im MR nochmals ablaufen lassen kann. Wir nutzen die Phrase “ rebuild pls ” und Jenkins baut den Job automatisch neu auf!

Job DSL und Seed Jobs

Dank des Job DSL Plugins können wir dynamisch Jenkins Pipeline Jobs via Jenkins DSL API generieren.
Einen Job, der andere Jobs generiert, nennt man Seed Job.
Hier kommt ein Beispiel für das Generieren eines iOS Merge Request Jobs:

Die Produktions-Pipeline testen

Jetzt kommt der Moment, in dem wir unsere Jenkins Pipeline aufbauen, testen und ausliefern müssen. CI/CD für die CI/CD-Pipeline.

Yo dawg, I heard you like Inception.

Wir platzieren ein einfaches Jenkinsfile in der Shared Pipeline Library und nutzen es, um die Jobs im vorigen Kapitel “zu säen”.

Weitere großartige Dinge, die man mit der Jenkins Shared Pipeline Library anstellen kann

Alles, was du willst. Wirklich!

Links

Für NodeJS , Android , iOS , React , middleman, etc. gibt es noch weitere Pipelines.

https://github.com/AckeeDevOps/jenkins-pipeline-library

 

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.