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 № 1Das 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 (immer noch möglich, aber sehr unhandlich).workflow-lib/
Verzeichnis innerhalb der Jenkins Benutzerverzeichnis.
Die globale Bibliothek kann folgendermaßen konfiguriert werden:
- ein
@Library("github.com/...")
Anmerkung in derJenkinsfile
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 load
Stellen 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.groovy
wird 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.