[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 检查

触发条件

  1. push:直接推送到 main 或 dev 分支时触发,适用于日常开发阶段的快速验证
  2. pull_request:向 main 或 dev 发起 PR 时触发,适用于代码合并前的质量把关
  3. 使用了 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 触发结果展示

image

posted @ 2026-04-27 14:23  练习日寸长两年半  阅读(22)  评论(0)    收藏  举报