diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 037cd606..da407a69 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -24,6 +24,7 @@ jobs: timeout-minutes: 2 outputs: can_deploy: ${{ steps.repo-check.outputs.can_deploy }} + duration: ${{ steps.end-pre-check.outputs.duration }} steps: - name: Start timing @@ -90,6 +91,9 @@ jobs: contents: write outputs: build_hash: ${{ steps.hash.outputs.build_hash }} + duration: ${{ steps.end-build.outputs.duration }} + file_count: ${{ steps.stats.outputs.file_count }} + total_size: ${{ steps.stats.outputs.total_size }} needs: pre-check if: needs.pre-check.outputs.can_deploy == 'true' @@ -120,6 +124,7 @@ jobs: - name: Cache Hugo resources uses: actions/cache@v4 + id: hugo-cache with: path: | resources/_gen @@ -157,6 +162,14 @@ jobs: id: hash run: echo "build_hash=$(find public -type f -print0 | sort -z | xargs -0 sha256sum | sha256sum | awk '{print $1}')" >> $GITHUB_OUTPUT + - name: Build statistics + id: stats + run: | + FILE_COUNT=$(find public -type f | wc -l) + TOTAL_SIZE=$(du -sh public | awk '{print $1}') + echo "file_count=${FILE_COUNT}" >> $GITHUB_OUTPUT + echo "total_size=${TOTAL_SIZE}" >> $GITHUB_OUTPUT + - name: Upload build artifact uses: actions/upload-artifact@v4 with: @@ -185,7 +198,14 @@ jobs: start_time=${{ steps.start-build.outputs.start_time }} duration=$((end_time - start_time)) echo "duration=${duration}" >> $GITHUB_OUTPUT + echo "## ⏱️ Build 耗时: ${duration}秒" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### 📊 构建统计" >> $GITHUB_STEP_SUMMARY + echo "- **文件总数**: ${{ steps.stats.outputs.file_count }}" >> $GITHUB_STEP_SUMMARY + echo "- **总大小**: ${{ steps.stats.outputs.total_size }}" >> $GITHUB_STEP_SUMMARY + echo "- **构建哈希**: ${{ steps.hash.outputs.build_hash }}" >> $GITHUB_STEP_SUMMARY + echo "- **Hugo 缓存**: ${{ steps.hugo-cache.outputs.cache-hit == 'true' && '✅ 命中' || '🔄 未命中' }}" >> $GITHUB_STEP_SUMMARY # ============================================================ # Job 3: Deploy to EdgeOne Pages (并行) @@ -198,6 +218,9 @@ jobs: needs: build outputs: deployed: ${{ steps.check.outputs.deployed }} + duration: ${{ steps.end-edgeone.outputs.duration }} + download_duration: ${{ steps.end-edgeone.outputs.download_duration }} + upload_duration: ${{ steps.end-edgeone.outputs.upload_duration }} steps: - name: Start timing @@ -233,6 +256,11 @@ jobs: echo "🔄 构建产物有变化,需要部署到 EdgeOne" echo "deployed=true" >> $GITHUB_OUTPUT + - name: Start download timing + if: steps.check.outputs.deployed == 'true' + id: start-edgeone-download + run: echo "start_time=$(date +%s)" >> $GITHUB_OUTPUT + - name: Checkout code (for scripts) if: steps.check.outputs.deployed == 'true' uses: actions/checkout@v4 @@ -246,6 +274,20 @@ jobs: name: hugo-public path: public/ + - name: End download timing + if: steps.check.outputs.deployed == 'true' + id: end-edgeone-download + run: | + end_time=$(date +%s) + start_time=${{ steps.start-edgeone-download.outputs.start_time }} + duration=$((end_time - start_time)) + echo "duration=${duration}" >> $GITHUB_OUTPUT + + - name: Start upload timing + if: steps.check.outputs.deployed == 'true' + id: start-edgeone-upload + run: echo "start_time=$(date +%s)" >> $GITHUB_OUTPUT + - name: Deploy to EdgeOne Pages if: steps.check.outputs.deployed == 'true' env: @@ -254,6 +296,15 @@ jobs: chmod +x scripts/deploy_edgeone.sh ./scripts/deploy_edgeone.sh hugo-blog ./public overseas + - name: End upload timing + if: steps.check.outputs.deployed == 'true' + id: end-edgeone-upload + run: | + end_time=$(date +%s) + start_time=${{ steps.start-edgeone-upload.outputs.start_time }} + duration=$((end_time - start_time)) + echo "duration=${duration}" >> $GITHUB_OUTPUT + - name: Save deploy hash if: steps.check.outputs.deployed == 'true' run: echo "${{ needs.build.outputs.build_hash }}" > .last_deploy_hash @@ -272,8 +323,19 @@ jobs: start_time=${{ steps.start-edgeone.outputs.start_time }} duration=$((end_time - start_time)) echo "duration=${duration}" >> $GITHUB_OUTPUT + if [ "${{ steps.check.outputs.deployed }}" = "true" ]; then + download_duration=${{ steps.end-edgeone-download.outputs.duration }} + upload_duration=${{ steps.end-edgeone-upload.outputs.duration }} + echo "download_duration=${download_duration}" >> $GITHUB_OUTPUT + echo "upload_duration=${upload_duration}" >> $GITHUB_OUTPUT + echo "## ⏱️ Deploy EdgeOne 耗时: ${duration}秒" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### 📊 部署统计" >> $GITHUB_STEP_SUMMARY + echo "- **下载 Artifact**: ${download_duration}秒" >> $GITHUB_STEP_SUMMARY + echo "- **上传部署**: ${upload_duration}秒" >> $GITHUB_STEP_SUMMARY + echo "- **文件总数**: ${{ needs.build.outputs.file_count }}" >> $GITHUB_STEP_SUMMARY else echo "## EdgeOne 部署已跳过(构建产物无变化)" >> $GITHUB_STEP_SUMMARY echo "总耗时: ${duration}秒" >> $GITHUB_STEP_SUMMARY @@ -290,6 +352,9 @@ jobs: needs: build outputs: deployed: ${{ steps.check.outputs.deployed }} + duration: ${{ steps.end-upyun.outputs.duration }} + download_duration: ${{ steps.end-upyun.outputs.download_duration }} + upload_duration: ${{ steps.end-upyun.outputs.upload_duration }} steps: - name: Start timing @@ -325,7 +390,7 @@ jobs: echo "🔄 构建产物有变化,需要部署到 UpYun" echo "deployed=true" >> $GITHUB_OUTPUT - - name: Start artifact download timing + - name: Start download timing if: steps.check.outputs.deployed == 'true' id: start-upyun-download run: echo "start_time=$(date +%s)" >> $GITHUB_OUTPUT @@ -343,7 +408,7 @@ jobs: name: hugo-public path: public/ - - name: End artifact download timing + - name: End download timing if: steps.check.outputs.deployed == 'true' id: end-upyun-download run: | @@ -351,9 +416,8 @@ jobs: start_time=${{ steps.start-upyun-download.outputs.start_time }} duration=$((end_time - start_time)) echo "duration=${duration}" >> $GITHUB_OUTPUT - echo "## UpYun artifact download duration: ${duration}s" >> $GITHUB_STEP_SUMMARY - - name: Start UpYun upload timing + - name: Start upload timing if: steps.check.outputs.deployed == 'true' id: start-upyun-upload run: echo "start_time=$(date +%s)" >> $GITHUB_OUTPUT @@ -368,6 +432,15 @@ jobs: chmod +x scripts/deploy_upyun.sh ./scripts/deploy_upyun.sh ./public / 20 + - name: End upload timing + if: steps.check.outputs.deployed == 'true' + id: end-upyun-upload + run: | + end_time=$(date +%s) + start_time=${{ steps.start-upyun-upload.outputs.start_time }} + duration=$((end_time - start_time)) + echo "duration=${duration}" >> $GITHUB_OUTPUT + - name: Save deploy hash if: steps.check.outputs.deployed == 'true' run: echo "${{ needs.build.outputs.build_hash }}" > .last_deploy_hash @@ -388,14 +461,21 @@ jobs: echo "duration=${total_duration}" >> $GITHUB_OUTPUT if [ "${{ steps.check.outputs.deployed }}" = "true" ]; then - upload_start_time=${{ steps.start-upyun-upload.outputs.start_time }} - upload_duration=$((end_time - upload_start_time)) + download_duration=${{ steps.end-upyun-download.outputs.duration }} + upload_duration=${{ steps.end-upyun-upload.outputs.duration }} + echo "download_duration=${download_duration}" >> $GITHUB_OUTPUT echo "upload_duration=${upload_duration}" >> $GITHUB_OUTPUT - echo "## Deploy UpYun total duration: ${total_duration}s" >> $GITHUB_STEP_SUMMARY - echo "## UpYun upload duration: ${upload_duration}s" >> $GITHUB_STEP_SUMMARY + + echo "## ⏱️ Deploy UpYun 耗时: ${total_duration}秒" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### 📊 部署统计" >> $GITHUB_STEP_SUMMARY + echo "- **下载 Artifact**: ${download_duration}秒" >> $GITHUB_STEP_SUMMARY + echo "- **上传部署**: ${upload_duration}秒" >> $GITHUB_STEP_SUMMARY + echo "- **文件总数**: ${{ needs.build.outputs.file_count }}" >> $GITHUB_STEP_SUMMARY + echo "- **总大小**: ${{ needs.build.outputs.total_size }}" >> $GITHUB_STEP_SUMMARY else echo "## UpYun 部署已跳过(构建产物无变化)" >> $GITHUB_STEP_SUMMARY - echo "总耗时: ${total_duration}s" >> $GITHUB_STEP_SUMMARY + echo "总耗时: ${total_duration}秒" >> $GITHUB_STEP_SUMMARY fi # ============================================================ @@ -451,12 +531,7 @@ jobs: CDN_URL_LIST: ${{ secrets.CDN_URL_LIST }} run: node scripts/refresh_cdn.js - - name: Generate Notification Report - if: steps.deploy-status.outputs.any_deployed == 'true' - continue-on-error: true - run: node scripts/generate_notification_report.js - - - name: Send Telegram notification + - name: Send Telegram notification with detailed timing env: TELEGRAM_BOT_TOKEN: ${{ secrets.TELEGRAM_BOT_TOKEN }} TELEGRAM_CHAT_ID: ${{ secrets.TELEGRAM_CHAT_ID }} @@ -466,10 +541,31 @@ jobs: exit 0 fi - EDGEONE_STATUS="${{ needs.deploy-edgeone.outputs.deployed == 'true' && '✅' || '⏭️ 跳过' }}" - UPYUN_STATUS="${{ needs.deploy-upyun.outputs.deployed == 'true' && '✅' || '⏭️ 跳过' }}" - CDN_STATUS="${{ steps.deploy-status.outputs.any_deployed == 'true' && '✅' || '⏭️ 跳过' }}" - + PRECHECK_DUR="${{ needs.pre-check.outputs.duration }}" + BUILD_DUR="${{ needs.build.outputs.duration }}" + EDGEONE_DUR="${{ needs.deploy-edgeone.outputs.duration }}" + EDGEONE_DEPLOYED="${{ needs.deploy-edgeone.outputs.deployed }}" + UPYUN_DUR="${{ needs.deploy-upyun.outputs.duration }}" + UPYUN_DEPLOYED="${{ needs.deploy-upyun.outputs.deployed }}" + FILE_COUNT="${{ needs.build.outputs.file_count }}" + TOTAL_SIZE="${{ needs.build.outputs.total_size }}" + + if [ "$EDGEONE_DEPLOYED" = "true" ]; then + EDGEONE_DOWNLOAD="${{ needs.deploy-edgeone.outputs.download_duration }}" + EDGEONE_UPLOAD="${{ needs.deploy-edgeone.outputs.upload_duration }}" + EDGEONE_DETAIL="\n - 下载: ${EDGEONE_DOWNLOAD}s\n - 上传: ${EDGEONE_UPLOAD}s" + else + EDGEONE_DETAIL="" + fi + + if [ "$UPYUN_DEPLOYED" = "true" ]; then + UPYUN_DOWNLOAD="${{ needs.deploy-upyun.outputs.download_duration }}" + UPYUN_UPLOAD="${{ needs.deploy-upyun.outputs.upload_duration }}" + UPYUN_DETAIL="\n - 下载: ${UPYUN_DOWNLOAD}s\n - 上传: ${UPYUN_UPLOAD}s" + else + UPYUN_DETAIL="" + fi + if [ "${{ steps.deploy-status.outputs.any_deployed }}" = "true" ]; then TITLE="✅ **部署成功**" else @@ -478,22 +574,29 @@ jobs: MESSAGE="${TITLE} - 📦 项目: ${{ github.repository }} - 🌿 分支: ${{ github.ref_name }} - 🔗 Commit: ${{ github.sha }} - 🕐 时间: $(date +'%Y-%m-%d %H:%M:%S') +📦 项目: ${{ github.repository }} +🌿 分支: ${{ github.ref_name }} +🔗 Commit: ${{ github.sha }} +🕐 时间: $(date +'%Y-%m-%d %H:%M:%S') - 📊 部署目标: - - EdgeOne Pages ${EDGEONE_STATUS} - - UpYun ${UPYUN_STATUS} - - CDN 刷新 ${CDN_STATUS}" +📊 构建统计: +- 文件总数: ${FILE_COUNT} +- 总大小: ${TOTAL_SIZE} + +⏱️ 耗时统计: +- Pre-check: ${PRECHECK_DUR}s +- Build: ${BUILD_DUR}s +- EdgeOne: ${EDGEONE_DUR}s${EDGEONE_DETAIL} +- UpYun: ${UPYUN_DUR}s${UPYUN_DETAIL} + +🔍 查看详情: https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}" curl -s -X POST "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendMessage" \ -d chat_id="${TELEGRAM_CHAT_ID}" \ -d text="${MESSAGE}" \ -d parse_mode="Markdown" - - name: Send Feishu notification + - name: Send Feishu notification with detailed timing env: FEISHU_WEBHOOK_URL: ${{ secrets.FEISHU_WEBHOOK_URL }} run: | @@ -502,10 +605,31 @@ jobs: exit 0 fi - EDGEONE_STATUS="${{ needs.deploy-edgeone.outputs.deployed == 'true' && '✅' || '⏭️ 跳过' }}" - UPYUN_STATUS="${{ needs.deploy-upyun.outputs.deployed == 'true' && '✅' || '⏭️ 跳过' }}" - CDN_STATUS="${{ steps.deploy-status.outputs.any_deployed == 'true' && '✅' || '⏭️ 跳过' }}" - + PRECHECK_DUR="${{ needs.pre-check.outputs.duration }}" + BUILD_DUR="${{ needs.build.outputs.duration }}" + EDGEONE_DUR="${{ needs.deploy-edgeone.outputs.duration }}" + EDGEONE_DEPLOYED="${{ needs.deploy-edgeone.outputs.deployed }}" + UPYUN_DUR="${{ needs.deploy-upyun.outputs.duration }}" + UPYUN_DEPLOYED="${{ needs.deploy-upyun.outputs.deployed }}" + FILE_COUNT="${{ needs.build.outputs.file_count }}" + TOTAL_SIZE="${{ needs.build.outputs.total_size }}" + + if [ "$EDGEONE_DEPLOYED" = "true" ]; then + EDGEONE_DOWNLOAD="${{ needs.deploy-edgeone.outputs.download_duration }}" + EDGEONE_UPLOAD="${{ needs.deploy-edgeone.outputs.upload_duration }}" + EDGEONE_DETAIL="\n - 下载: ${EDGEONE_DOWNLOAD}s\n - 上传: ${EDGEONE_UPLOAD}s" + else + EDGEONE_DETAIL="" + fi + + if [ "$UPYUN_DEPLOYED" = "true" ]; then + UPYUN_DOWNLOAD="${{ needs.deploy-upyun.outputs.download_duration }}" + UPYUN_UPLOAD="${{ needs.deploy-upyun.outputs.upload_duration }}" + UPYUN_DETAIL="\n - 下载: ${UPYUN_DOWNLOAD}s\n - 上传: ${UPYUN_UPLOAD}s" + else + UPYUN_DETAIL="" + fi + if [ "${{ steps.deploy-status.outputs.any_deployed }}" = "true" ]; then TITLE="✅ **部署成功**" else @@ -513,21 +637,23 @@ jobs: fi CURRENT_TIME=$(date +'%Y-%m-%d %H:%M:%S') + MESSAGE_TEXT="${TITLE}\n\n📦 项目: ${{ github.repository }}\n🌿 分支: ${{ github.ref_name }}\n🔗 Commit: ${{ github.sha }}\n🕐 时间: ${CURRENT_TIME}\n\n📊 构建统计:\n- 文件总数: ${FILE_COUNT}\n- 总大小: ${TOTAL_SIZE}\n\n⏱️ 耗时统计:\n- Pre-check: ${PRECHECK_DUR}s\n- Build: ${BUILD_DUR}s\n- EdgeOne: ${EDGEONE_DUR}s${EDGEONE_DETAIL}\n- UpYun: ${UPYUN_DUR}s${UPYUN_DETAIL}\n\n🔍 查看详情: https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}" + curl -s -X POST "${FEISHU_WEBHOOK_URL}" \ -H "Content-Type: application/json" \ - -d '{ - "msg_type": "text", - "content": { - "text": "'"${TITLE}"'\n\n📦 项目: ${{ github.repository }}\n🌿 分支: ${{ github.ref_name }}\n🔗 Commit: ${{ github.sha }}\n🕐 时间: '"${CURRENT_TIME}"'\n\n📊 部署目标:\n- EdgeOne Pages '"${EDGEONE_STATUS}"'\n- UpYun '"${UPYUN_STATUS}"'\n- CDN 刷新 '"${CDN_STATUS}"'" + -d "{ + \"msg_type\": \"text\", + \"content\": { + \"text\": \"${MESSAGE_TEXT}\" } - }' + }" - name: Get current date (CN) if: steps.deploy-status.outputs.any_deployed == 'true' id: date run: echo "date=$(date +'%Y-%m-%d %H:%M:%S')" >> $GITHUB_OUTPUT - - name: Send deployment notification + - name: Send email notification with detailed timing if: steps.deploy-status.outputs.any_deployed == 'true' uses: dawidd6/action-send-mail@v3 with: @@ -536,11 +662,49 @@ jobs: secure: true username: ${{ secrets.MAIL_USERNAME }} password: ${{ secrets.MAIL_PASSWORD }} - subject: 部署报告 - ${{ steps.date.outputs.date }} + subject: "[部署报告] ${{ github.repository }} - ${{ steps.date.outputs.date }}" to: ${{ secrets.MAIL_USERNAME }} from: GitHub Actions <${{ github.event_name }}> body: | - ${{ env.DEPLOY_REPORT }} + =========================================== + 部署报告 + =========================================== + 项目: ${{ github.repository }} + 分支: ${{ github.ref_name }} + Commit: ${{ github.sha }} + 时间: ${{ steps.date.outputs.date }} + 触发方式: ${{ github.event_name }} + + =========================================== + 构建统计 + =========================================== + 文件总数: ${{ needs.build.outputs.file_count }} + 总大小: ${{ needs.build.outputs.total_size }} + + =========================================== + 耗时统计 + =========================================== + Pre-check: ${{ needs.pre-check.outputs.duration }}s + Build: ${{ needs.build.outputs.duration }}s + + EdgeOne Pages: ${{ needs.deploy-edgeone.outputs.duration }}s + - 下载 Artifact: ${{ needs.deploy-edgeone.outputs.download_duration }}s + - 上传部署: ${{ needs.deploy-edgeone.outputs.upload_duration }}s + + UpYun: ${{ needs.deploy-upyun.outputs.duration }}s + - 下载 Artifact: ${{ needs.deploy-upyun.outputs.download_duration }}s + - 上传部署: ${{ needs.deploy-upyun.outputs.upload_duration }}s + + =========================================== + 部署状态 + =========================================== + EdgeOne Pages: ${{ needs.deploy-edgeone.outputs.deployed == 'true' && '已部署' || '跳过(无变化)' }} + UpYun: ${{ needs.deploy-upyun.outputs.deployed == 'true' && '已部署' || '跳过(无变化)' }} + + =========================================== + 查看详情 + =========================================== + https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }} - name: Generate timing summary id: timing-summary @@ -549,32 +713,58 @@ jobs: start_time=${{ steps.start-finalize.outputs.start_time }} finalize_duration=$((end_time - start_time)) + PRECHECK_DUR="${{ needs.pre-check.outputs.duration }}" + BUILD_DUR="${{ needs.build.outputs.duration }}" + EDGEONE_DUR="${{ needs.deploy-edgeone.outputs.duration }}" EDGEONE_DEPLOYED="${{ needs.deploy-edgeone.outputs.deployed }}" + UPYUN_DUR="${{ needs.deploy-upyun.outputs.duration }}" UPYUN_DEPLOYED="${{ needs.deploy-upyun.outputs.deployed }}" - + if [ "$EDGEONE_DEPLOYED" = "true" ]; then - EDGEONE_DISPLAY="✅ 已部署" + EDGEONE_DOWNLOAD="${{ needs.deploy-edgeone.outputs.download_duration }}" + EDGEONE_UPLOAD="${{ needs.deploy-edgeone.outputs.upload_duration }}" else - EDGEONE_DISPLAY="⏭️ 跳过(无变化)" - fi - - if [ "$UPYUN_DEPLOYED" = "true" ]; then - UPYUN_DISPLAY="✅ 已部署" - else - UPYUN_DISPLAY="⏭️ 跳过(无变化)" + EDGEONE_DOWNLOAD="0" + EDGEONE_UPLOAD="0" fi - echo "## ⏱️ 部署耗时统计" >> $GITHUB_STEP_SUMMARY + if [ "$UPYUN_DEPLOYED" = "true" ]; then + UPYUN_DOWNLOAD="${{ needs.deploy-upyun.outputs.download_duration }}" + UPYUN_UPLOAD="${{ needs.deploy-upyun.outputs.upload_duration }}" + else + UPYUN_DOWNLOAD="0" + UPYUN_UPLOAD="0" + fi + + echo "## 📊 部署报告" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY - echo "| 阶段 | 状态 |" >> $GITHUB_STEP_SUMMARY + echo "### 基本信息" >> $GITHUB_STEP_SUMMARY + echo "- **项目**: ${{ github.repository }}" >> $GITHUB_STEP_SUMMARY + echo "- **分支**: ${{ github.ref_name }}" >> $GITHUB_STEP_SUMMARY + echo "- **Commit**: ${{ github.sha }}" >> $GITHUB_STEP_SUMMARY + echo "- **触发方式**: ${{ github.event_name }}" >> $GITHUB_STEP_SUMMARY + echo "- **文件总数**: ${{ needs.build.outputs.file_count }}" >> $GITHUB_STEP_SUMMARY + echo "- **总大小**: ${{ needs.build.outputs.total_size }}" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + + echo "### ⏱️ 耗时统计" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "| 阶段 | 总耗时 | 下载 | 上传 |" >> $GITHUB_STEP_SUMMARY + echo "|------|--------|------|------|" >> $GITHUB_STEP_SUMMARY + echo "| Pre-check | ${PRECHECK_DUR}s | - | - |" >> $GITHUB_STEP_SUMMARY + echo "| Build | ${BUILD_DUR}s | - | - |" >> $GITHUB_STEP_SUMMARY + echo "| EdgeOne | ${EDGEONE_DUR}s | ${EDGEONE_DOWNLOAD}s | ${EDGEONE_UPLOAD}s |" >> $GITHUB_STEP_SUMMARY + echo "| UpYun | ${UPYUN_DUR}s | ${UPYUN_DOWNLOAD}s | ${UPYUN_UPLOAD}s |" >> $GITHUB_STEP_SUMMARY + echo "| Finalize | ${finalize_duration}s | - | - |" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + + echo "### 🚀 部署状态" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "| 目标 | 状态 |" >> $GITHUB_STEP_SUMMARY echo "|------|------|" >> $GITHUB_STEP_SUMMARY - echo "| Pre-check | ${{ needs.pre-check.result == 'success' && '✅ 成功' || needs.pre-check.result == 'skipped' && '⏭️ 跳过' || '❌ 失败' }} |" >> $GITHUB_STEP_SUMMARY - echo "| Build | ${{ needs.build.result == 'success' && '✅ 成功' || '❌ 失败' }} |" >> $GITHUB_STEP_SUMMARY - echo "| Deploy EdgeOne | ${EDGEONE_DISPLAY} |" >> $GITHUB_STEP_SUMMARY - echo "| Deploy UpYun | ${UPYUN_DISPLAY} |" >> $GITHUB_STEP_SUMMARY - echo "| Finalize | ✅ 成功 (${finalize_duration}秒) |" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "**Finalize 阶段耗时:** ${finalize_duration}秒" >> $GITHUB_STEP_SUMMARY + echo "| EdgeOne Pages | ${{ needs.deploy-edgeone.outputs.deployed == 'true' && '✅ 已部署' || '⏭️ 跳过(无变化)' }} |" >> $GITHUB_STEP_SUMMARY + echo "| UpYun | ${{ needs.deploy-upyun.outputs.deployed == 'true' && '✅ 已部署' || '⏭️ 跳过(无变化)' }} |" >> $GITHUB_STEP_SUMMARY + echo "| CDN 刷新 | ${{ steps.deploy-status.outputs.any_deployed == 'true' && '✅ 已刷新' || '⏭️ 跳过' }} |" >> $GITHUB_STEP_SUMMARY # ============================================================ # Job 6: Failure Notification (失败通知) @@ -598,15 +788,23 @@ jobs: exit 0 fi + FAILURES="" + if [ "${{ needs.pre-check.result }}" = "failure" ]; then FAILURES="${FAILURES}\n- ❌ Pre-check"; fi + if [ "${{ needs.build.result }}" = "failure" ]; then FAILURES="${FAILURES}\n- ❌ Build"; fi + if [ "${{ needs.deploy-edgeone.result }}" = "failure" ]; then FAILURES="${FAILURES}\n- ❌ Deploy EdgeOne"; fi + if [ "${{ needs.deploy-upyun.result }}" = "failure" ]; then FAILURES="${FAILURES}\n- ❌ Deploy UpYun"; fi + if [ "${{ needs.finalize.result }}" = "failure" ]; then FAILURES="${FAILURES}\n- ❌ Finalize"; fi + MESSAGE="❌ **部署失败** - 📦 项目: ${{ github.repository }} - 🌿 分支: ${{ github.ref_name }} - 🔗 Commit: ${{ github.sha }} - 🕐 时间: $(date +'%Y-%m-%d %H:%M:%S') +📦 项目: ${{ github.repository }} +🌿 分支: ${{ github.ref_name }} +🔗 Commit: ${{ github.sha }} +🕐 时间: $(date +'%Y-%m-%d %H:%M:%S') - 📝 工作流: ${{ github.workflow }} - 🔍 查看详情: https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}" +⚠️ 失败阶段:$FAILURES + +🔍 查看详情: https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}" curl -s -X POST "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendMessage" \ -d chat_id="${TELEGRAM_CHAT_ID}" \ @@ -622,12 +820,21 @@ jobs: exit 0 fi + FAILURES="" + if [ "${{ needs.pre-check.result }}" = "failure" ]; then FAILURES="${FAILURES}\n- ❌ Pre-check"; fi + if [ "${{ needs.build.result }}" = "failure" ]; then FAILURES="${FAILURES}\n- ❌ Build"; fi + if [ "${{ needs.deploy-edgeone.result }}" = "failure" ]; then FAILURES="${FAILURES}\n- ❌ Deploy EdgeOne"; fi + if [ "${{ needs.deploy-upyun.result }}" = "failure" ]; then FAILURES="${FAILURES}\n- ❌ Deploy UpYun"; fi + if [ "${{ needs.finalize.result }}" = "failure" ]; then FAILURES="${FAILURES}\n- ❌ Finalize"; fi + CURRENT_TIME=$(date +'%Y-%m-%d %H:%M:%S') + MESSAGE_TEXT="❌ **部署失败**\n\n📦 项目: ${{ github.repository }}\n🌿 分支: ${{ github.ref_name }}\n🔗 Commit: ${{ github.sha }}\n🕐 时间: ${CURRENT_TIME}\n\n⚠️ 失败阶段:${FAILURES}\n\n🔍 查看详情: https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}" + curl -s -X POST "${FEISHU_WEBHOOK_URL}" \ -H "Content-Type: application/json" \ - -d '{ - "msg_type": "text", - "content": { - "text": "❌ **部署失败**\n\n📦 项目: ${{ github.repository }}\n🌿 分支: ${{ github.ref_name }}\n🔗 Commit: ${{ github.sha }}\n🕐 时间: '"${CURRENT_TIME}"'\n\n📝 工作流: ${{ github.workflow }}\n🔍 查看详情: https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}" + -d "{ + \"msg_type\": \"text\", + \"content\": { + \"text\": \"${MESSAGE_TEXT}\" } - }' \ No newline at end of file + }" \ No newline at end of file