Blog

Rationalisierung der Pipeline-Entwicklung mit gemeinsam genutzten Bibliotheken in Jenkins

Bild von Evgeni Stoyanov
Ewgeni Stojanow
DevOps- und Cloud-Ingenieur
22.06.2023
Lesezeit: 5 Minuten.
Zuletzt aktualisiert am: 27.02.2025

Inhaltsübersicht

Maximierung der Pipeline-Effizienz mit Jenkins Shared Libraries

In der CICD-Welt hat sich Jenkins als eines der wichtigsten Tools erwiesen. Es hilft bei der Automatisierung der Erstellung, Prüfung und Bereitstellung von Anwendungen und Infrastruktur. Eine der Stärken von Jenkins ist die Verwendung von Shared Libraries, die es DevOps-Ingenieuren und Entwicklern ermöglicht, Code über mehrere Projekte und Pipelines hinweg wiederzuverwenden. In diesem Blog werden wir das Konzept der Shared Libraries untersuchen und erörtern, wie sie Ihre CICD-Workflows verbessern können.

Wie erstellt man eine Shared Library in Jenkins?

Gemeinsam genutzte Bibliotheken sind wiederverwendbare Codeblöcke, die von mehreren Pipelines gemeinsam genutzt werden können. Um eine gemeinsam genutzte Bibliothek in Jenkins zu erstellen, ist es am besten, ein eigenes Repository in Ihrem SCM-Tool zu erstellen, in dem Ihr Code gespeichert wird. Sie können GitHub, GitLab, Bitbucket, etc. verwenden. 

Gemäß den Best Practices sollten diese Repositories vollständig vom Rest Ihres Codes getrennt sein. Wenn Sie beispielsweise Code mit Groovy-Pipelines haben, sollte dieser in anderen Repositories liegen als der Code für die Shared Libraries. Jenkins bietet einen eigenen Abschnitt für die Konfiguration Ihrer Shared Library-Repositories und deren Anmeldeinformationen. Sobald diese konfiguriert sind, kann Jenkins sie auslesen und in Ihre Pipelines einfügen. Sie sind in der Regel in Groovy geschrieben - einer objektorientierten Sprache, die auf der Java-Plattform basiert.

Sobald Sie die gemeinsam genutzte Bibliothek erstellt und konfiguriert haben, können Sie sie in Ihren Pipelines verwenden. Sie werden in Pipelines mit dem Vermerk "@Library" importiert. Danach wählen Sie in Klammern die Bibliothek aus. Es ist üblich, alles aus der Bibliothek zu importieren, indem man nach den Klammern ein Leerzeichen und einen Unterstrich hinzufügt, etwa so: @Library("my-shared-library") _

Alternativ können Sie auch eine einzelne Klasse importieren, indem Sie sie wie folgt importieren:

@Library('my-shared-library')
import mylib.ShareClass

Es wird empfohlen, die Anzahl der Dateien und die Größe der Bibliotheken gering zu halten, da bei jeder Ausführung einer Pipeline die Bibliothek in den Arbeitsbereich geklont wird, was sich bei großen Bibliotheken negativ auf die Auftragslaufzeit auswirken kann.

Was sind die Vorteile von gemeinsam genutzten Bibliotheken?

Sehen wir uns die Vorteile der Verwendung von Shared Libraries an:

  • Wiederverwendung von Code: Gemeinsame Bibliotheken ermöglichen die Wiederverwendung von Code, wodurch Doppelarbeit vermieden und die Wartbarkeit verbessert wird.
  • Standardisierung: Mit Shared Libraries können Sie Ihre Aufträge standardisieren, indem Sie Schritte verwenden, die in mehreren Projekten verwendet werden können. Dies gewährleistet Konsistenz und verringert die Fehleranfälligkeit.
  • Versionierung und Aktualisierungen: Die Aufbewahrung von Funktionen/Methoden in einem Shared Library Repository ermöglicht einfache Aktualisierungen, wobei Informationen über frühere Versionen des Codes erhalten bleiben. Dies hilft bei der effektiven Verwaltung von Änderungen.
  • Kollaboration zwischen Teams: Gemeinsame Bibliotheken erleichtern die Zusammenarbeit, indem sie den Austausch von Code, die Überprüfung und gemeinsame Verbesserungen ermöglichen. So können Teams effizienter zusammenarbeiten.

Schritt-für-Schritt-Anleitung: Einrichten einer Pipeline mit einer Shared Library-Funktion

Folgen Sie der folgenden Schritt-für-Schritt-Anleitung, um eine Pipeline mit einer Funktion aus der Share Library einzurichten.

  1. Wenn wir uns an die Regeln halten, sollten wir ein neues Repository anlegen und dann einen Ordner `vars` und eine Datei mit dem Code in diesem Ordner erstellen. In unserem Fall wird die Datei myLibrary.groovy heißen. Lassen Sie uns die Funktion in dieser Datei definieren:
def print(String name) {

    echo "Hello, ${name}!"

}
  1. Konfigurieren Sie Jenkins so, dass es die gemeinsam genutzte Bibliothek verwenden kann.

Gehen Sie zu Jenkins verwalten. Konfigurieren Sie das System und scrollen Sie nach unten zu GLobal Pipeline Libraries. Klicken Sie auf Hinzufügen und denken Sie sich einen Namen für die Bibliothek aus. Für diesen Artikel haben wir my-shared-library gewählt, aber Sie können die Bibliothek nach Belieben benennen. Im Abschnitt Standardversion verwenden wir den Namen der Verzweigung, die in diesem Fall main ist, aber Sie können in der offiziellen Jenkins-Dokumentation Details zu den verschiedenen Versionsoptionen nachlesen.

Globale Pipeline-Bibliotheken Jenkins
Abrufmethode
  1. Fügen Sie Ihr neu erstelltes Repository mit den gemeinsam genutzten Bibliotheken hinzu und konfigurieren Sie die Anmeldeinformationen für den Zugriff auf dieses Repository, dann speichern Sie die Konfiguration. Ich empfehle die Lektüre der Dokumentation über die Optionen in den Globalen Pipeline-Bibliotheken.
  2. Jenkins-Pipeline erstellen

Lassen Sie uns nun mit dem nächsten Schritt fortfahren - erstellen Sie eine Jenkins-Pipeline und benennen Sie sie entsprechend dem Szenario und fügen Sie optional eine passende Beschreibung hinzu.

Für diesen Test können wir alles überspringen und die Standardeinstellungen beibehalten, bis wir zum Abschnitt "Pipeline" kommen.

Im Abschnitt "Pipeline" können wir im Allgemeinen "Pipeline-Skript aus SCM" wie GitHub oder einer anderen Versionskontrollplattform verwenden, aber der Einfachheit halber fügen wir den Code direkt in die Pipeline ein, indem wir "Pipeline-Skript" wählen.

Wir werden den folgenden Code in unserer Pipeline verwenden:

@Library(my-shared-library) _
pipeline {
agent any
stages {
     stage('Hello World') {
         steps {
             script {
                 myLibrary.print('John')
             }
         }
     }
}
}

Wie bereits erwähnt, gibt @Library('my-shared-library') _ an, dass die gemeinsam genutzte Bibliothek namens 'my-shared-library' für diese Pipeline geladen werden soll. Der Unterstrich _ gibt an, dass alle Standardressourcen aus der Bibliothek geladen werden sollen.

In diesem Blog werden wir die Zeilen mit Pipeline, Stages und Agent überspringen, da sie allgemein für Jenkins gelten und nicht spezifisch für das Thema Shared Libraries sind.

  1. Der nächste Punkt, den wir besprechen sollten, befindet sich im Skriptblock. In der folgenden Zeile myLibrary.print('John') rufen wir die Funktion `print` aus der Datei myLibrary in der Bibliothek `my-shared-library` auf und übergeben die Zeichenkette "John" als Argument.

Jetzt werden wir den Auftrag ausführen und sehen, was passiert:

Hier ist die zweite Zeile der Konsolenausgabe:

Loading library my-shared-library@main

Einige Zeilen weiter unten sehen wir dann Folgendes:

Running on Jenkins in /apps/jenkins/workspace/OPERATIONS/shared-libraries-demo

[Pipeline] {
[Pipeline] stage
[Pipeline] { (Hello World)
[Pipeline] script
[Pipeline] {
[Pipeline] echo
Hello, John!
[Pipeline] }
[Pipeline] // script
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS

Das bedeutet, dass die Funktion "print" aus unserer gemeinsamen Bibliothek wie erwartet funktioniert.

Schlussfolgerung:

Wenn Sie die Schritt-für-Schritt-Anleitung befolgt haben, haben Sie Ihre gemeinsam genutzte Bibliothek erfolgreich konfiguriert und damit die Wiederverwendung von Code und die Modularität in Ihren Jenkins-Pipelines ermöglicht. Mit gemeinsam genutzten Bibliotheken können Sie nun gemeinsame Funktionen kapseln, die Zusammenarbeit fördern und die Wartbarkeit Ihrer Jenkins-Projekte verbessern. Durch die Nutzung gemeinsam genutzter Bibliotheken können Sie Ihre Automatisierungsworkflows optimieren, Doppelarbeit reduzieren und die Softwarebereitstellung beschleunigen. Tauchen Sie also ein in die Welt der gemeinsam genutzten Bibliotheken in Jenkins und erschließen Sie das volle Potenzial für Ihr Entwicklungsteam.

Nutzen Sie die Leistungsfähigkeit von Shared Libraries in Jenkins für eine optimierte Pipeline-Entwicklung

Steigern Sie Effizienz und Zusammenarbeit mit unserem erfahrenen DevOps-Unternehmen

Eine Antwort

  1. Schnelle Tipps:
    - Legen Sie Ihre gesamte Pipeline in der Bibliothek ab. Auf diese Weise brauchen Sie keine CI/CD-bezogenen Commits im App-Repo.
    - Das macht es auch viel einfacher, ein Projekt zu verwalten, wenn es Dutzende von Zweigen hat, in denen Sie eine Änderung implementieren müssen.

    Beispiel:
    Jenkinsfile
    "`
    @Library('jenkins-shared-lib') _

    ApplicationCI {
    runnerTemplate = "default.yaml"
    APP_NAME = "api-gateway"
    APP_CHANGESET = [ "api-gateway/", "gradle/dependencies.gradle", "build.gradle", "settings.gradle" ]
    }
    "`

    Actual Pipeline Definition within vars/ApplicationCI.groovy:
    “`
    def call(body) {
    def pipelineParams= [:]
    body.resolveStrategy = Closure.DELEGATE_FIRST
    body.delegate = pipelineParams
    body()
    // v Functions located in the src folder of the library
    def funcs = new org.someOrg.Utilities()

    Pipeline {
    // Pipelinesachen
    }
    "`

Eine Antwort hinterlassen

Mehr Beiträge

Kontakt aufnehmen
ITGix bietet Ihnen fachkundige Beratung und maßgeschneiderte DevOps-Services, um Ihr Unternehmenswachstum zu beschleunigen.
Newsletter für
Technik-Experten
Schließen Sie sich 12.000+ Geschäftsführern und Ingenieuren an, die Blogs, e-Books und Fallstudien Fallstudien über neue Technologie erhalten.