Become a sponsor

说明
CI/CD(持续集成/持续部署)是现代开发流程的基础设施。本文介绍如何为本项目配置自动化测试、构建和部署流水线。
创建 .github/workflows/ci.yml:
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 # 自动部署到服务器
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/pipeline.yml:
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.ini
[pytest]
DJANGO_SETTINGS_MODULE = application.settings
python_files = tests.py test_*.py
python_classes = Test*
python_functions = test_*
addopts = -v --tb=short#!/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! ==="# 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# 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# 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 | 正式环境 | 手动触发 |
# 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_secret1. ✅ 代码审查通过
2. ✅ 自动化测试通过
3. ✅ 前端构建成功
4. ✅ 数据库迁移执行
5. ✅ 静态文件收集
6. ✅ 服务重启
7. ✅ 健康检查通过
8. ✅ 回滚方案准备CI/CD 流水线配置涵盖 GitHub Actions、Gitee Go、自动化测试、自动化部署(SSH/Docker/Webhook)、环境管理等方面。核心原则:自动化测试先行、分环境部署、手动触发生产发布、保留回滚能力。