Antworten:
Sie können das Pipeline-Skript nicht lokal ausführen, da der gesamte Zweck darin besteht, Jenkins zu skripten. (Dies ist ein Grund, warum es am besten ist, Ihren Jenkinsfile
Code kurz und auf Code zu beschränken, der sich tatsächlich mit Jenkins-Funktionen befasst. Ihre eigentliche Erstellungslogik sollte mit externen Prozessen oder Erstellungswerkzeugen behandelt werden, die Sie über eine Zeile sh
oder einen bat
Schritt aufrufen .)
Wenn Sie eine Änderung testen wollen Jenkinsfile
leben , aber ohne begehen sie, verwenden Sie die Replay - Funktion hinzugefügt 1.14
JENKINS-33925 verfolgt das für ein automatisiertes Testframework gewünschte.
Ich habe eine Lösung, die für mich gut funktioniert. Es besteht aus einem lokalen Jenkins, das im Docker ausgeführt wird, und einem Git-Web-Hook, um die Pipeline in den lokalen Jenkins bei jedem Commit auszulösen. Sie müssen nicht mehr auf Ihr Github- oder Bitbucket-Repository pushen, um die Pipeline zu testen.
Dies wurde nur in einer Linux-Umgebung getestet.
Es ist ziemlich einfach, diese Arbeit zu machen, obwohl diese Anweisung ein bisschen lang ist. Die meisten Schritte sind da.
Erstellen Sie anstelle Ihrer Wahl eine Datei namens Dockerfile. Ich platziere es und /opt/docker/jenkins/Dockerfile
fülle es damit aus:
FROM jenkins/jenkins:lts
USER root
RUN apt-get -y update && apt-get -y upgrade
# Your needed installations goes here
USER jenkins
Erstellen Sie das Bild local_jenkins
Dies müssen Sie nur einmal tun oder nachdem Sie der Docker-Datei etwas hinzugefügt haben.
$ docker build -t local_jenkins /opt/docker/jenkins/
Starten Sie local_jenkins und starten Sie es neu
Von Zeit zu Zeit möchten Sie Jenkins einfach starten und neu starten. ZB nach einem Neustart Ihres Computers. Dafür habe ich einen Alias erstellt, den ich .bash_aliases
in meinen Home-Ordner eingefügt habe.
$ echo "alias localjenkinsrestart='docker stop jenkins;docker rm jenkins;docker run --name jenkins -i -d -p 8787:8080 -p 50000:50000 -v /opt/docker/jenkins/jenkins_home:/var/jenkins_home:rw local_jenkins'" >> ~/.bash_aliases
$ source .bash_aliases # To make it work
Stellen Sie sicher, dass der /opt/docker/jenkins/jenkins_home
Ordner vorhanden ist und dass Sie über Lese- und Schreibrechte des Benutzers verfügen.
Um Ihre Jenkins zu starten oder neu zu starten, geben Sie einfach Folgendes ein:
$ localjenkinsrestart
Alles, was Sie in Ihren lokalen Jenkins tun, wird im Ordner / opt / docker / jenkins / jenkins_home gespeichert und zwischen den Neustarts beibehalten.
Erstellen Sie einen SSH-Zugriffsschlüssel in Ihren Docker Jenkins
Dies ist ein sehr wichtiger Teil, damit dies funktioniert. Zuerst starten wir den Docker-Container und erstellen eine Bash-Shell dazu:
$ localjenkinsrestart
$ docker exec -it jenkins /bin/bash
Sie haben jetzt den Docker-Container eingegeben, den Sie an so etwas wie jenkins@e7b23bad10aa:/$
in Ihrem Terminal sehen können. Der Hash nach dem @ wird sich sicher unterscheiden.
Erstellen Sie den Schlüssel
jenkins@e7b23bad10aa:/$ ssh-keygen
Drücken Sie bei allen Fragen die Eingabetaste, bis Sie die Eingabeaufforderung erhalten
Kopieren Sie den Schlüssel auf Ihren Computer. Aus dem Docker-Container heraus ist Ihr Computer 172.17.0.1, sollten Sie sich fragen.
jenkins@e7b23bad10aa:/$ ssh-copy-id user@172.17.0.1
user = Ihr Benutzername und 172.17.0.1 ist die IP-Adresse Ihres Computers aus dem Docker-Container.
Sie müssen an dieser Stelle Ihr Passwort eingeben.
Versuchen wir nun, die Schleife zu vervollständigen, indem Sie aus dem Docker-Container auf Ihren Computer senden.
jenkins@e7b23bad10aa:/$ ssh user@172.17.0.1
Dieses Mal sollten Sie Ihr Passwort nicht eingeben müssen. Wenn Sie dies tun, ist etwas schief gelaufen und Sie müssen es erneut versuchen.
Sie befinden sich jetzt im Home-Ordner Ihres Computers. Versuchen Sie es ls
und schauen Sie.
Hören Sie hier nicht auf, da wir eine Kette von SSH-Muscheln haben, aus denen wir herauskommen müssen.
$ exit
jenkins@e7b23bad10aa:/$ exit
Richtig! Jetzt sind wir zurück und bereit weiterzumachen.
Installieren Sie Ihre Jenkins
Sie finden Ihre lokalen Jenkins in Ihrem Browser unter http: // localhost: 8787 .
Wenn Sie Ihren Browser zum ersten Mal auf Ihre lokalen Jenkins richten, werden Sie von einem Installationsassistenten begeistert sein. Die Standardeinstellungen sind in Ordnung. Stellen Sie jedoch sicher, dass Sie das Pipeline-Plugin während des Setups installieren.
Richten Sie Ihre Jenkins ein
Es ist sehr wichtig, dass Sie die matrixbasierte Sicherheit unter http: // localhost: 8787 / configureSecurity aktivieren und sich alle Rechte einräumen, indem Sie sich der Matrix hinzufügen und alle Kästchen ankreuzen. (Ganz rechts befindet sich ein Kontrollkästchen.)
Jenkins’ own user database
als SicherheitsbereichMatrix-based security
im Abschnitt AutorisierungUser/group to add:
und klicken Sie auf die [ Add ]
SchaltflächePrevent Cross Site Request Forgery exploits
ist. (Da dieser Jenkins nur von Ihrem Computer aus erreichbar ist, ist dies keine so große Sache.)[ Save ]
und melden Sie sich bei Jenkins ab und wieder an, um sicherzustellen, dass es funktioniert.
Wenn dies nicht der Fall ist, müssen Sie /opt/docker/jenkins/jenkins_home
vor dem Neustart von vorne beginnen und den Ordner leerenFügen Sie den Git-Benutzer hinzu
Wir müssen unserem Git-Hook erlauben, sich mit minimalen Rechten bei unseren lokalen Jenkins anzumelden. Es reicht aus, nur Arbeitsplätze zu sehen und aufzubauen. Deshalb erstellen wir einen Benutzer git
mit Passwort login
.
Richten Sie Ihren Browser auf http: // localhost: 8787 / securityRealm / addUser und fügen Sie ihn git
als Benutzernamen und login
als Kennwort hinzu. Klicken Sie auf [ Create User ]
.
Fügen Sie dem Git-Benutzer die Rechte hinzu
Gehen Sie auf die http: // localhost: 8787 / configureSecurity Seite in Ihrem Browser. Fügen Sie den Git-Benutzer zur Matrix hinzu:
git
in das Feld User/group to add:
und klicken Sie auf[ Add ]
Jetzt ist es Zeit, die Kontrollkästchen für minimale Rechte für den Git-Benutzer zu aktivieren. Nur diese werden benötigt:
Stellen Sie sicher, dass das Prevent Cross Site Request Forgery exploits
Kontrollkästchen deaktiviert ist und klicken Sie auf[ Save ]
Wir gehen davon aus, dass wir den Benutzernamen haben user
und unser git-fähiges Projekt mit dem Jenkinsfile
darin aufgerufen wird project
und sich unter befindet/home/user/projects/project
Fügen Sie in Ihrem http: // localhost: 8787 Jenkins ein neues Pipeline-Projekt hinzu. Ich habe es als Referenz Hookpipeline genannt.
New Item
im Jenkins-Menü aufhookpipeline
[ OK ]
Poll SCM
im Abschnitt Build-Trigger. Lassen Sie den Zeitplan leer.Pipeline script from SCM
Repository URL
Feld eingebenuser@172.17.0.1:projects/project/.git
Script Path
Feld eingebenJenkinsfile
Gehen Sie zum /home/user/projects/project/.git/hooks
Ordner und erstellen Sie eine Datei mit dem Namen post-commit
:
#!/bin/sh
BRANCHNAME=$(git rev-parse --abbrev-ref HEAD)
MASTERBRANCH='master'
curl -XPOST -u git:login http://localhost:8787/job/hookpipeline/build
echo "Build triggered successfully on branch: $BRANCHNAME"
Machen Sie diese Datei ausführbar:
$ chmod +x /home/user/projects/project/.git/hooks/post-commit
Testen Sie den Post-Commit-Hook:
$ /home/user/projects/project/.git/hooks/post-commit
Überprüfen Sie in Jenkins, ob Ihr Hookpipeline-Projekt ausgelöst wurde.
Nehmen Sie zum Schluss eine beliebige Änderung an Ihrem Projekt vor, fügen Sie die Änderungen hinzu und führen Sie ein Commit durch. Dies löst nun die Pipeline in Ihren lokalen Jenkins aus.
Glückliche Tage!
docker build -t local_jenkins /opt/docker/jenkins/Dockerfile
mit , docker build -t local_jenkins /opt/docker/jenkins
weil Docker beschwerten sich über „nicht in der Lage Kontext vorzubereiten: Kontext muss ein Verzeichnis sein“.
$ docker inspect jenkins | grep Gateway
ssh user@docker.for.mac.localhost
statt der IP-Adresse. Stellen Sie außerdem sicher, dass Sie die Remote-Anmeldefunktion in den Systemeinstellungen von macOs -> Menü für
TL; DR
Langversion
Jenkins Pipeline-Tests werden immer schmerzhafter. Im Gegensatz zum klassischen Ansatz der deklarativen Jobkonfiguration, bei dem der Benutzer auf die Benutzeroberfläche beschränkt war, ist die neue Jenkins-Pipeline eine vollwertige Programmiersprache für den Erstellungsprozess, bei dem Sie den deklarativen Teil mit Ihrem eigenen Code mischen. Als gute Entwickler möchten wir auch einige Unit-Tests für diese Art von Code durchführen.
Bei der Entwicklung von Jenkins-Pipelines sollten Sie drei Schritte ausführen. Der Schritt 1. sollte 80% der Anwendungsfälle abdecken.
Beispiele
Das PipelineUnit GitHub-Repo enthält einige Spock-Beispiele zur Verwendung des Jenkins Pipeline Unit-Testframeworks
Jenkins verfügt über eine Wiedergabefunktion, mit der Sie einen Auftrag schnell wiedergeben können, ohne die Quellen zu aktualisieren:
Zum Zeitpunkt des Schreibens (Ende Juli 2017) mit dem Blue Ocean- Plugin können Sie die Syntax einer deklarativen Pipeline direkt im visuellen Pipeline-Editor überprüfen . Der Editor funktioniert über die Blue Ocean-Benutzeroberfläche, wenn Sie nur für Github-Projekte auf "Konfigurieren" klicken (dies ist ein bekanntes Problem, und sie arbeiten daran, dass es auch auf Git usw. funktioniert).
Wie in dieser Frage erläutert , können Sie den Editor öffnen, um Folgendes zu durchsuchen:
[Jenkins URL]/blue/organizations/jenkins/pipeline-editor/
Klicken Sie dann in die Mitte der Seite und drücken Sie Ctrl+S
, um einen Textbereich zu öffnen, in den Sie ein deklaratives Pipeline-Skript einfügen können. Wenn Sie auf Aktualisieren klicken und ein Syntaxfehler vorliegt, teilt Ihnen der Editor mit, wo sich der Syntaxfehler befindet. Wie in diesem Screenshot:
Wenn kein Syntaxfehler vorliegt, wird der Textbereich geschlossen und die Seite visualisiert Ihre Pipeline. Keine Sorge, es wird nichts gespeichert (wenn es sich um ein Github-Projekt handelt, wird die Jenkinsfile-Änderung vorgenommen).
Ich bin neu bei Jenkins und das ist sehr hilfreich, ohne das musste ich viele Male eine Jenkins-Datei festschreiben, bis es funktioniert (sehr nervig!). Hoffe das hilft. Prost.
Ein bisschen spät zur Party, aber deshalb habe ich jenny
eine kleine Neuimplementierung einiger Kernschritte von Jenkinsfile geschrieben. ( https://github.com/bmustiata/jenny )
Soweit ich weiß, ist dieses Pipeline-Plugin die "Engine" der neuen Jenkinsfile-Mechanik. Ich bin mir also ziemlich sicher, dass Sie damit Ihre Skripte lokal testen können.
Ich bin mir nicht sicher, ob zusätzliche Schritte erforderlich sind, wenn Sie es in eine Jenkins-Datei kopieren, aber die Syntax usw. sollte genau gleich sein.
Bearbeiten: Die Referenz auf der "Engine" gefunden, diese Funktionsbeschreibung, letzter Absatz, erster Eintrag überprüfen .
In meinem Entwicklungs-Setup - ohne einen richtigen Groovy-Editor - sind viele Jenkinsfile-Probleme auf einfache Syntaxfehler zurückzuführen . Um dieses Problem zu beheben, können Sie die Jenkins-Datei anhand Ihrer Jenkins-Instanz (ausgeführt unter $JENKINS_HTTP_URL
) validieren :
curl -X POST -H $(curl '$JENKINS_HTTP_URL/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,":",//crumb)') -F "jenkinsfile=<Jenkinsfile" $JENKINS_HTTP_URL/pipeline-model-converter/validate
Der obige Befehl ist eine leicht modifizierte Version von https://github.com/jenkinsci/pipeline-model-definition-plugin/wiki/Validating-(or-linting)-a-Declarative-Jenkinsfile-from-the-command-line
Abgesehen von der Wiedergabefunktion, die andere bereits erwähnt haben (ebenso wie ihre Nützlichkeit!), Fand ich Folgendes auch nützlich:
Fügen Sie Ihren SSH-Schlüssel in Ihr Jenkins-Profil ein und verwenden Sie den deklarativen Linter wie folgt:
ssh jenkins.hostname.here declarative-linter < Jenkinsfile
Dadurch wird eine statische Analyse Ihrer Jenkins-Datei durchgeführt. Definieren Sie im Editor Ihrer Wahl eine Tastenkombination, die diesen Befehl automatisch ausführt. Gehen Sie in Visual Studio Code, den ich verwende, zu Aufgaben> Aufgaben konfigurieren und verwenden Sie dann den folgenden JSON, um einen Validate Jenkinsfile- Befehl zu erstellen :
{
"version": "2.0.0",
"tasks": [
{
"label": "Validate Jenkinsfile",
"type": "shell",
"command": "ssh jenkins.hostname declarative-linter < ${file}"
}
]
}
Ich benutze Replay Future, um ein Update zu machen und schnell zu laufen.
Mit einigen Einschränkungen und für geskriptete Pipelines verwende ich diese Lösung:
node('master') {
stage('Run!') {
def script = load('...you job file...')
}
}
def execute() {
... main job code here ...
}
execute()