Шаг входного конвейера Jenkins, заполненный через POST с помощью CSRF - как?

У меня есть конвейер Jenkins с шагом ввода, и я хотел бы передать этот ввод (однострочный аргумент) через скрипт. Пока что я пытаюсь использовать curl, в идеале я буду отправлять его через библиотеку запросов Python. Это должен быть простой запрос POST, однако с CSRF он становится сложным. Я получил Jenkins-Crumb (с использованием curl в этом случае, с той же машины и того же сеанса bash), но все еще не могу отправить содержимое ...

я отправляюJenkins-Crumb:XXX заголовок, как это объясняется вhttps://wiki.jenkins-ci.org/display/JENKINS/Remote+access+API

мой запрос выглядит так:

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

URL-адрес, по которому я размещаю сообщение, совпадает с URL-адресом, указанным в журнале сборки (вывод консоли).

Ответы на вопрос(4)

естировал механизм csrf, и похоже, что он работал как положено.

Например, следующая команда успешно запустила задание под названием «тест».

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

При этом ваша команда выглядит так, как будто она должна работать. Не могли бы вы попробовать следующее, чтобы сузить проблему:

Попробуйте запустить сборку, используя механизм csrf, а не входной конвейер Jenkins. Это, по крайней мере, даст нам знать, если это проблема вызвана csrf или плагином.Попробуйте новую версию Jenkins (если вы не используете последнюю стабильную версию).

Дайте мне знать ваши результаты.

 J. Doe09 авг. 2016 г., 09:50
Да, однако этот ответ более чем на 2 года старше, чем вики-страница Дженкинса. Кроме того, используя.crumb:xxx приводит к следующей ошибке:No valid crumb was included in the request в то время какJenkins-Crumb:xxx не делает такой вещи.
 J. Doe09 авг. 2016 г., 07:25
Я не пытаюсь запустить параметризованное задание, но отправляю строку на шаг конвейера «Вход».

В надежде, что кто-то другой получит пользу от моего ответа, позвольте мне объяснить, как я достиг цели ОП.

Все, что нужно для шага ввода Jenkis Pipeline - это правильно отформатированный заголовок кнопки JSON и OK, отправляемый на правильный URL.

Итак, правильный синтаксис:

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'

С уважением

 J. Doe17 мар. 2017 г., 13:05
Я установил номер ввода вручную в конвейере, чтобы он совпадал с номером сборки. Тогда INPUT_ID равен BUILD_NUMBER
 csviri27 мар. 2019 г., 14:02
Как мне прервать при отправке какого-либо параметра? Есть ли для этого «отправить подпись»?
 Learner21 мар. 2018 г., 06:50
Что такое отправить подпись?
 Jeroen Rosenberg09 февр. 2017 г., 14:09
Спасибо за этот ответ. Один вопрос: как вы получаете INPUT_ID?

wfapi Я хотел бы порекомендовать следующий скрипт bash. Вам нуженПользователь API на Дженкинс. Пользователь API должен иметь разрешенияОбщий / Read, Работа / чтение а такжеРабота / Сложение установить с помощью Jenkins -> Manage Jenkins -> Manage and Assol Roles.

Давайте предположим, что ваша сборка приостановлена ​​с помощью

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

Следующий скрипт продолжит его. Это упрощенная версия, без каких-либо проверок. Предполагается, что самая последняя сборка приостановлена ​​в ожидании ввода. Вам нужно изменить переменные вверху, чтобы они соответствовали вашей среде.

#!/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}"

Что в основном сводится к:

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"
 Learner22 мар. 2018 г., 03:27
Зачем использовать этот подход, а не конечную точку / input / {inputId} / submit?
 Florian30 нояб. 2017 г., 17:53
Кстати, это обходит требование использовать любые токены CSRF, так как использует API RESt.
Решение Вопроса

Есть более простой способ, просто позвонитеproceedEmpty URL для работы:

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

Нет необходимости передавать данные тела.

Чтобы прервать, используйте:

curl -X POST -H "Jenkins-Crumb:${JENKINS_CRUMB}" http://${JENKINS_URL}/job/${JOB_NAME}/${BUILD_ID}/input/${INPUT_ID}/abort
 Learner21 мар. 2018 г., 06:41
Что делать, если вам нужно передать параметр?

Ваш ответ на вопрос