多个 Job 并发运行时共享配置文件导致上下文污染,固化 Jenkins Job 上下文
基于 context.py
固化 Jenkins Job 上下文的完整方案,适用于你当前的工作流(Python + Jenkins Pipeline),解决:
- 多个 Job 并发运行时共享配置文件导致上下文污染;
- 读取环境变量或 JSON 文件时被其他 Job 修改的问题;
- 后续阶段(如发送通知)读取错误上下文的问题;
✅ 目标
在每个 Jenkins Job 开始时,将关键变量一次性固化到内存中,并在整个 Job 生命周期内始终使用这些值。
🧱 整体架构图
[初始化阶段]↓
env_step.py → 读取 jenkins_config.json → 写入 context.py.ctx↓
executor.py → 使用 context.py.ctx 中的变量执行用例↓
notification_sender.py → 使用 context.py.ctx 发送报告
📁 目录结构建议
SuuntoTest/
├── jenkins/
│ ├── Jenkinsfile
│ ├── jenkins_config.json
│ ├── env_setup.py
│ ├── env_step.py ← 初始化上下文
│ ├── executor.py ← 执行测试用例
│ └── notification_sender.py ← 发送报告
├── context.py ← 全局上下文模块
└── ...
🧩 实现步骤详解
1️⃣ 创建 context.py
# context.pyclass Context:def __init__(self):self.GIT_REPO_URL = Noneself.BRANCH = Noneself.WORKSPACE_DIR = Noneself.PLATFORM = Noneself.DEVICE_ID = Noneself.TESTCASE = Noneself.JENKINS_BUILD_URL = Noneself.NOTIFY_EMAIL = Noneself.JOB_URL = Noneself.SEND_METHOD = Noneself.BUILD_UR = Noneself.BUILD_NUMBER = None# 模块级全局实例
ctx = Context()
2️⃣ 编写 env_step.py
:初始化上下文
# jenkins/env_step.pyimport json
import os
from context import ctxconfig_path = os.path.join(os.path.dirname(__file__), "../jenkins/jenkins_config.json")with open(config_path, "r", encoding="utf-8") as f:config = json.load(f)# 将所有需要缓存的字段写入 context.ctx
for key in vars(ctx):if key in config:setattr(ctx, key, config[key])print("✅ 上下文已初始化完成")
print("JOB_URL:", ctx.JOB_URL)
print("BUILD_NUMBER:", ctx.BUILD_NUMBER)
3️⃣ 在 executor.py
中使用上下文
# jenkins/executor.pyfrom context import ctxprint("执行测试用例...")
print("当前构建号:", ctx.BUILD_NUMBER)
print("设备 ID:", ctx.DEVICE_ID)
print("平台:", ctx.PLATFORM)
# 这里开始你的测试逻辑...
4️⃣ 在 notification_sender.py
中使用上下文
# jenkins/notification_sender.pyfrom context import ctxprint("发送测试报告...")
print("Jenkins 构建地址:", ctx.JENKINS_BUILD_URL)
print("发送方式:", ctx.SEND_METHOD)
# 这里调用钉钉、邮件等通知接口...
🛠️ Jenkins Pipeline 配置优化建议
确保 env_step.py
是整个流程的第一步。
pipeline {agent anystages {stage('Initialize Context') {steps {script {dir(env.WORKSPACE_DIR) {bat """@echo on.venv\\Scripts\\python.exe jenkins\\env_step.py"""}}}}stage('Run Tests') {steps {script {dir(env.WORKSPACE_DIR) {bat """@echo on.venv\\Scripts\\python.exe jenkins\\executor.py"""}}}}stage('Send Notification') {steps {script {dir(env.WORKSPACE_DIR) {bat """@echo on.venv\\Scripts\\python.exe jenkins\\notification_sender.py"""}}}}}
}
🔒 可选增强:防止并发构建
为了彻底避免并发冲突,可在 Jenkinsfile
中添加:
options {disableConcurrentBuilds(abortPrevious: true)
}
📌 最佳实践总结
做法 | 是否推荐 | 说明 |
---|---|---|
使用 context.py 存储上下文 | ✅ 强烈推荐 | 独立进程之间互不影响 |
在 Job 初始阶段运行 env_step.py | ✅ 必须 | 保证上下文尽早固化 |
后续脚本只读取 context.ctx | ✅ 必须 | 避免再次访问配置文件 |
不再依赖 jenkins_config.json | ✅ 推荐 | 提升稳定性 |
添加 disableConcurrentBuilds | ✅ 可选 | 更安全控制并发 |
✅ 总结
通过
context.py
固化上下文,结合 Python 进程隔离特性,你可以安全地实现:
即使多个 Job 并发运行,每个 Job 的上下文也始终保持一致且独立。