From 24da09490691cf0e6b10e1b23be5ef92323cd7a4 Mon Sep 17 00:00:00 2001 From: Vaica <94612053+zqlit@users.noreply.github.com> Date: Mon, 29 Jun 2026 17:26:39 +0800 Subject: [PATCH] Update deploy.yml --- .github/workflows/deploy.yml | 145 ++++++++++++++++++++++------------- 1 file changed, 90 insertions(+), 55 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 3946f34d..7a53ba36 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -115,6 +115,7 @@ jobs: duration: ${{ steps.end-build.outputs.duration }} file_count: ${{ steps.stats.outputs.file_count }} total_size: ${{ steps.stats.outputs.total_size }} + skipped: ${{ steps.upload.outputs.skipped }} needs: pre-check if: needs.pre-check.outputs.can_deploy == 'true' @@ -194,20 +195,14 @@ jobs: echo "file_count=${FILE_COUNT}" >> $GITHUB_OUTPUT echo "total_size=${TOTAL_SIZE}" >> $GITHUB_OUTPUT - - name: Upload build artifact - uses: actions/upload-artifact@v4 - with: - name: hugo-public - path: public/ - retention-days: 1 - - - name: Upload build hash to UpYun + - name: Upload to UpYun and check hash env: UPYUN_SERVICE: ${{ secrets.UPYUN_BUCKET }} UPYUN_OPERATOR: ${{ secrets.UPYUN_OPERATOR }} UPYUN_PASSWORD: ${{ secrets.UPYUN_PASSWORD }} + id: upload run: | - echo "📤 上传 build_hash 到 UpYun..." + echo "📤 上传构建产物到 UpYun..." UPX_VERSION="0.4.9" UPX_URL="https://collection.b0.upaiyun.com/softwares/upx/upx_${UPX_VERSION}_linux_amd64.tar.gz" @@ -221,8 +216,24 @@ jobs: fi "$UPX_BIN" login "$UPYUN_SERVICE" "$UPYUN_OPERATOR" "$UPYUN_PASSWORD" - "$UPX_BIN" put public/.build_hash /__build_hash - echo "✅ build_hash 已上传到 UpYun" + + # 获取上次部署的哈希 + LAST_HASH=$("$UPX_BIN" get /__build_hash 2>/dev/null || echo "") + CURRENT_HASH=$(cat public/.build_hash) + + echo "上次部署 hash: $LAST_HASH" + echo "当前构建 hash: $CURRENT_HASH" + + if [ "$CURRENT_HASH" = "$LAST_HASH" ]; then + echo "✅ 构建产物无变化,跳过上传" + echo "skipped=true" >> $GITHUB_OUTPUT + else + echo "🔄 发现变化,开始上传..." + "$UPX_BIN" sync public/ / -w 10 --delete --strong + "$UPX_BIN" put public/.build_hash /__build_hash + echo "✅ 上传完成" + echo "skipped=false" >> $GITHUB_OUTPUT + fi - name: Push Image Optimizations continue-on-error: true @@ -308,16 +319,42 @@ jobs: with: fetch-depth: 1 - - name: Download build artifact - uses: actions/download-artifact@v4 - with: - name: hugo-public - path: public/ + - name: Download from UpYun + id: download + env: + UPYUN_SERVICE: ${{ secrets.UPYUN_BUCKET }} + UPYUN_OPERATOR: ${{ secrets.UPYUN_OPERATOR }} + UPYUN_PASSWORD: ${{ secrets.UPYUN_PASSWORD }} + run: | + echo "📥 从 UpYun 下载构建产物..." + + UPX_VERSION="0.4.9" + UPX_URL="https://collection.b0.upaiyun.com/softwares/upx/upx_${UPX_VERSION}_linux_amd64.tar.gz" + UPX_BIN="/tmp/upyun-upx" + + if [ ! -x "$UPX_BIN" ]; then + curl -sL "$UPX_URL" -o /tmp/upx.tar.gz + tar -xzf /tmp/upx.tar.gz -C /tmp + mv /tmp/upx "$UPX_BIN" + chmod +x "$UPX_BIN" + fi + + "$UPX_BIN" login "$UPYUN_SERVICE" "$UPYUN_OPERATOR" "$UPYUN_PASSWORD" + + DOWNLOAD_START=$(date +%s) + "$UPX_BIN" sync -r / public/ / + "$UPX_BIN" get /__build_hash > /tmp/current_hash 2>/dev/null || echo "" + DOWNLOAD_END=$(date +%s) + DOWNLOAD_DURATION=$((DOWNLOAD_END - DOWNLOAD_START)) + echo "download_duration=${DOWNLOAD_DURATION}" >> $GITHUB_OUTPUT + + CURRENT_HASH=$(cat /tmp/current_hash 2>/dev/null || echo "") + echo "current_hash=${CURRENT_HASH}" >> $GITHUB_OUTPUT - name: Check if deployment is needed id: check run: | - CURRENT_HASH=$(cat public/.build_hash 2>/dev/null || echo "") + CURRENT_HASH="${{ steps.download.outputs.current_hash }}" LAST_HASH="${{ steps.last-hash.outputs.last_hash }}" echo "当前 build_hash: $CURRENT_HASH" @@ -365,6 +402,7 @@ jobs: echo "## ⏱️ Deploy EdgeOne 耗时: ${duration}秒" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY echo "### 📊 部署统计" >> $GITHUB_STEP_SUMMARY + echo "- **下载: ${{ steps.download.outputs.download_duration }}s**" >> $GITHUB_STEP_SUMMARY echo "- **上传部署**: ${duration}秒" >> $GITHUB_STEP_SUMMARY echo "- **文件总数**: ${{ needs.build.outputs.file_count }}" >> $GITHUB_STEP_SUMMARY else @@ -427,53 +465,55 @@ jobs: with: fetch-depth: 1 - - name: Download build artifact - uses: actions/download-artifact@v4 - with: - name: hugo-public - path: public/ + - name: Download from UpYun + id: download + env: + UPYUN_SERVICE: ${{ secrets.UPYUN_BUCKET }} + UPYUN_OPERATOR: ${{ secrets.UPYUN_OPERATOR }} + UPYUN_PASSWORD: ${{ secrets.UPYUN_PASSWORD }} + run: | + echo "📥 从 UpYun 同步构建产物..." + + UPX_VERSION="0.4.9" + UPX_URL="https://collection.b0.upaiyun.com/softwares/upx/upx_${UPX_VERSION}_linux_amd64.tar.gz" + UPX_BIN="/tmp/upyun-upx" + + if [ ! -x "$UPX_BIN" ]; then + curl -sL "$UPX_URL" -o /tmp/upx.tar.gz + tar -xzf /tmp/upx.tar.gz -C /tmp + mv /tmp/upx "$UPX_BIN" + chmod +x "$UPX_BIN" + fi + + "$UPX_BIN" login "$UPYUN_SERVICE" "$UPYUN_OPERATOR" "$UPYUN_PASSWORD" + + DOWNLOAD_START=$(date +%s) + "$UPX_BIN" sync -r / public/ / + "$UPX_BIN" get /__build_hash > /tmp/current_hash 2>/dev/null || echo "" + DOWNLOAD_END=$(date +%s) + DOWNLOAD_DURATION=$((DOWNLOAD_END - DOWNLOAD_START)) + echo "download_duration=${DOWNLOAD_DURATION}" >> $GITHUB_OUTPUT + + CURRENT_HASH=$(cat /tmp/current_hash 2>/dev/null || echo "") + echo "current_hash=${CURRENT_HASH}" >> $GITHUB_OUTPUT - name: Check if deployment is needed id: check run: | - CURRENT_HASH=$(cat public/.build_hash 2>/dev/null || echo "") + CURRENT_HASH="${{ steps.download.outputs.current_hash }}" 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 "🔄 构建产物有变化,UpYun 已同步最新内容" echo "deployed=true" >> $GITHUB_OUTPUT else - echo "✅ 构建产物无变化,跳过 UpYun 部署" + echo "✅ 构建产物无变化,UpYun 无需更新" echo "deployed=false" >> $GITHUB_OUTPUT fi - - name: Start upload timing - if: steps.check.outputs.deployed == 'true' - id: start-upyun-upload - run: echo "start_time=$(date +%s)" >> $GITHUB_OUTPUT - - - name: Deploy to UpYun - if: steps.check.outputs.deployed == 'true' - env: - UPYUN_SERVICE: ${{ secrets.UPYUN_BUCKET }} - UPYUN_OPERATOR: ${{ secrets.UPYUN_OPERATOR }} - UPYUN_PASSWORD: ${{ secrets.UPYUN_PASSWORD }} - run: | - 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: End timing id: end-upyun run: | @@ -486,7 +526,7 @@ jobs: echo "## ⏱️ Deploy UpYun 耗时: ${total_duration}秒" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY echo "### 📊 部署统计" >> $GITHUB_STEP_SUMMARY - echo "- **上传部署**: ${total_duration}秒" >> $GITHUB_STEP_SUMMARY + echo "- **下载: ${{ steps.download.outputs.download_duration }}s**" >> $GITHUB_STEP_SUMMARY echo "- **文件总数**: ${{ needs.build.outputs.file_count }}" >> $GITHUB_STEP_SUMMARY echo "- **总大小**: ${{ needs.build.outputs.total_size }}" >> $GITHUB_STEP_SUMMARY else @@ -823,11 +863,6 @@ jobs: echo "| UpYun | ${{ needs.deploy-upyun.outputs.deployed == 'true' && '✅ 已部署' || '⏭️ 跳过(无变化)' }} |" >> $GITHUB_STEP_SUMMARY echo "| CDN 刷新 | ${{ steps.deploy-status.outputs.any_deployed == 'true' && '✅ 已刷新' || '⏭️ 跳过' }} |" >> $GITHUB_STEP_SUMMARY - - name: Clean up build artifact - uses: actions/delete-artifact@v4 - with: - name: hugo-public - # ============================================================ # Job 6: Failure Notification (失败通知) # ============================================================