如何获取特定格式的詹金斯管道的输出?

时间:2018-10-27 14:50:24

标签: jenkins machine-learning jenkins-pipeline devops jenkins-api

我正在尝试在我的詹金斯管道中实现机器学习。
为此,我需要每个构建的管道输出数据。

我需要的一些参数是:

  1. 哪个用户触发了管道
  2. 管道的持续时间
  3. 内部编号及其详细信息
  4. 管道通过/失败
  5. 如果失败,则在该阶段失败。
  6. 失败阶段中的错误。 (为什么失败)
  7. 执行每个阶段所需的时间
  8. 每个阶段的特定输出(例如:例如:如果一个阶段包含声纳执行,则输出为某种代码百分比或代码覆盖率)

我需要获取所有构建的这些详细信息。怎么能得到呢?

有可以在python中实现的jenkins api,但是我只能获得JOB_NAME,工作说明,IS job Enabled。 这些细节没有用。

1 个答案:

答案 0 :(得分:1)

有两种方法可以从列表中获取一些数据。

1。 Jenkins API

对于列表中的前4个点,您可以使用JSON REST API进行特定的构建以获取这些数据。示例API端点:

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

1。哪个用户触发了管道

这将作为响应在 actions 数组下,通过“ _ class”:“ hudson.model.CauseAction” 在数组中标识对象,并且其中将具有 shortDescription 键,其中将包含以下信息:

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

2。管道持续时间

可以在键“ duration”下找到它。例子

"duration": 244736,

3。内部版本号及其详细信息

我不知道您需要什么详细信息,但是要查找内部版本号,请查找“数字”键:

"number": 107,

4。管道通过/失败

"result": "SUCCESS",

如果您需要为所有内部版本提取此信息,请运行作业API https://[JENKINS_HOST]/job/[JOB_NAME]/api/json?pretty=true的GET请求并提取所有内部版本,然后针对您提取的每个内部版本运行上述请求。

稍后我将编写一个虚拟的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中实现自己的逻辑。

广告。 5

创建一个变量,其中包含有关当前阶段的信息。在每个阶段的开始,将其值更改为正在进行的阶段。最后,像其他变量一样转储到文件中。如果流水线失败,则在后续操作中在阶段 foo 上说,此变量将具有完全相同的值,因为如果流水线失败,它将不会进入下一阶段。

广告。 6 我不确定您想要什么,回溯,错误代码? 我想您可能需要实现自己的日志记录功能。

广告。 7 制作一个用于测量每个阶段的时间并在最后转储值的功能。

广告。 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​​令牌进行授权。