You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何通过Jenkins API查询最近执行的若干次构建或指定时间范围的构建

如何通过Jenkins API查询全局最近/指定时间范围的构建

嘿,这个需求我刚好折腾过!不用知道具体任务名称,Jenkins API完全能帮你拿到全局范围内的最近构建记录,或者筛选指定时间戳之间的构建。下面给你分场景一步步说明:

一、基础准备:认证与API端点

首先,调用Jenkins API需要认证,推荐用用户名+API Token的方式(比密码更安全)。你可以在Jenkins个人设置里生成专属API Token。

核心的全局API端点是:http://你的Jenkins地址/api/json,我们通过tree参数来指定需要返回的字段,避免拿到冗余数据。

二、查询最近n次构建

如果你要获取全局最近的10次构建(把10换成你需要的数字),可以用命令行结合curljq快速实现:

# 替换成你的Jenkins地址、用户名、API Token和想要的数量n
curl -u 你的用户名:你的API_Token "http://your-jenkins-url/api/json?tree=jobs[builds[number,timestamp,result,fullDisplayName,url]]" | jq '[.jobs[]?.builds[]?] | sort_by(-.timestamp) | .[:10]'

命令解释:

  • [.jobs[]?.builds[]?]:把所有任务下的构建记录收集到一个数组里,?.用来跳过没有构建记录的任务,避免报错
  • sort_by(-.timestamp):按构建时间戳(毫秒级)倒序排序,最新的排在前面
  • [:10]:取排序后的前10条记录

三、查询两个时间戳之间的构建

如果要筛选某个时间范围内的构建,同样用curl+jq,只需要加个select过滤条件:

# 替换成你的认证信息、Jenkins地址,以及起始/结束时间戳(毫秒级)
curl -u 你的用户名:你的API_Token "http://your-jenkins-url/api/json?tree=jobs[builds[number,timestamp,result,fullDisplayName,url]]" | jq '[.jobs[]?.builds[]? | select(.timestamp >= 1690000000000 and .timestamp <= 1691000000000)] | sort_by(-.timestamp)'

注意:

Jenkins返回的timestamp毫秒级的时间戳,所以你需要把自己的起始/结束时间转换成毫秒(比如用在线工具或者代码转换)。

四、用Python代码实现(更灵活)

如果需要在代码里处理,可以用requests库来调用API,然后自己做排序和过滤:

import requests
from requests.auth import HTTPBasicAuth

# 配置你的Jenkins信息
JENKINS_URL = "http://your-jenkins-url"
USERNAME = "你的用户名"
API_TOKEN = "你的API Token"

# 获取所有任务的构建数据
response = requests.get(
    f"{JENKINS_URL}/api/json",
    auth=HTTPBasicAuth(USERNAME, API_TOKEN),
    params={"tree": "jobs[builds[number,timestamp,result,fullDisplayName,url]]"}
)
response.raise_for_status()  # 处理请求错误
data = response.json()

# 收集所有构建记录
all_builds = []
for job in data.get("jobs", []):
    builds = job.get("builds", [])
    all_builds.extend(builds)

# 1. 获取最近10次构建
recent_builds = sorted(all_builds, key=lambda x: x["timestamp"], reverse=True)[:10]
print("最近10次构建:")
for build in recent_builds:
    print(f"任务名:{build['fullDisplayName']} | 构建号:{build['number']} | 结果:{build['result']} | 链接:{build['url']}")

# 2. 筛选指定时间范围的构建(示例:2023-07-21 到 2023-07-31)
start_ts = 1690000000000  # 起始时间戳(毫秒)
end_ts = 1691000000000    # 结束时间戳(毫秒)
filtered_builds = [
    build for build in all_builds
    if start_ts <= build["timestamp"] <= end_ts
]
# 按时间倒序排序
filtered_builds_sorted = sorted(filtered_builds, key=lambda x: x["timestamp"], reverse=True)

print("\n指定时间范围的构建:")
for build in filtered_builds_sorted:
    print(f"任务名:{build['fullDisplayName']} | 构建号:{build['number']} | 结果:{build['result']} | 链接:{build['url']}")

额外注意事项

  • 如果你的Jenkins开启了CSRF保护,需要先获取Crumb再请求:
    # 获取Crumb
    curl -u 用户名:API_Token "http://your-jenkins-url/crumbIssuer/api/json"
    # 然后在请求里加Header:-H "Jenkins-Crumb: 拿到的crumb值"
    
  • 如果Jenkins数据量很大,第一次请求可能会慢,可以考虑分页或者限制返回字段来优化。

内容的提问来源于stack exchange,提问作者The Governor

火山引擎 最新活动