Files
aitsc/.github/workflows/ci-cd.yml

307 lines
8.3 KiB
YAML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
name: Flask 提示词大师 - CI/CD 流水线
on:
push:
branches: [ main, develop ]
pull_request:
branches: [ main ]
env:
PYTHON_VERSION: '3.12'
FLASK_ENV: testing
jobs:
# 代码质量检查
code-quality:
name: 代码质量检查
runs-on: ubuntu-latest
steps:
- name: 检出代码
uses: actions/checkout@v4
- name: 设置Python环境
uses: actions/setup-python@v4
with:
python-version: ${{ env.PYTHON_VERSION }}
- name: 安装依赖
run: |
python -m pip install --upgrade pip
pip install flake8 black isort mypy
pip install -r requirements.txt
- name: 代码格式检查
run: |
echo "检查代码格式..."
black --check --diff .
isort --check-only --diff .
- name: 代码质量检查
run: |
echo "运行Flake8检查..."
flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics
flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics
- name: 类型检查
run: |
echo "运行类型检查..."
mypy src/ --ignore-missing-imports
# 单元测试
test:
name: 单元测试
runs-on: ubuntu-latest
needs: code-quality
services:
mysql:
image: mysql:8.0
env:
MYSQL_ROOT_PASSWORD: test123456
MYSQL_DATABASE: test_db
ports:
- 3306:3306
options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3
redis:
image: redis:7-alpine
ports:
- 6379:6379
options: --health-cmd="redis-cli ping" --health-interval=10s --health-timeout=5s --health-retries=3
steps:
- name: 检出代码
uses: actions/checkout@v4
- name: 设置Python环境
uses: actions/setup-python@v4
with:
python-version: ${{ env.PYTHON_VERSION }}
- name: 安装依赖
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
pip install pytest pytest-cov pytest-mock
- name: 创建测试环境变量
run: |
echo "FLASK_ENV=testing" >> $GITHUB_ENV
echo "DATABASE_URL=mysql+pymysql://root:test123456@localhost:3306/test_db?charset=utf8mb4" >> $GITHUB_ENV
echo "SECRET_KEY=test-secret-key-for-ci" >> $GITHUB_ENV
echo "LLM_API_KEY=test-api-key" >> $GITHUB_ENV
- name: 等待数据库就绪
run: |
echo "等待MySQL数据库启动..."
sleep 30
- name: 运行单元测试
run: |
echo "运行单元测试..."
pytest tests/ -v --cov=src --cov-report=xml --cov-report=html
- name: 上传测试覆盖率报告
uses: codecov/codecov-action@v3
with:
file: ./coverage.xml
flags: unittests
name: codecov-umbrella
# 集成测试
integration-test:
name: 集成测试
runs-on: ubuntu-latest
needs: test
services:
mysql:
image: mysql:8.0
env:
MYSQL_ROOT_PASSWORD: test123456
MYSQL_DATABASE: test_db
ports:
- 3306:3306
options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3
redis:
image: redis:7-alpine
ports:
- 6379:6379
options: --health-cmd="redis-cli ping" --health-interval=10s --health-timeout=5s --health-retries=3
steps:
- name: 检出代码
uses: actions/checkout@v4
- name: 设置Python环境
uses: actions/setup-python@v4
with:
python-version: ${{ env.PYTHON_VERSION }}
- name: 安装依赖
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
- name: 创建测试环境变量
run: |
echo "FLASK_ENV=testing" >> $GITHUB_ENV
echo "DATABASE_URL=mysql+pymysql://root:test123456@localhost:3306/test_db?charset=utf8mb4" >> $GITHUB_ENV
echo "SECRET_KEY=test-secret-key-for-ci" >> $GITHUB_ENV
echo "LLM_API_KEY=test-api-key" >> $GITHUB_ENV
- name: 等待数据库就绪
run: |
echo "等待MySQL数据库启动..."
sleep 30
- name: 启动应用进行集成测试
run: |
echo "启动应用进行集成测试..."
python run_dev.py &
sleep 10
- name: 运行集成测试
run: |
echo "运行集成测试..."
python -c "
import requests
import time
# 等待应用启动
time.sleep(5)
# 测试健康检查
response = requests.get('http://localhost:5000/health')
assert response.status_code == 200
print('健康检查通过')
# 测试主页
response = requests.get('http://localhost:5000/')
assert response.status_code == 200
print('主页访问通过')
# 测试API端点
response = requests.post('http://localhost:5000/api/wx/templates/intent',
json={'text': '测试文本'})
assert response.status_code == 200
print('API测试通过')
"
# 构建Docker镜像
build:
name: 构建Docker镜像
runs-on: ubuntu-latest
needs: [test, integration-test]
if: github.ref == 'refs/heads/main'
steps:
- name: 检出代码
uses: actions/checkout@v4
- name: 设置Docker Buildx
uses: docker/setup-buildx-action@v3
- name: 登录Docker Hub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: 构建并推送Docker镜像
uses: docker/build-push-action@v5
with:
context: .
push: true
tags: |
${{ secrets.DOCKER_USERNAME }}/flask-prompt-master:latest
${{ secrets.DOCKER_USERNAME }}/flask-prompt-master:${{ github.sha }}
cache-from: type=gha
cache-to: type=gha,mode=max
# 部署到测试环境
deploy-test:
name: 部署到测试环境
runs-on: ubuntu-latest
needs: build
if: github.ref == 'refs/heads/develop'
environment: test
steps:
- name: 检出代码
uses: actions/checkout@v4
- name: 部署到测试服务器
run: |
echo "部署到测试环境..."
# 这里可以添加部署到测试服务器的脚本
# 例如使用SSH连接到测试服务器并更新应用
- name: 运行部署后测试
run: |
echo "运行部署后测试..."
# 等待应用启动
sleep 30
# 测试应用是否正常运行
curl -f http://test-server:5000/health || exit 1
# 部署到生产环境
deploy-production:
name: 部署到生产环境
runs-on: ubuntu-latest
needs: build
if: github.ref == 'refs/heads/main'
environment: production
steps:
- name: 检出代码
uses: actions/checkout@v4
- name: 部署到生产服务器
run: |
echo "部署到生产环境..."
# 这里可以添加部署到生产服务器的脚本
# 例如使用SSH连接到生产服务器并更新应用
- name: 运行部署后测试
run: |
echo "运行部署后测试..."
# 等待应用启动
sleep 30
# 测试应用是否正常运行
curl -f https://production-server/health || exit 1
- name: 发送部署通知
run: |
echo "部署完成,发送通知..."
# 这里可以添加发送通知的逻辑
# 例如发送邮件、Slack消息等
# 监控系统部署
deploy-monitoring:
name: 部署监控系统
runs-on: ubuntu-latest
needs: deploy-production
if: github.ref == 'refs/heads/main'
steps:
- name: 检出代码
uses: actions/checkout@v4
- name: 部署监控系统
run: |
echo "部署监控系统..."
# 部署监控脚本到服务器
# 配置定时任务
# 启动监控服务
- name: 验证监控系统
run: |
echo "验证监控系统..."
# 检查监控系统是否正常运行
# 测试监控脚本功能