Jenkins - Python 获取正在运行的 Job

在持续集成和持续交付(CI/CD)的流程中,Jenkins 是一个非常流行的工具。有时候我们需要通过编程的方式获取 Jenkins 中正在运行的 Job 信息,Python 作为一种强大且灵活的编程语言,为我们提供了实现这一功能的途径。本文将详细介绍如何使用 Python 获取 Jenkins 中正在运行的 Job,包括相关的库、代码实现以及一些最佳实践。

目录#

  1. 准备工作
    • 安装必要的库
    • 获取 Jenkins API 令牌
  2. 使用 Python 库与 Jenkins 交互
    • jenkinsapi 库的使用
    • requests 库的使用(更底层的方式)
  3. 获取正在运行的 Job 代码实现
    • jenkinsapi 方式示例代码
    • requests 方式示例代码
  4. 常见实践与最佳实践
    • 错误处理
    • 安全考虑
    • 定期清理和优化代码
  5. 总结
  6. 参考

1. 准备工作#

1.1 安装必要的库#

  • jenkinsapi:这是一个专门用于与 Jenkins 交互的 Python 库,它封装了很多与 Jenkins API 交互的功能,使用起来相对方便。可以通过 pip install jenkinsapi 进行安装。
  • requests:如果不想使用 jenkinsapi 这样的封装库,也可以使用 requests 库直接与 Jenkins 的 REST API 进行交互。它是一个常用的 HTTP 请求库,通过 pip install requests 安装。

1.2 获取 Jenkins API 令牌#

为了安全地访问 Jenkins 的 API,我们需要获取一个 API 令牌。步骤如下:

  1. 登录 Jenkins 管理界面。
  2. 点击右上角的用户名,选择“设置”。
  3. 在“API Token”部分,点击“添加新 Token”,输入描述后生成令牌并保存(注意:生成后只会显示一次,要妥善保存)。

2. 使用 Python 库与 Jenkins 交互#

2.1 jenkinsapi 库的使用#

jenkinsapi 库提供了一个 Jenkins 类,通过它可以方便地连接到 Jenkins 服务器并进行各种操作。

2.2 requests 库的使用(更底层的方式)#

requests 库主要用于发送 HTTP 请求。我们需要知道 Jenkins 的 API 接口地址(一般是 http://<jenkins_url>/api/json 等形式),然后构造合适的请求头(包含认证信息等)来发送请求获取数据。

3. 获取正在运行的 Job 代码实现#

3.1 jenkinsapi 方式示例代码#

from jenkinsapi.jenkins import Jenkins
 
# 替换为你的 Jenkins 地址和 API 令牌
jenkins_url = "http://your_jenkins_url"
api_token = "your_api_token"
 
# 连接到 Jenkins
server = Jenkins(jenkins_url, username="your_username", password=api_token)
 
# 获取所有正在运行的 Job
running_jobs = []
for job_name, job in server.get_jobs():
    job_instance = server.get_job(job_name)
    builds = job_instance.get_build_ids()
    for build_id in builds:
        build = job_instance.get_build(build_id)
        if build.is_running():
            running_jobs.append({
                "job_name": job_name,
                "build_number": build_id
            })
 
print(running_jobs)

3.2 requests 方式示例代码#

import requests
 
# 替换为你的 Jenkins 地址和 API 令牌
jenkins_url = "http://your_jenkins_url"
api_token = "your_api_token"
username = "your_username"
 
# 构造认证信息
auth = (username, api_token)
 
# 获取所有 Job 信息(这里简化处理,实际可能需要分页等)
response = requests.get(f"{jenkins_url}/api/json", auth=auth)
jobs_data = response.json()
 
running_jobs = []
for job in jobs_data["jobs"]:
    job_name = job["name"]
    job_url = job["url"]
    # 获取该 Job 的构建信息
    build_response = requests.get(f"{job_url}/api/json", auth=auth)
    build_data = build_response.json()
    for build in build_data["builds"]:
        build_number = build["number"]
        build_url = f"{job_url}{build_number}/api/json"
        build_info_response = requests.get(build_url, auth=auth)
        build_info = build_info_response.json()
        if build_info["building"]:
            running_jobs.append({
                "job_name": job_name,
                "build_number": build_number
            })
 
print(running_jobs)

4. 常见实践与最佳实践#

4.1 错误处理#

  • jenkinsapi 方式中,可能会遇到连接失败等问题,要添加 try - except 块来捕获 JenkinsAPIException 等异常。
  • requests 方式中,要处理 requests.exceptions.RequestException 等网络请求异常,例如:
try:
    response = requests.get(f"{jenkins_url}/api/json", auth=auth)
    response.raise_for_status()  # 检查请求是否成功,不成功抛出异常
except requests.exceptions.RequestException as e:
    print(f"请求出错: {e}")

4.2 安全考虑#

  • 不要在代码中明文存储 API 令牌,最好通过环境变量等方式获取(例如在 jenkinsapi 中可以通过 os.environ.get("JENKINS_API_TOKEN") 获取)。
  • 限制代码的访问权限,确保只有授权的用户或服务可以运行获取 Job 信息的脚本。

4.3 定期清理和优化代码#

  • 如果代码中存在大量重复的请求(如 requests 方式中多次获取不同层级的数据),可以考虑封装成函数,提高代码复用性。
  • 对于不再使用的连接对象(如 jenkinsapi 中的 server 对象),及时释放资源(虽然 Python 有垃圾回收,但良好的习惯有助于性能)。

5. 总结#

通过本文介绍的 jenkinsapirequests 两种方式,我们可以方便地使用 Python 获取 Jenkins 中正在运行的 Job 信息。在实际应用中,根据项目需求选择合适的方式,并遵循错误处理、安全等最佳实践,以确保代码的稳定性和可靠性。

6. 参考#