如何以特定格式获取 jenkins 管道的输出?
How to get output of jenkins pipeline in a specific format?
我正在尝试在我的 jenkins 管道中实施机器学习。
为此,我需要每个构建的管道输出数据。
我需要的一些参数是:
- 哪个用户触发了管道
- 管道持续时间
- 版本号及其详细信息
- 管道pass/fail
- 如果失败,在哪个阶段失败。
- 失败阶段出错。 (为什么失败)
- 执行每个阶段所需的时间
- 每个阶段的具体输出(例如:如果一个阶段包含 sonarcube 执行,那么输出是某种代码气味百分比或代码覆盖率)
我需要为所有构建获取这些详细信息。怎么才能得到呢?
有 jenkins api 可以在 python 中实现,但我只能得到 JOB_NAME,工作描述,IS 工作已启用。
这些细节没有用。
有两种方法可以从您的列表中获取一些数据。
1。詹金斯 API
对于列表中的前 4 个点,您可以对特定构建使用 JSON REST API 来获取这些数据。示例 API 端点:
https://[JENKINS_HOST]/job/[JOB_NAME]/[BUILD_NUMBER]/api/json?pretty=true
1.哪个用户触发了管道
这将在 actions 数组下响应,数组中的 identyfi 对象由 "_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" 键:
"number": 107,
4。管道 pass/fail
"result": "SUCCESS",
如果您需要为所有构建提取此信息,运行 GET 作业请求 API https://[JENKINS_HOST]/job/[JOB_NAME]/api/json?pretty=true
并提取所有构建,然后 运行 上述请求您提取的每个版本。
稍后我会写一个虚拟 python 脚本来做到这一点。
2。在 Jenkinsfile 中转储数据
也有可能在 post 操作中从 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
创建一个包含当前阶段信息的变量。在每个阶段开始时将其值更改为正在进行的阶段。最后转储到文件,如 rest 变量。如果管道失败,假设在 foo 阶段的 post 操作中,此变量将具有完全相同的值,因为如果管道失败,它将不会进入下一阶段。
广告。 6
我不确定你想要什么,追溯,错误代码?
我想您可能需要实现自己的日志记录功能。
广告。 7
制作一个函数来测量每个阶段的时间并在最后转储值。
广告。 8
也不确定你的意思。比如,构建工件?
在每次构建结束时,此文件 job_data.txt 将被存档为构建工件,稍后可以下载。
如果我能找到更优雅、更简单的解决方案,我会编辑这个 post。
希望对您有所帮助
编辑 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 令牌进行授权。
我正在尝试在我的 jenkins 管道中实施机器学习。
为此,我需要每个构建的管道输出数据。
我需要的一些参数是:
- 哪个用户触发了管道
- 管道持续时间
- 版本号及其详细信息
- 管道pass/fail
- 如果失败,在哪个阶段失败。
- 失败阶段出错。 (为什么失败)
- 执行每个阶段所需的时间
- 每个阶段的具体输出(例如:如果一个阶段包含 sonarcube 执行,那么输出是某种代码气味百分比或代码覆盖率)
我需要为所有构建获取这些详细信息。怎么才能得到呢?
有 jenkins api 可以在 python 中实现,但我只能得到 JOB_NAME,工作描述,IS 工作已启用。 这些细节没有用。
有两种方法可以从您的列表中获取一些数据。
1。詹金斯 API
对于列表中的前 4 个点,您可以对特定构建使用 JSON REST API 来获取这些数据。示例 API 端点:
https://[JENKINS_HOST]/job/[JOB_NAME]/[BUILD_NUMBER]/api/json?pretty=true
1.哪个用户触发了管道
这将在 actions 数组下响应,数组中的 identyfi 对象由 "_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" 键:
"number": 107,
4。管道 pass/fail
"result": "SUCCESS",
如果您需要为所有构建提取此信息,运行 GET 作业请求 API https://[JENKINS_HOST]/job/[JOB_NAME]/api/json?pretty=true
并提取所有构建,然后 运行 上述请求您提取的每个版本。
稍后我会写一个虚拟 python 脚本来做到这一点。
2。在 Jenkinsfile 中转储数据
也有可能在 post 操作中从 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
创建一个包含当前阶段信息的变量。在每个阶段开始时将其值更改为正在进行的阶段。最后转储到文件,如 rest 变量。如果管道失败,假设在 foo 阶段的 post 操作中,此变量将具有完全相同的值,因为如果管道失败,它将不会进入下一阶段。
广告。 6 我不确定你想要什么,追溯,错误代码? 我想您可能需要实现自己的日志记录功能。
广告。 7 制作一个函数来测量每个阶段的时间并在最后转储值。
广告。 8 也不确定你的意思。比如,构建工件?
在每次构建结束时,此文件 job_data.txt 将被存档为构建工件,稍后可以下载。
如果我能找到更优雅、更简单的解决方案,我会编辑这个 post。
希望对您有所帮助
编辑 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 令牌进行授权。