签入版本
This commit is contained in:
@@ -0,0 +1,301 @@
|
||||
# CI/CD 流水线配置
|
||||
|
||||
:::tip 说明
|
||||
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 配置
|
||||
|
||||
```ini
|
||||
# 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)、环境管理等方面。核心原则:自动化测试先行、分环境部署、手动触发生产发布、保留回滚能力。
|
||||
Reference in New Issue
Block a user