Как получить вывод конвейера Дженкинса в определенном формате? - PullRequest
0 голосов
/ 27 октября 2018

Я пытаюсь внедрить машинное обучение в моем конвейере Дженкинса.
Для этого мне нужны выходные данные конвейера для каждой сборки.

Некоторые параметры, которые мне нужны:

  1. Какой пользователь запустил конвейер
  2. Продолжительность трубопровода
  3. Номер сборки с его деталями
  4. Трубопровод пройден / не пройден
  5. Если не удалось, на каком этапе это не удалось.
  6. Ошибка в неудачной стадии. (Почему не получилось)
  7. Время, необходимое для выполнения каждого этапа
  8. Конкретный вывод каждого каскада (например, если ступень содержит выполнение сонаркуба, тогда вывод будет в виде процента от кодовых ячеек или покрытия кода)

Мне нужно получить эти данные для всех сборок. Как можно получить это?

Существует jenkins api, который может быть реализован на python, но я смог получить только JOB_NAME, Описание работы, IS job Enabled. Эти детали не были полезны.

1 Ответ

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

Есть 2 способа получить некоторые данные из вашего списка.

1.Jenkins API

Для первых 4 точек из списка вы можете использовать JSON REST API для конкретной сборки, чтобы получить эти данные.Пример конечной точки API:

https://[JENKINS_HOST]/job/[JOB_NAME]/[BUILD_NUMBER]/api/json?pretty=true

1.Какой пользователь запустил конвейер

Это будет под действиями массивом в ответ, идентификатор объекта в массиве по "_ class": "hudson.model.CauseAction" и в нем у вас будет ключ shortDescription , который будет содержать эту информацию:

"actions": [
        {
            "_class": "hudson.model.CauseAction",
            "causes": [
                {
                    "_class": "hudson.triggers.SCMTrigger$SCMTriggerCause",
                    "shortDescription": "Started by an SCM change"
                }
            ]
        },

2.Длительность конвейера

Его можно найти под ключом: «продолжительность».Пример

"duration": 244736,

3.Номер сборки с ее деталями

Я не знаю, какие детали вам нужны, но для номера сборки ищите ключ "number":

"number": 107,

4.Пропуск / сбой конвейера

"result": "SUCCESS",

Если вам нужно извлечь эту информацию для всех сборок, запустите GET-запрос для API задания https://[JENKINS_HOST]/job/[JOB_NAME]/api/json?pretty=true и извлеките все сборки, затем запустите вышеупомянутый запросза сборку, которую вы извлекли.

Я напишу позже фиктивный скрипт на Python, чтобы сделать именно это.


2.Дамп данных в Jenkinsfile

Существует также возможность вывести часть этой информации из Jenkinfile в пост-действие.

pipeline {
agent any

stages {
    stage('stage 1') {
        steps {
            sh 'echo "Stage 1 time: ${YOUR_TIME_VAR}" > job_data.txt'
        }
    }
}
post {
    always {
        sh 'echo "Result: ${result}" > job_data.txt'
        sh 'echo "Job name: ${displayName}" > job_data.txt'
        sh 'echo "Build number: ${number}" > job_data.txt'
        sh 'echo "Duration: ${duration}" > job_data.txt'


        archiveArtifacts artifacts: 'job_data.txt', onlyIfSuccessful: false
    }
}

}

Список доступных глобальных переменных для конвейерного заданияможно найти:

https://[JENKINS_HOST]/pipeline-syntax/globals#env

Для отдыха вам потребуется реализовать собственную логику в Jenkinsfile.

Ad.5

Создайте переменную, которая содержит информацию о текущем этапе.В начале каждого этапа измените его значение на текущий этап.В конце дампа в файл, как остальные переменные.Если конвейер потерпит неудачу, скажем, на этапе foo в последующем действии, эта переменная будет иметь точно такое же значение, потому что, если конвейер потерпит неудачу, он не перейдет к следующему этапу.

Ad.6 Я не уверен, что вы хотите, трассировку, код ошибки?Я полагаю, вам, вероятно, потребуется реализовать собственную функцию ведения журнала.

Объявление.7 Создать функцию для измерения времени для каждой ступени и значения дампа в конце.

Ad.8 Также не уверен, что вы имеете в виду.Например, артефакты сборки?

В конце каждой сборки этот файл job_data.txt будет архивироваться как артефакт сборки, который можно будет позже загрузить.

Если я найдуболее элегантное и простое решение. Я отредактирую этот пост.

Надеюсь, что это поможет каким-либо образом


РЕДАКТИРОВАТЬ 1

Вот скрипт, который я упоминал ранее.

import requests


username = "USERNAME"
password = "PASSWORD"
jenkins_host = "JENKINS_HOST"
jenkins_job = "JOBNAME"
request_url = "{0:s}/job/{1:s}/api/json".format(
    jenkins_host,
    jenkins_job,
)

job_data = requests.get(request_url, auth=(username, password)).json()

builds = []

for build in job_data.get('builds'):
    builds.append(build.get('number'))

for build in builds:
    build_url = "{0:s}/job/{1:s}/{2:d}/api/json".format(
        jenkins_host,
        jenkins_job,
        build,
    )

    build_data = requests.get(build_url, auth=(username, password)).json()
    build_name = build_data.get('fullDisplayName')
    build_number = build_data.get('number')
    build_status = build_data.get('result')
    build_duration = build_data.get('duration')
    for action in build_data.get('actions'):
        if action.get("_class") == "hudson.model.CauseAction":
            build_trigger = action.get('causes')
    print(build_name)
    print(build_status)
    print(build_duration)
    print(build_number)
    print(build_trigger)

Обратите внимание, что вам может потребоваться авторизация с помощью API Token в зависимости от настроек безопасности.

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