From 6838934fa5cd365aa263317dc7ed70873a1ad9ed Mon Sep 17 00:00:00 2001 From: zqlit Date: Thu, 1 Oct 2026 11:30:15 +0800 Subject: [PATCH] =?UTF-8?q?fix(ci):=20=E4=BF=AE=E5=A4=8D=E5=AE=9A=E6=97=B6?= =?UTF-8?q?=E6=9E=84=E5=BB=BA=E3=80=8C=E6=97=A0=E6=96=B0=E6=8F=90=E4=BA=A4?= =?UTF-8?q?=E5=88=99=E8=B7=B3=E8=BF=87=E3=80=8D=E9=80=BB=E8=BE=91=E5=A4=B1?= =?UTF-8?q?=E6=95=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 根因:pre-check job 的 outputs.can_deploy 绑定在 steps.repo-check 上, 而该步骤是无条件写 true;真正写 can_deploy=false 的是 steps.cron-check, 它写进自己步骤的 outputs,从未被 job 级 output 采用。 于是 build 的 if: needs.pre-check.outputs.can_deploy == 'true' 恒为真。 证据(run 8, event=schedule): - 日志 cron-check 已打印「距离上次提交: 9 小时 / 超过 1 小时没有新提交,跳过定时构建」 - 但随后 build 的 if 表达式求值 'steps.repo-check.outputs.can_deploy' 结果为 true,build 照常执行 后果:每天北京 09:00 无条件全量构建(build ~17min + finalize ~12.5min), 2 核服务器被白占约 32 分钟/天。线上不受影响(build hash 未变, COS/EdgeOne/UpYun 上传与部署均正确 skip)。 改动: - 合并 repo-check 与 cron-check 为单一步骤 decide,统一计算并输出 can_deploy - pre-check.outputs.can_deploy 改指向 steps.decide.outputs.can_deploy - 去掉原 cron-check 的 exit 0(避免步骤提前中断导致 output 丢失) --- .github/workflows/deploy.yml | 45 +++++++++++++++++++++--------------- 1 file changed, 26 insertions(+), 19 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 4c2d8162..aff03321 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -23,7 +23,7 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 2 outputs: - can_deploy: ${{ steps.repo-check.outputs.can_deploy }} + can_deploy: ${{ steps.decide.outputs.can_deploy }} duration: ${{ steps.end-pre-check.outputs.duration }} steps: @@ -63,27 +63,34 @@ jobs: echo "⚠️ 提交信息格式建议: feat/fix/chore/docs/style/refactor/test: description" fi - - name: Check for new commits (only for cron) - if: github.event_name == 'schedule' - id: cron-check + - name: Decide whether to deploy + id: decide run: | - LAST_COMMIT_TIME=$(git log -1 --format=%ct) - CURRENT_TIME=$(date +%s) - DIFF_HOURS=$(( (CURRENT_TIME - LAST_COMMIT_TIME) / 3600 )) - - echo "⏰ 最后一次提交时间: $(date -d @$LAST_COMMIT_TIME)" - echo "⏰ 当前时间: $(date)" - echo "⏰ 距离上次提交: $DIFF_HOURS 小时" - - if [ "$DIFF_HOURS" -lt 1 ]; then - echo "✅ 最近有提交,继续构建" - echo "can_deploy=true" >> $GITHUB_OUTPUT - else - echo "⏭️ 超过 1 小时没有新提交,跳过定时构建" - echo "can_deploy=false" >> $GITHUB_OUTPUT - exit 0 + # 基础决策来自仓库校验 + CAN_DEPLOY="${{ steps.repo-check.outputs.can_deploy }}" + echo "📌 仓库校验结果: can_deploy=${CAN_DEPLOY}" + + # 定时触发:若 1 小时内无新提交则跳过,避免重复构建 + if [ "${{ github.event_name }}" = "schedule" ]; then + LAST_COMMIT_TIME=$(git log -1 --format=%ct) + CURRENT_TIME=$(date +%s) + DIFF_HOURS=$(( (CURRENT_TIME - LAST_COMMIT_TIME) / 3600 )) + + echo "⏰ 最后一次提交时间: $(date -d @$LAST_COMMIT_TIME)" + echo "⏰ 当前时间: $(date)" + echo "⏰ 距离上次提交: ${DIFF_HOURS} 小时" + + if [ "$DIFF_HOURS" -ge 1 ]; then + echo "⏭️ 超过 1 小时没有新提交,跳过定时构建" + CAN_DEPLOY="false" + else + echo "✅ 最近有提交,继续构建" + fi fi + echo "can_deploy=${CAN_DEPLOY}" >> $GITHUB_OUTPUT + echo "## 🚦 部署决策: can_deploy=${CAN_DEPLOY}" >> $GITHUB_STEP_SUMMARY + - name: Summary run: | echo "## 🔍 前置检查完成" >> $GITHUB_STEP_SUMMARY