Continuous Integration

Jenkins Job mit curl starten

Gestern hab ich versucht herauszufinden, wie man einen Jenkins Job mit curl startet. Da ich keine Anleitung gefunden habe, wie man das am besten anstellen kann, beschreibe ich es hier. Um einen Job mit curl oder einem anderem Programm starten zu können, benötigt man drei Zutaten:

  • API Token des eigenen Benutzers
  • Ein Token für den Job
  • Jenkins-Crumb

Im folgenden zeige ich, wie man sich die Werte holen kann.

API Token

Das erste, was gebraucht wird, ist das API Token von dem Jenkins-Konto, das man benutzt. Diesen findet man unter http://jenkinsserver:8080/me/configure. Dort gibt es einen Bereich namens API Token. Wenn man auf Show API Token drückt, zeigt sich der eigene API Token. Mein Token in meiner Testumbegung ist: 0a43db81f2bb747833c07b9df37abdbc

Job-Token

Nachdem wir nun den Benutzer-Token haben, müssen wir die Remote-Option von dem Job, der gestartet werden soll, aktivieren. Dazu müssen man auf die Konfigurationsseite des Jobs gehen. In dem Bereich Build Triggers müsste man nun einen Haken vor der Option Trigger builds remotely (e.g., from scripts) sehen und diesen aktivieren. Es tauch eine Textzeile auf, in der man nun einen Token reinschreiben kann, der später beim Starten des Jobs aus einem Skript heraus benötigt wird. Ich habe in meinem Beispiel mal TOKEN_NAME reingeschrieben.

Jenkins-Crumb

Was jetzt noch gebraucht wird, ist ein Jenkins-Crumb. Der Jenkins-Crumb ist Sicherheitsmechanismus, der Jenkins vor CSRF-Angriffen schützen soll. Um den Jenkins-Crumb auszulesen, benötigt man hierfür das API-Token des eigenen Benutzers. Hat man diesen zur Hand, kann man den Jenkins-Crumb über diese Kommandozeile auslesen:

curl -s 'http://jenkins:0a43db81f2bb747833c07b9df37abdbc@192.168.0.29:8080/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,":",//crumb)' && echo

Oder allgemeiner

curl -s 'http://benutzer:benutzerAPItoken@jenkinsserver:port/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,":",//crumb)' && echo

Herauskommen müsste eine Ausgabe, die in etwa so aussieht (seit Jenkins 2.0):

Jenkins-Crumb:00c16fbd6096d7f3877407cd0bd54940

Vor Jenkins 2.0 hatte der Jenkins-Crumb ein anderes Format

.crumb:00c16fbd6096d7f3877407cd0bd54940

Hat man alle Zutaten beisammen, kann man den Job mit Hilfe von curl starten:

curl -H "Jenkins-Crumb:00c16fbd6096d7f3877407cd0bd54940" -X POST "http://192.168.0.29:8080/job/Random%20Project/build?token=TOKEN_NAME&cause=Additional+Message" -u jenkins:0a43db81f2bb747833c07b9df37abdbc

Oder allgemeiner

curl -H "jenkinscrum" -X POST "http://jenkinsserver:port/job/JOBNAME/build?token=TOKEN_NAME&cause=Additional+Message" -u benutzer:benutzerAPItoken

Ich hoffe ihr konntet was aus diesem Post entnehmen.

Quellen