fix(ci): 删除空壳 deploy-upyun job,UpYun 直传改为如实上报三态
Deploy to Production / pre-check (push) Successful in 2m6s
Deploy to Production / build (push) Successful in 4m18s
Deploy to Production / deploy-edgeone (push) Successful in 7s
Deploy to Production / finalize (push) Successful in 16s
Deploy to Production / notify-failure (push) Skipped
Deploy to Production / pre-check (push) Successful in 2m6s
Deploy to Production / build (push) Successful in 4m18s
Deploy to Production / deploy-edgeone (push) Successful in 7s
Deploy to Production / finalize (push) Successful in 16s
Deploy to Production / notify-failure (push) Skipped
deploy-upyun 是零上传动作的空壳 job,却无条件打印「UpYun 已同步最新内容」,其输出被 Telegram / 飞书 / 邮件通知当成 UpYun 部署成功的依据;真正的上传步骤标了 continue-on-error,失败也不影响 job 颜色。三层叠加,导致 7/25 起国内线路停更两个多月而通知始终显示成功。 改动:删除 deploy-upyun(finalize / notify-failure 的 needs 同步清理);Upload to UpYun 在退出时写 GITHUB_OUTPUT,如实上报 success / failure / skipped 三态与真实耗时(不用 steps.outcome,只依赖最通用的 output 传递);通知与 Step Summary 改为展示三态真实结果,移除「文件已在 Build 阶段同步」这类未经验证的说法。 又拍云直传失败仍不阻断流水线 —— 国内线路由腾讯云广州的 1Panel 计划任务「又拍云同步(国内中转)」每分钟兜底增量推送。
This commit is contained in:
1 parent
95a8455c0e
commit
80ea1ff5b3
1 file changed
+70
-102
+70
-102
@@ -126,8 +126,13 @@ jobs:
|
|||||||
duration: ${{ steps.end-build.outputs.duration }}
|
duration: ${{ steps.end-build.outputs.duration }}
|
||||||
file_count: ${{ steps.stats.outputs.file_count }}
|
file_count: ${{ steps.stats.outputs.file_count }}
|
||||||
total_size: ${{ steps.stats.outputs.total_size }}
|
total_size: ${{ steps.stats.outputs.total_size }}
|
||||||
skipped: ${{ steps.upload.outputs.skipped || steps.set-skipped.outputs.skipped }}
|
|
||||||
need_upload: ${{ steps.check-upload.outputs.need_upload }}
|
need_upload: ${{ steps.check-upload.outputs.need_upload }}
|
||||||
|
# Upload to UpYun 的真实三态:success / failure / skipped(未执行)。
|
||||||
|
# 该步骤标了 continue-on-error,conclusion 恒为 success,不能用来判断成败。
|
||||||
|
# 这里刻意不用 steps.<id>.outcome,而是让步骤自己在退出时写 GITHUB_OUTPUT,
|
||||||
|
# 只依赖最通用的 output 传递机制,GitHub / Gitea 两边都稳。
|
||||||
|
upyun_status: ${{ steps.upload.outputs.upyun_status || 'skipped' }}
|
||||||
|
upyun_duration: ${{ steps.upload.outputs.duration }}
|
||||||
needs: pre-check
|
needs: pre-check
|
||||||
if: needs.pre-check.outputs.can_deploy == 'true'
|
if: needs.pre-check.outputs.can_deploy == 'true'
|
||||||
|
|
||||||
@@ -291,9 +296,25 @@ jobs:
|
|||||||
UPYUN_OPERATOR: ${{ secrets.UPYUN_OPERATOR }}
|
UPYUN_OPERATOR: ${{ secrets.UPYUN_OPERATOR }}
|
||||||
UPYUN_PASSWORD: ${{ secrets.UPYUN_PASSWORD }}
|
UPYUN_PASSWORD: ${{ secrets.UPYUN_PASSWORD }}
|
||||||
id: upload
|
id: upload
|
||||||
|
# 直传失败不阻断整条流水线 —— 国内线路已由腾讯云广州的中转机兜底
|
||||||
|
# (1Panel 计划任务「又拍云同步(国内中转)」每分钟比对 COS 上的 build hash,
|
||||||
|
# 有变化才增量推送)。但失败必须被如实上报,绝不能再伪装成成功。
|
||||||
continue-on-error: true
|
continue-on-error: true
|
||||||
run: |
|
run: |
|
||||||
echo "📤 上传构建产物到 UpYun..."
|
echo "📤 上传构建产物到 UpYun..."
|
||||||
|
START_TS=$(date +%s)
|
||||||
|
# 无论成功、失败还是中途退出,都在退出时如实上报结果与耗时。
|
||||||
|
# 这是"不再假绿"的核心:过去无论传没传上去,通知都显示成功。
|
||||||
|
on_exit() {
|
||||||
|
rc=$?
|
||||||
|
if [ "$rc" -eq 0 ]; then
|
||||||
|
echo "upyun_status=success" >> $GITHUB_OUTPUT
|
||||||
|
else
|
||||||
|
echo "upyun_status=failure" >> $GITHUB_OUTPUT
|
||||||
|
fi
|
||||||
|
echo "duration=$(($(date +%s) - START_TS))" >> $GITHUB_OUTPUT
|
||||||
|
}
|
||||||
|
trap on_exit EXIT
|
||||||
|
|
||||||
UPX_VERSION="0.4.9"
|
UPX_VERSION="0.4.9"
|
||||||
UPX_BIN="/tmp/upyun-upx"
|
UPX_BIN="/tmp/upyun-upx"
|
||||||
@@ -340,12 +361,6 @@ jobs:
|
|||||||
timeout 480 "$UPX_BIN" sync public/ / -w 10 --delete --strong
|
timeout 480 "$UPX_BIN" sync public/ / -w 10 --delete --strong
|
||||||
timeout 30 "$UPX_BIN" put public/.build_hash /__build_hash
|
timeout 30 "$UPX_BIN" put public/.build_hash /__build_hash
|
||||||
echo "✅ UpYun 上传完成"
|
echo "✅ UpYun 上传完成"
|
||||||
echo "skipped=false" >> $GITHUB_OUTPUT
|
|
||||||
|
|
||||||
- name: Set skipped status
|
|
||||||
if: steps.check-upload.outputs.need_upload == 'false'
|
|
||||||
id: set-skipped
|
|
||||||
run: echo "skipped=true" >> $GITHUB_OUTPUT
|
|
||||||
|
|
||||||
- name: Push Image Optimizations
|
- name: Push Image Optimizations
|
||||||
continue-on-error: true
|
continue-on-error: true
|
||||||
@@ -504,58 +519,12 @@ jobs:
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# ============================================================
|
# ============================================================
|
||||||
# Job 4: Deploy to UpYun (并行)
|
# 注意:这里原先有一个名为 deploy-upyun 的 job —— 它是纯空壳:
|
||||||
|
# 零上传动作,却无条件打印「UpYun 已同步最新内容」,且它的输出被
|
||||||
|
# Telegram / 飞书 / 邮件通知当成"UpYun 部署成功"的依据。
|
||||||
|
# 因它持续掩盖真实故障(7/25 起国内线路停更两个多月),已于 2026-10-01 删除。
|
||||||
|
# 又拍云的真实状态现在来自 build job 的 upyun_status 输出。
|
||||||
# ============================================================
|
# ============================================================
|
||||||
deploy-upyun:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
timeout-minutes: 5
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
needs: build
|
|
||||||
outputs:
|
|
||||||
deployed: ${{ steps.check.outputs.deployed }}
|
|
||||||
duration: ${{ steps.end-upyun.outputs.duration }}
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Start timing
|
|
||||||
id: start-upyun
|
|
||||||
run: echo "start_time=$(date +%s)" >> $GITHUB_OUTPUT
|
|
||||||
|
|
||||||
- name: Check if deployment is needed
|
|
||||||
id: check
|
|
||||||
run: |
|
|
||||||
CURRENT_HASH="${{ needs.build.outputs.build_hash }}"
|
|
||||||
LAST_HASH="${{ needs.build.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: End timing
|
|
||||||
id: end-upyun
|
|
||||||
run: |
|
|
||||||
end_time=$(date +%s)
|
|
||||||
total_start_time=${{ steps.start-upyun.outputs.start_time }}
|
|
||||||
total_duration=$((end_time - total_start_time))
|
|
||||||
echo "duration=${total_duration}" >> $GITHUB_OUTPUT
|
|
||||||
|
|
||||||
if [ "${{ steps.check.outputs.deployed }}" = "true" ]; then
|
|
||||||
echo "## ⏱️ Deploy UpYun 耗时: ${total_duration}秒" >> $GITHUB_STEP_SUMMARY
|
|
||||||
echo "" >> $GITHUB_STEP_SUMMARY
|
|
||||||
echo "### 📊 部署统计" >> $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}秒" >> $GITHUB_STEP_SUMMARY
|
|
||||||
fi
|
|
||||||
|
|
||||||
# ============================================================
|
# ============================================================
|
||||||
# Job 5: CDN Refresh & Notifications (after all deployments)
|
# Job 5: CDN Refresh & Notifications (after all deployments)
|
||||||
@@ -565,8 +534,8 @@ jobs:
|
|||||||
timeout-minutes: 5
|
timeout-minutes: 5
|
||||||
permissions:
|
permissions:
|
||||||
contents: write
|
contents: write
|
||||||
needs: [pre-check, build, deploy-edgeone, deploy-upyun]
|
needs: [pre-check, build, deploy-edgeone]
|
||||||
if: always() && needs.build.result == 'success' && needs.deploy-edgeone.result == 'success' && needs.deploy-upyun.result == 'success'
|
if: always() && needs.build.result == 'success' && needs.deploy-edgeone.result == 'success'
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Start timing
|
- name: Start timing
|
||||||
@@ -584,12 +553,12 @@ jobs:
|
|||||||
id: deploy-status
|
id: deploy-status
|
||||||
run: |
|
run: |
|
||||||
EDGEONE_DEPLOYED="${{ needs.deploy-edgeone.outputs.deployed }}"
|
EDGEONE_DEPLOYED="${{ needs.deploy-edgeone.outputs.deployed }}"
|
||||||
UPYUN_DEPLOYED="${{ needs.deploy-upyun.outputs.deployed }}"
|
UPYUN_STATUS="${{ needs.build.outputs.upyun_status }}"
|
||||||
|
|
||||||
echo "EdgeOne deployed: $EDGEONE_DEPLOYED"
|
echo "EdgeOne deployed: $EDGEONE_DEPLOYED"
|
||||||
echo "UpYun deployed: $UPYUN_DEPLOYED"
|
echo "UpYun status: $UPYUN_STATUS"
|
||||||
|
|
||||||
if [ "$EDGEONE_DEPLOYED" = "true" ] || [ "$UPYUN_DEPLOYED" = "true" ]; then
|
if [ "$EDGEONE_DEPLOYED" = "true" ] || [ "$UPYUN_STATUS" = "success" ]; then
|
||||||
echo "any_deployed=true" >> $GITHUB_OUTPUT
|
echo "any_deployed=true" >> $GITHUB_OUTPUT
|
||||||
else
|
else
|
||||||
echo "any_deployed=false" >> $GITHUB_OUTPUT
|
echo "any_deployed=false" >> $GITHUB_OUTPUT
|
||||||
@@ -684,8 +653,8 @@ jobs:
|
|||||||
BUILD_DUR="${{ needs.build.outputs.duration }}"
|
BUILD_DUR="${{ needs.build.outputs.duration }}"
|
||||||
EDGEONE_DUR="${{ needs.deploy-edgeone.outputs.duration }}"
|
EDGEONE_DUR="${{ needs.deploy-edgeone.outputs.duration }}"
|
||||||
EDGEONE_DEPLOYED="${{ needs.deploy-edgeone.outputs.deployed }}"
|
EDGEONE_DEPLOYED="${{ needs.deploy-edgeone.outputs.deployed }}"
|
||||||
UPYUN_DUR="${{ needs.deploy-upyun.outputs.duration }}"
|
UPYUN_DUR="${{ needs.build.outputs.upyun_duration }}"
|
||||||
UPYUN_DEPLOYED="${{ needs.deploy-upyun.outputs.deployed }}"
|
UPYUN_STATUS_RAW="${{ needs.build.outputs.upyun_status }}"
|
||||||
FILE_COUNT="${{ needs.build.outputs.file_count }}"
|
FILE_COUNT="${{ needs.build.outputs.file_count }}"
|
||||||
TOTAL_SIZE="${{ needs.build.outputs.total_size }}"
|
TOTAL_SIZE="${{ needs.build.outputs.total_size }}"
|
||||||
|
|
||||||
@@ -696,10 +665,14 @@ jobs:
|
|||||||
EDGEONE_DETAIL=$(printf "\n 📥 下载: %ss\n 📤 上传: %ss" "$EDGEONE_DOWNLOAD" "$EDGEONE_UPLOAD")
|
EDGEONE_DETAIL=$(printf "\n 📥 下载: %ss\n 📤 上传: %ss" "$EDGEONE_DOWNLOAD" "$EDGEONE_UPLOAD")
|
||||||
fi
|
fi
|
||||||
|
|
||||||
UPYUN_DETAIL=""
|
# 三态映射:直传结果如实呈现,不再有"文件已在 Build 阶段同步"这种没验证过的说辞
|
||||||
if [ "$UPYUN_DEPLOYED" = "true" ]; then
|
case "$UPYUN_STATUS_RAW" in
|
||||||
UPYUN_DETAIL=$(printf "\n (文件已在 Build 阶段同步)")
|
success) UPYUN_TEXT="✅ 已直传";;
|
||||||
fi
|
failure) UPYUN_TEXT="❌ 直传失败(国内中转机兜底)";;
|
||||||
|
skipped) UPYUN_TEXT="⏭️ 跳过(无变化)";;
|
||||||
|
*) UPYUN_TEXT="❔ 未执行";;
|
||||||
|
esac
|
||||||
|
if [ -n "$UPYUN_DUR" ]; then UPYUN_DUR_TEXT="${UPYUN_DUR}s"; else UPYUN_DUR_TEXT="—"; fi
|
||||||
|
|
||||||
if [ "${{ steps.deploy-status.outputs.any_deployed }}" = "true" ]; then
|
if [ "${{ steps.deploy-status.outputs.any_deployed }}" = "true" ]; then
|
||||||
STATUS_ICON="🎉"
|
STATUS_ICON="🎉"
|
||||||
@@ -710,7 +683,6 @@ jobs:
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
EDGEONE_STATUS=$([ "$EDGEONE_DEPLOYED" = "true" ] && echo "✅ 已部署" || echo "⏭️ 跳过")
|
EDGEONE_STATUS=$([ "$EDGEONE_DEPLOYED" = "true" ] && echo "✅ 已部署" || echo "⏭️ 跳过")
|
||||||
UPYUN_STATUS=$([ "$UPYUN_DEPLOYED" = "true" ] && echo "✅ 已部署" || echo "⏭️ 跳过")
|
|
||||||
|
|
||||||
CURRENT_TIME=$(date +'%Y-%m-%d %H:%M:%S')
|
CURRENT_TIME=$(date +'%Y-%m-%d %H:%M:%S')
|
||||||
|
|
||||||
@@ -732,12 +704,12 @@ jobs:
|
|||||||
MESSAGE="$MESSAGE""🔍 Pre-check: ${PRECHECK_DUR}s"$'\n'
|
MESSAGE="$MESSAGE""🔍 Pre-check: ${PRECHECK_DUR}s"$'\n'
|
||||||
MESSAGE="$MESSAGE""🏗️ Build: ${BUILD_DUR}s"$'\n'
|
MESSAGE="$MESSAGE""🏗️ Build: ${BUILD_DUR}s"$'\n'
|
||||||
MESSAGE="$MESSAGE""🌐 EdgeOne: ${EDGEONE_DUR}s$EDGEONE_DETAIL"$'\n'
|
MESSAGE="$MESSAGE""🌐 EdgeOne: ${EDGEONE_DUR}s$EDGEONE_DETAIL"$'\n'
|
||||||
MESSAGE="$MESSAGE""☁️ UpYun: ${UPYUN_DUR}s$UPYUN_DETAIL"$'\n\n'
|
MESSAGE="$MESSAGE""☁️ UpYun 直传: ${UPYUN_DUR_TEXT}"$'\n\n'
|
||||||
MESSAGE="$MESSAGE""━━━━━━━━━━━━━━━━━━━━━━"$'\n'
|
MESSAGE="$MESSAGE""━━━━━━━━━━━━━━━━━━━━━━"$'\n'
|
||||||
MESSAGE="$MESSAGE""📌 *部署状态*"$'\n'
|
MESSAGE="$MESSAGE""📌 *部署状态*"$'\n'
|
||||||
MESSAGE="$MESSAGE""━━━━━━━━━━━━━━━━━━━━━━"$'\n'
|
MESSAGE="$MESSAGE""━━━━━━━━━━━━━━━━━━━━━━"$'\n'
|
||||||
MESSAGE="$MESSAGE""🌐 EdgeOne Pages: $EDGEONE_STATUS"$'\n'
|
MESSAGE="$MESSAGE""🌐 EdgeOne Pages: $EDGEONE_STATUS"$'\n'
|
||||||
MESSAGE="$MESSAGE""☁️ UpYun: $UPYUN_STATUS"$'\n\n'
|
MESSAGE="$MESSAGE""☁️ UpYun: $UPYUN_TEXT"$'\n\n'
|
||||||
if [ "${{ github.server_url }}" = "https://github.com" ]; then
|
if [ "${{ github.server_url }}" = "https://github.com" ]; then
|
||||||
RUN_URL="https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}"
|
RUN_URL="https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}"
|
||||||
else
|
else
|
||||||
@@ -764,8 +736,8 @@ jobs:
|
|||||||
BUILD_DUR="${{ needs.build.outputs.duration }}"
|
BUILD_DUR="${{ needs.build.outputs.duration }}"
|
||||||
EDGEONE_DUR="${{ needs.deploy-edgeone.outputs.duration }}"
|
EDGEONE_DUR="${{ needs.deploy-edgeone.outputs.duration }}"
|
||||||
EDGEONE_DEPLOYED="${{ needs.deploy-edgeone.outputs.deployed }}"
|
EDGEONE_DEPLOYED="${{ needs.deploy-edgeone.outputs.deployed }}"
|
||||||
UPYUN_DUR="${{ needs.deploy-upyun.outputs.duration }}"
|
UPYUN_DUR="${{ needs.build.outputs.upyun_duration }}"
|
||||||
UPYUN_DEPLOYED="${{ needs.deploy-upyun.outputs.deployed }}"
|
UPYUN_STATUS_RAW="${{ needs.build.outputs.upyun_status }}"
|
||||||
FILE_COUNT="${{ needs.build.outputs.file_count }}"
|
FILE_COUNT="${{ needs.build.outputs.file_count }}"
|
||||||
TOTAL_SIZE="${{ needs.build.outputs.total_size }}"
|
TOTAL_SIZE="${{ needs.build.outputs.total_size }}"
|
||||||
|
|
||||||
@@ -776,10 +748,14 @@ jobs:
|
|||||||
EDGEONE_DETAIL=$(printf "\n 📥 下载: %ss\n 📤 上传: %ss" "$EDGEONE_DOWNLOAD" "$EDGEONE_UPLOAD")
|
EDGEONE_DETAIL=$(printf "\n 📥 下载: %ss\n 📤 上传: %ss" "$EDGEONE_DOWNLOAD" "$EDGEONE_UPLOAD")
|
||||||
fi
|
fi
|
||||||
|
|
||||||
UPYUN_DETAIL=""
|
# 三态映射:直传结果如实呈现,不再有"文件已在 Build 阶段同步"这种没验证过的说辞
|
||||||
if [ "$UPYUN_DEPLOYED" = "true" ]; then
|
case "$UPYUN_STATUS_RAW" in
|
||||||
UPYUN_DETAIL=$(printf "\n (文件已在 Build 阶段同步)")
|
success) UPYUN_TEXT="✅ 已直传";;
|
||||||
fi
|
failure) UPYUN_TEXT="❌ 直传失败(国内中转机兜底)";;
|
||||||
|
skipped) UPYUN_TEXT="⏭️ 跳过(无变化)";;
|
||||||
|
*) UPYUN_TEXT="❔ 未执行";;
|
||||||
|
esac
|
||||||
|
if [ -n "$UPYUN_DUR" ]; then UPYUN_DUR_TEXT="${UPYUN_DUR}s"; else UPYUN_DUR_TEXT="—"; fi
|
||||||
|
|
||||||
if [ "${{ steps.deploy-status.outputs.any_deployed }}" = "true" ]; then
|
if [ "${{ steps.deploy-status.outputs.any_deployed }}" = "true" ]; then
|
||||||
STATUS_ICON="🎉"
|
STATUS_ICON="🎉"
|
||||||
@@ -790,7 +766,6 @@ jobs:
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
EDGEONE_STATUS=$([ "$EDGEONE_DEPLOYED" = "true" ] && echo "✅ 已部署" || echo "⏭️ 跳过")
|
EDGEONE_STATUS=$([ "$EDGEONE_DEPLOYED" = "true" ] && echo "✅ 已部署" || echo "⏭️ 跳过")
|
||||||
UPYUN_STATUS=$([ "$UPYUN_DEPLOYED" = "true" ] && echo "✅ 已部署" || echo "⏭️ 跳过")
|
|
||||||
|
|
||||||
CURRENT_TIME=$(date +'%Y-%m-%d %H:%M:%S')
|
CURRENT_TIME=$(date +'%Y-%m-%d %H:%M:%S')
|
||||||
|
|
||||||
@@ -812,12 +787,12 @@ jobs:
|
|||||||
MESSAGE_TEXT="$MESSAGE_TEXT""🔍 Pre-check: ${PRECHECK_DUR}s"$'\n'
|
MESSAGE_TEXT="$MESSAGE_TEXT""🔍 Pre-check: ${PRECHECK_DUR}s"$'\n'
|
||||||
MESSAGE_TEXT="$MESSAGE_TEXT""🏗️ Build: ${BUILD_DUR}s"$'\n'
|
MESSAGE_TEXT="$MESSAGE_TEXT""🏗️ Build: ${BUILD_DUR}s"$'\n'
|
||||||
MESSAGE_TEXT="$MESSAGE_TEXT""🌐 EdgeOne: ${EDGEONE_DUR}s$EDGEONE_DETAIL"$'\n'
|
MESSAGE_TEXT="$MESSAGE_TEXT""🌐 EdgeOne: ${EDGEONE_DUR}s$EDGEONE_DETAIL"$'\n'
|
||||||
MESSAGE_TEXT="$MESSAGE_TEXT""☁️ UpYun: ${UPYUN_DUR}s$UPYUN_DETAIL"$'\n\n'
|
MESSAGE_TEXT="$MESSAGE_TEXT""☁️ UpYun 直传: ${UPYUN_DUR_TEXT}"$'\n\n'
|
||||||
MESSAGE_TEXT="$MESSAGE_TEXT""━━━━━━━━━━━━━━━━━━━━━━"$'\n'
|
MESSAGE_TEXT="$MESSAGE_TEXT""━━━━━━━━━━━━━━━━━━━━━━"$'\n'
|
||||||
MESSAGE_TEXT="$MESSAGE_TEXT""📌 部署状态"$'\n'
|
MESSAGE_TEXT="$MESSAGE_TEXT""📌 部署状态"$'\n'
|
||||||
MESSAGE_TEXT="$MESSAGE_TEXT""━━━━━━━━━━━━━━━━━━━━━━"$'\n'
|
MESSAGE_TEXT="$MESSAGE_TEXT""━━━━━━━━━━━━━━━━━━━━━━"$'\n'
|
||||||
MESSAGE_TEXT="$MESSAGE_TEXT""🌐 EdgeOne Pages: $EDGEONE_STATUS"$'\n'
|
MESSAGE_TEXT="$MESSAGE_TEXT""🌐 EdgeOne Pages: $EDGEONE_STATUS"$'\n'
|
||||||
MESSAGE_TEXT="$MESSAGE_TEXT""☁️ UpYun: $UPYUN_STATUS"$'\n\n'
|
MESSAGE_TEXT="$MESSAGE_TEXT""☁️ UpYun: $UPYUN_TEXT"$'\n\n'
|
||||||
if [ "${{ github.server_url }}" = "https://github.com" ]; then
|
if [ "${{ github.server_url }}" = "https://github.com" ]; then
|
||||||
RUN_URL="https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}"
|
RUN_URL="https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}"
|
||||||
else
|
else
|
||||||
@@ -877,12 +852,12 @@ jobs:
|
|||||||
📥 下载 COS: ${{ needs.deploy-edgeone.outputs.download_duration }}s
|
📥 下载 COS: ${{ needs.deploy-edgeone.outputs.download_duration }}s
|
||||||
📤 上传部署: ${{ needs.deploy-edgeone.outputs.upload_duration }}s
|
📤 上传部署: ${{ needs.deploy-edgeone.outputs.upload_duration }}s
|
||||||
|
|
||||||
☁️ UpYun: ${{ needs.deploy-upyun.outputs.duration }}s
|
☁️ UpYun 直传: ${{ needs.build.outputs.upyun_status == 'success' && '✅ 成功' || (needs.build.outputs.upyun_status == 'skipped' && '⏭️ 跳过(无变化)' || '❌ 失败(国内中转机兜底)') }}
|
||||||
|
|
||||||
📌 部署状态
|
📌 部署状态
|
||||||
──────────────────────────────────
|
──────────────────────────────────
|
||||||
🌐 EdgeOne Pages: ${{ needs.deploy-edgeone.outputs.deployed == 'true' && '✅ 已部署' || '⏭️ 跳过(无变化)' }}
|
🌐 EdgeOne Pages: ${{ needs.deploy-edgeone.outputs.deployed == 'true' && '✅ 已部署' || '⏭️ 跳过(无变化)' }}
|
||||||
☁️ UpYun: ${{ needs.deploy-upyun.outputs.deployed == 'true' && '✅ 已部署' || '⏭️ 跳过(无变化)' }}
|
☁️ UpYun: ${{ needs.build.outputs.upyun_status == 'success' && '✅ 已直传' || (needs.build.outputs.upyun_status == 'skipped' && '⏭️ 跳过(无变化)' || '❌ 直传失败(中转机兜底)') }}
|
||||||
|
|
||||||
🔗 查看详情
|
🔗 查看详情
|
||||||
──────────────────────────────────
|
──────────────────────────────────
|
||||||
@@ -901,8 +876,7 @@ jobs:
|
|||||||
BUILD_DUR="${{ needs.build.outputs.duration }}"
|
BUILD_DUR="${{ needs.build.outputs.duration }}"
|
||||||
EDGEONE_DUR="${{ needs.deploy-edgeone.outputs.duration }}"
|
EDGEONE_DUR="${{ needs.deploy-edgeone.outputs.duration }}"
|
||||||
EDGEONE_DEPLOYED="${{ needs.deploy-edgeone.outputs.deployed }}"
|
EDGEONE_DEPLOYED="${{ needs.deploy-edgeone.outputs.deployed }}"
|
||||||
UPYUN_DUR="${{ needs.deploy-upyun.outputs.duration }}"
|
UPYUN_DUR="${{ needs.build.outputs.upyun_duration }}"
|
||||||
UPYUN_DEPLOYED="${{ needs.deploy-upyun.outputs.deployed }}"
|
|
||||||
|
|
||||||
if [ "$EDGEONE_DEPLOYED" = "true" ]; then
|
if [ "$EDGEONE_DEPLOYED" = "true" ]; then
|
||||||
EDGEONE_DOWNLOAD="${{ needs.deploy-edgeone.outputs.download_duration }}"
|
EDGEONE_DOWNLOAD="${{ needs.deploy-edgeone.outputs.download_duration }}"
|
||||||
@@ -912,13 +886,7 @@ jobs:
|
|||||||
EDGEONE_UPLOAD="0"
|
EDGEONE_UPLOAD="0"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ "$UPYUN_DEPLOYED" = "true" ]; then
|
UPYUN_DUR_CELL="${UPYUN_DUR}s"; [ -z "$UPYUN_DUR" ] && UPYUN_DUR_CELL="—"
|
||||||
UPYUN_DOWNLOAD="0"
|
|
||||||
UPYUN_UPLOAD="0"
|
|
||||||
else
|
|
||||||
UPYUN_DOWNLOAD="0"
|
|
||||||
UPYUN_UPLOAD="0"
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "## 📊 部署报告" >> $GITHUB_STEP_SUMMARY
|
echo "## 📊 部署报告" >> $GITHUB_STEP_SUMMARY
|
||||||
echo "" >> $GITHUB_STEP_SUMMARY
|
echo "" >> $GITHUB_STEP_SUMMARY
|
||||||
@@ -938,7 +906,7 @@ jobs:
|
|||||||
echo "| Pre-check | ${PRECHECK_DUR}s | - | - |" >> $GITHUB_STEP_SUMMARY
|
echo "| Pre-check | ${PRECHECK_DUR}s | - | - |" >> $GITHUB_STEP_SUMMARY
|
||||||
echo "| Build | ${BUILD_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 "| 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 "| UpYun 直传 | ${UPYUN_DUR_CELL} | - | ${UPYUN_DUR_CELL} |" >> $GITHUB_STEP_SUMMARY
|
||||||
echo "| Finalize | ${finalize_duration}s | - | - |" >> $GITHUB_STEP_SUMMARY
|
echo "| Finalize | ${finalize_duration}s | - | - |" >> $GITHUB_STEP_SUMMARY
|
||||||
echo "" >> $GITHUB_STEP_SUMMARY
|
echo "" >> $GITHUB_STEP_SUMMARY
|
||||||
|
|
||||||
@@ -947,7 +915,7 @@ jobs:
|
|||||||
echo "| 目标 | 状态 |" >> $GITHUB_STEP_SUMMARY
|
echo "| 目标 | 状态 |" >> $GITHUB_STEP_SUMMARY
|
||||||
echo "|------|------|" >> $GITHUB_STEP_SUMMARY
|
echo "|------|------|" >> $GITHUB_STEP_SUMMARY
|
||||||
echo "| EdgeOne Pages | ${{ needs.deploy-edgeone.outputs.deployed == 'true' && '✅ 已部署' || '⏭️ 跳过(无变化)' }} |" >> $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 "| UpYun 直传 | ${{ needs.build.outputs.upyun_status == 'success' && '✅ 成功' || (needs.build.outputs.upyun_status == 'skipped' && '⏭️ 跳过(无变化)' || '❌ 失败(中转机兜底)') }} |" >> $GITHUB_STEP_SUMMARY
|
||||||
echo "| CDN 刷新 | ${{ steps.deploy-status.outputs.any_deployed == 'true' && '✅ 已刷新' || '⏭️ 跳过' }} |" >> $GITHUB_STEP_SUMMARY
|
echo "| CDN 刷新 | ${{ steps.deploy-status.outputs.any_deployed == 'true' && '✅ 已刷新' || '⏭️ 跳过' }} |" >> $GITHUB_STEP_SUMMARY
|
||||||
|
|
||||||
# ============================================================
|
# ============================================================
|
||||||
@@ -958,8 +926,8 @@ jobs:
|
|||||||
timeout-minutes: 3
|
timeout-minutes: 3
|
||||||
permissions:
|
permissions:
|
||||||
contents: read
|
contents: read
|
||||||
needs: [pre-check, build, deploy-edgeone, deploy-upyun, finalize]
|
needs: [pre-check, build, deploy-edgeone, finalize]
|
||||||
if: always() && (needs.pre-check.result == 'failure' || needs.build.result == 'failure' || needs.deploy-edgeone.result == 'failure' || needs.deploy-upyun.result == 'failure' || needs.finalize.result == 'failure')
|
if: always() && (needs.pre-check.result == 'failure' || needs.build.result == 'failure' || needs.deploy-edgeone.result == 'failure' || needs.finalize.result == 'failure')
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Send Telegram failure notification
|
- name: Send Telegram failure notification
|
||||||
@@ -976,13 +944,13 @@ jobs:
|
|||||||
if [ "${{ needs.pre-check.result }}" = "failure" ]; then FAILURES=$(printf "%s\n 🔴 Pre-check" "$FAILURES"); fi
|
if [ "${{ needs.pre-check.result }}" = "failure" ]; then FAILURES=$(printf "%s\n 🔴 Pre-check" "$FAILURES"); fi
|
||||||
if [ "${{ needs.build.result }}" = "failure" ]; then FAILURES=$(printf "%s\n 🔴 Build" "$FAILURES"); fi
|
if [ "${{ needs.build.result }}" = "failure" ]; then FAILURES=$(printf "%s\n 🔴 Build" "$FAILURES"); fi
|
||||||
if [ "${{ needs.deploy-edgeone.result }}" = "failure" ]; then FAILURES=$(printf "%s\n 🔴 Deploy EdgeOne" "$FAILURES"); fi
|
if [ "${{ needs.deploy-edgeone.result }}" = "failure" ]; then FAILURES=$(printf "%s\n 🔴 Deploy EdgeOne" "$FAILURES"); fi
|
||||||
if [ "${{ needs.deploy-upyun.result }}" = "failure" ]; then FAILURES=$(printf "%s\n 🔴 Deploy UpYun" "$FAILURES"); fi
|
if [ "${{ needs.build.outputs.upyun_status }}" = "failure" ]; then FAILURES=$(printf "%s\n ⚠️ UpYun 直传失败(不阻断,国内中转机兜底)" "$FAILURES"); fi
|
||||||
if [ "${{ needs.finalize.result }}" = "failure" ]; then FAILURES=$(printf "%s\n 🔴 Finalize" "$FAILURES"); fi
|
if [ "${{ needs.finalize.result }}" = "failure" ]; then FAILURES=$(printf "%s\n 🔴 Finalize" "$FAILURES"); fi
|
||||||
|
|
||||||
PRECHECK_STATUS=$([ "${{ needs.pre-check.result }}" = "success" ] && echo "✅ 成功" || ([ "${{ needs.pre-check.result }}" = "failure" ] && echo "❌ 失败" || echo "⏭️ 跳过"))
|
PRECHECK_STATUS=$([ "${{ needs.pre-check.result }}" = "success" ] && echo "✅ 成功" || ([ "${{ needs.pre-check.result }}" = "failure" ] && echo "❌ 失败" || echo "⏭️ 跳过"))
|
||||||
BUILD_STATUS=$([ "${{ needs.build.result }}" = "success" ] && echo "✅ 成功" || ([ "${{ needs.build.result }}" = "failure" ] && echo "❌ 失败" || echo "⏭️ 跳过"))
|
BUILD_STATUS=$([ "${{ needs.build.result }}" = "success" ] && echo "✅ 成功" || ([ "${{ needs.build.result }}" = "failure" ] && echo "❌ 失败" || echo "⏭️ 跳过"))
|
||||||
EDGEONE_STATUS=$([ "${{ needs.deploy-edgeone.result }}" = "success" ] && echo "✅ 成功" || ([ "${{ needs.deploy-edgeone.result }}" = "failure" ] && echo "❌ 失败" || echo "⏭️ 跳过"))
|
EDGEONE_STATUS=$([ "${{ needs.deploy-edgeone.result }}" = "success" ] && echo "✅ 成功" || ([ "${{ needs.deploy-edgeone.result }}" = "failure" ] && echo "❌ 失败" || echo "⏭️ 跳过"))
|
||||||
UPYUN_STATUS=$([ "${{ needs.deploy-upyun.result }}" = "success" ] && echo "✅ 成功" || ([ "${{ needs.deploy-upyun.result }}" = "failure" ] && echo "❌ 失败" || echo "⏭️ 跳过"))
|
UPYUN_STATUS=$([ "${{ needs.build.outputs.upyun_status }}" = "success" ] && echo "✅ 直传成功" || ([ "${{ needs.build.outputs.upyun_status }}" = "failure" ] && echo "❌ 直传失败(中转兜底)" || echo "⏭️ 跳过(无变化)"))
|
||||||
FINALIZE_STATUS=$([ "${{ needs.finalize.result }}" = "success" ] && echo "✅ 成功" || ([ "${{ needs.finalize.result }}" = "failure" ] && echo "❌ 失败" || echo "⏭️ 跳过"))
|
FINALIZE_STATUS=$([ "${{ needs.finalize.result }}" = "success" ] && echo "✅ 成功" || ([ "${{ needs.finalize.result }}" = "failure" ] && echo "❌ 失败" || echo "⏭️ 跳过"))
|
||||||
|
|
||||||
CURRENT_TIME=$(date +'%Y-%m-%d %H:%M:%S')
|
CURRENT_TIME=$(date +'%Y-%m-%d %H:%M:%S')
|
||||||
@@ -1003,7 +971,7 @@ jobs:
|
|||||||
MESSAGE="$MESSAGE""🔍 Pre-check: $PRECHECK_STATUS"$'\n'
|
MESSAGE="$MESSAGE""🔍 Pre-check: $PRECHECK_STATUS"$'\n'
|
||||||
MESSAGE="$MESSAGE""🏗️ Build: $BUILD_STATUS"$'\n'
|
MESSAGE="$MESSAGE""🏗️ Build: $BUILD_STATUS"$'\n'
|
||||||
MESSAGE="$MESSAGE""🌐 Deploy EdgeOne: $EDGEONE_STATUS"$'\n'
|
MESSAGE="$MESSAGE""🌐 Deploy EdgeOne: $EDGEONE_STATUS"$'\n'
|
||||||
MESSAGE="$MESSAGE""☁️ Deploy UpYun: $UPYUN_STATUS"$'\n'
|
MESSAGE="$MESSAGE""☁️ UpYun 直传: $UPYUN_STATUS"$'\n'
|
||||||
MESSAGE="$MESSAGE""📤 Finalize: $FINALIZE_STATUS"$'\n\n'
|
MESSAGE="$MESSAGE""📤 Finalize: $FINALIZE_STATUS"$'\n\n'
|
||||||
if [ "${{ github.server_url }}" = "https://github.com" ]; then
|
if [ "${{ github.server_url }}" = "https://github.com" ]; then
|
||||||
RUN_URL="https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}"
|
RUN_URL="https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}"
|
||||||
@@ -1031,13 +999,13 @@ jobs:
|
|||||||
if [ "${{ needs.pre-check.result }}" = "failure" ]; then FAILURES=$(printf "%s\n 🔴 Pre-check" "$FAILURES"); fi
|
if [ "${{ needs.pre-check.result }}" = "failure" ]; then FAILURES=$(printf "%s\n 🔴 Pre-check" "$FAILURES"); fi
|
||||||
if [ "${{ needs.build.result }}" = "failure" ]; then FAILURES=$(printf "%s\n 🔴 Build" "$FAILURES"); fi
|
if [ "${{ needs.build.result }}" = "failure" ]; then FAILURES=$(printf "%s\n 🔴 Build" "$FAILURES"); fi
|
||||||
if [ "${{ needs.deploy-edgeone.result }}" = "failure" ]; then FAILURES=$(printf "%s\n 🔴 Deploy EdgeOne" "$FAILURES"); fi
|
if [ "${{ needs.deploy-edgeone.result }}" = "failure" ]; then FAILURES=$(printf "%s\n 🔴 Deploy EdgeOne" "$FAILURES"); fi
|
||||||
if [ "${{ needs.deploy-upyun.result }}" = "failure" ]; then FAILURES=$(printf "%s\n 🔴 Deploy UpYun" "$FAILURES"); fi
|
if [ "${{ needs.build.outputs.upyun_status }}" = "failure" ]; then FAILURES=$(printf "%s\n ⚠️ UpYun 直传失败(不阻断,国内中转机兜底)" "$FAILURES"); fi
|
||||||
if [ "${{ needs.finalize.result }}" = "failure" ]; then FAILURES=$(printf "%s\n 🔴 Finalize" "$FAILURES"); fi
|
if [ "${{ needs.finalize.result }}" = "failure" ]; then FAILURES=$(printf "%s\n 🔴 Finalize" "$FAILURES"); fi
|
||||||
|
|
||||||
PRECHECK_STATUS=$([ "${{ needs.pre-check.result }}" = "success" ] && echo "✅ 成功" || ([ "${{ needs.pre-check.result }}" = "failure" ] && echo "❌ 失败" || echo "⏭️ 跳过"))
|
PRECHECK_STATUS=$([ "${{ needs.pre-check.result }}" = "success" ] && echo "✅ 成功" || ([ "${{ needs.pre-check.result }}" = "failure" ] && echo "❌ 失败" || echo "⏭️ 跳过"))
|
||||||
BUILD_STATUS=$([ "${{ needs.build.result }}" = "success" ] && echo "✅ 成功" || ([ "${{ needs.build.result }}" = "failure" ] && echo "❌ 失败" || echo "⏭️ 跳过"))
|
BUILD_STATUS=$([ "${{ needs.build.result }}" = "success" ] && echo "✅ 成功" || ([ "${{ needs.build.result }}" = "failure" ] && echo "❌ 失败" || echo "⏭️ 跳过"))
|
||||||
EDGEONE_STATUS=$([ "${{ needs.deploy-edgeone.result }}" = "success" ] && echo "✅ 成功" || ([ "${{ needs.deploy-edgeone.result }}" = "failure" ] && echo "❌ 失败" || echo "⏭️ 跳过"))
|
EDGEONE_STATUS=$([ "${{ needs.deploy-edgeone.result }}" = "success" ] && echo "✅ 成功" || ([ "${{ needs.deploy-edgeone.result }}" = "failure" ] && echo "❌ 失败" || echo "⏭️ 跳过"))
|
||||||
UPYUN_STATUS=$([ "${{ needs.deploy-upyun.result }}" = "success" ] && echo "✅ 成功" || ([ "${{ needs.deploy-upyun.result }}" = "failure" ] && echo "❌ 失败" || echo "⏭️ 跳过"))
|
UPYUN_STATUS=$([ "${{ needs.build.outputs.upyun_status }}" = "success" ] && echo "✅ 直传成功" || ([ "${{ needs.build.outputs.upyun_status }}" = "failure" ] && echo "❌ 直传失败(中转兜底)" || echo "⏭️ 跳过(无变化)"))
|
||||||
FINALIZE_STATUS=$([ "${{ needs.finalize.result }}" = "success" ] && echo "✅ 成功" || ([ "${{ needs.finalize.result }}" = "failure" ] && echo "❌ 失败" || echo "⏭️ 跳过"))
|
FINALIZE_STATUS=$([ "${{ needs.finalize.result }}" = "success" ] && echo "✅ 成功" || ([ "${{ needs.finalize.result }}" = "failure" ] && echo "❌ 失败" || echo "⏭️ 跳过"))
|
||||||
|
|
||||||
CURRENT_TIME=$(date +'%Y-%m-%d %H:%M:%S')
|
CURRENT_TIME=$(date +'%Y-%m-%d %H:%M:%S')
|
||||||
@@ -1058,7 +1026,7 @@ jobs:
|
|||||||
MESSAGE_TEXT="$MESSAGE_TEXT""🔍 Pre-check: $PRECHECK_STATUS"$'\n'
|
MESSAGE_TEXT="$MESSAGE_TEXT""🔍 Pre-check: $PRECHECK_STATUS"$'\n'
|
||||||
MESSAGE_TEXT="$MESSAGE_TEXT""🏗️ Build: $BUILD_STATUS"$'\n'
|
MESSAGE_TEXT="$MESSAGE_TEXT""🏗️ Build: $BUILD_STATUS"$'\n'
|
||||||
MESSAGE_TEXT="$MESSAGE_TEXT""🌐 Deploy EdgeOne: $EDGEONE_STATUS"$'\n'
|
MESSAGE_TEXT="$MESSAGE_TEXT""🌐 Deploy EdgeOne: $EDGEONE_STATUS"$'\n'
|
||||||
MESSAGE_TEXT="$MESSAGE_TEXT""☁️ Deploy UpYun: $UPYUN_STATUS"$'\n'
|
MESSAGE_TEXT="$MESSAGE_TEXT""☁️ UpYun 直传: $UPYUN_STATUS"$'\n'
|
||||||
MESSAGE_TEXT="$MESSAGE_TEXT""📤 Finalize: $FINALIZE_STATUS"$'\n\n'
|
MESSAGE_TEXT="$MESSAGE_TEXT""📤 Finalize: $FINALIZE_STATUS"$'\n\n'
|
||||||
if [ "${{ github.server_url }}" = "https://github.com" ]; then
|
if [ "${{ github.server_url }}" = "https://github.com" ]; then
|
||||||
RUN_URL="https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}"
|
RUN_URL="https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}"
|
||||||
|
|||||||
Reference in new issue
Block a user