基于 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 的上下文也始終保持一致且獨立。