Jenkins Pipeline 与 Python 脚本之间使用环境变量通信

发布于:2025-06-26 ⋅ 阅读:(19) ⋅ 点赞:(0)

📄 Jenkins Pipeline 与 Python 脚本之间使用环境变量通信指南

✅ 目标

  • 在 Jenkins Pipeline 中设置环境变量
  • 在 Python 脚本中读取这些变量
  • 构造可访问的日志链接(artifact URL)
  • 用于钉钉/邮件通知中的日志路径拼接

🧩 一、Jenkinsfile 设置环境变量(Windows 批处理方式)

✅ 示例:在 bat 块中设置变量

stage('Send Notification') {
    steps {
        script {
            dir("${env.WORKSPACE_DIR}") {
                bat """
                    @echo on
                    set PYTHONIOENCODING=utf-8
                    set LATEST_LOG_DIR=2025-06-23-19-48-33_android_10CF4809DD002B4
                    set BUILD_URL=http://localhost:8080/job/AndroidSmokePipline/35/
                    .venv\\Scripts\\python jenkins\\notification_sender.py
                """
            }
        }
    }
}

💡 注意:

  • 使用 set VAR_NAME=value 设置变量
  • 变量只对当前命令行会话有效
  • Python 脚本必须在同一会话中执行才能读取到变量

🧩 二、Python 脚本中读取 Jenkins 环境变量

✅ 示例:在 [notification_sender.py] 中获取变量

import os

def get_environment_variables():
    """
    获取 Jenkins 传入的环境变量
    """
    env_vars = {
        "LATEST_LOG_DIR": os.getenv("LATEST_LOG_DIR"),
        "BUILD_URL": os.getenv("BUILD_URL"),
        "JOB_NAME": os.getenv("JOB_NAME"),
        "BUILD_NUMBER": os.getenv("BUILD_NUMBER"),
        "WORKSPACE": os.getenv("WORKSPACE"),
        "NODE_NAME": os.getenv("NODE_NAME")
    }

    missing_vars = [k for k, v in env_vars.items() if v is None or v == '']
    if missing_vars:
        print(f"⚠️ 缺少以下环境变量: {missing_vars}")
    
    return env_vars

✅ 使用示例:构造 artifact 日志链接

def build_log_url(build_url, log_dir):
    if not build_url or not log_dir:
        return "未知"
    return f"{build_url.rstrip('/')}/artifact/SuuntoTest/log/{log_dir}/"

# 示例调用
env_vars = get_environment_variables()
log_url = build_log_url(env_vars["BUILD_URL"], env_vars["LATEST_LOG_DIR"])
print(f"测试日志访问地址: {log_url}")

📦 三、Jenkins 内置常用环境变量一览

Jenkins 环境变量 含义 示例值
BUILD_URL 当前构建页面地址 http://localhost:8080/job/MyJob/35/
JOB_NAME 任务名称 AndroidSmokePipline
BUILD_NUMBER 构建编号 35
WORKSPACE Jenkins 工作空间根目录 C:\ProgramData\Jenkins\.jenkins\workspace\AndroidSmokePipline
NODE_NAME 当前执行节点名 windows-agent-01

🔁 四、完整流程图

graph LR
    A[Jenkins Pipeline] --> B[bat 命令行]
    B --> C{设置环境变量}
    C --> D[`set LATEST_LOG_DIR=...`]
    C --> E[`set BUILD_URL=...`]
    D --> F[启动 Python 脚本]
    F --> G[Python 使用 `os.getenv()` 读取变量]
    G --> H[构造 artifact 日志链接]
    H --> I[发送钉钉/邮件通知]

🧪 五、调试建议

✅ 在 Jenkinsfile 中打印变量值:

bat """
    echo 当前环境变量:
    set
"""

✅ 在 Python 中打印所有环境变量:

import os

def print_all_env_vars():
    print("=== Jenkins 注入的环境变量 ===")
    for key, value in sorted(os.environ.items()):
        print(f"{key}={value}")

这样你可以看到 Jenkins 自动注入了哪些变量,以及你在 bat 中手动设置的变量是否生效。


📌 六、常见问题排查

问题 原因 解决方法
os.getenv("LATEST_LOG_DIR") 返回 None Jenkinsfile 没有正确设置该变量 检查 Jenkinsfile 中的 set LATEST_LOG_DIR=... 是否存在
❌ 构造出的日志链接不完整 Jenkinsfile 或 Python 路径拼接错误 确保使用 /artifact/ 路径,并且 Jenkins 成功归档了日志目录
✅ 如何查看当前所有可用变量? 使用 setos.environ 推荐在 Python 中打印全部环境变量调试


网站公告

今日签到

点亮在社区的每一天
去签到