jenkins中执行python脚本导入路径错误
🧾 问题一:ModuleNotFoundError: No module named 'jenkins'
🔍 现象:
在本地运行正常,但在 Jenkins 中运行脚本时报错,提示找不到 jenkins
模块。
❓ 原因分析:
- Python 默认只从当前目录或已安装包中查找模块。
- Jenkins 执行脚本时的工作路径可能不是项目根目录。
from jenkins.config_manager import load_config
这种导入方式要求 Python 能找到jenkins
目录,但默认情况下不会自动加入。
✅ 推荐解决方案:
方案一:在 Jenkins Pipeline 中设置 PYTHONPATH
bat '''@echo oncd /d "%WORKSPACE%"set PYTHONPATH=%WORKSPACE%.venv\\Scripts\\python.exe jenkins\\notification_sender.py
'''
⚠️
%WORKSPACE%
是 Jenkins 内置变量,指向任务的工作空间根目录。
方案二:在脚本中动态添加路径(适用于调试或临时使用)
import sys
import oscurrent_script_dir = os.path.dirname(os.path.abspath(__file__))
project_root = os.path.dirname(current_script_dir)
if project_root not in sys.path:sys.path.insert(0, project_root)from jenkins.config_manager import load_config
🧾 问题二:download_apk
路径不一致导致文件分散
🔍 现象:
下载目录一会出现在项目根目录下,一会出现在 jenkins/
目录下,导致重复下载、清理混乱。
❓ 原因分析:
- 使用了相对路径
os.getcwd()
,而该函数返回的是当前执行命令所在的目录。 - 如果从不同位置运行脚本,
download_dir
的路径会不同。
✅ 推荐解决方案:
统一使用脚本所在目录定位 download_apk
代码如下:
# 获取当前脚本目录
current_script_dir = os.path.dirname(os.path.abspath(__file__))
download_dir = os.path.join(current_script_dir, "..", "download_apk")
这样无论你从哪里运行脚本,[download_apk]都会固定在项目根目录下。
✅ 总结:避免这些问题的最佳实践
问题 | 最佳实践 | 工具支持 |
---|---|---|
模块导入错误 (No module named 'jenkins' ) | 设置 PYTHONPATH 或动态添加 sys.path | Jenkins Pipeline + Python |
下载目录路径不一致 | 使用 __file__ 定位绝对路径 | Python 脚本内部处理 |
📌 最推荐的组合方案(Jenkins + Python)
Jenkinsfile 中的标准 bat 执行模板:
pipeline {agent anystages {stage('Run Script') {steps {script {bat '''@echo oncd /d "%WORKSPACE%"set PYTHONPATH=%WORKSPACE%.venv\\Scripts\\python.exe jenkins\\your_script.py'''}}}}
}
Python 脚本中标准路径处理逻辑:
import os
import sys# 获取当前脚本所在目录
current_script_dir = os.path.dirname(os.path.abspath(__file__))
# 添加项目根目录到 sys.path
project_root = os.path.dirname(current_script_dir)
if project_root not in sys.path:sys.path.insert(0, project_root)# 设置下载目录为项目根目录下的 download_apk
download_dir = os.path.join(project_root, 'download_apk')
📝 附加建议:
- 保持工作空间一致性
- Jenkins 中尽量通过
cd /d "%WORKSPACE%"
固定工作目录。
- Jenkins 中尽量通过
- 使用虚拟环境
- 使用
.venv
确保依赖隔离。
- 使用
- 日志输出清晰化
- 添加打印语句确认当前工作目录和模块路径:
print("Current working dir:", os.getcwd()) print("sys.path:", sys.path)
- 添加打印语句确认当前工作目录和模块路径: