diff --git a/.github/workflows/cd.yaml b/.github/workflows/cd.yaml index bd348d24..4c82c521 100644 --- a/.github/workflows/cd.yaml +++ b/.github/workflows/cd.yaml @@ -57,6 +57,11 @@ jobs: name: "Pre-flight Check" runs-on: [self-hosted, harbor, k8s] timeout-minutes: 1 + # 2026-03-29: Runner 全局 mutex,確保同一 Runner 不會並行執行任何 CD Job + # 使用固定 group 名稱 (非 run_id),所有 CD Jobs 共用同一把鎖 + concurrency: + group: runner-awoooi-cd-mutex + cancel-in-progress: false steps: # ======================================================================= # 2026-03-29: Runner _diag/pages 檔案衝突修復 (v3) @@ -130,6 +135,9 @@ jobs: runs-on: [self-hosted, harbor, k8s] needs: pre-flight-check timeout-minutes: 1 + concurrency: + group: runner-awoooi-cd-mutex + cancel-in-progress: false outputs: api: ${{ inputs.force_deploy == true && 'true' || steps.filter.outputs.api }} web: ${{ inputs.force_deploy == true && 'true' || steps.filter.outputs.web }} @@ -168,7 +176,10 @@ jobs: name: "Build API" runs-on: [self-hosted, harbor, k8s] needs: detect-changes - timeout-minutes: 20 # 2026-03-29: 增加超時時間 (Docker Build 需要更長時間) + timeout-minutes: 20 + concurrency: + group: runner-awoooi-cd-mutex + cancel-in-progress: false if: | !inputs.skip_api && ( needs.detect-changes.outputs.api == 'true' || @@ -208,7 +219,10 @@ jobs: name: "Build Web" runs-on: [self-hosted, harbor, k8s] needs: detect-changes - timeout-minutes: 20 # 2026-03-29: 增加超時時間 (Next.js Build 需要更長時間) + timeout-minutes: 20 + concurrency: + group: runner-awoooi-cd-mutex + cancel-in-progress: false if: | !inputs.skip_web && ( needs.detect-changes.outputs.web == 'true' || @@ -261,6 +275,9 @@ jobs: runs-on: [self-hosted, harbor, k8s] needs: [detect-changes, build-api, build-web] timeout-minutes: 10 + concurrency: + group: runner-awoooi-cd-mutex + cancel-in-progress: false if: always() && (needs.build-api.result == 'success' || needs.build-api.result == 'skipped') && (needs.build-web.result == 'success' || needs.build-web.result == 'skipped') environment: production steps: