вторник, 24 марта 2020 г.

Удаленный запуск джобы в Jenkins через curl

В Jenkins есть возможность запускать задачи удаленно, через curl:

curl -X POST http://API_USER_ID:API_TOKEN@JENKINS_URL/job/JOB_NAME/build -H "CRUMB"



А вот как составить этот curl, мне помогла статья на stackoverflow, которая, в свою очередь, ссылается на оригинальный пост.

Хочу сохранить это решение:

Допустим, мы хотим запустить удаленно задачу под названием «Football».
Дженкинс у нас находится по адресу http://192.168.99.20:8080 и входим ты под пользователем admin.

Что нужно сделать?

1. Создать задачу


1. «Создать Item» (да, в русифицированной версии это так называется)




Со свободной конфигурацией, назвать «Football». 



Хочу заметить, что, если вы собираетесь вызывать джобу через curl, лучше не использовать пробел в ее названии. А то потом огребете проблем там, где не ждали. Это имхо, но лучше использовать CamelCase  или snake_case.

См также:


2. Настроить ее — например, пусть она вызывает shell команду

newman run https://www.getpostman.com/collections/c2eb72db4c1191c3d36d

Это, конечно, необязательный пункт, но какой смысл запускать "пустую" задачу?


3. В оригинальном посте еще советуют в в блоке «Триггеры сборки» поставить галочку «Trigger builds remotely (e.g., from scripts)»


Увидеть подсказку: 

Use the following URL to trigger build remotely: JENKINS_URL/job/Football/build?token=TOKEN_NAME or /buildWithParameters?token=TOKEN_NAME
Optionally append &cause=Cause+Text to provide text that will be included in the recorded build cause.

Восхититься ею и убрать галочку. Честно говоря, я не поняла смысла этого. Потому что мы составляем запрос все равно немного по-другому, используя crumb. Когда я пыталась отправить запрос как в этой подсказке, он не сработал. Тогда в чем ее смысл?

В общем, если не выполнять этот пункт, все будет работать — проверено. Просто создайте задачу и можно сразу пулять ее через curl.


2. Получить API Token


1. Кликнуть на имя пользователя в правом верхнем углу страницы



2. Нажать «Настроить»

3. В разделе «API Token» нажать «Создать новый токен». Дать ему имя и потом сохранить куда-нибудь выданное сервером значение.

4. Выпишите себе в блокнот через двоеточие "User ID" and "API Token", так вы будете использовать их в запросе. Например, admin:85703fb68927f04968630e192e4927cb


3. Получить crumb


Для этого надо вызвать запрос:

wget -q --auth-no-challenge --user admin --password admin --output-document - 'http://192.168.99.20:8080/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,":",//crumb)'

Подставив свои данные:
  • логин/пароль для входа в систему (это не API-токен, это как вы заходите через GUI) — в примере это  admin/admin
  • URL — в примере 192.168.99.20:8080. 
Этот запрос вернет вам что-то типа Jenkins-Crumb:44e7033af70da95a47403c3bed5c10f8
Если эту информацию не передать в curl, то огребете ошибку HTTP/1.1 403 Forbiddenили Error 403 No valid crumb was included in the request.

Внимание! Если вы работаете на Windows, то wget нужно вызывать из программы cygwin, которая позволяет в винде работать линукс-командами. Если вызвать wget из простой консоли винды, он вернет пустоту (даже на верный запрос).


4. Проверить!

Теперь у нас есть вся информация! Напомню запрос, который нам надо послать:

curl -X POST http://API_USER_ID:API_TOKEN@JENKINS_URL/job/JOB_NAME/build -H "CRUMB"

Что мы туда подставляем:
  • API_USER_ID:API_TOKEN — имя пользователя (под которым вы логинитесь в GUI) + его API токен. Мы сохранили эту информацию в пункте 2
  • JENKINS_URL — ну тут все просто, мы и без настроек его знаем
  • JOB_NAME — имя свежесозданной задачи
  • CRUMB — то, что вернул нам wget в пункте 3
Если все ок, то запрос вернет нам статус 201 Created:

curl -I -X POST http://admin:85703fb68927f04968630e192e4927cb@192.168.99.20:8080/job/Football/build -H "Jenkins-Crumb:44e7033af70da95a47403c3bed5c10f8"
HTTP/1.1 201 Created
Date: Fri, 02 Jun 2017 06:17:51 GMT
X-Content-Type-Options: nosniff
Location: http://192.168.99.20:8080/queue/item/17/
Content-Length: 0
Server: Jetty(9.2.z-SNAPSHOT)

Проверяем в графическом интерфейсе — ура, сборка правда вызвана успешно!

Еще раз напомню источники — статья на stackoverflow, которая, в свою очередь, ссылается на оригинальный пост.

Комментариев нет:

Отправить комментарий