web-dev-qa-db-de.com

Wie kann ich eine in Jenkinsfile vorgenommene Änderung lokal testen?

Beim Schreiben von Jenkins-Pipelines scheint es sehr unpraktisch zu sein, jede neue Änderung zu übernehmen, um zu sehen, ob sie funktioniert. 

Gibt es eine Möglichkeit, diese lokal auszuführen, ohne den Code zu übergeben?

115
sorin

Sie können das Pipeline-Skript nicht lokal ausführen, da es sich ausschließlich um Jenkins-Skripte handelt. (Dies ist einer der Gründe, warum es am besten ist, Jenkinsfile kurz zu halten und auf Code zu beschränken, der sich eigentlich auf Jenkins-Features bezieht. Die eigentliche Build-Logik sollte mit externen Prozessen oder Build-Tools behandelt werden, die Sie über einen einzeiligen sh- oder bat-Schritt aufrufen .)

Wenn Sie eine Änderung an Jenkinsfile live testen möchten, jedoch ohne Festschreiben, verwenden Sie die Replay - Funktion , die in 1.14 hinzugefügt wurde

JENKINS-33925 verfolgt das gewünschte für ein automatisiertes Testframework.

84
Jesse Glick

Ich habe eine Lösung, die für mich gut funktioniert. Es besteht aus einem lokalen Jenkin, der im Docker ausgeführt wird, und einem Git-Web-Hook, der die Pipeline in den lokalen Jenkins bei jedem Commit auslöst. Sie müssen nicht mehr in 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 Stufen sind da.

Das ist was du brauchst

  • Docker installiert und funktioniert. Dies ist nicht Teil dieser Anleitung.
  • Ein Jenkins läuft im Hafenarbeiter vor Ort. Erklärt wie unten.
    • Die richtigen Rechte (SSH-Zugriffsschlüssel) für Ihren lokalen Jenkins-Docker-Benutzer, um von Ihrem lokalen Git-Repo zu ziehen. Erklärt wie unten.
    • Ein Jenkins-Pipelineprojekt, das aus Ihrem lokalen Git-Repository abgerufen wird. Unten erklärt.
    • Ein Git-Benutzer in Ihrem lokalen Jenkins mit minimalen Rechten. Unten erklärt.
  • Ein Git-Projekt mit einem Web-Hook nach dem Festschreiben, der das Pipeline-Projekt auslöst. Unten erklärt.

Das ist wie man es macht

Jenkins Docker

Erstellen Sie eine Datei namens Dockerfile anstelle Ihrer Wahl. Ich gebe es in /opt/docker/jenkins/Dockerfile Ein und fülle es so aus:

FROM jenkins/jenkins:lts
USER root
RUN apt-get -y update && apt-get -y upgrade
# Your needed installations goes here
USER jenkins

Bild von local_jenkins erstellen

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/Dockerfile

local_jenkins starten und neu starten

Von Zeit zu Zeit möchten Sie Jenkins einfach starten und neu starten. Z.B. nach einem Neustart Ihres Computers. Dazu habe ich einen Alias ​​erstellt, den ich in meinem Home-Ordner in .bash_aliases Eingegeben 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

Vergewissern Sie sich, dass der Ordner /opt/docker/jenkins/jenkins_home Vorhanden ist und dass Sie über Lese- und Schreibrechte 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 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:

$ localjenkinsrestart
$ docker exec -it jenkins /bin/bash

Sie haben jetzt den Docker-Container betreten, das können Sie an etwas wie [email protected]:/$ In Ihrem Terminal sehen. Der Hash nach dem @ wird sich sicherlich unterscheiden.

Erstellen Sie den Schlüssel

[email protected]:/$ 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 ist Ihr Computer 172.17.0.1, sollten Sie sich fragen.

[email protected]:/$ ssh-copy-id [email protected]

user = Ihr Benutzername und 172.17.0.1 ist die IP-Adresse Ihres Computers im Docker-Container.

Sie müssen an dieser Stelle Ihr Passwort eingeben.

Lassen Sie uns nun versuchen, die Schleife zu beenden, indem Sie aus dem Docker-Container auf Ihren Computer senden.

[email protected]:/$ ssh [email protected]

Dieses Mal sollten Sie Ihr Passwort nicht eingeben müssen. In diesem Fall ist ein Fehler aufgetreten und Sie müssen es erneut versuchen.

Sie befinden sich nun im Ausgangsordner Ihres Computers. Probieren Sie ls und schauen Sie es sich an.

Hören Sie hier nicht auf, da wir eine Kette von SSH-Muscheln haben, aus denen wir herauskommen müssen.

$ exit
[email protected]:/$ exit

Richtig! Jetzt sind wir zurück und können weitermachen.

Installiere deine Jenkins

Sie finden Ihre lokalen Jenkins in Ihrem Browser unter http: // localhost: 8787 .

Wenn Sie zum ersten Mal Ihren Browser auf Ihre lokalen Jenkins richten, wird Ihnen ein Installationsassistent zur Verfügung stehen. Die Standardeinstellungen sind in Ordnung. Stellen Sie jedoch sicher, dass Sie das Pipeline-Plugin während des Setups installieren.

Richte deine Jenkins ein

Es ist sehr wichtig , dass Sie die matrixbasierte Sicherheit auf http: // localhost: 8787/configureSecurity aktivieren und sich selbst alles geben Rechte , indem Sie sich der Matrix hinzufügen und alle Kästchen ankreuzen. (Ganz rechts befindet sich ein Häkchen

  • Wählen Sie Jenkins’ own user database Als Sicherheitsbereich
  • Wählen Sie im Abschnitt Autorisierung die Option Matrix-based security
  • Geben Sie Ihren Benutzernamen in das Feld User/group to add: Ein und klicken Sie auf die Schaltfläche [ Add ]
  • In der obigen Tabelle sollte Ihr Benutzername mit einem Personen-Symbol daneben angezeigt werden. Wenn es durchgestrichen ist, hast du deinen Benutzernamen falsch eingegeben.
  • Gehen Sie ganz rechts in die Tabelle und klicken Sie auf die Schaltfläche "Alle ankreuzen" oder aktivieren Sie manuell alle Kästchen in Ihrer Zeile.
  • Bitte vergewissern Sie sich, dass das Kontrollkästchen Prevent Cross Site Request Forgery exploits Deaktiviert ist. (Da dieser Jenkins nur von Ihrem Computer aus erreichbar ist, ist das keine so große Sache)
  • Klicken Sie auf [ 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 vor dem Neustart den Ordner /opt/docker/jenkins/jenkins_home Neu starten und leeren

Füge den Git-Benutzer hinzu

Wir müssen unserem Git-Hook erlauben, sich mit minimalen Rechten bei unseren lokalen Jenkins anzumelden. Nur um zu sehen und Arbeitsplätze zu schaffen, reicht es aus. Deshalb erstellen wir einen Benutzer namens git mit dem Passwort login.

Richten Sie Ihren Browser auf http: // localhost: 8787/securityRealm/addUser und fügen Sie git als Benutzernamen und login als Passwort hinzu. Klicken Sie auf [ Create User ].

Füge die Rechte dem Git-Benutzer hinzu

Rufen Sie die Seite http: // localhost: 8787/configureSecurity in Ihrem Browser auf. Fügen Sie den Git-Benutzer der Matrix hinzu:

  • Schreiben Sie git in das Feld User/group to add: Und klicken Sie auf [ Add ]

Jetzt ist es an der Zeit, die Kontrollkästchen für minimale Rechte für den Git-Benutzer zu aktivieren. Nur diese werden benötigt:

  • insgesamt: lesen
  • job: bauen
  • job: entdecken
  • beruf: lesen

Stellen Sie sicher, dass das Kontrollkästchen Prevent Cross Site Request Forgery exploits Deaktiviert ist, und klicken Sie auf [ Save ].

Erstellen Sie das Pipelineprojekt

Wir nehmen an, wir haben den Benutzernamen user und unser git-fähiges Projekt mit dem darin enthaltenen Jenkinsfile heißt project und befindet sich unter /home/user/projects/project.

Fügen Sie in Ihrem http: // localhost: 8787 Jenkins ein neues Pipeline-Projekt hinzu. Ich nannte es Hookpipeline als Referenz.

  • Klicken Sie im Jenkins-Menü auf New Item
  • Nennen Sie das Projekt hookpipeline
  • Klicken Sie auf Pipeline
  • Klicken Sie auf [ OK ]
  • Aktivieren Sie das Kontrollkästchen Poll SCM Im Bereich Build-Trigger. Lassen Sie den Zeitplan leer.
  • Im Abschnitt "Pipeline":
    • wähle Pipeline script from SCM
    • geben Sie im Feld Repository URL[email protected]:projects/project/.git ein.
    • geben Sie im Feld Script PathJenkinsfile ein.
  • Speichern Sie das Hookpipeline-Projekt
  • Erstellen Sie die Hookpipeline einmal manuell. Dies ist erforderlich, damit der Poll-SCM seine Arbeit aufnehmen kann.

Erstellen Sie den Git-Haken

Wechseln Sie in den Ordner /home/user/projects/project/.git/hooks Und erstellen Sie eine Datei mit dem Namen post-commit, Die Folgendes enthält:

#!/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 abschließend eine willkürliche Änderung an Ihrem Projekt vor, fügen Sie die Änderungen hinzu und führen Sie ein Commit durch. Dies wird nun die Pipeline in Ihren lokalen Jenkins auslösen.

Glückliche Tage!

55
javabeangrinder

TL; DR
Testrahmen für Jenkins-Pipeline-Einheiten

Lange Version
Jenkins Pipeline-Tests werden immer mehr zu einem Schmerz. Im Gegensatz zum deklarativen Jobkonfigurationsansatz classic, bei dem der Benutzer auf das beschränkt war, was die Benutzeroberfläche enthielt, ist die neue Jenkins Pipeline eine vollwertige Programmiersprache für den Buildprozess, bei der der deklarative Teil mit Ihrem eigenen Code gemischt wird. Als gute Entwickler möchten wir auch einige Komponententests für diese Art von Code haben. 

Es gibt drei Schritte, die Sie bei der Entwicklung von Jenkins Pipelines beachten sollten. Schritt 1. sollte 80% der Anwendungsfälle abdecken.

  1. Tun Sie so viel wie möglich in Build-Skripten (z. B. Maven, Gradle, Gulp usw.). Dann rufen Sie in Ihren Pipeline-Skripts die Build-Tasks in der richtigen Reihenfolge auf. Die Build-Pipeline orchestriert lediglich die Build-Tasks und führt sie aus, hat jedoch keine wesentliche Logik, für die ein besonderer Test erforderlich ist. 
  2. Wenn die vorherige Regel nicht vollständig angewendet werden kann, wechseln Sie zu Pipeline Shared Libraries , wo Sie benutzerdefinierte Logik eigenständig entwickeln, testen und in die Pipeline integrieren können.
  3. Wenn Ihnen all dies nicht gelingt, können Sie eine der Bibliotheken ausprobieren, die kürzlich (März 2017) erschienen sind. Jenkins Pipeline Unit Test Framework oder pipelineUnit (Beispiele)

Beispiele 

Das Repo pipelineUnit GitHub enthält einige Spock-Beispiele zur Verwendung des Jenkins Pipeline Unit-Testframeworks

38
Vadimo

Zum Zeitpunkt des Schreibens (Ende Juli 2017) mit dem Plugin Blue Ocean können Sie die Syntax einer deklarativen Pipeline direkt im visual Pipeline-Editor überprüfen. Der Editor arbeitet von der Blue Ocean-Benutzeroberfläche aus, wenn Sie auf "configure" nur für github-Projekte klicken.

Aber wie in diese Frage erläutert können Sie den Editor öffnen, indem Sie Folgendes öffnen:

[Jenkins URL]/blue/organizations/jenkins/pipeline-editor/

Klicken Sie dann in die Mitte der Seite und drücken Sie Ctrl+S. Dadurch wird ein Textbereich geöffnet, in dem Sie ein Pipeline-Deklarationsskript einfügen können. Wenn Sie auf Update klicken, wird bei einem Syntaxfehler der Editor Ihnen mitteilen, wo der Syntaxfehler liegt. Wie in diesem Screenshot:

 As a quick test I wrongly typed "stepps" instead of "steps"

Wenn kein Syntaxfehler vorliegt, wird der Textbereich geschlossen und die Seite visualisiert Ihre Pipeline. Machen Sie sich keine Sorgen, dass Sie nichts speichern können (wenn es sich um ein Github-Projekt handelt, würde dies die Jenkinsfile-Änderung übernehmen).

Ich bin neu bei Jenkins und das ist sehr hilfreich. Ohne dieses musste ich oft ein Jenkinsfile festlegen, bis es funktioniert (sehr nervig!). Hoffe das hilft. Prost.

10
firepol

Jenkins verfügt über eine 'Replay'-Funktion, mit der Sie einen Auftrag schnell wiedergeben können, ohne die Quellen zu aktualisieren:

 Replay feature

7
AhmedDrira

Etwas spät zur Party, aber deshalb habe ich jenny geschrieben, eine kleine Neuimplementierung einiger Kernschritte von Jenkinsfile. ( https://github.com/bmustiata/jenny )

4
bogdan.mustiata

Soweit ich weiß, dass Pipeline Plugin die "Engine" der neuen Jenkinsfile-Mechanik ist, kann man dies durchaus zum lokalen Testen Ihrer Skripte nutzen.

Ich bin nicht sicher, ob beim Kopieren in eine Jenkins-Datei weitere Schritte erforderlich sind. Die Syntax usw. sollte jedoch identisch sein.

Edit: Die Referenz auf der "Engine" gefunden, diese Feature-Beschreibung, letzter Absatz, erster Eintrag überprüfen.

4
Dominik Gebhart

In meinem Entwicklungssetup - dem Fehlen eines geeigneten Groovy-Editors - sind viele Jenkinsfile-Probleme auf einfache Syntaxfehler zurückzuführen. Um dieses Problem zu beheben, können Sie die Jenkins-Datei gegen Ihre Jenkins-Instanz validieren (ausgeführt unter $JENKINS_HTTP_URL):

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 geänderte Version von https://github.com/jenkinsci/pipeline-model-definition-plugin/wiki/Validating- (or-linting) -a-Declarative-Jenkinsfile-from-the -Befehlszeile

4
Juuso Ohtonen

Abgesehen von der Replay-Funktion, die von anderen bereits erwähnt wurde (auch hinsichtlich ihrer Nützlichkeit!), Fand ich Folgendes auch nützlich:

  1. Erstellen Sie einen Test-Pipeline-Job, in den Sie Pipeline-Code eingeben oder auf Ihr Repo/Zweig einer Jenkins-Datei zeigen können, um schnell etwas auszuprobieren. Verwenden Sie für genauere Tests eine Multibranch-Pipeline, die auf Ihre eigene Verzweigung verweist, wo Sie schnell Änderungen vornehmen und Commits ausführen können, ohne das Produkt zu beeinflussen. Sachen wie BRANCH_NAME env sind nur in Multibranch verfügbar.
  2. Da Jenkinsfile grooviger Code ist, rufen Sie ihn einfach mit "groovy Jenkinsfile" auf, um die grundlegende Syntax zu überprüfen.
1
Max Zheng

ich benutze Replay Future, um ein paar Updates durchzuführen und schnell zu laufen.

0
AhmedDrira

Mit einigen Einschränkungen und für Skriptpipelines verwende ich diese Lösung:

  1. Pipeline-Job mit Inline-Groovy-Skript:

node('master') {
    stage('Run!') {
                def script = load('...you job file...')
    }
}

  1. Jenkinsfile zum Testen haben die gleiche Struktur wie für lesfurets:

def execute() {
 ... main job code here ...
}
execute()
0
user3148458

Geben Sie Ihren SSH-Schlüssel in Ihr Jenkins-Profil ein und verwenden Sie dann 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. Wechseln Sie in Visual Studio-Code, den ich verwende, zu Tasks> Tasks konfigurieren und verwenden Sie die folgende 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}"
    }
  ]
}
0