2014-05-06 6 views
18

Ich habe auf SO ähnlich wie diese Beiträge gesehen, aber nicht ganz genau, was ich versuche zu tun (oder zumindest keine vollständigen Beispiele für einen Befehl auszuführen).Trigger-parametrisierte Build mit curl und Krume

Ich versuche, mit curl eine parametrisierte Build auf Jenkins aus der Ferne auslösen. Ich habe 'Verhindern Cross Site Request Forgery' aktiviert, also muss ich auch eine gültige Krume übergeben.

Das Skript I ist unten haben:

#!/bin/bash 

json="{\"parameter\": [{ \"P1\": \"param1\", \"P2\": \"param2\", \"P3\": \"param3\" }]}" 
crumb=`curl "http://SERVER/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,%22:%22,//crumb)"` 

curl -v -H $crumb -X POST http://SERVER/job/JOB_NAME/buildWithParameters -d token=runme --data-urlencode json="$json" 

Ich habe auch versucht, die URL zu modifizieren ich entweder zu kräuseln bin vorbei:

USERNAME:[email protected] 

und

USERNAME:[email protected] 

Die Ausgabe von curl ist:

* About to connect() to SERVER port 8080 (#0) 
* Trying SERVER... connected 
* Connected to SERVER (SERVER) port 8080 (#0) 
* Server auth using Basic with user 'USERNAME' 
> POST /job/JOB_NAME/buildWithParameters HTTP/1.1 
> Authorization: Basic bjAwNjY5MjI6YWxLaW5kaTg= 
> User-Agent: curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.13.1.0 zlib/1.2.3 libidn/1.18 libssh2/1.2.2 
> Host: SERVER:8080 
> Accept: */* 
> .crumb:776eb589e8b930d9f06cfc2df885314c 
> Content-Length: 168 
> Content-Type: application/x-www-form-urlencoded 
> 
< HTTP/1.1 403 No valid crumb was included in the request 
< Content-Type: text/html;charset=ISO-8859-1 
< Cache-Control: must-revalidate,no-cache,no-store 
< Content-Length: 1469 
< Server: Jetty(8.y.z-SNAPSHOT) 
< 

So sieht es aus, wie ich bin nicht den Krümel richtig vorbei, aber ich bin mir nicht sicher, was das richtige Format des Befehls sein sollte.

+0

Mögliches Duplikat von [Jenkins REST-API-Job erstellen] (https://StackOverflow.com/questions/38137760/jenkins-rest-api-create-job) – kenorb

Antwort

17

Das richtige Format ist:

curl -H ".crumb:xxxxxxxxxxxxxxxxxxxxxx"

+0

Wie unterscheidet sich das von dem, was Sie in Ihrer Frage ausgeführt haben? Ich stoße auf das gleiche Problem und kann nicht herausfinden, warum es die Krume zurückweist, und es scheint genau so zu sein, wie du es hier beschreibst. – Jesse

+4

Okay, habe mein Problem herausgefunden: Wenn Sie crumb unter einem Benutzernamen generieren (was je nach der Konfiguration der Jenkins-Sicherheit erforderlich sein kann), müssen alle weiteren Anfragen diese Anmeldeinformationen enthalten und umgekehrt. Irgendwie habe ich das vermisst. – Jesse

+2

Hinweis, wenn Sie die Krümel von einem anderen „Browser“ wie wget oder einer anderen URL wie localhost greifen über DirectIP/dns/etc die Krume wird anders sein, also nicht erwarten, die Krümel von etwas über wget zu bekommen und dann verwenden, in der Locke. – sjakubowski

21

Was für mich gearbeitet:

SERVER=http://localhost:8080 
CRUMB=$(curl --user $USER:$APITOKEN \ 
    $SERVER/crumbIssuer/api/xml?xpath=concat\(//crumbRequestField,%22:%22,//crumb\)) 

curl --user $USER:$APITOKEN -H "$CRUMB" -d "script=$GROOVYSCRIPT" $SERVER/script 
6

Das ist für mich gearbeitet:

erhalten Krume $ wget -q --auth-no-challenge --user yourUserName --password yourPassword--output-document - 'http://myJenkins:8080/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,":",//crumb) '

Jetzt Run Jenkins Job $ curl -I -X POST http://yourUserName:[email protected]:8080/job/JOBName/build -H "Jenkins-Crumb:44e7038af70da95a47403c3bed5q10f8"

HTTP/1.1 201 Erstellt am: Fr, 28. Juli 2017 09.15.45 GMT X-Content-Type-Optionen: NOSNIFF Ort: http://myJenkins:8080/queue/item/17/ Content-Length: 0