diff --git a/.github/workflows/validate.yml b/.github/workflows/validate.yml index f54d1c46..7afbe883 100644 --- a/.github/workflows/validate.yml +++ b/.github/workflows/validate.yml @@ -33,8 +33,16 @@ jobs: name: "Предполётные проверки: документация, провенанс, процесс" runs-on: ubuntu-latest steps: + # `blob:none` при полной истории (#345): этой job нужны сообщения + # коммитов, трейлеры и ИМЕНА изменённых файлов, а не содержимое старых + # ревизий. Полный клон стоит 215 МБ против 26 МБ, и 32% этого веса — + # скриншоты документации, переснятые 196 раз. + # + # Коммиты и деревья скачиваются целиком, поэтому диапазоны и `merge-base` + # работают как раньше. Единственная догрузка по требованию здесь — + # `git show origin/main:.github/workflows/process.yml`: один блоб. - uses: actions/checkout@v7 - with: { fetch-depth: 0 } + with: { fetch-depth: 0, filter: 'blob:none' } - uses: actions/setup-node@v7 with: { node-version: 22 } @@ -137,8 +145,10 @@ jobs: backend: ${{ steps.classify.outputs.backend }} integration: ${{ steps.classify.outputs.integration }} steps: + # `git diff --name-only` содержимого файлов не читает вовсе, поэтому + # блобы истории этой job не нужны ни на одном шаге (#345). - uses: actions/checkout@v7 - with: { fetch-depth: 0 } + with: { fetch-depth: 0, filter: 'blob:none' } - id: classify env: EVENT_NAME: ${{ github.event_name }} diff --git a/test/validate-workflow.test.mjs b/test/validate-workflow.test.mjs index 0b17ba20..97ccb2a8 100644 --- a/test/validate-workflow.test.mjs +++ b/test/validate-workflow.test.mjs @@ -70,3 +70,22 @@ test('предполётные проверки не прячут друг др assert.equal(preflight.match(/continue-on-error: true/g)?.length, 4); assert.ok(preflight.includes('exit $fail'), 'вердикт обязан падать сам'); }); + +test('джобы с полной историей качают её без блобов (#345)', () => { + const workflow = read('validate.yml'); + // Полный клон — 215 МБ .git, blobless — 26 МБ, история и теги в обоих полные + // (замер в #345). Обе эти job читают сообщения коммитов и ИМЕНА изменённых + // файлов; содержимое старых ревизий им не нужно ни на одном шаге. + for (const job of ['preflight', 'changes']) { + const start = workflow.indexOf(` ${job}:`); + assert.ok(start > 0, `нет job ${job}`); + const chunk = workflow.slice(start, start + 1400); + assert.match(chunk, /fetch-depth: 0, filter: 'blob:none'/, + `${job} обязана качать историю без блобов`); + } + // Обратная сторона: --depth=1 сюда подставлять нельзя. Он того же размера, но + // без merge-base, а на нём стоят процессный гейт, smoke-select и каждый + // диапазон origin/dev..HEAD. + assert.equal(workflow.includes('fetch-depth: 1'), false, + 'shallow-клон ломает merge-base: диапазоны и процессный гейт перестают работать'); +});