Skip to content

CI/CD 流水线配置

说明

CI/CD(持续集成/持续部署)是现代开发流程的基础设施。本文介绍如何为本项目配置自动化测试、构建和部署流水线。

GitHub Actions

基础配置

创建 .github/workflows/ci.yml

yaml
name: CI

on:
  push:
    branches: [main, develop]
  pull_request:
    branches: [main]

jobs:
  # 后端测试
  backend-test:
    runs-on: ubuntu-latest
    services:
      mysql:
        image: mysql:8.0
        env:
          MYSQL_ROOT_PASSWORD: root
          MYSQL_DATABASE: test_djangoadmin
        ports:
          - 3306:3306
      redis:
        image: redis:6.0
        ports:
          - 6379:6379

    steps:
      - uses: actions/checkout@v4

      - name: Set up Python
        uses: actions/setup-python@v5
        with:
          python-version: '3.12'

      - name: Install dependencies
        run: |
          pip install -r requirements.txt
          pip install coverage

      - name: Run tests
        env:
          DATABASE_ENGINE: mysql
          DATABASE_NAME: test_djangoadmin
          DATABASE_HOST: 127.0.0.1
          DATABASE_PORT: 3306
          DATABASE_USER: root
          DATABASE_PASSWORD: root
          REDIS_HOST: 127.0.0.1
          REDIS_PORT: 6379
        run: |
          coverage run --source='application' manage.py test
          coverage report

  # 前端检查
  frontend-check:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4

      - name: Set up Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '18'

      - name: Install pnpm
        run: npm install -g pnpm

      - name: Install dependencies
        working-directory: ./ui
        run: pnpm install

      - name: Type check
        working-directory: ./ui
        run: pnpm type:check

      - name: Lint
        working-directory: ./ui
        run: pnpm lint:eslint

      - name: Build
        working-directory: ./ui
        run: pnpm build

自动部署

yaml
  # 自动部署到服务器
  deploy:
    needs: [backend-test, frontend-check]
    runs-on: ubuntu-latest
    if: github.ref == 'refs/heads/main'

    steps:
      - uses: actions/checkout@v4

      - name: Deploy to server
        uses: appleboy/ssh-action@v1
        with:
          host: ${{ secrets.SERVER_HOST }}
          username: ${{ secrets.SERVER_USER }}
          key: ${{ secrets.SSH_KEY }}
          script: |
            cd /opt/djangoadmin
            git pull origin main
            source /opt/venv/bin/activate
            pip install -r requirements.txt
            python manage.py migrate
            supervisorctl restart djangoadmin

Gitee Go

基础配置

创建 .gitee/pipeline.yml

yaml
name: CI Pipeline

trigger:
  push:
    branches:
      - main
      - develop

stages:
  - stage:
      name: test
      jobs:
        - job:
            name: backend-test
            steps:
              - step: python
                name: Run tests
                script:
                  - pip install -r requirements.txt
                  - python manage.py test

        - job:
            name: frontend-check
            steps:
              - step: node
                name: Build frontend
                script:
                  - cd ui
                  - npm install -g pnpm
                  - pnpm install
                  - pnpm type:check
                  - pnpm build

自动化测试集成

pytest 配置

bash
# pytest.ini
[pytest]
DJANGO_SETTINGS_MODULE = application.settings
python_files = tests.py test_*.py
python_classes = Test*
python_functions = test_*
addopts = -v --tb=short

测试脚本

bash
#!/bin/bash
# scripts/test.sh

set -e

echo "=== Running Python tests ==="
coverage run --source='application' manage.py test -v 2
coverage report --fail-under=80

echo "=== Running frontend type check ==="
cd ui && pnpm type:check

echo "=== Running frontend lint ==="
pnpm lint:eslint

echo "=== All checks passed! ==="

自动化部署

SSH 部署

yaml
# GitHub Actions
- name: Deploy via SSH
  uses: appleboy/ssh-action@v1
  with:
    host: ${{ secrets.SERVER_HOST }}
    username: ${{ secrets.SERVER_USER }}
    key: ${{ secrets.SSH_KEY }}
    script: |
      cd /opt/djangoadmin
      git pull origin main
      source /opt/venv/bin/activate
      pip install -r requirements.txt
      python manage.py migrate
      cd ui && pnpm install && pnpm build
      sudo supervisorctl restart djangoadmin
      sudo nginx -s reload

Docker 部署

yaml
# GitHub Actions
- name: Build and push Docker image
  uses: docker/build-push-action@v5
  with:
    push: true
    tags: your-registry/djangoadmin:latest

- name: Deploy to server
  uses: appleboy/ssh-action@v1
  with:
    script: |
      docker pull your-registry/djangoadmin:latest
      docker-compose up -d

Webhook 部署

python
# application/webhook/views.py
import hmac
from django.http import JsonResponse

def webhook_deploy(request):
    """Webhook 自动部署"""
    # 验证签名
    signature = request.META.get('HTTP_X_HUB_SIGNATURE_256')
    secret = os.getenv('WEBHOOK_SECRET', '').encode()
    expected = 'sha256=' + hmac.new(secret, request.body, 'sha256').hexdigest()

    if not hmac.compare_digest(signature, expected):
        return JsonResponse({'error': 'Invalid signature'}, status=403)

    # 执行部署脚本
    subprocess.Popen(['/opt/scripts/deploy.sh'])
    return JsonResponse({'status': 'deploying'})

环境管理

多环境配置

环境分支用途部署方式
开发环境develop日本地开发手动
测试环境develop功能测试自动(push 触发)
预发环境release/*上线前验证手动触发
生产环境main正式环境手动触发

环境变量管理

yaml
# GitHub Secrets
SERVER_HOST: 192.168.1.100
SERVER_USER: deploy
SSH_KEY: -----BEGIN OPENSSH PRIVATE KEY-----...
DB_PASSWORD: your_secure_password
JWT_SALT: your_jwt_secret

部署 Checklist

1. ✅ 代码审查通过
2. ✅ 自动化测试通过
3. ✅ 前端构建成功
4. ✅ 数据库迁移执行
5. ✅ 静态文件收集
6. ✅ 服务重启
7. ✅ 健康检查通过
8. ✅ 回滚方案准备

总结

CI/CD 流水线配置涵盖 GitHub Actions、Gitee Go、自动化测试、自动化部署(SSH/Docker/Webhook)、环境管理等方面。核心原则:自动化测试先行、分环境部署、手动触发生产发布、保留回滚能力。

小蚂蚁云团队 · 提供技术支持