如何通过Jenkins API高效获取所有层级的构建日志?
获取Jenkins所有层级构建日志的解决方案
核心思路:递归遍历Jenkins的文件夹与任务
Jenkins的API中,文件夹和普通任务都属于jobs范畴,通过_class字段可以区分类型:
- 文件夹的
_class通常为com.cloudbees.hudson.plugins.folder.Folder - 普通构建任务的
_class比如hudson.model.FreeStyleProject、org.jenkinsci.plugins.workflow.job.WorkflowJob等
通过递归遍历每个层级的jobs,就能覆盖所有嵌套文件夹中的任务,同时避免一次性拉取全量数据导致的内存问题。
实现代码示例
import requests JENKINS_URL = "https://build.org.com" username = "your_username" access_token = "your_access_token" session = requests.Session() session.auth = (username, access_token) def traverse_jobs(job_url): # 获取当前job的基础信息,仅请求需要的字段以缩小响应体积 job_api_url = f"{job_url.rstrip('/')}/api/json?tree=name,_class,jobs[name,url,_class]" job_data = session.get(job_api_url).json() # 如果是文件夹,递归遍历内部的jobs if job_data["_class"].startswith("com.cloudbees.hudson.plugins.folder.Folder"): for sub_job in job_data["jobs"]: traverse_jobs(sub_job["url"]) else: # 处理普通构建任务,获取构建日志 get_job_build_logs(job_url) def get_job_builds(job_url, limit=10): # 分页获取构建列表,避免一次性拉取过多构建数据 builds_api_url = f"{job_url.rstrip('/')}/api/json?tree=builds[number,url]{{0,{limit}}}" job_data = session.get(builds_api_url).json() return job_data.get("builds", []) def get_job_build_logs(job_url): builds = get_job_builds(job_url) if not builds: print(f"任务 {job_url} 无构建记录") return # 遍历每个构建,流式读取日志避免内存溢出 for build in builds: log_url = f"{build['url'].rstrip('/')}/consoleText" print(f"=== 读取构建 {build['number']} 的日志 ===") with session.get(log_url, stream=True) as response: for chunk in response.iter_content(chunk_size=1024*1024): if chunk: # 可替换为写入文件、存储数据库等自定义逻辑 print(chunk.decode('utf-8'), end='') # 从Jenkins根节点开始遍历所有任务 root_api_url = f"{JENKINS_URL}/api/json?tree=jobs[name,url,_class]" root_data = session.get(root_api_url).json() for root_job in root_data["jobs"]: traverse_jobs(root_job["url"])
关键优化点
- 递归遍历:自动处理任意深度的嵌套文件夹,不会遗漏深层任务
- 精简API请求:通过
tree参数只获取必要字段,大幅减少响应数据量 - 分页获取构建:限制每次拉取的构建数量,避免单请求返回过大数据
- 流式读取日志:分块加载日志内容,防止大日志直接占用大量内存
内容的提问来源于stack exchange,提问作者Abhishek Rai
相关产品推荐
相关产品推荐

