使用Python调用Jenkins Api之获取构建日志使用说明文档
简介
通过 Python 脚本自动化获取 Jenkins 构建日志,可以实现日志分析、错误监控、报告生成等功能。本文档将介绍以下方法:
Python-Jenkins 库:官方推荐的 Python 客户端库
日志分页与流式处理:应对大日志文件场景
准备工作
安装依赖库
# 安装 python-jenkins 库(推荐)
pip install python-jenkins
获取 Jenkins 访问凭证
登录 Jenkins Web 界面
点击右上角用户名 > Configure
在 API Token 区域生成 Token(需记录保存)
使用 python-jenkins 库
初始化客户端连接
# 创建 Jenkins 客户端实例
import jenkins
j = jenkins.Jenkins(
url='http://jenkins.demonlg.cn',
username='your_username',
password='your_api_token' # 或直接使用 API Token
)
# 验证连接
user = j.get_whoami()
print(f"Connected to Jenkins as {user['fullName']}")
**获取构建日志**
```python
def get_build_log(job_name, build_number):
try:
log = j.get_build_console_output(job_name, build_number)
return log
except jenkins.NotFoundException:
print(f"Build #{build_number} not found")
except jenkins.JenkinsException as e:
print(f"Error: {str(e)}")
# 示例:获取 job "my-project" 的最近一次构建日志
last_build = j.get_job_info('my-project')['lastCompletedBuild']['number']
log = get_build_log('my-project', last_build)
print(log[:500]) # 打印前500字符
参数说明
job_name:任务名称(区分大小写)
build_number:构建号(整数)或 ‘lastBuild’ 关键字
支持代理配置:通过 j= Jenkins(…, proxies={‘http’: ‘http://proxy:port’})
使用 Requests 直接调用 API
基础请求示例
import requests
import jenkins
j = jenkins.Jenkins(
url='http://jenkins.demonlg.cn',
username='your_username',
password='your_api_token' # 或直接使用 API Token
)
def fetch_log(job_name, build_number):
url = f"http://jenkins.example.com/job/{job_name}/{build_number}/consoleText"
response = j.jenkins_open(requests.Request(
'GET', url,
headers=DEFAULT_HEADERS
))
)
if response.status_code == 200:
return response.text
else:
raise Exception(f"Request failed: {response.status_code}")
# 示例调用
log = fetch_log('android-ci', 42)
高级用法
- 过滤特定时间段的构建
import datetime
def find_failed_builds(job_name, days=7):
builds = j.get_job_info(job_name)['builds']
cutoff = datetime.datetime.now() - datetime.timedelta(days=days)
results = []
for build in builds:
build_info = j.get_build_info(job_name, build['number'])
timestamp = build_info['timestamp'] / 1000 # 转换为秒
if (datetime.datetime.fromtimestamp(timestamp) > cutoff and
build_info['result'] == 'FAILURE'):
results.append(build['number'])
return results
# 获取最近7天失败的构建号
failed_builds = find_failed_builds('backend-tests')
print(f"Failed builds: {failed_builds}")
- 日志实时监控
from time import sleep
def monitor_running_build(job_name):
while True:
build_info = j.get_job_info(job_name)['lastBuild']
if build_info['building']:
log = j.get_build_console_output(job_name, build_info['number'])
print(log.splitlines()[-10:]) # 显示最后10行
sleep(10) # 每10秒检查一次
else:
print("Build completed")
break
# 监控正在运行的构建
monitor_running_build('mobile-deploy')
- 获取特定阶段(stage)OR特定指令(step)日志
源生接口只能获取整个流水线的日志,如果想获取stage的日志需要自行实现。那如何实现呢?
有2种方法 pipeline接口or BlueOcean接口。
错误处理建议
- 常见异常处理
try:
log = j.get_build_console_output('invalid-job', 999)
except jenkins.NotFoundException:
print("Job or build does not exist")
except jenkins.JenkinsException as e:
print(f"Jenkins API error: {str(e)}")
except requests.exceptions.ConnectionError:
print("Network connection failed")
- 重试机制
from tenacity import retry, stop_after_attempt, wait_exponential
@retry(stop=stop_after_attempt(3),
wait=wait_exponential(multiplier=1, max=10))
def safe_fetch_log(job_name, build_number):
return fetch_log(job_name, build_number)
安全注意事项
凭证存储:避免硬编码凭证,推荐使用环境变量:
import os
username = os.environ.get('JENKINS_USER')
token = os.environ.get('JENKINS_TOKEN')
未更新完后续继续更新。。。