多个 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.py

class Context:
    def __init__(self):
        self.GIT_REPO_URL = None
        self.BRANCH = None
        self.WORKSPACE_DIR = None
        self.PLATFORM = None
        self.DEVICE_ID = None
        self.TESTCASE = None
        self.JENKINS_BUILD_URL = None
        self.NOTIFY_EMAIL = None
        self.JOB_URL = None
        self.SEND_METHOD = None
        self.BUILD_UR = None
        self.BUILD_NUMBER = None


# 模块级全局实例
ctx = Context()

2️⃣ 编写 env_step.py:初始化上下文

# jenkins/env_step.py

import json
import os
from context import ctx

config_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.py

from context import ctx

print("执行测试用例...")
print("当前构建号:", ctx.BUILD_NUMBER)
print("设备 ID:", ctx.DEVICE_ID)
print("平台:", ctx.PLATFORM)
# 这里开始你的测试逻辑...

4️⃣ 在 notification_sender.py 中使用上下文

# jenkins/notification_sender.py

from context import ctx

print("发送测试报告...")
print("Jenkins 构建地址:", ctx.JENKINS_BUILD_URL)
print("发送方式:", ctx.SEND_METHOD)
# 这里调用钉钉、邮件等通知接口...

️ Jenkins Pipeline 配置优化建议

确保 env_step.py 是整个流程的第一步。

pipeline {
    agent any
    stages {
        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 的上下文也始终保持一致且独立。

你可能感兴趣的:(Jenkins,jenkins,servlet,运维)