From 59ae6b106493d06adcaece94f9d1098f9cf5190f Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 28 Aug 2026 08:00:51 +0300 Subject: [PATCH] =?UTF-8?q?ci:=20=D0=BF=D0=BE=D0=BB=D0=BD=D0=B0=D1=8F=20?= =?UTF-8?q?=D0=B8=D1=81=D1=82=D0=BE=D1=80=D0=B8=D1=8F=20=D0=B1=D0=B5=D0=B7?= =?UTF-8?q?=20=D0=B1=D0=BB=D0=BE=D0=B1=D0=BE=D0=B2=20=D1=82=D0=B0=D0=BC,?= =?UTF-8?q?=20=D0=B3=D0=B4=D0=B5=20=D1=81=D0=BE=D0=B4=D0=B5=D1=80=D0=B6?= =?UTF-8?q?=D0=B8=D0=BC=D0=BE=D0=B5=20=D1=81=D1=82=D0=B0=D1=80=D1=8B=D1=85?= =?UTF-8?q?=20=D1=84=D0=B0=D0=B9=D0=BB=D0=BE=D0=B2=20=D0=BD=D0=B5=20=D0=BD?= =?UTF-8?q?=D1=83=D0=B6=D0=BD=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Полный клон — 215 МБ .git, blobless — 26 МБ, история коммитов и теги в обоих полные (замер в #345). Две job Validate качают историю целиком: preflight и changes. Первой нужны сообщения коммитов, трейлеры и имена изменённых файлов, второй — только `git diff --name-only`. Содержимое старых ревизий не читает ни одна из них ни на одном шаге. Коммиты и деревья по-прежнему скачиваются полностью, поэтому диапазоны и merge-base работают как раньше. Единственная догрузка блоба по требованию — `git show origin/main:.github/workflows/process.yml` в шаге сверки, один файл. Браузерным job фильтр не нужен: у них глубина по умолчанию, истории они не касаются вовсе. Тест закрепляет и обратную сторону: --depth=1 сюда подставлять нельзя, он того же размера, но без merge-base, а на нём стоят процессный гейт, smoke-select и каждый диапазон origin/dev..HEAD. Два мутанта проверены руками — снятый фильтр и подмена на depth=1, — каждый убит. Issue: #345 User-Visible: no --- .github/workflows/validate.yml | 14 ++++++++++++-- test/validate-workflow.test.mjs | 19 +++++++++++++++++++ 2 files changed, 31 insertions(+), 2 deletions(-) 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: диапазоны и процессный гейт перестают работать'); +});