[T.10] 团队项目:CI/CD实践
| 项目 | 内容 |
|---|---|
| 这个作业属于哪个课程 | 课程社区 |
| 这个作业的要求在哪里 | 作业要求 |
| 我在这个课程的目标是 | 团队合作,分工完成软件的完整开发流程 |
| 这个作业在哪个具体方面帮助我实现目标 | 完成CI/CD实践 |
一、选项选择及理由
选择方案
选择方案 A:GitHub Actions 作为 CI/CD 工具。
选择理由
我们的代码托管在 GitHub 上,GitHub Actions运行方便,流程简单
二、CI/CD 配置文件展示
为前后端分别编写了独立的 workflow 文件
Backend CI 配置(.github/workflows/backend-ci.yml)
name: Backend CI
on:
push:
branches: [main, dev]
paths:
- "backend/**"
- ".github/workflows/backend-ci.yml"
pull_request:
branches: [main, dev]
paths:
- "backend/**"
jobs:
lint-and-test:
name: Lint & Test (Python ${{ matrix.python-version }})
runs-on: ubuntu-latest
strategy:
matrix:
python-version: ["3.11"]
services:
postgres:
image: postgres:16
env:
POSTGRES_USER: test_user
POSTGRES_PASSWORD: test_pass
POSTGRES_DB: test_db
ports:
- 5432:5432
options: >-
--health-cmd="pg_isready -U test_user"
--health-interval=10s
--health-timeout=5s
--health-retries=5
redis:
image: redis:7
ports:
- 6379:6379
options: >-
--health-cmd="redis-cli ping"
--health-interval=10s
--health-timeout=5s
--health-retries=5
defaults:
run:
working-directory: backend
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
- name: Cache pip packages
uses: actions/cache@v4
with:
path: ~/.cache/pip
key: ${{ runner.os }}-pip-${{ hashFiles('backend/requirements.txt') }}
restore-keys: |
${{ runner.os }}-pip-
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
pip install -r requirements-dev.txt
- name: Lint with Ruff
run: |
ruff check --fix app/ tests/
ruff format app/ tests/
- name: Type check with mypy
run: mypy app/ --ignore-missing-imports
- name: Run tests with pytest
env:
DATABASE_URL: postgresql://test_user:test_pass@localhost:5432/test_db
REDIS_URL: redis://localhost:6379/0
TESTING: "1"
run: pytest tests/ -v --cov=app --cov-report=term-missing --cov-report=xml
- name: Upload coverage report
if: github.event_name == 'pull_request'
uses: actions/upload-artifact@v4
with:
name: coverage-report
path: backend/coverage.xml
Frontend CI 配置(.github/workflows/frontend-ci.yml)
name: Frontend CI
on:
push:
branches: [main, dev]
paths:
- "frontend/**"
- ".github/workflows/frontend-ci.yml"
pull_request:
branches: [main, dev]
paths:
- "frontend/**"
jobs:
lint-and-build:
name: Lint & Build
runs-on: ubuntu-latest
defaults:
run:
working-directory: frontend
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version: "18"
- name: Cache node_modules
uses: actions/cache@v4
with:
path: frontend/node_modules
key: ${{ runner.os }}-node-${{ hashFiles('frontend/package-lock.json') }}
restore-keys: |
${{ runner.os }}-node-
- name: Install dependencies
run: npm install
- name: Lint
run: npm run lint
- name: Build (WeChat Mini Program)
run: npm run build:mp-weixin
- name: Upload build artifact
if: github.ref == 'refs/heads/main'
uses: actions/upload-artifact@v4
with:
name: mp-weixin-dist
path: frontend/dist/build/mp-weixin/
retention-days: 7
三、实现方式及选择理由
分支范围
| 分支 | 用途 |
|---|---|
main |
稳定发布分支 |
dev |
日常协作开发分支 |
两个分支都配置了 CI 检查
触发条件
- push:直接推送到 main 或 dev 分支时触发,适用于日常开发阶段的快速验证
- pull_request:向 main 或 dev 发起 PR 时触发,适用于代码合并前的质量把关
- 使用了 paths 过滤:只有对应目录下的文件发生变更时才触发对应的 CI,改了
backend/下的文件只触发 Backend CI,改了frontend/下的文件只触发 Frontend CI
选择理由:在项目初期主要使用 push 触发快速迭代,后续团队协作成熟后将更多依赖 PR 触发来做代码审查。paths 过滤对 monorepo 结构尤为重要,因为前后端改动频率不同,解耦后互不干扰。
执行的动作
后端 CI 流水线
| 步骤 | 工具 | 作用 |
|---|---|---|
| 代码风格检查 | Ruff | 检查 Python 代码风格(PEP 8)和 import 排序 |
| 类型检查 | mypy | 静态类型分析,提前发现类型错误 |
| 单元测试 | pytest | 运行测试用例,验证接口功能正确性 |
后端 CI 还配置了 PostgreSQL 和 Redis 服务容器,为后续集成测试提供真实的数据库环境。
前端 CI 流水线
| 步骤 | 工具 | 作用 |
|---|---|---|
| 代码规范检查 | ESLint | 检查 TypeScript/Vue 代码规范 |
| 构建验证 | uni-app CLI | 构建微信小程序产物,验证编译是否通过 |
选择理由:Ruff 是目前 Python 社区速度最快的 linter,比 flake8 + isort 快 10-100 倍,非常适合 CI 环境。pytest 是 Python 最主流的测试框架,与 FastAPI 配合良好。前端选择 ESLint 是 Vue/TS 项目的标准配置。
四、CI/CD 触发结果展示

浙公网安备 33010602011771号