Jenkins Pipeline 与 Python 脚本之间使用环境变量通信
📄 Jenkins Pipeline 与 Python 脚本之间使用环境变量通信指南
✅ 目标
- 在 Jenkins Pipeline 中设置环境变量
- 在 Python 脚本中读取这些变量
- 构造可访问的日志链接(artifact URL)
- 用于钉钉/邮件通知中的日志路径拼接
🧩 一、Jenkinsfile 设置环境变量(Windows 批处理方式)
✅ 示例:在 bat
块中设置变量
stage('Send Notification') {steps {script {dir("${env.WORKSPACE_DIR}") {bat """@echo onset PYTHONIOENCODING=utf-8set LATEST_LOG_DIR=2025-06-23-19-48-33_android_10CF4809DD002B4set 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 osdef 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 LRA[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 osdef 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 成功归档了日志目录 |
✅ 如何查看当前所有可用变量? | 使用 set 或 os.environ | 推荐在 Python 中打印全部环境变量调试 |