Дженкинсапи Питон - как вызвать и отследить результат работы - PullRequest
0 голосов
/ 12 февраля 2019

Я использую JenkinsAPI для запуска параметризованных заданий.Я знаю о REST API, который использует Jenkins, но наша установка не позволяет этого напрямую;поэтому для меня основной способ запуска заданий - через эту библиотеку.

Пока у меня нет проблем с поиском заданий на моем сервере или с заданиями запуска, но я сталкиваюсь с двумя проблемами

1)Когда я запускаю работу, я понятия не имею о ее результате.Я предполагал, что выходные данные задания будут возвращены при запуске функции build_job, но это не так.Мне нужно знать, прошло ли это задание или провалилось, и я не могу найти способ получить эту информацию, так как я даже не могу получить номер задания при его запуске.

2) Я получаюошибка при выполнении задания, хотя задание проходит без проблем:

raise ValueError("Not a Queue URL: %s" % redirect_url)

Я немного прочитал, и кажется, что Дженкинс переключается между URL-адресом http и https, что сбивает с толкубиблиотека.Если я правильно понимаю, это было сочтено проблемой Jenkins, и поэтому не было исправлено на стороне JenkinsAPI.

Это код, который до сих пор подключается к моему серверу jenkins и получает списокзаданий, запускает задание, но не позволяет мне узнать, прошло ли задание или нет, и я получаю ошибку, упомянутую ранее.

Любой способ заставить это работать, чтобы я мог пройти / потерпеть неудачурезультат работы, которую я вызвал?

jenkins_url = 'http://myjenkins_host:8080'   
# Create server
server = Jenkins(jenkins_url, username='user', password='123456789abcdef')
# Check job and print description
for job_name, job_instance in server.get_jobs():
    if job_name == "testjob":
        print('Job Name:%s' % job_instance.name)
        print('Job Description:%s' % (job_instance.get_description()))

# Trigger job
params = {'a':1, 'b':2, 'c': True}
server.build_job("testjob", params)
# HOW do I get the result of this job???

1 Ответ

0 голосов
/ 12 февраля 2019

Я не большой поклонник 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 , что предотвращает атаки одним щелчком .

Чтобы решить эту проблему, вы можете:

  1. Отключить Запретить подделку межсайтовых запросов Флажок в Jenkins Настройка глобальной безопасности (не рекомендуется)
  2. Получитькрошка из /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,
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...