Я не большой поклонник Jenkins Python API и, честно говоря, я даже не использовал его один раз.Лично я предпочитаю использовать сырой JSON API с Python, он мне больше подходит (поэтому в моем примере вместо этого будет использоваться JSON API, но в итоге цель все еще достигается с помощью скрипта Python).
Теперь, отвечая на ваш вопрос, вы можете отслеживать статус работы и результат, периодически запрашивая его через API.Но обо всем по порядку.
1. Предпосылки
Python 2.7 или 3.x и запросы Python установленная библиотека:
pip install requests
Для Python 3.x
pip3 install requests
Также: Как установить pip
2. Сценарий Python для запуска и отслеживания результата
import requests
import time
jenkins_url = "http://localhost:8080"
auth = ("USERNAME", "PASSWORD")
job_name = "Dummy"
request_url = "{0:s}/job/{1:s}/buildWithParameters".format(
jenkins_url,
job_name,
)
print("Determining next build number")
job = requests.get(
"{0:s}/job/{1:s}/api/json".format(
jenkins_url,
job_name,
),
auth=auth,
).json()
next_build_number = job['nextBuildNumber']
next_build_url = "{0:s}/job/{1:s}/{2:d}/api/json".format(
jenkins_url,
job_name,
next_build_number,
)
params = {"Foo": "String param 1", "Bar": "String param 2"}
print("Triggering build: {0:s} #{1:d}".format(job_name, next_build_number))
response = requests.post(request_url, data=params, auth=auth)
response.raise_for_status()
print("Job triggered successfully")
while True:
print("Querying Job current status...")
try:
build_data = requests.get(next_build_url, auth=auth).json()
except ValueError:
print("No data, build still in queue")
print("Sleep for 20 sec")
time.sleep(20)
continue
print("Building: {0}".format(build_data['building']))
building = build_data['building']
if building is False:
break
else:
print("Sleep for 60 sec")
time.sleep(60)
print("Job finished with status: {0:s}".format(build_data['result']))
Вышеописанный скрипт работает как с Python 2.7, так и с 3.x.Теперь небольшое объяснение:
Вначале мы хотим определить, какое число будет иметь будущая сборка, чтобы запросить его позже.После этого запускается сборка, и ответ проверяется на наличие ошибок.Ошибка клиента 4XX или ошибка сервера 5XX вызовут исключение: requests.exceptions.HTTPError
.И последний шаг - просто запросить триггерную сборку для ее статуса, пока она не завершена.Но учтите, что запущенные сборки могут находиться в очереди в течение некоторого времени, поэтому в коде есть блок try: except:
.Конечно, вы можете настроить time.sleep()
в соответствии с вашими потребностями.
Пример вывода:
$ python dummy.py
Determining next build number
Triggering build: Dummy #55
Job triggered successfully
Querying Job current status...
No data, build still in queue
Sleep for 20 sec
Querying Job current status...
Building: True
Sleep for 60 sec
Querying Job current status...
Building: True
Sleep for 60 sec
Querying Job current status...
Building: False
Job finished with status: SUCCESS
! ОБРАТИТЕ ВНИМАНИЕ!
В зависимости отВ вашей версии и настройках безопасности Jenkins может отображаться следующая ошибка:
requests.exceptions.HTTPError: 403 Client Error: No valid crumb was included in the request for url: ...
По умолчанию в Jenkins включена Защита от CSRF , что предотвращает атаки одним щелчком .
Чтобы решить эту проблему, вы можете:
- Отключить Запретить подделку межсайтовых запросов Флажок в Jenkins Настройка глобальной безопасности (не рекомендуется)
- Получитькрошка из
/crumbIssuer/api/xml
с использованием ваших учетных данных и включение ее в заголовки вашего запроса.
Выше скрипта потребуются лишь незначительные изменения для использования крошки Дженкинса:
crumb_data = requests.get(
"{0:s}/crumbIssuer/api/json".format(jenkins_url),
auth=auth,
).json()
headers = {'Jenkins-Crumb': crumb_data['crumb']}
и пропуск этих заголовковчтобы запросить запуск новой сборки, вот так:
print("Triggering build: {0:s} #{1:d}".format(job_name, next_build_number))
response = requests.post(
request_url,
data=params,
auth=auth,
headers=headers,
)