如何通过Jenkins API查询最近执行的若干次构建或指定时间范围的构建
如何通过Jenkins API查询全局最近/指定时间范围的构建
嘿,这个需求我刚好折腾过!不用知道具体任务名称,Jenkins API完全能帮你拿到全局范围内的最近构建记录,或者筛选指定时间戳之间的构建。下面给你分场景一步步说明:
一、基础准备:认证与API端点
首先,调用Jenkins API需要认证,推荐用用户名+API Token的方式(比密码更安全)。你可以在Jenkins个人设置里生成专属API Token。
核心的全局API端点是:http://你的Jenkins地址/api/json,我们通过tree参数来指定需要返回的字段,避免拿到冗余数据。
二、查询最近n次构建
如果你要获取全局最近的10次构建(把10换成你需要的数字),可以用命令行结合curl和jq快速实现:
# 替换成你的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




