From 4c1f23d97e36f1289f25d3c981c4c9a50546d3c2 Mon Sep 17 00:00:00 2001 From: Vaica <94612053+zqlit@users.noreply.github.com> Date: Thu, 25 Jun 2026 00:19:54 +0800 Subject: [PATCH] 0019 --- .github/workflows/deploy.yml | 103 ++++++++++++++++++++++++++++++++--- scripts/deploy_timer.sh | 42 ++++++++++++++ 2 files changed, 138 insertions(+), 7 deletions(-) create mode 100644 scripts/deploy_timer.sh diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index df19afd2..52e47d7b 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -19,7 +19,7 @@ on: concurrency: group: ${{ github.workflow }}-${{ github.ref }} - cancel-in-progress: true + cancel-in-progress: false env: TZ: Asia/Shanghai @@ -35,6 +35,10 @@ jobs: can_deploy: ${{ steps.repo-check.outputs.can_deploy }} steps: + - name: Start timing + id: start-pre-check + run: echo "start_time=$(date +%s)" >> $GITHUB_OUTPUT + - name: Checkout code uses: actions/checkout@v4 with: @@ -76,6 +80,15 @@ jobs: echo "- **触发方式**: ${{ github.event_name }}" >> $GITHUB_STEP_SUMMARY echo "- **Commit SHA**: ${{ github.sha }}" >> $GITHUB_STEP_SUMMARY + - name: End timing + id: end-pre-check + run: | + end_time=$(date +%s) + start_time=${{ steps.start-pre-check.outputs.start_time }} + duration=$((end_time - start_time)) + echo "duration=${duration}" >> $GITHUB_OUTPUT + echo "## ⏱️ Pre-check 耗时: ${duration}秒" >> $GITHUB_STEP_SUMMARY + # ============================================================ # Job 1: Font Subset (字体子集化 - 可选并行任务) # ============================================================ @@ -93,8 +106,12 @@ jobs: char_count: ${{ steps.stats.outputs.char_count }} original_size: ${{ steps.stats.outputs.original_size }} subset_size: ${{ steps.stats.outputs.subset_size }} - + steps: + - name: Start timing + id: start-subset + run: echo "start_time=$(date +%s)" >> $GITHUB_OUTPUT + - name: Checkout code uses: actions/checkout@v4 with: @@ -217,6 +234,15 @@ jobs: }' fi + - name: End timing + id: end-subset + run: | + end_time=$(date +%s) + start_time=${{ steps.start-subset.outputs.start_time }} + duration=$((end_time - start_time)) + echo "duration=${duration}" >> $GITHUB_OUTPUT + echo "## ⏱️ Subset-fonts 耗时: ${duration}秒" >> $GITHUB_STEP_SUMMARY + # ============================================================ # Job 2: Build (构建) # ============================================================ @@ -229,8 +255,12 @@ jobs: build_hash: ${{ steps.hash.outputs.build_hash }} needs: pre-check if: needs.pre-check.outputs.can_deploy == 'true' - + steps: + - name: Start timing + id: start-build + run: echo "start_time=$(date +%s)" >> $GITHUB_OUTPUT + - name: Checkout code uses: actions/checkout@v4 with: @@ -310,6 +340,15 @@ jobs: echo "No auto-commits to push" fi + - name: End timing + id: end-build + run: | + end_time=$(date +%s) + start_time=${{ steps.start-build.outputs.start_time }} + duration=$((end_time - start_time)) + echo "duration=${duration}" >> $GITHUB_OUTPUT + echo "## ⏱️ Build 耗时: ${duration}秒" >> $GITHUB_STEP_SUMMARY + # ============================================================ # Job 3: Deploy to EdgeOne Pages (并行) # ============================================================ @@ -319,8 +358,12 @@ jobs: permissions: contents: read needs: build - + steps: + - name: Start timing + id: start-edgeone + run: echo "start_time=$(date +%s)" >> $GITHUB_OUTPUT + - name: Checkout code (for scripts) uses: actions/checkout@v4 with: @@ -339,17 +382,30 @@ jobs: chmod +x scripts/deploy_edgeone.sh ./scripts/deploy_edgeone.sh hugo-blog ./public overseas + - name: End timing + id: end-edgeone + run: | + end_time=$(date +%s) + start_time=${{ steps.start-edgeone.outputs.start_time }} + duration=$((end_time - start_time)) + echo "duration=${duration}" >> $GITHUB_OUTPUT + echo "## ⏱️ Deploy EdgeOne 耗时: ${duration}秒" >> $GITHUB_STEP_SUMMARY + # ============================================================ # Job 4: Deploy to UpYun (并行) # ============================================================ deploy-upyun: runs-on: ubuntu-latest - timeout-minutes: 10 + timeout-minutes: 20 permissions: contents: read needs: build - + steps: + - name: Start timing + id: start-upyun + run: echo "start_time=$(date +%s)" >> $GITHUB_OUTPUT + - name: Download build artifact uses: actions/download-artifact@v4 with: @@ -365,6 +421,15 @@ jobs: dir: 'public' publish_dir: '/' + - name: End timing + id: end-upyun + run: | + end_time=$(date +%s) + start_time=${{ steps.start-upyun.outputs.start_time }} + duration=$((end_time - start_time)) + echo "duration=${duration}" >> $GITHUB_OUTPUT + echo "## ⏱️ Deploy UpYun 耗时: ${duration}秒" >> $GITHUB_STEP_SUMMARY + # ============================================================ # Job 5: CDN Refresh & Notifications (在所有部署完成后) # ============================================================ @@ -374,8 +439,12 @@ jobs: permissions: contents: read needs: [deploy-edgeone, deploy-upyun] - + steps: + - name: Start timing + id: start-finalize + run: echo "start_time=$(date +%s)" >> $GITHUB_OUTPUT + - name: Checkout code uses: actions/checkout@v4 with: @@ -465,6 +534,26 @@ jobs: body: | ${{ env.DEPLOY_REPORT }} + - name: Generate timing summary + id: timing-summary + run: | + end_time=$(date +%s) + start_time=${{ steps.start-finalize.outputs.start_time }} + finalize_duration=$((end_time - start_time)) + + echo "## ⏱️ 部署耗时统计" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "| 阶段 | 耗时 |" >> $GITHUB_STEP_SUMMARY + echo "|------|------|" >> $GITHUB_STEP_SUMMARY + echo "| Pre-check | ${{ needs.pre-check.result == 'success' && '✅' || '⏭️' }} |" >> $GITHUB_STEP_SUMMARY + echo "| Subset-fonts | ${{ needs.build.result == 'success' && '✅' || '⏭️' }} |" >> $GITHUB_STEP_SUMMARY + echo "| Build | ${{ needs.build.result == 'success' && '✅' || '❌' }} |" >> $GITHUB_STEP_SUMMARY + echo "| Deploy EdgeOne | ${{ needs.deploy-edgeone.result == 'success' && '✅' || '❌' }} |" >> $GITHUB_STEP_SUMMARY + echo "| Deploy UpYun | ${{ needs.deploy-upyun.result == 'success' && '✅' || '❌' }} |" >> $GITHUB_STEP_SUMMARY + echo "| Finalize | ✅ (${finalize_duration}秒) |" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "**总计耗时:** ${finalize_duration}秒 (finalize 阶段)" >> $GITHUB_STEP_SUMMARY + # ============================================================ # Job 6: Failure Notification (失败通知) # ============================================================ diff --git a/scripts/deploy_timer.sh b/scripts/deploy_timer.sh new file mode 100644 index 00000000..d0faddf7 --- /dev/null +++ b/scripts/deploy_timer.sh @@ -0,0 +1,42 @@ +#!/bin/bash +# 部署计时器 - 记录每个阶段的耗时 + +TIMING_FILE="/tmp/deploy_timing.txt" +> "$TIMING_FILE" + +start_timer() { + echo "START_$1=$(date +%s)" >> "$TIMING_FILE" +} + +end_timer() { + echo "END_$1=$(date +%s)" >> "$TIMING_FILE" +} + +print_summary() { + echo "## ⏱️ 部署耗时统计" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "| 阶段 | 耗时 |" >> $GITHUB_STEP_SUMMARY + echo "|------|------|" >> $GITHUB_STEP_SUMMARY + + total_start=$(grep "START_WORKFLOW" "$TIMING_FILE" | cut -d'=' -f2) + total_end=$(date +%s) + total_duration=$((total_end - total_start)) + + # 解析每个阶段 + for stage in PRE_CHECK SUBSET_FONTS BUILD DEPLOY_EDGEONE DEPLOY_UPYUN FINALIZE; do + start=$(grep "START_${stage}=" "$TIMING_FILE" | cut -d'=' -f2) + end=$(grep "END_${stage}=" "$TIMING_FILE" | cut -d'=' -f2) + + if [ -n "$start" ] && [ -n "$end" ]; then + duration=$((end - start)) + minutes=$((duration / 60)) + seconds=$((duration % 60)) + echo "| $stage | ${minutes}m ${seconds}s |" >> $GITHUB_STEP_SUMMARY + fi + done + + total_minutes=$((total_duration / 60)) + total_seconds=$((total_duration % 60)) + echo "| **总计** | **${total_minutes}m ${total_seconds}s** |" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY +}