当前位置: 首页 > article >正文

使用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')

未更新完后续继续更新。。。


http://www.kler.cn/a/599757.html

相关文章:

  • 两个手机都用流量,IP地址会一样吗?深入解析
  • Excel第41套全国人口普查
  • 在Spring Boot中,可以通过实现一些特定的接口来拓展Starter
  • 安全上网沙箱:多方面解决政企私的上网问题
  • 2025-如何创建自己的电商网站
  • Linux 系统关机和重启指令
  • Spring Boot项目快速创建-开发流程(笔记)
  • JAVA_数据结构_栈和队列
  • CSS 中text - shadow和box - shadow原理、属性的使用方法及区别
  • 鸿蒙进行视频上传,使用 request.uploadFile方法
  • Android 13系统定制实战:基于系统属性的音量键动态屏蔽方案解析
  • [AI速读]用持续集成(CI)优化芯片验证环境:Jenkins与EDA工具的实战指南
  • 【Linux学习笔记】gcc编辑器和动静态库的深度剖析
  • SAP-ABAP:SAP事务码SE14深度解析:数据库表管理核心工具
  • mysql传统主从模式下,主从中断接续
  • 探究Three.js中模型移动与旋转的交互逻辑
  • venv 和 conda 哪个更适合管理python虚拟环境
  • 内网穿透的应用-本地部署ChatTTS教程:Windows搭建AI语音合成服务的全流程配置
  • LeetCode讲解篇之456. 132 模式
  • 鸿蒙生态开发