diff --git a/.github/workflows/validate.yml b/.github/workflows/validate.yml index b96f7045..3cc5834e 100644 --- a/.github/workflows/validate.yml +++ b/.github/workflows/validate.yml @@ -24,8 +24,11 @@ on: # A new push supersedes an unfinished validation for the same branch or PR. # Exact-SHA release gates never depend on an obsolete commit. +# Полный прогон по кнопке/ночью (#479) живёт в своей группе: первый ручной +# запуск отменил очередной push конвейера через полторы минуты — ночной +# результат обнулялся бы любым коммитом, пришедшим в то же окно. concurrency: - group: validate-${{ github.event.pull_request.number || github.ref }} + group: validate-${{ github.event_name == 'workflow_dispatch' && 'dispatch-' || '' }}${{ github.event.pull_request.number || github.ref }} cancel-in-progress: true jobs: diff --git a/test/validate-workflow.test.mjs b/test/validate-workflow.test.mjs index 28b4e2f3..7df130d1 100644 --- a/test/validate-workflow.test.mjs +++ b/test/validate-workflow.test.mjs @@ -383,3 +383,8 @@ test('мутанты по диффу гоняются на каждом пуше // Блокирующая job: свидетель, разучившийся краснеть, — отказ, а не предупреждение. assert.ok(!job.includes('continue-on-error'), 'job обязана красить прогон'); }); + +test('ручной/ночной полный прогон не делит concurrency с push (#479)', () => { + const text = read('validate.yml'); + assert.match(text, /group: validate-\$\{\{ github\.event_name == 'workflow_dispatch' && 'dispatch-' \|\| '' \}\}/); +});