From cb952e6c9680bdb7c059be95592e568e7e3baa53 Mon Sep 17 00:00:00 2001 From: Vaica <94612053+zqlit@users.noreply.github.com> Date: Sat, 27 Jun 2026 19:55:09 +0800 Subject: [PATCH] Update deploy.yml --- .github/workflows/deploy.yml | 235 +++++++++++++++++------------------ 1 file changed, 116 insertions(+), 119 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 8a1afdab..96dfd917 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -181,7 +181,10 @@ jobs: - name: Generate build hash id: hash - run: echo "build_hash=$(find public -type f -print0 | sort -z | xargs -0 sha256sum | sha256sum | awk '{print $1}')" >> $GITHUB_OUTPUT + run: | + BUILD_HASH=$(find public -type f -print0 | sort -z | xargs -0 sha256sum | sha256sum | awk '{print $1}') + echo "build_hash=${BUILD_HASH}" >> $GITHUB_OUTPUT + echo "$BUILD_HASH" > public/.build_hash - name: Build statistics id: stats @@ -235,6 +238,7 @@ jobs: timeout-minutes: 10 permissions: contents: read + actions: read needs: build outputs: deployed: ${{ steps.check.outputs.deployed }} @@ -247,61 +251,77 @@ jobs: id: start-edgeone run: echo "start_time=$(date +%s)" >> $GITHUB_OUTPUT - - name: Check build hash cache - id: cache-check - uses: actions/cache/restore@v4 - with: - path: .last_deploy_hash - key: ${{ runner.os }}-deploy-edgeone-${{ needs.build.outputs.build_hash }} - restore-keys: | - ${{ runner.os }}-deploy-edgeone- - - - name: Check if deployment is needed - id: check + - name: Get last successful run info + id: last-run run: | - CURRENT_HASH="${{ needs.build.outputs.build_hash }}" - echo "当前 build_hash: $CURRENT_HASH" + echo "🔍 查找上一次成功部署的 hash..." - if [ -f .last_deploy_hash ]; then - LAST_HASH=$(cat .last_deploy_hash) - echo "上次部署 hash: $LAST_HASH" - if [ "$CURRENT_HASH" = "$LAST_HASH" ]; then - echo "✅ 构建产物无变化,跳过 EdgeOne 部署" - echo "deployed=false" >> $GITHUB_OUTPUT - echo "skip_reason=hash_match" >> $GITHUB_OUTPUT - exit 0 - fi + # 获取上一个成功的 workflow run(排除当前 run) + LAST_RUN=$(gh api repos/${{ github.repository }}/actions/runs \ + --jq '.workflow_runs[] | select(.conclusion == "success") | select(.id != $RUN_ID) | {id: .id, head_sha: .head_sha}' \ + --paginate \ + --limit 10 \ + -F run_id=${{ github.run_id }} 2>/dev/null | head -2) + + if [ -z "$LAST_RUN" ]; then + echo "没有找到上一次成功运行的记录" + echo "last_run_id=" >> $GITHUB_OUTPUT + echo "last_hash=" >> $GITHUB_OUTPUT + else + LAST_RUN_ID=$(echo "$LAST_RUN" | jq -r '.id') + LAST_SHA=$(echo "$LAST_RUN" | jq -r '.head_sha') + echo "上次成功运行 ID: $LAST_RUN_ID" + echo "上次成功运行 SHA: $LAST_SHA" + echo "last_run_id=${LAST_RUN_ID}" >> $GITHUB_OUTPUT fi - - 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: Download last artifact and get hash + id: last-hash + if: steps.last-run.outputs.last_run_id != '' + run: | + LAST_RUN_ID="${{ steps.last-run.outputs.last_run_id }}" + + echo "� 下载上次成功的 artifact..." + gh api repos/${{ github.repository }}/actions/runs/$LAST_RUN_ID/artifacts \ + --jq '.artifacts[] | select(.name == "hugo-public") | .id' > /tmp/last_artifact_id.txt + + LAST_ARTIFACT_ID=$(cat /tmp/last_artifact_id.txt) + + if [ -n "$LAST_ARTIFACT_ID" ]; then + gh api repos/${{ github.repository }}/actions/artifacts/$LAST_ARTIFACT_ID/archive --output /tmp/last_artifact.zip + unzip -p /tmp/last_artifact.zip .build_hash 2>/dev/null || echo "" + LAST_HASH=$(unzip -p /tmp/last_artifact.zip .build_hash 2>/dev/null) + echo "上次部署 hash: $LAST_HASH" + echo "last_hash=${LAST_HASH}" >> $GITHUB_OUTPUT + fi - name: Checkout code (for scripts) - if: steps.check.outputs.deployed == 'true' uses: actions/checkout@v4 with: fetch-depth: 1 - name: Download build artifact - if: steps.check.outputs.deployed == 'true' uses: actions/download-artifact@v4 with: name: hugo-public path: public/ - - name: End download timing - if: steps.check.outputs.deployed == 'true' - id: end-edgeone-download + - name: Check if deployment is needed + id: check run: | - end_time=$(date +%s) - start_time=${{ steps.start-edgeone-download.outputs.start_time }} - duration=$((end_time - start_time)) - echo "duration=${duration}" >> $GITHUB_OUTPUT + CURRENT_HASH=$(cat public/.build_hash 2>/dev/null || echo "") + LAST_HASH="${{ steps.last-hash.outputs.last_hash }}" + + echo "当前 build_hash: $CURRENT_HASH" + echo "上次部署 hash: $LAST_HASH" + + if [ -z "$LAST_HASH" ] || [ "$CURRENT_HASH" != "$LAST_HASH" ]; then + echo "🔄 构建产物有变化,需要部署到 EdgeOne" + echo "deployed=true" >> $GITHUB_OUTPUT + else + echo "✅ 构建产物无变化,跳过 EdgeOne 部署" + echo "deployed=false" >> $GITHUB_OUTPUT + fi - name: Start upload timing if: steps.check.outputs.deployed == 'true' @@ -325,17 +345,6 @@ jobs: 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 - - - name: Save build hash cache - if: steps.check.outputs.deployed == 'true' - uses: actions/cache/save@v4 - with: - path: .last_deploy_hash - key: ${{ runner.os }}-deploy-edgeone-${{ needs.build.outputs.build_hash }} - - name: End timing id: end-edgeone run: | @@ -345,16 +354,10 @@ jobs: 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 "- **上传部署**: ${duration}秒" >> $GITHUB_STEP_SUMMARY echo "- **文件总数**: ${{ needs.build.outputs.file_count }}" >> $GITHUB_STEP_SUMMARY else echo "## EdgeOne 部署已跳过(构建产物无变化)" >> $GITHUB_STEP_SUMMARY @@ -369,6 +372,7 @@ jobs: timeout-minutes: 20 permissions: contents: read + actions: read needs: build outputs: deployed: ${{ steps.check.outputs.deployed }} @@ -381,61 +385,77 @@ jobs: id: start-upyun run: echo "start_time=$(date +%s)" >> $GITHUB_OUTPUT - - name: Check build hash cache - id: cache-check - uses: actions/cache/restore@v4 - with: - path: .last_deploy_hash - key: ${{ runner.os }}-deploy-upyun-${{ needs.build.outputs.build_hash }} - restore-keys: | - ${{ runner.os }}-deploy-upyun- - - - name: Check if deployment is needed - id: check + - name: Get last successful run info + id: last-run run: | - CURRENT_HASH="${{ needs.build.outputs.build_hash }}" - echo "当前 build_hash: $CURRENT_HASH" + echo "🔍 查找上一次成功部署的 hash..." - if [ -f .last_deploy_hash ]; then - LAST_HASH=$(cat .last_deploy_hash) - echo "上次部署 hash: $LAST_HASH" - if [ "$CURRENT_HASH" = "$LAST_HASH" ]; then - echo "✅ 构建产物无变化,跳过 UpYun 部署" - echo "deployed=false" >> $GITHUB_OUTPUT - echo "skip_reason=hash_match" >> $GITHUB_OUTPUT - exit 0 - fi + # 获取上一个成功的 workflow run(排除当前 run) + LAST_RUN=$(gh api repos/${{ github.repository }}/actions/runs \ + --jq '.workflow_runs[] | select(.conclusion == "success") | select(.id != $RUN_ID) | {id: .id, head_sha: .head_sha}' \ + --paginate \ + --limit 10 \ + -F run_id=${{ github.run_id }} 2>/dev/null | head -2) + + if [ -z "$LAST_RUN" ]; then + echo "没有找到上一次成功运行的记录" + echo "last_run_id=" >> $GITHUB_OUTPUT + echo "last_hash=" >> $GITHUB_OUTPUT + else + LAST_RUN_ID=$(echo "$LAST_RUN" | jq -r '.id') + LAST_SHA=$(echo "$LAST_RUN" | jq -r '.head_sha') + echo "上次成功运行 ID: $LAST_RUN_ID" + echo "上次成功运行 SHA: $LAST_SHA" + echo "last_run_id=${LAST_RUN_ID}" >> $GITHUB_OUTPUT fi - - echo "🔄 构建产物有变化,需要部署到 UpYun" - echo "deployed=true" >> $GITHUB_OUTPUT - - name: Start download timing - if: steps.check.outputs.deployed == 'true' - id: start-upyun-download - run: echo "start_time=$(date +%s)" >> $GITHUB_OUTPUT + - name: Download last artifact and get hash + id: last-hash + if: steps.last-run.outputs.last_run_id != '' + run: | + LAST_RUN_ID="${{ steps.last-run.outputs.last_run_id }}" + + echo "� 下载上次成功的 artifact..." + gh api repos/${{ github.repository }}/actions/runs/$LAST_RUN_ID/artifacts \ + --jq '.artifacts[] | select(.name == "hugo-public") | .id' > /tmp/last_artifact_id.txt + + LAST_ARTIFACT_ID=$(cat /tmp/last_artifact_id.txt) + + if [ -n "$LAST_ARTIFACT_ID" ]; then + gh api repos/${{ github.repository }}/actions/artifacts/$LAST_ARTIFACT_ID/archive --output /tmp/last_artifact.zip + unzip -p /tmp/last_artifact.zip .build_hash 2>/dev/null || echo "" + LAST_HASH=$(unzip -p /tmp/last_artifact.zip .build_hash 2>/dev/null) + echo "上次部署 hash: $LAST_HASH" + echo "last_hash=${LAST_HASH}" >> $GITHUB_OUTPUT + fi - name: Checkout code (for scripts) - if: steps.check.outputs.deployed == 'true' uses: actions/checkout@v4 with: fetch-depth: 1 - name: Download build artifact - if: steps.check.outputs.deployed == 'true' uses: actions/download-artifact@v4 with: name: hugo-public path: public/ - - name: End download timing - if: steps.check.outputs.deployed == 'true' - id: end-upyun-download + - name: Check if deployment is needed + id: check run: | - end_time=$(date +%s) - start_time=${{ steps.start-upyun-download.outputs.start_time }} - duration=$((end_time - start_time)) - echo "duration=${duration}" >> $GITHUB_OUTPUT + CURRENT_HASH=$(cat public/.build_hash 2>/dev/null || echo "") + LAST_HASH="${{ steps.last-hash.outputs.last_hash }}" + + echo "当前 build_hash: $CURRENT_HASH" + echo "上次部署 hash: $LAST_HASH" + + if [ -z "$LAST_HASH" ] || [ "$CURRENT_HASH" != "$LAST_HASH" ]; then + echo "🔄 构建产物有变化,需要部署到 UpYun" + echo "deployed=true" >> $GITHUB_OUTPUT + else + echo "✅ 构建产物无变化,跳过 UpYun 部署" + echo "deployed=false" >> $GITHUB_OUTPUT + fi - name: Start upload timing if: steps.check.outputs.deployed == 'true' @@ -461,17 +481,6 @@ jobs: 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 - - - name: Save build hash cache - if: steps.check.outputs.deployed == 'true' - uses: actions/cache/save@v4 - with: - path: .last_deploy_hash - key: ${{ runner.os }}-deploy-upyun-${{ needs.build.outputs.build_hash }} - - name: End timing id: end-upyun run: | @@ -481,16 +490,10 @@ jobs: echo "duration=${total_duration}" >> $GITHUB_OUTPUT if [ "${{ steps.check.outputs.deployed }}" = "true" ]; then - 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}秒" >> $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 "- **上传部署**: ${total_duration}秒" >> $GITHUB_STEP_SUMMARY echo "- **文件总数**: ${{ needs.build.outputs.file_count }}" >> $GITHUB_STEP_SUMMARY echo "- **总大小**: ${{ needs.build.outputs.total_size }}" >> $GITHUB_STEP_SUMMARY else @@ -832,12 +835,6 @@ jobs: with: name: hugo-public - - name: Clean up old caches - continue-on-error: true - run: | - gh extension install actions/gh-actions-cache || true - gh actions-cache delete --all --confirm || true - # ============================================================ # Job 6: Failure Notification (失败通知) # ============================================================