Docker + Jenkins 构建自动化测试持续集成流水线
“在我的机器上能跑,怎么在服务器上就报错了?”为了解决这个经典的环境一致性问题,我决定将自动化测试环境容器化,并接入 Jenkins 流水线。
1. 编写 Dockerfile
首先,我们需要构建一个包含 Python 环境、浏览器驱动(Chrome/Firefox)的基础镜像。这是我的 Dockerfile 简化版:
FROM python:3.9-slim
# 安装必要的系统依赖
RUN apt-get update && apt-get install -y \
wget \
gnupg \
&& rm -rf /var/lib/apt/lists/*
# 设置工作目录
WORKDIR /app
# 复制依赖文件并安装
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# 复制测试代码
COPY . .
# 默认运行命令
CMD ["pytest", "-v", "--alluredir=./results"]
2. Jenkins Pipeline 配置
在 Jenkins 中,我创建了一个 Pipeline 任务,配置了 Git 钩子(Webhook)。当代码推送到 GitLab 的 master 分支时,会自动触发构建:
pipeline {
agent any
stages {
stage('Pull Code') {
steps {
git 'https://github.com/zefeng/test-repo.git'
}
}
stage('Build & Test') {
steps {
sh 'docker build -t my-test-image .'
sh 'docker run --rm -v $PWD/report:/app/results my-test-image'
}
}
}
post {
always {
allure includeProperties: false, jdk: '', results: [[path: 'report']]
}
}
}
3. 遇到的坑:浏览器无头模式
在 Linux 服务器上运行 UI 测试必须使用 Headless 模式(无头模式),否则会报错找不到显示设备。我在代码中增加了环境判断逻辑:
# 启动浏览器时增加参数
chrome_options.add_argument("--headless")
chrome_options.add_argument("--no-sandbox")
chrome_options.add_argument("--disable-dev-shm-usage")