【工程实战】第九篇:持续集成 —— Jenkins 与 GitLab CI:构建无人值守的自动化流水线

专栏进度:09 / 10 (自动化实战专题)

持续集成(Continuous Integration, CI) 的核心目标是:尽早发现集成错误。我们将实现"代码提交 -> 自动触发 -> 并行执行 -> 报告发布 -> 钉钉/邮件通知"的全闭环。

一、 核心流程:自动化脚本的 CI 旅程

在工业界,典型的测试流水线由以下四个阶段(Stages)组成:

Checkout (检出):从 Git 仓库拉取最新的自动化测试代码。

Environment (环境):拉取 Docker 镜像或激活虚拟环境,安装 requirements.txt 中的依赖。

Execution (执行):调用 Pytest 运行测试(通常配合分布式插件 xdist 加速)。

Publish (发布):解析 Allure 结果并推送到看板,发送通知。

二、 实战 1:Jenkins 自由风格任务配置

在 Jenkins 界面中,我们需要完成以下关键配置:

构建触发器:勾选 Poll SCM(定时检查代码更新)或配置 Webhook(代码推送即触发)。

构建步骤 (Execute Shell):

Bash

bash 复制代码
# 激活环境
source venv/bin/activate
# 运行测试并指定 Allure 结果路径
pytest --alluredir=${WORKSPACE}/allure-results
构建后操作:添加 Allure Report 插件,设置 Results Path 为 allure-results。

三、 实战 2:GitLab CI 声明式管道 (.gitlab-ci.yml)

如果你使用 GitLab,只需在项目根目录写一个 YAML 文件,系统就会自动调度。

YAML

yaml 复制代码
stages:
  - test
  - report

run_tests:
  stage: test
  image: python:3.9
  script:
    - pip install -r requirements.txt
    - pytest --alluredir=./allure-results
  artifacts:
    paths:
      - allure-results/
    expire_in: 1 week

generate_report:
  stage: report
  script:
    - allure generate ./allure-results -o ./allure-report --clean
  when: always

四、 关键环节:即时通知(钉钉/企业微信)

测试跑完后,必须第一时间"轰炸"负责人。

Python

python 复制代码
# common/notice_util.py
import requests

def send_dingtalk(msg, webhook_url):
    data = {
        "msgtype": "text",
        "text": {"content": f"【自动化测试告警】\n{msg}"}
    }
    requests.post(webhook_url, json=data)

提示:在 conftest.py 的 pytest_sessionfinish 钩子中调用此方法,即可实现测试结束自动发消息。

五、 避坑指南:CI 环境中的"幽灵问题"

Headless 模式:CI 服务器通常没有显示器。执行 UI 测试时,Playwright 必须开启 headless=True,或者使用 Docker 版的 Playwright(内置了 Xvfb 虚拟显示器)。

并发导致的冲突:如果在 CI 上开启并行执行(-n auto),多个线程可能会同时操作数据库同一个账号。对策:使用账号池管理,或者每个线程使用独立的测试环境。

权限地雷:Jenkins 执行脚本时常因为没有写文件夹权限而报错。对策:确保 Jenkins 账号拥有工作空间的 chown 权限。

相关推荐
zoipuus1 天前
上传repo仓库到自己的gitlab
linux·gitlab·shell·全志·tina
刘马想放假2 天前
Git 从入门到进阶:一篇吃透版本管理的实战指南
git·gitlab
2301_780303902 天前
DevSecOps建设之自动化集成与部署 Jenkins教程和使用案例
运维·自动化·jenkins
千维百策6663 天前
AI 编码智能体平台如何提升研发效能:从 CI 修复到工程工作流自动化
人工智能·ci/cd·自动化
NexTunnel5 天前
公司老项目还在 SVN,远程维护怎么做更稳?
git·svn·gitlab·远程工作·nextunnel
Hy行者勇哥5 天前
用Cursor智能编写Ansible/Terraform脚本,打通CI/CD链路
ci/cd·ansible·terraform
想你依然心痛6 天前
AtomCode 在 DevOps 场景中的实战:CI/CD 流水线脚本自动生成
运维·ci/cd·docker·devops·自动化部署·github actions
IT二叔7 天前
Java项目部署-03-teamcity-cicd-docker镜像流水线方式部署
java·ci/cd·持续部署
想你依然心痛7 天前
持续集成在嵌入式开发中的实践:GitLab CI与交叉编译——自动化构建、固件生成
ci/cd·自动化·gitlab
Sean‘8 天前
GitLab 升级后 502:Puma 反复重启问题处理记录
docker·gateway·gitlab