fix(ci): set cache-dependency-path to package-lock.json #16

Merged
slaid098 merged 1 commit from fix/ci-setup-node-cache-dependency-path into main 2026-08-07 18:08:28 +03:00
Owner

Что сделано

Добавлена 1 строка в .forgejo/workflows/ci.yml: cache-dependency-path: "package-lock.json" к actions/setup-node@v4.

Изменение

- uses: actions/setup-node@v4
  with:
    node-version: "22"
    cache: "npm"
    cache-dependency-path: "package-lock.json"   # ← добавлено

Почему

Root cause: setup-node@v4 с cache: "npm" вычисляет cache-key, ища lock-файл по дефолтному списку путей. act-эмуляция на Forgejo runner имеет устаревший/сломанный дефолт — идёт к eslint.config.mjs (fallback), которого нет в проекте (используется Biome). lstat /root/.cache/act/.../eslint.config.mjs: no such file or directory → failure.

Почему pull_request работал, а push падал: act runner в Docker-контейнере, cache в /opt/hostedtoolcache per-container (не персистит между запусками).

  • pull_request: контейнер с разогретым cache → setup-node restored, не вычислял ключ → до lstat не дошёл → success
  • push: свежий контейнер / после GC → cache miss → вычисление ключа → lstat eslint.config.mjs → failure

Фикс: cache-dependency-path: "package-lock.json" — явный путь, обходит дефолтный path-finding. setup-node читает package-lock.json (есть в репо, 109KB) → хэширует → cache-key. lstat eslint.config.mjs НЕ вызывается. Оба триггера (pull_request + push) вычисляют ключ идентично через package-lock.json.

Watch out

  • CI на этом PR: pull_request должен быть success (как и раньше). Реальная проверка фикса — push после merge (run с event=push, status должен быть success, не failure).
  • act custom cache-dependency-path: стандартная опция setup-node@v4, act поддерживает. Если упадёт — вернёмся к удалению cache: npm (Вариант A, медленнее на ~15с, но 100% надёжно).
  • Cache-key изменение: после этого PR cache-key изменится (новый dependency-path) → первый run после merge будет cold (cache save, не restore). Последующие runs с тем же package-lock.json — cache restore, быстро.

Pending

  • Проверить после merge: push на main → ci.yml run → status=success (не failure). Логи: Cache restored from key: node-cache-linux-x64-npm-<hash> или Cache saved.
  • Обновить memory slaid098-dev-002.md — issue #13 закрыт, root cause + фикс задокументированы.

Closes #13

## Что сделано Добавлена 1 строка в `.forgejo/workflows/ci.yml`: `cache-dependency-path: "package-lock.json"` к `actions/setup-node@v4`. ### Изменение ```yaml - uses: actions/setup-node@v4 with: node-version: "22" cache: "npm" cache-dependency-path: "package-lock.json" # ← добавлено ``` ## Почему **Root cause**: `setup-node@v4` с `cache: "npm"` вычисляет cache-key, ища lock-файл по дефолтному списку путей. `act`-эмуляция на Forgejo runner имеет устаревший/сломанный дефолт — идёт к `eslint.config.mjs` (fallback), которого нет в проекте (используется Biome). `lstat /root/.cache/act/.../eslint.config.mjs: no such file or directory` → failure. **Почему pull_request работал, а push падал**: `act` runner в Docker-контейнере, cache в `/opt/hostedtoolcache` per-container (не персистит между запусками). - pull_request: контейнер с разогретым cache → `setup-node` restored, не вычислял ключ → до lstat не дошёл → success - push: свежий контейнер / после GC → cache miss → вычисление ключа → lstat `eslint.config.mjs` → failure **Фикс**: `cache-dependency-path: "package-lock.json"` — явный путь, обходит дефолтный path-finding. `setup-node` читает `package-lock.json` (есть в репо, 109KB) → хэширует → cache-key. `lstat eslint.config.mjs` НЕ вызывается. Оба триггера (pull_request + push) вычисляют ключ идентично через `package-lock.json`. ## Watch out - **CI на этом PR**: pull_request должен быть success (как и раньше). Реальная проверка фикса — **push после merge** (run с event=push, status должен быть success, не failure). - **`act` custom cache-dependency-path**: стандартная опция `setup-node@v4`, `act` поддерживает. Если упадёт — вернёмся к удалению `cache: npm` (Вариант A, медленнее на ~15с, но 100% надёжно). - **Cache-key изменение**: после этого PR cache-key изменится (новый dependency-path) → первый run после merge будет cold (cache save, не restore). Последующие runs с тем же `package-lock.json` — cache restore, быстро. ## Pending - Проверить после merge: push на main → ci.yml run → status=success (не failure). Логи: `Cache restored from key: node-cache-linux-x64-npm-<hash>` или `Cache saved`. - Обновить memory `slaid098-dev-002.md` — issue #13 закрыт, root cause + фикс задокументированы. Closes #13
fix(ci): set cache-dependency-path to package-lock.json
All checks were successful
CI / check (pull_request) Successful in 1m59s
1651373a89
- setup-node@v4 с cache: npm падает на push (lstat eslint.config.mjs: no such file)
- act-эмуляция setup-node имеет устаревший дефолт cache-dependency-path — ищет eslint.config.mjs (нет, проект на Biome)
- cache-dependency-path: package-lock.json — явный путь, обходит дефолтный path-finding
- pull_request работал (cache restored), push падал (cache miss → вычисление ключа → lstat)
- после фикса оба триггера вычисляют ключ через package-lock.json (есть всегда)

Closes #13
Author
Owner

Code Review Summary

Инфра-фикс в 1 строку: cache-dependency-path: "package-lock.json" добавлен к actions/setup-node@v4 в .forgejo/workflows/ci.yml. Закрывает issue #13 (npm cache bug на push).

Проверено

  • Diff: ровно 1 строка добавлена, 0 удалено — git diff --stat подтверждает 1 file changed, 1 insertion(+).
  • Контекст опции: cache-dependency-path стоит внутри with: блока setup-node@v4 (строка 19), рядом с cache: "npm" (строка 18) — стандартная и документированная опция для кэширования npm.
  • package-lock.json существует в корне репо (109 KB) — путь валиден.
  • CI green на pull_request (run id=134) — подтверждено через pipeline-status.

Positives

  • Минимальный, точечный фикс — ничего лишнего.
  • Явное указание cache-dependency-path надёжнее дефолта: устраняет неоднозначность поиска lock-файла на push event (вероятная причина бага #13).

Suggestions (info, not blocking)

  • ci.yml Реальная проверка фикса наступит только на push event после merge в main (workflow триггерится на push, строка 6-7). На pull_request кэш уже работал — баг воспроизводился именно на push. Рекомендую после merge сделать пустой коммит или дождаться первого push в main, чтобы убедиться, что cache hit проходит без ошибок.

Verdict: APPROVE

## Code Review Summary Инфра-фикс в 1 строку: `cache-dependency-path: "package-lock.json"` добавлен к `actions/setup-node@v4` в `.forgejo/workflows/ci.yml`. Закрывает issue #13 (npm cache bug на push). ### Проверено - **Diff**: ровно 1 строка добавлена, 0 удалено — `git diff --stat` подтверждает `1 file changed, 1 insertion(+)`. - **Контекст опции**: `cache-dependency-path` стоит внутри `with:` блока `setup-node@v4` (строка 19), рядом с `cache: "npm"` (строка 18) — стандартная и документированная опция для кэширования npm. - **`package-lock.json` существует** в корне репо (109 KB) — путь валиден. - **CI green** на pull_request (run id=134) — подтверждено через `pipeline-status`. ### Positives - Минимальный, точечный фикс — ничего лишнего. - Явное указание `cache-dependency-path` надёжнее дефолта: устраняет неоднозначность поиска lock-файла на push event (вероятная причина бага #13). ### Suggestions (info, not blocking) - **ci.yml** Реальная проверка фикса наступит только на `push` event после merge в `main` (workflow триггерится на push, строка 6-7). На pull_request кэш уже работал — баг воспроизводился именно на push. Рекомендую после merge сделать пустой коммит или дождаться первого push в main, чтобы убедиться, что cache hit проходит без ошибок. ### Verdict: APPROVE
slaid098 deleted branch fix/ci-setup-node-cache-dependency-path 2026-08-07 18:08:28 +03:00
Sign in to join this conversation.
No reviewers
No labels
bug
performance
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
slaid098/slaid098-dev!16
No description provided.