Docker + Jenkins 构建自动化测试持续集成流水线

发布于 2026-01-20  |  分类:DevOps

“在我的机器上能跑,怎么在服务器上就报错了?”为了解决这个经典的环境一致性问题,我决定将自动化测试环境容器化,并接入 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")