mirror of
https://github.com/Matysh/houseplan-card
synced 2026-09-29 03:09:36 +00:00
ci: полная история без блобов там, где содержимое старых файлов не нужно
Полный клон — 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
This commit is contained in:
@@ -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 }}
|
||||
|
||||
@@ -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: диапазоны и процессный гейт перестают работать');
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user