Jenkins - Python 获取正在运行的 Job
在持续集成和持续交付(CI/CD)的流程中,Jenkins 是一个非常流行的工具。有时候我们需要通过编程的方式获取 Jenkins 中正在运行的 Job 信息,Python 作为一种强大且灵活的编程语言,为我们提供了实现这一功能的途径。本文将详细介绍如何使用 Python 获取 Jenkins 中正在运行的 Job,包括相关的库、代码实现以及一些最佳实践。
目录#
- 准备工作
- 安装必要的库
- 获取 Jenkins API 令牌
- 使用 Python 库与 Jenkins 交互
jenkinsapi库的使用requests库的使用(更底层的方式)
- 获取正在运行的 Job 代码实现
jenkinsapi方式示例代码requests方式示例代码
- 常见实践与最佳实践
- 错误处理
- 安全考虑
- 定期清理和优化代码
- 总结
- 参考
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 令牌。步骤如下:
- 登录 Jenkins 管理界面。
- 点击右上角的用户名,选择“设置”。
- 在“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. 总结#
通过本文介绍的 jenkinsapi 和 requests 两种方式,我们可以方便地使用 Python 获取 Jenkins 中正在运行的 Job 信息。在实际应用中,根据项目需求选择合适的方式,并遵循错误处理、安全等最佳实践,以确保代码的稳定性和可靠性。