2016-08-08 20 views
1

Ich habe Jenkins-Pipeline mit einem Input-Schritt, und ich möchte diese Eingabe (einzelnes String-Argument) über ein Skript übergeben. Bis jetzt versuche ich mit Curl, idealerweise werde ich es über Python Anfragen Bibliothek senden. Dies sollte eine einfache POST-Anfrage sein, aber mit CSRF wird es schwierig. Ich habe Jenkins-Crumb (mit Curl in diesem Fall, von der gleichen Maschine und der gleichen Bash-Sitzung), kann aber immer noch nicht den Inhalt senden ...Jenkins Eingang Pipeline-Schritt über POST mit CSRF gefüllt - howto?

Ich sende Jenkins-Crumb:XXX Header, so wie es ist bei https://wiki.jenkins-ci.org/display/JENKINS/Remote+access+API

meine Anfrage erklärt sieht wie folgt aus:

curl -vvv -X POST --user '${USER}:${API_KEY}' -H "Jenkins-Crumb:${JENKINS_CRUMB}" -d 'json="{"parameter":{"name":"${PARAM_NAME}","value":"asd"},"Jenkins-Crumb":"${JENKINS_CRUMB}"}"' 'http://${JENKINS_URL}/job/${JOB_NAME}/${BUILD_NR}/input/' 

die URL ich poste auf die gleiche ist, wie derjenige in Build log (Konsolenausgabe) verknüpft.

Antwort

0

Es ist ein einfacher Weg, rufen Sie einfach die proceedEmpty URL für die Jobs:

curl -X POST -H "Jenkins-Crumb:${JENKINS_CRUMB}" http://${JENKINS_URL}/job/${JOB_NAME}/${BUILD_ID}/input/${INPUT_ID}/proceedEmpty 

Es gibt keine Notwendigkeit, Body-Daten übergeben.

abzubrechen, zu verwenden:

curl -X POST -H "Jenkins-Crumb:${JENKINS_CRUMB}" http://${JENKINS_URL}/job/${JOB_NAME}/${BUILD_ID}/input/${INPUT_ID}/abort 
0

Ich habe gerade die neueste stabile Version von Jenkins (2.7.2) heruntergeladen und den csrf-Mechanismus getestet und es scheint, als ob es wie erwartet funktioniert hat.

Zum Beispiel hat der folgende Befehl erfolgreich einen Job namens "test" gestartet.

curl -X POST -u admin:test --header "Jenkins-Crumb:9c771b9e74d8d1d4b80766b63165c79d" http://localhost:8080/job/test/build 

Das gesagt, Ihr Befehl sieht aus wie es funktionieren sollte. Könnten Sie Folgendes versuchen, um das Problem einzugrenzen:

  1. Versuchen Sie, einen Build mit dem csrf-Mechanismus zu starten, anstatt die Jenkins-Eingabepipeline zu verwenden. Dies wird uns zumindest darüber informieren, ob es das csrf ist, das das Problem oder das Plugin verursacht.
  2. Versuchen Sie eine neuere Version von Jenkins (wenn Sie nicht auf dem neuesten Stall sind).

Lassen Sie mich Ihre Ergebnisse wissen.

+0

ich nicht versuche, eine parametrierte Aufgabe auslösen, sondern einen String in „Input“ Pipeline Schritt zu senden. –

+0

Ja, aber diese Antwort ist über 2 Jahre älter als die Jenkins Wiki Seite. Außerdem führt die Verwendung von '.crumb: xxx' zu folgendem Fehler: ' In der Anfrage wurde kein gültiger Krümel enthalten, während 'Jenkins-Crumb: xxx' das nicht tut. –

2

Ich konnte dieses Problem beheben.

In der Hoffnung, dass jemand anderes von meiner Antwort profitieren wird, lassen Sie mich erklären, wie ich das OP-Ziel erreicht habe.

Alles, was Jenkis Pipeline Eingabeschritt benötigt, ist eine richtig formatierte JSON und OK-Schaltfläche Beschriftung an die richtige URL gesendet.

Also, die richtige Syntax ist:

curl -X POST -H "Jenkins-Crumb:${JENKINS_CRUMB}" -d json='{"parameter": {"name": "${PARAMETER_NAME}", "value": "${PARAMETER_VALUE}"}}' -d proceed='${SUBMIT_CAPTION}' 'http://j${JENKINS_URL}/job/${JOB_NAME}/${BUILD_ID}/input/${INPUT_ID}/submit' 

Grüße

+1

Thnx für diese Antwort. Eine Frage: Wie bekommst du die INPUT_ID? –

+0

Ich setze die Eingabe-Nummer manuell in die Pipeline, um dieselbe wie die Build-Nummer zu sein. Dann ist INPUT_ID gleich BUILD_NUMBER –

0

Für richtig die wfapi mit Ich möchte den folgenden Bash-Skript empfehlen. Sie benötigen eine API user auf jenkins.Der API-Benutzer sollte die Berechtigungen haben Gesamt/Lesen, Job/Lesen und Job/Build mit Jenkins eingestellt -> Jenkins verwalten -> Rollen verwalten und zuweisen.

Nehmen wir an, Ihr Build

input message: 'Does the build work on the Testserver?', ok: 'Yes' 

Das folgende Skript wird auch weiterhin pausiert verwendet. Dies ist eine vereinfachte Version ohne Überprüfungen. Es setzt voraus, dass der letzte Build pausiert ist und auf Eingabe wartet. Sie müssen die Variablen im oberen Bereich entsprechend Ihrer Umgebung ändern.

#!/bin/bash 
JENKINS_SERVER_URL=https://www.example.com 
JENKINS_URL=${JENKINS_SERVER_URL}/jenkins 
JENKINS_USER=YOUR-API-USER 
JENKINS_API_TOKEN=YOUR-API-TOKEN 
JENKINS_PROJECT=your-project 
JENKINS_WGET_PARAMS="--auth-no-challenge --http-user=${JENKINS_USER} --http-password=${JENKINS_API_TOKEN}" 

# Get the ID of the most recent build 
mrBuildInfo=$(wget -q -O - ${JENKINS_WGET_PARAMS} "${JENKINS_URL}/job/${JENKINS_PROJECT}/wfapi/runs" | jq '.[0] | {id: .id, status: .status}') 
# mrBuildInfo is now something like: '{ "id": "13", "status": "PAUSED_PENDING_INPUT" }' 
mrBuildId=$(echo "$mrBuildInfo" | jq --raw-output '.id') 
mrBuildStatus=$(echo "$mrBuildInfo" | jq --raw-output '.status') 

# From here on we assume that $mrBuildStatus is PAUSED_PENDING_INPUT 
# Get the first pending input action, assuming there is one 
mrBuildInputActions=$(wget -q -O - ${JENKINS_WGET_PARAMS} "${JENKINS_URL}/job/${JENKINS_PROJECT}/${mrBuildId}/wfapi/pendingInputActions" | jq --raw-output '.[0]') 
mrBuildProceedUrl=$(echo "$mrBuildInputActions" | jq --raw-output '.proceedUrl') 
mrBuildProceedText=$(echo "$mrBuildInputActions" | jq --raw-output '.proceedText') 
# We need to pass json={} and proceed=Yes, the curly braces are already URL encoded here 
wget -q -O - "--post-data=json=%7B%7D&proceed=$mrBuildProceedText" ${JENKINS_WGET_PARAMS} "${JENKINS_SERVER_URL}${mrBuildProceedUrl}" 

die im Grunde läuft darauf hinaus:

wget -q -O - "--post-data=json=%7B%7D&proceed=Yes" --auth-no-challenge --http-user=${JENKINS_USER} --http-password=${JENKINS_API_TOKEN} "https://www.example.com/jenkins/job/${JENKINS_JOB}/${JOB_NR}/wfapi/inputSubmit?inputId=YOUR-INPUT-ID" 
+0

BTW, dies umgeht die Anforderung, irgendwelche CSRF-Token zu verwenden, da es die RESt-API verwendet. – Florian

Verwandte Themen