# 部署管道 — moziplus v2.0 # # 触发条件: # - push 到 main 分支 → 完整 CI(lint + test + coverage)+ 部署 # # 注意:非 main 分支的 CI 由 ci.yml 负责(快速门控) # # Gitea v1.23.4 限制注意: # - 不支持 failure() 表达式 # - 不支持 concurrency / permissions # - 部署脚本占位,等姜维确认 act-runner 环境后再补具体命令 name: Deploy on: push: branches: [main] jobs: # ── Job 1: CI(main 分支跑完整测试)───────────────── ci: runs-on: macos-arm64 steps: - uses: actions/checkout@v4 - name: Setup Python run: | python3 -m venv .venv .venv/bin/pip install --quiet -e ".[dev]" - name: Lint run: | test -d src && .venv/bin/ruff check src/ || echo "No src/ directory, skipping lint" - name: Unit & Integration Tests run: | if [ -d tests ]; then .venv/bin/pytest tests/ -m "not e2e" -x -q else echo "No tests/ directory, skipping tests" fi - name: Coverage Report run: | if [ -d tests ] && [ -d src ]; then .venv/bin/pytest tests/ -m "not e2e" --cov=src --cov-report=term-missing -q else echo "No tests/ or src/ directory, skipping coverage" fi # ── Job 2: 部署 ───────────────────────────────────── deploy: runs-on: macos-arm64 needs: ci steps: - uses: actions/checkout@v4 - name: Record current version run: | echo "Deploying commit: ${{ gitea.sha }}" echo "Branch: ${{ gitea.ref }}" echo "Timestamp: $(date -u +%Y-%m-%dT%H:%M:%SZ)" # TODO: bash scripts/deploy.sh --version # 等姜维确认 act-runner 环境后再补 - name: Deploy run: | echo "=== Deploy step (placeholder) ===" echo "Source: ${{ gitea.workspace }}" # TODO: 实际部署脚本 # bash scripts/deploy.sh --source="$GITHUB_WORKSPACE" --target="$HOME/.sanguo_projects/sanguo_moziplus_v2" --health-check echo "Deploy placeholder completed." # placeholder: 后续替换为实际部署脚本 true - name: Health check run: | echo "=== Health check (placeholder) ===" # TODO: 等服务启动后做健康检查 # curl -sf http://localhost:8083/api/health || exit 1 echo "Health check placeholder passed." # placeholder: 后续替换为实际健康检查 true # ── 失败时回滚 ──────────────────────────────── # v1.23 不支持 if: failure() # 回滚逻辑改由 notify-on-failure job 检测 commit status 后通知人工介入 # 后续可升级到 v1.24+ 后改用 failure() 表达式 # ── Job 3: 部署失败通知 ────────────────────────────── notify-deploy-failure: runs-on: macos-arm64 needs: [ci, deploy] if: always() steps: - name: Check deploy result and notify env: CI_TOKEN: ${{ secrets.CI_TOKEN }} run: | STATUS=$(curl -sf \ -H "Authorization: token $CI_TOKEN" \ "${{ gitea.api_url }}/repos/${{ gitea.repository }}/commits/${{ gitea.sha }}/status" \ | python3 -c "import sys,json; print(json.load(sys.stdin).get('state',''))" 2>/dev/null || echo "") echo "Deploy status: $STATUS" if [ "$STATUS" != "success" ]; then echo "Deploy failed, creating Issue for manual intervention..." # 创建 Issue 通知人工介入 curl -sf -X POST \ -H "Authorization: token $CI_TOKEN" \ -H "Content-Type: application/json" \ "${{ gitea.api_url }}/repos/${{ gitea.repository }}/issues" \ -d "{\"title\": \"🔴 部署失败: commit ${{ gitea.sha }}\", \"body\": \"部署失败,需人工介入排查。\\n\\n触发 commit: \`${{ gitea.sha }}\`\\n分支: main\\n\\n请检查 deploy 日志并手动处理。\", \"labels\": [\"bug\", \"priority:high\"]}" \ || echo "Failed to create issue" echo "Issue created for deploy failure." else echo "Deploy succeeded." fi