fix(ci): remove npm cache from setup-node to fix push trigger failure #13

Closed
opened 2026-08-07 17:42:47 +03:00 by slaid098 · 0 comments
Owner

Контекст

После переноса ci.yml в .forgejo/workflows/ (PR #12, issue #10) триггер pull_request восстановлен — CI запускается на PR. Однако на push (merge в main) ci.yml падает на шаге actions/setup-node@v4 с cache: "npm":

❌  Failure - Main actions/setup-node@v4
lstat /root/.cache/act/.../eslint.config.mjs: no such file or directory

setup-node@v4 с cache: "npm" ищет eslint.config.mjs (дефолтный cache-dependency-path для npm-cache) — которого нет в проекте (используется Biome, не ESLint). На pull_request (run id=127) cache успешно restored (ключ node-cache-linux-x64-npm-...), на push (run id=128) — падает на lstat. Нестабильность кэша act runner (Forgejo использует act для эмуляции GitHub Actions).

Задача

  1. Убрать cache: "npm" из actions/setup-node@v4 в .forgejo/workflows/ci.yml — кэш npm не критичен, npm ci deterministic по package-lock.json и достаточно быстр (~10-15с на CI runner).
  2. Альтернатива (если кэш нужен): указать cache-dependency-path: "package-lock.json" явно — setup-node будет искать package-lock.json вместо eslint.config.mjs для валидации cache-key.
  3. Проверить: push на main триггерит ci.yml → status=success (после правки).

Контракты

  • ci.yml остаётся в .forgejo/workflows/ (issue #10 фикс сохранён).
  • Триггеры pull_request + push на main — не меняются.
  • Steps: checkout → setup-node → npm ci → lint → typecheck → knip → test → build — не меняются (только параметр cache у setup-node).
  • runs-on: ubuntu-latest, node-version: "22" — сохраняются.

Инварианты

  • CI quality-gate (lint + typecheck + knip + test + build) остаётся обязательным на PR и push.
  • npm run build в CI — единственный детектор клиент/серверных границ. Без CI-билда такие баги проходят (локальные lint/typecheck/test/knip НЕ ловят).
  • pipeline-status oracle использует presence CI checks для вердикта. Если ci.yml падает на push — pipeline-status после merge покажет CI failure (не блокирует merge, но сигнал регрессии).

Граничные случаи

  • На pull_request cache может restored (успех) даже с дефолтным eslint.config.mjs — если cache-key уже валиден в runner. На push — падает. Поведение nondeterministic.
  • После удаления cache: "npm"npm ci всегда выполняется полностью (нет cache restore). Замедление ~10-15с на каждом run. Приемлемо для CI.
  • cache-dependency-path: "package-lock.json" — если кэш runner поддерживает этот путь, сохранит кэширование. Но act может иметь баги с custom dependency-path. Тестировать.

Влияние на связанные компоненты

  • .forgejo/workflows/ci.yml — единственное изменение.
  • .forgejo/workflows/deploy.yml — НЕ трогается (deploy работает, run id=129 success).
  • pipeline-status — после фикса ci.yml на push = success, oracle покажет CI после merge (не failure).
  • run-pipeline skill — после фикса CI-фаза полностью детерминированная (pull_request + push оба зелёные).

Вне scope

  • Миграция на uv/pnpm (проект на npm, package-lock.json).
  • Настройка self-hosted runner вместо act (инфра-решение, отдельная задача).
  • Разделение ci.yml на параллельные jobs (lint, test, build — будущий enhancement).
  • Контент deploy.yml (работает, не трогать).

Критерии приемки

  • cache: "npm" убран из actions/setup-node@v4 (или cache-dependency-path: "package-lock.json" добавлен).
  • Push на main триггерит ci.yml → status=success (run виден в /actions/runs, event=push).
  • Pull_request триггерит ci.yml → status=success (регрессии нет, run id=127 остался зелёным).
  • pipeline-status после merge нового PR → CI на push (не failure).
  • Логи /actions/jobs/{id}/logs — нет lstat eslint.config.mjs ошибки.
## Контекст После переноса `ci.yml` в `.forgejo/workflows/` (PR #12, issue #10) триггер `pull_request` восстановлен — CI запускается на PR. Однако на `push` (merge в main) ci.yml падает на шаге `actions/setup-node@v4` с `cache: "npm"`: ``` ❌ Failure - Main actions/setup-node@v4 lstat /root/.cache/act/.../eslint.config.mjs: no such file or directory ``` `setup-node@v4` с `cache: "npm"` ищет `eslint.config.mjs` (дефолтный cache-dependency-path для npm-cache) — которого нет в проекте (используется Biome, не ESLint). На `pull_request` (run id=127) cache успешно restored (ключ `node-cache-linux-x64-npm-...`), на `push` (run id=128) — падает на `lstat`. Нестабильность кэша `act` runner (Forgejo использует `act` для эмуляции GitHub Actions). ## Задача 1. Убрать `cache: "npm"` из `actions/setup-node@v4` в `.forgejo/workflows/ci.yml` — кэш npm не критичен, `npm ci` deterministic по `package-lock.json` и достаточно быстр (~10-15с на CI runner). 2. Альтернатива (если кэш нужен): указать `cache-dependency-path: "package-lock.json"` явно — `setup-node` будет искать `package-lock.json` вместо `eslint.config.mjs` для валидации cache-key. 3. Проверить: push на main триггерит ci.yml → status=success (после правки). ## Контракты - ci.yml остаётся в `.forgejo/workflows/` (issue #10 фикс сохранён). - Триггеры `pull_request` + `push` на `main` — не меняются. - Steps: checkout → setup-node → npm ci → lint → typecheck → knip → test → build — не меняются (только параметр `cache` у setup-node). - `runs-on: ubuntu-latest`, `node-version: "22"` — сохраняются. ## Инварианты - CI quality-gate (lint + typecheck + knip + test + build) остаётся обязательным на PR и push. - `npm run build` в CI — единственный детектор клиент/серверных границ. Без CI-билда такие баги проходят (локальные lint/typecheck/test/knip НЕ ловят). - `pipeline-status` oracle использует presence CI checks для вердикта. Если ci.yml падает на push — `pipeline-status` после merge покажет CI failure (не блокирует merge, но сигнал регрессии). ## Граничные случаи - На pull_request cache может restored (успех) даже с дефолтным `eslint.config.mjs` — если cache-key уже валиден в runner. На push — падает. Поведение nondeterministic. - После удаления `cache: "npm"` — `npm ci` всегда выполняется полностью (нет cache restore). Замедление ~10-15с на каждом run. Приемлемо для CI. - `cache-dependency-path: "package-lock.json"` — если кэш runner поддерживает этот путь, сохранит кэширование. Но `act` может иметь баги с custom dependency-path. Тестировать. ## Влияние на связанные компоненты - `.forgejo/workflows/ci.yml` — единственное изменение. - `.forgejo/workflows/deploy.yml` — НЕ трогается (deploy работает, run id=129 success). - `pipeline-status` — после фикса ci.yml на push = success, oracle покажет CI ✅ после merge (не failure). - `run-pipeline` skill — после фикса CI-фаза полностью детерминированная (pull_request + push оба зелёные). ## Вне scope - Миграция на `uv`/`pnpm` (проект на npm, `package-lock.json`). - Настройка self-hosted runner вместо `act` (инфра-решение, отдельная задача). - Разделение ci.yml на параллельные jobs (lint, test, build — будущий enhancement). - Контент deploy.yml (работает, не трогать). ## Критерии приемки - `cache: "npm"` убран из `actions/setup-node@v4` (или `cache-dependency-path: "package-lock.json"` добавлен). - Push на main триггерит ci.yml → status=success (run виден в `/actions/runs`, event=push). - Pull_request триггерит ci.yml → status=success (регрессии нет, run id=127 остался зелёным). - `pipeline-status` после merge нового PR → CI ✅ на push (не failure). - Логи `/actions/jobs/{id}/logs` — нет `lstat eslint.config.mjs` ошибки.
Sign in to join this conversation.
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#13
No description provided.