[T.10] 团队项目:CI/CD实践
| 项目 | 内容 |
|---|---|
| 这个作业属于哪个课程 | 课程社区 |
| 这个作业的要求在哪里 | 作业要求 |
| 我在这个课程的目标是 | 凝聚整个团队通过一定的软件开发流程,在预计时间内发布"足够好"的符合用户需求的软件,并证明其是可维护和持续发展的,并在其中做出应有的贡献,提升进行软件工程开发的能力。 |
| 这个作业在哪个具体方面帮助我实现目标 | 帮助我们熟悉CI/CD实践构建流程,为后续的开发提供自动化测试与集成部署的有效帮助。 |
[T.10] 团队项目:CI/CD实践
选择选项及选择理由
选项
我们选择了方案 A:GitHub Actions,任务选择的是自动运行测试,以单元测试为主,同时还补充了 Cypress E2E 冒烟测试。
理由
- 我们的项目代码已经托管在
GitHub上,直接使用GitHub Actions即可,不需要再额外搭建Jenkins等其他集成框架,配置成本最低。 GitHub Actions与Pull Request流程结合紧密,每次push或PR到dev分支都会自动执行测试,适合团队协作开发,也便于代码可能存在的潜在bug的及时发现。- 相比
Git Hooks,GitHub Actions运行环境统一、日志可追溯、结果对全队可见,更符合真正的CI思路。 - 对前端项目来说,自动测试的价值很高。它可以在代码合并前尽早发现页面结构变化、状态逻辑错误和基础交互失效,减少“本地能跑、合并后出错”的情况发生。
现有仓库中的CI配置文件的脚本
name: frontend-test
on:
push:
branches: [dev, test/work]
pull_request:
branches: [dev, test/work]
jobs:
test:
runs-on: ubuntu-24.04
container:
image: cypress/browsers:22.15.0
options: --user 1001
env:
CYPRESS_CACHE_FOLDER: ${{ github.workspace }}/.cache/Cypress
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
steps:
- uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: 24
cache: npm
- name: Cache Cypress binary
uses: actions/cache@v4
with:
path: ${{ github.workspace }}/.cache/Cypress
key: cypress-${{ runner.os }}-${{ hashFiles('package-lock.json') }}
- name: Install dependencies
run: |
for attempt in 1 2 3; do
if npm ci --ignore-scripts; then
break
fi
if [ "$attempt" -eq 3 ]; then
exit 1
fi
rm -rf node_modules
echo "npm ci failed on attempt $attempt, retrying..."
sleep 5
done
- name: Restore build scripts
run: npm rebuild esbuild vue-demi
- name: Run unit tests
run: npm run test:unit
- name: Install Cypress binary
run: |
mkdir -p "$CYPRESS_CACHE_FOLDER"
for attempt in 1 2 3; do
if npx cypress install; then
break
fi
if [ "$attempt" -eq 3 ]; then
exit 1
fi
echo "cypress install failed on attempt $attempt, retrying..."
sleep 5
done
- name: Check Cypress binary
run: |
npx cypress cache path
npx cypress cache list
- name: Run E2E tests
run: |
Xvfb :99 -screen 0 1280x1024x24 >/tmp/xvfb.log 2>&1 &
export DISPLAY=:99
sleep 2
npm run test:e2e
实现方式及选择理由
实现方式
我们采用的是“单元测试 + E2E 冒烟测试”的实现方式。
- 单元测试使用
Vitest。
用来验证前端中较小粒度的逻辑和组件行为,例如:userStore的登录/退出逻辑RoomCreate、RoomJoin组件的输入与按钮启用逻辑- 一些工具函数行为
E2E测试使用Cypress。
用来验证页面在浏览器环境中的基本交互,例如:- 首页是否正常渲染
- “
CREATE ROOM”“JOIN ROOM”等按钮是否可见 - 房间输入后按钮是否按预期启用
CI运行环境选择GitHub Actions + Cypress官方浏览器容器。
这样做的原因是:- 浏览器、
Node环境更稳定 - 更适合运行
Cypress - 减少“本地能跑、
CI跑不起来”的环境差异
- 浏览器、
- 为了让
CI更稳定,我们额外做了以下处理:- 使用
npm缓存和Cypress二进制缓存,减少重复下载 npm ci和cypress install都加了重试逻辑- 通过
Xvfb提供虚拟显示环境,支持headless图形测试 test:e2e中先build再preview,使测试更接近生产环境
- 使用
分支范围、触发条件、执行动作
当前实际配置如下:
-
分支范围:
devtest/work
-
触发条件:
pushpull_request
-
执行动作:
- 检出代码
actions/checkout - 配置
Node.js环境 - 安装依赖
npm ci - 恢复构建脚本依赖
- 运行单元测试
npm run test:unit - 安装并检查
Cypress二进制 - 启动虚拟显示环境
- 运行
E2E测试npm run test:e2e
- 检出代码
因此,这套流程本质上是:提交代码后自动验证前端测试是否通过。
触发结果


浙公网安备 33010602011771号