在上一篇的实战过程中,你可能会遇到这样一个问题:
Jenkins 已经跑起来了,但执行自动化测试时却发现:容器里根本没有 Python。
也就是说需要提前构建自定义 Jenkins 镜像。
一、为什么 Jenkins 官方镜像默认没有 Python?
Jenkins 官方提供的 Docker 镜像,设计目标是:
- 不预装语言运行环境(如 Python / Node / Java SDK 等)
因此:
Jenkins 官方镜像 ≠ 自动化测试运行环境
如果你直接在容器里执行:
python --version
会出现类似:
command not found
二、为什么不推荐「进容器手动安装 Python」?
大多数人第一反应是没有就自己在容器内部创建,例如:
docker exec -it jenkins bash
apt-get install python3
⚠️ 这种做法在 CI 场景中非常不推荐,原因包括:
但上一篇为了简单实现案例,还是采取了如上的方法进行搭建。但需要注意的是在容器内部使用apt,可能会触发如下错误:
E: List directory /var/lib/apt/lists/partial is missing. - Acquire (13: Permission)
所以提升权限进行操作是必须的,执行:
docker exec -u 0 -it jenkins /bin/bash # 0 表示root
apt-get update
apt-get install xxx
另外,如果下载比较缓慢,需要更换容器内部的apt镜像源:
sed -i 's/deb.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.list.d/debian.sources
👉 推荐的做法:构建自定义 Jenkins 镜像
三、推荐方案:基于官方 Jenkins 镜像构建 Python 版 Jenkins
我们以上一篇实战中用到的jenkins镜像为基础,在其中安装 Python 运行环境。
1️⃣ 编写 Dockerfile
FROM jenkins/jenkins:jdk17
USER root
# 安装 Python3、pip、venv
RUN apt-get update && \
apt-get install -y --no-install-recommends \
python3 \
python3-pip \
python3-venv && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
# 让 python 命令指向 python3(可选)
RUN ln -sf /usr/bin/python3 /usr/bin/python
USER jenkins
2️⃣ 构建自定义 Jenkins 镜像
docker build -t jenkins-python:jdk17 .
3️⃣ 使用新镜像启动 Jenkins
docker run -d \
--name jenkins \
-p 8080:8080 \
-p 50000:50000 \
-v /opt/jenkins_home:/var/jenkins_home \
jenkins-python:jdk17
⚠️ Jenkins 数据不会丢失 因为核心数据目录已经通过 volume 挂载到了宿主机
四、验证 Python 是否可用
启动后可以快速验证:
docker exec -it jenkins python --version
docker exec -it jenkins pip --version
如果能正常输出版本号,说明环境已经准备完成 ✅
五、CI 场景下的 Python 最佳实践
在 Jenkins 构建脚本中,推荐使用虚拟环境:
python -m venv venv
. venv/bin/activate
pip install -r requirements.txt
pytest -v
这样可以做到:
六、小结
Jenkins 负责“调度和执行”, 运行环境应该通过 Docker 镜像提前固化。
在自动化测试场景下,构建一个带 Python 的 Jenkins 自定义镜像,是比较推荐的做法。
在下一步中,我们就可以基于这个镜像,进一步引入 Pipeline、测试报告、通知机制啦~敬请期待知识库的更新吧!