[T.10] 团队项目:CI/CD实践
| 这个作业属于哪个课程 | 北航2026年春季软件工程 |
|---|---|
| 这个作业的要求在哪里 | [T.10] 团队项目:CI/CD实践 |
| 我在这个课程的目标是 | 提升团队协作与项目管理能力 |
| 这个作业在哪个具体方面帮助我实现目标 | 完成团队基础设施及 CI/CD 准备 |
一、选择的选项及理由
我们选择 方案 A:GitHub Actions,主要完成 打包 任务(同时顺带验证了代码风格与单元测试)。
选择方案 A 的理由
- 项目代码已托管在 GitHub,使用 GitHub Actions 无需引入外部平台,配置简单,且免费额度完全满足团队开发需求。
- 与仓库深度集成,支持 push、PR 等事件自动触发,能第一时间反馈构建状态。
选择“打包”任务的理由
- 我们的项目是 Electron 单机卡牌游戏,最终需要交付可直接运行的桌面安装包(如 dmg、exe、AppImage)。
- 手动构建容易出现环境不一致、资源遗漏等问题。将打包自动化可以保证每次合并到主分支的代码都能产出可用的安装包,实现持续交付。
- 打包过程中天然包含依赖安装、资源 LFS 拉取、测试等环节,能够同时验证代码完整性和正确性,对团队的开发流程价值最高。
二、CI/CD 配置文件脚本
我们在仓库 .github/workflows/ci.yml 中编写了如下 GitHub Actions 配置:
name: CI/CD
on:
push:
branches: [ main ]
pull_request:
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
lfs: true
- name: Install Git LFS and pull LFS files
run: |
sudo apt-get update
sudo apt-get install -y git-lfs
git lfs install --local
git lfs pull || true
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '24'
- name: Install dependencies and run action
run: npm run action
npm run action 在 package.json 中的定义如下(摘要):
{
"scripts": {
"action": "prettier --check . && npm test && electron-builder --linux"
}
}
它依次执行:
- Prettier 代码格式化检查 – 确保代码风格统一(若不通过则中断流水线)。
- 运行单元测试 (
jest) – 验证卡牌逻辑等核心模块未被破坏。 - Electron 打包 – 通过
electron-builder生成 Linux 平台的安装包(AppImage / deb),即本次 CI/CD 的核心“打包”产物。
三、实现方式及选择的理由
-
分支范围:
main分支
仅对主分支的 push 和所有 Pull Request 触发。
理由:main是生产就绪分支,所有合并到main的代码必须经过完整的质量门禁;PR 触发则可以提前发现分支上的问题,减少 Code Review 负担。 -
触发条件:
push(到 main)与pull_request(所有目标分支的 PR)。
理由:- Push 到 main 后自动构建并生成安装包,实现持续交付;
- PR 触发确保每一行候选代码都经过风格检查和测试,保护主分支质量。
-
执行的动作:
- 环境准备 – 拉取仓库(含 Git LFS 资源),安装 LFS 客户端并拉取大文件(美术资源);
- 代码风格检查 – Prettier 格式化检查,杜绝风格争议;
- 自动化测试 – 执行单元测试,守卫核心逻辑;
- 构建打包 – 运行
electron-builder,产出可部署的桌面应用安装包。
-
选择这些动作的理由:
- 项目包含大量二进制的卡牌美术资源,必须依赖 Git LFS,因此流水线需显式处理 LFS 同步;
- Prettier 检查可以消除代码风格上的主观讨论,让团队聚焦逻辑;
- 单元测试 是卡牌游戏规则正确性的基础保障;
- 打包 直接服务于交付目标,且验证了资源的完整性。
四、CI/CD 触发结果展示
我们在一次 push 到 main 分支后,Actions 自动运行并通过。以下是执行成功截图:


浙公网安备 33010602011771号