簡介
通過 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 logexcept 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.textelse:raise Exception(f"Request failed: {response.status_code}")# 示例調用
log = fetch_log('android-ci', 42)
高級用法
- 過濾特定時間段的構建
import datetimedef 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 andbuild_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')
未更新完后續繼續更新。。。