最简python流水线需用python:3.11-slim镜像,命令依次执行cd ${drone_workspace}、pip install -u pip setuptools wheel、pip install -e .、pytest tests/ -v --tb=short -s。

Drone CI 里怎么写最简 Python 流水线
能跑 python -m pytest 和 pip install -e . 的最小可行流水线,核心就两步:选对镜像、写清命令。别用 python:latest,它不带 pip 或版本太新导致 setuptools 冲突;优先用 python:3.11-slim 这类带完整 pip 且体积小的官方镜像。
常见错误是直接写 pip install . 而不是 pip install -e .——本地开发依赖(比如 tests/ 下的模块)会找不到;还有人漏掉 WORKDIR /drone/src,结果 setup.py 找不到。
-
image: python:3.11-slim(比alpine兼容性好,少踩编译坑) - 命令块里第一行必须是
cd ${DRONE_WORKSPACE},Drone 不自动切工作目录 - 测试前加
pip install -U pip setuptools wheel,避免旧项目因打包工具过旧失败
Drone 中如何传环境变量给 Python 脚本
Drone 默认不把 secrets 当环境变量透传进容器,得显式声明。比如你有个 API_KEY secret,想让 main.py 读到 os.getenv("API_KEY"),光在 UI 里加 secret 不够,还得在 .drone.yml 里写 environment: 块。
容易踩的坑是大小写混淆:environment: 下写的键名必须全大写,且和 Python 里 getenv 的参数完全一致;另外,secret 名本身不能含下划线以外的符号,否则 Drone 解析失败报 invalid secret name。
立即学习“Python免费学习笔记(深入)”;
- 在
.drone.yml的 step 下加environment:,再缩进写API_KEY: {secret: api_key} - 不要用
export API_KEY=xxx在 script 里硬编码,secrets 就失效了 - 敏感值若需用于
pip install -i https://xxx:${API_KEY}@pypi.org/simple,得确保该 step 的environment包含它,且 URL 编码处理好特殊字符
Python 单元测试失败时,Drone 怎么看详细报错
默认 pytest 在 Drone 里只输出 summary,失败时看不到 traceback。根本原因是没开详细输出,也没捕获 stdout/stderr。解决方法很简单:加参数、重定向、别让 pytest 静默吞掉错误。
另一个常见问题是测试用例里调用了 print(),但 Drone 日志里看不到——因为 pytest 默认 capture 输出,得显式关掉或用 -s。
- 命令写成
pytest tests/ -v --tb=short -s(-v显式开启详细模式,--tb=short防止堆栈过长截断) - 如果用
tox,得在tox.ini里配setenv = PYTHONUNBUFFERED=1,否则日志延迟刷出 - CI 上时间敏感测试(如
time.sleep(0.1))容易偶发失败,建议改用freezegun或跳过,别靠重试掩盖
Drone 构建慢?Python 依赖缓存怎么配才真正生效
Drone 默认每次都是干净容器,pip install 从头下包,3 分钟起步很常见。缓存不是加个 cache: 就完事——Python 的 pip 缓存路径、wheel 构建目录、虚拟环境位置都得对上,否则缓存形同虚设。
最容易被忽略的是:Drone 的 cache key 必须包含 requirements.txt 的 hash,否则文件一变缓存就错乱;而且 pip install 必须加 --find-links 和 --no-index 才会复用本地 wheel。
- 在
.drone.yml顶层加cache:块,路径填~/.cache/pip(不是/root/.cache/pip,镜像用户是 root,但 ~ 自动展开) - 安装命令拆两步:
pip wheel --no-deps --wheel-dir /tmp/wheels -r requirements.txt,再pip install --find-links /tmp/wheels --no-index -r requirements.txt - cache key 推荐用
key: '{{ arch }}-{{ repo.owner }}-{{ repo.name }}-{{ checksum "requirements.txt" }}',checksum 必须指向文件,不是 glob
缓存命中的标志是日志里出现 Using cached xxx.whl,而不是 Downloading xxx.tar.gz。如果一直没看到,八成是 wheel 目录没挂对,或者 cache key 没随依赖文件变化。










