如何在Jenkins等CI环境中便捷使用Python作为脚本语言
Jenkins 中运行带第三方依赖的Python脚本实用方案
完全不需要给每个业务Docker镜像打包Python环境,这类需求有成熟的低维护成本方案,按易用性排序如下:
方案1:按流水线阶段单独指定Python运行镜像(最推荐,零侵入)
Jenkins Docker Agent支持为不同执行阶段单独指定运行镜像,工作区目录会在所有阶段自动挂载共享,原有业务构建逻辑完全不需要改动:
- 原来跑Shell、业务编译构建的阶段,继续使用原本的业务镜像,配置一行都不用改
- 执行Python脚本的阶段单独指定官方轻量Python镜像(比如
python:3.11-slim,体积仅100M左右) - 将pip缓存目录映射到Jenkins工作区做持久化,第一次执行会下载依赖,后续执行直接命中缓存,速度和预装依赖没有区别
示例声明式流水线配置:
pipeline { agent none environment { PIP_CACHE = "${env.WORKSPACE}/.ci-cache/pip" } stages { // 原有业务构建阶段保持原样 stage('前端构建') { agent { docker { image 'node:20-alpine' } } steps { sh 'npm ci && npm run build' } } stage('后端构建') { agent { docker { image 'openjdk:17-jdk-slim' } } steps { sh './gradlew build' } } // 新增Python脚本执行阶段 stage('执行Python业务脚本') { agent { docker { image 'python:3.11-slim' args "-v ${env.PIP_CACHE}:/root/.cache/pip" } } steps { sh ''' # 固定版本的依赖清单写在requirements.txt里,和代码一起提交 pip install -r scripts/requirements.txt python scripts/deploy_helper.py --env prod --version ${BUILD_NUMBER} ''' } } } }
方案2:维护单个通用Python CI基础镜像(适合团队统一使用)
如果团队内Python脚本用到的通用依赖比较固定(比如都用typer、loguru、requests、pyyaml这类工具库),只需要单独维护一个通用CI工具镜像即可,不需要改动任何业务镜像:
- 镜像基于官方python:slim构建,提前预装所有团队通用的Python依赖
- 所有流水线中跑Python脚本的阶段统一使用这个镜像,只有个别脚本存在特殊依赖时,再临时执行pip install安装对应包
- 这个镜像仅需维护一次,全团队所有流水线共用,维护成本极低
示例基础镜像Dockerfile:
FROM python:3.11-slim # 预装团队通用Python依赖 RUN pip install typer loguru requests pyyaml
方案3:将Python脚本打包为单文件二进制(适合脚本改动频率低的场景)
如果你的Python脚本逻辑稳定、不需要频繁迭代,可以提前把脚本编译为无系统依赖的单二进制文件,任何Docker镜像内都可以直接运行,完全不需要预装Python解释器:
- 用PyInstaller或者Nuitka执行编译,运行
pyinstaller --onefile your_script.py即可在dist目录生成单文件二进制 - 把编译好的二进制提交到代码仓或者上传到内部制品库,流水线执行时直接拉取运行即可
- 注意编译环境要和CI运行环境的CPU架构、系统版本保持一致(比如都是linux/amd64),避免二进制兼容性问题
避坑提醒(不推荐的做法)
- 不要给每个业务镜像单独安装Python环境:维护成本极高,镜像体积无意义膨胀,后续升级Python版本需要改动所有业务镜像
- 不要直接用Jenkins控制器节点自带的Python环境跑任务:容易污染控制器运行环境,多任务并发时容易出现依赖版本冲突
- 不要在执行阶段临时往业务容器里全局安装Python:会拖慢构建速度,还可能和业务镜像内的原有系统依赖产生冲突
内容的提问来源于stack exchange,提问作者ch271828n
相关产品推荐
相关产品推荐

