/ / Erstellen Sie ein wiederverwendbares Jenkins-Pipeline-Skript - Jenkins, Jenkins-Workflow, Jenkins-Pipeline

Erstelle wiederverwendbare jenkins pipeline script - jenkins, jenkins-workflow, jenkins-pipeline

Ich denke darüber nach, Jenkins Pipeline-Skript kürzlich zu verwenden. Eine Frage ist, dass ich keinen intelligenten Weg finde, um internen Code für wiederverwendbare Utils zu erstellen. Stellen Sie sich vor, ich habe eine gemeinsame Funktion helloworld die von vielen Pipeline-Jobs verwendet werden, also hoffe ich, eine zu erstellen utils.jar kann es in den Job Klassenpfad injiziert.

Ich stelle fest, dass Jenkins ein ähnliches Konzept mit dem hat globale Bibliothek, aber mein Anliegen bezüglich dieses Plugins:

Da es ein Plugin ist, müssen wir es auchinstalliere / aktualisiere es über den jenkins Plugin Manager, dann kann ein Neustart erforderlich sein, um die Änderung zu übernehmen. Dies ist nicht das, was ich sehen möchte, da sich die Utils ändern können.

Zweitens ist es die offizielle jenkins shared lib, ich möchte keinen (oder sie werden uns nicht anwenden) privaten Code in jenkins repo einfügen.

Irgendeine gute Idee?

Antworten:

27 für die Antwort № 1

Das Shared Libraries (Dokumente) können Sie machen Ihre Code, auf den alle Ihre Pipeline-Skripte zugreifen können. Sie müssen kein Plugin dafür erstellen und Sie müssen Jenkins nicht neu starten.

Z.B. das ist meine Bibliothek und Dies ist eine Jenkinsdatei das nennt diese gemeinsame Funktion.


BEARBEITEN (Februar 2017): Auf die Bibliothek kann über den internen Git-Server von Jenkin zugegriffen oder auf andere Weise (z. B. über Chefkoch) auf dem Server bereitgestellt werden workflow-lib/ Verzeichnis innerhalb der Jenkins Benutzerverzeichnis. (immer noch möglich, aber sehr unhandlich).

Die globale Bibliothek kann folgendermaßen konfiguriert werden:

  • ein @Library("github.com/...") Anmerkung in der Jenkinsfile Verweis auf die URL des freigegebenen Bibliotheksrepos.
  • Auf Ordnerebene von Jenkins-Jobs konfiguriert.
  • konfiguriert in Jenkins Konfiguration als globale Bibliothek, mit dem Vorteil, dass der Code ist Vertrauenswürdiged.h. nicht der Skriptsicherheit unterworfen.

Eine Mischung aus der ersten und der letzten Methode wäre eine nicht explizit geladene Shared Library, die dann nur mit ihrem Namen in der angefordert wird Jenkinsfile: @Library("mysharedlib").


8 für die Antwort № 2

Abhängig davon, wie oft Sie Ihren Code wiederverwenden möchten, können Sie auch eine Funktion (oder eine Reihe von Funktionen) als Teil einer anderen Pipeline laden.

{
// ...your pipeline code...

git "http://urlToYourGit/projectContainingYourScript"
pipeline = load "global-functions.groovy"
pipeline.helloworld()    // Call one of your defined function

// ...some other pipeline code...
}

Diese Lösung scheint etwas umständlich zu seinIm Vergleich zu StephenKing gefällt mir an dieser Lösung jedoch, dass meine globalen Funktionen ausschließlich für Git bestimmt sind und jeder sie ohne (fast) Kenntnisse von Jenkins, nur Grundlagen von Groovy, leicht modifizieren kann.

Im Groovy-Skript sind Sie loadStellen Sie sicher, dass Sie hinzufügen return this ganz am Ende. Auf diese Weise können Sie später Anrufe tätigen. Ansonsten beim Einstellen pipeline = load global-functions.groovywird die Variable auf gesetzt null.


1 für die Antwort № 3

Hier ist die Lösung, die wir derzeit verwenden, um Jenkinsfile-Code wiederzuverwenden:

node {

curl_cmd = "curl -H "Accept: application/vnd.github.v3.raw" -H "Authorization: token ${env.GITHUB_TOKEN}" https://raw.githubusercontent.com/example/foobar/master/shared/Jenkinsfile > Jenkinsfile.t
sh "${curl_cmd}"
load "Jenkinsfile.tmp"

}

Ich mag ein bisschen hässlich sein, aber es funktioniert einwandfrei und außerdem können wir vor oder nach dem gemeinsam genutzten Code einen repository-spezifischen Code einfügen.