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

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

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

相关文章:

  • SpringBoot 3.0之后为什么移除了spring.factories
  • 好好学Docker:基于Docker buildx构建多平台镜像【转载】
  • Python爬取微博签到数据(2025年3月更)
  • python的文件上传
  • 单片机 - RAM 与内存、ROM 与硬盘 之间的详细对比总结
  • 【MySQL】JDBC —— Java 连接 MySQL
  • Qt 隐式共享
  • Java「Deque」 方法详解:从入门到实战
  • 信息安全和病毒防护——入侵检测技术
  • selenium基本使用(二)九种定位方法
  • 深度优先搜索(DFS)在排列组合问题中的应用详解:C++实现与优化
  • 第一章,网络发展史///OSI七层模型
  • 【开题报告+论文+源码】基于SpringBoot+Vue的酒店餐饮管理系统设计与实现
  • CTF类题目复现总结-[羊城杯 2020]TCP_IP 1
  • 25. 策略模式
  • Java 编译 API(javax.tools 包)的使用方法及关键点总结,适用于在运行时动态编译 Java 代码
  • 【MySQL篇】DEPENDENT SUBQUERY(依赖性子查询)优化:从百秒到秒级响应的四种优化办法
  • 芋道 Spring Cloud Alibaba 消息队列 RocketMQ 入门
  • LeetCode 2255.统计是给定字符串前缀的字符串数目:使用库函数+计数
  • wordpress-网站百宝箱插件
  • 迷你主机做网站/手机管家一键优化
  • 网站开发的工作流程/图片识别
  • 网站的英文/seo技术网网
  • 网站如何转做app/可口可乐营销策划方案
  • 现在建设一个网站需要什么技术/策划
  • 香港美女做旅游视频网站/推广页面制作