Как получить список сборок Jenkins, которые запускались в определенное время? - PullRequest
0 голосов
/ 12 ноября 2018

У моего нынешнего Дженкинса много рабочих мест. Различные папки, каждая с несколькими заданиями. Недавно я увидел, что один подчиненный Jenkins (который автоматически масштабируется) отправляет слишком много запросов на другой сервер в определенное время. Однако я не могу найти, какие сборки выполняются в это конкретное время, не проверяя их вручную. Есть ли способ получить эту информацию, используя API / Groovy скрипт?

Ответы [ 3 ]

0 голосов
/ 27 ноября 2018

Этого легко добиться с помощью простого скрипта на Python и API-интерфейса Jenkins JSON REST.

1.Prerequisites

Python 2.7 или 3.x и python-запросы установленная библиотека:

pip install requests

Для Python 3.x

pip3 install requests

Также: Как установить pip

2.Python-скрипт для извлечения сборок между датами

import requests
from datetime import datetime


jenkins_url = "JENKINS_HOST"
username = "USERNAME"
password = "PASSWORD"
job_name = "JOB_NAME"
stop_date = datetime.strptime('23.11.2018 0:30:00', "%d.%m.%Y %H:%M:%S")        
start_date = datetime.strptime('10.11.2018 18:46:04', "%d.%m.%Y %H:%M:%S") 
request_url = "{0:s}/job/{1:s}/api/json{2:s}".format(
    jenkins_url,
    job_name,
    "?tree=builds[fullDisplayName,id,number,timestamp,url]"
)

response = requests.get(request_url, auth=(username, password)).json()
builds = []

for build in response['builds']:
    build_date = datetime.utcfromtimestamp(build['timestamp']/1000)
    if build_date >= start_date and build_date <= stop_date:
        builds.append(build)
        print("Job name: {0:s}".format(build["fullDisplayName"]))
        print("Build number: {0:d}".format(build["number"]))
        print("Build url: {0:s}".format(build["url"]))
        print("Build timestamp: {0:d}".format(build["timestamp"]))
        print("Build date: {}\n".format(build_date))

Вышеописанный скрипт работает как с python 2.7, так и с 3.x. Теперь небольшое объяснение:

Сначала загрузите все данные сборки, используя JSON API, и загрузите ответ как JSON. Затем для каждой сборки преобразуйте свою временную метку в дату и сравните ее с датами начала и окончания. Обратите внимание, что важно делить отметку времени на 1000, чтобы получить секунды, а не миллисекунды (в противном случае преобразование даты из отметки времени вызовет ValueError).

Пример вывода:

$ python test.py 
Job name: Dummy #21
Build number: 21
Build url: http://localhost:8080/job/Dummy/21/
Build timestamp: 1541875585881
Build date: 2018-11-10 18:46:25

Job name: Dummy #20
Build number: 20
Build url: http://localhost:8080/job/Dummy/20/
Build timestamp: 1541875564250
Build date: 2018-11-10 18:46:04

С другой стороны, если вы хотите указать даты начала и окончания в другом формате, помните, что вам нужно настроить параметр формата в функции strptime(). Директивы Python datetime.

Несколько примеров:

datetime.strptime("23.11.2018", "%d.%m.%Y")
datetime.strptime("2018.11.23", "%Y.%m.%d")
datetime.strptime("Jun 1 2005  1:33PM", "%b %d %Y %I:%M%p")

3.Python-скрипт для получения сборки с точной датой

Если вы хотите найти сборку по ее точной дате, просто замените эту строку:

if build_date >= start_date and build_date <= stop_date:

с этим:

if build_date == date:

, где date - конкретная дата сборки.

Обратите внимание! , что если вы хотите найти сборку по точной дате, вам нужно предоставить date в правильном формате. В этом случае это "%d.%m.%Y %H:%M:%S". Пример:

datetime.strptime('10.11.2018 18:46:04', "%d.%m.%Y %H:%M:%S")

В противном случае, даже если для python даты будут одинаковыми с определенной точкой (минуты, часы, дата и т. Д.), Они не будут равны датам.

Если вы хотите указать другой формат, вам нужно настроить его для переменной build_date.

build_date.strftime('%d %m,%Y')
0 голосов
/ 12 августа 2019

Я написал очень маленький bash-скрипт для запуска на сервере jenkins для анализа лог-файлов.

Недостаточно смотреть только на время начала работы. Работа могла начаться как раз перед вашим временным окном и даже закончиться после вашего временного окна; он все еще работал бы в вашем временном окне.

#!/bin/bash
start=$1
end=$2

for build_xml in jobs/*/branches/*/builds/*/build.xml
do
        startTime=$(sed -n -e "s/.*<startTime>\(.*\)<\/startTime>.*/\1/p" $build_xml)
        modificationTime=$(date '+%s' -r $build_xml)
        if [[ $modificationTime > $start ]] && [[ $startTime < $end ]]
        then
                echo "START $(date -d @${startTime::-3})   END $(date -d @$modificationTime)   : $build_xml"
        fi
done

использование:

./getBuildsRunningBetween.sh 1565535639 1565582439

даст:

START Sun Aug 11 20:29:00 CEST 2019   END Sun Aug 11 20:30:20 CEST 2019   : jobs/job-name/branches/branch-name/builds/277/build.xml
0 голосов
/ 12 ноября 2018

Работающие задания можно найти на основе цветовой категоризации, называемой аниме, с помощью API Jenkins ниже.

"URL-адрес хоста Jenkins" / api / xml? Tree = jobs [имя, URL-адрес, цвет] & xpath = / hudson / job [заканчивается-цветом (color / text (),% 22_anime% 22)] & wrapper = jobs

Синие - те, которые бегут

blue_anime

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...