chore(ci): деплой на изменение ролей, ruff-гейт для МЕРЫ, удаление мёртвого workflow #2748

Closed
lekss361 wants to merge 1 commit from chore/ci-config-cleanup into main
Owner

Волна 0 инвентаризации техдолга. Три правки конфигурации, все подтверждены проверкой перед внесением.

1. Изменение прав вступало в силу в случайный момент (Птица)

auth/** отсутствовал в on.push.paths у deploy.yml. Роли читаются из auth/roles.yaml (bind-mount, docker-compose.prod.yml:139), а backend/app/core/auth.py:74 держит их под @lru_cache(maxsize=1) на всё время жизни процесса — сбросить можно только рестартом.

Следствие: правка ролей не запускала ни один деплой, и новые права применялись тогда, когда чей-то посторонний мерж случайно пересоздавал контейнер.

Тонкость реализации: путь добавлен только в верхнеуровневый on.push.paths, но не в changes-фильтр infra. Причина: deploy.yml в конце безусловно делает up -d --force-recreate --no-deps backend worker beat, то есть самого запуска workflow достаточно для сброса кэша. Добавление в infra вызвало бы бесполезную пересборку и публикацию идентичных образов.

2. Линтер не запускался в CI (МЕРА)

Добавлен блокирующий шаг ruff check в job backend-tests.

При включении всплыли три срабатывания RUF059 в test_estimator_pure_units.py:381. Разобрана причина расхождения, о котором говорил аудит: .pre-commit-config.yaml пиннит ruff 0.7.4, а uv.lock — 0.15.20. То есть локальная проверка физически не видела этих правил, их ловит только CI.

Выбрано чистить код, а не понижать версию: pyproject.toml объявляет ruff>=0.5.0 без верхней границы, и откат лока пошёл бы против намерения зависимости, отложив проблему до следующего обновления. Правка — переход на _ для неиспользуемых значений распаковки, ровно та же конвенция уже применена в трёх соседних тестах того же файла.

3. Мёртвый конфиг вводил в заблуждение

  • .github/workflows/ci.yml удалён — Forgejo его не исполняет, зеркало на GitHub отстало на 522 коммита. Блок с сервисом postgis перенесён в .forgejo/workflows/ci.yml закомментированным образцом: тестов против живой БД в проекте нет ни одного, и когда их будут заводить, заготовка пригодится.
  • README.md — mypy был приписан гейту CI, где его нет. Исправлено на фактическое положение дел.

Проверка

  • YAML разбирается во всех трёх изменённых workflow.
  • actionlint — код возврата 0 на всех трёх. Инструмент предварительно проверен на намеренно сломанном YAML, чтобы убедиться, что он действительно ловит ошибки, а не молчит всегда.
  • ruff check на всём backend МЕРЫ версией из лока — чисто.
  • Хуки pre-commit зелёные.
  • Диффы paths — только добавления, все прежние пути на месте (проверено отдельно: тихая поломка триггеров деплоя — самый вероятный способ навредить этой правкой).

deploy-tradein.yml не тронут — по нему висит открытый PR #2680.

Волна 0 инвентаризации техдолга. Три правки конфигурации, все подтверждены проверкой перед внесением. ## 1. Изменение прав вступало в силу в случайный момент (Птица) `auth/**` отсутствовал в `on.push.paths` у `deploy.yml`. Роли читаются из `auth/roles.yaml` (bind-mount, `docker-compose.prod.yml:139`), а `backend/app/core/auth.py:74` держит их под `@lru_cache(maxsize=1)` на всё время жизни процесса — сбросить можно только рестартом. Следствие: правка ролей не запускала ни один деплой, и новые права применялись тогда, когда чей-то посторонний мерж случайно пересоздавал контейнер. **Тонкость реализации:** путь добавлен только в верхнеуровневый `on.push.paths`, но **не** в `changes`-фильтр `infra`. Причина: `deploy.yml` в конце безусловно делает `up -d --force-recreate --no-deps backend worker beat`, то есть самого запуска workflow достаточно для сброса кэша. Добавление в `infra` вызвало бы бесполезную пересборку и публикацию идентичных образов. ## 2. Линтер не запускался в CI (МЕРА) Добавлен блокирующий шаг `ruff check` в job `backend-tests`. При включении всплыли три срабатывания `RUF059` в `test_estimator_pure_units.py:381`. Разобрана причина расхождения, о котором говорил аудит: `.pre-commit-config.yaml` пиннит ruff 0.7.4, а `uv.lock` — 0.15.20. То есть **локальная проверка физически не видела этих правил**, их ловит только CI. Выбрано чистить код, а не понижать версию: `pyproject.toml` объявляет `ruff>=0.5.0` без верхней границы, и откат лока пошёл бы против намерения зависимости, отложив проблему до следующего обновления. Правка — переход на `_` для неиспользуемых значений распаковки, ровно та же конвенция уже применена в трёх соседних тестах того же файла. ## 3. Мёртвый конфиг вводил в заблуждение - `.github/workflows/ci.yml` удалён — Forgejo его не исполняет, зеркало на GitHub отстало на 522 коммита. Блок с сервисом postgis перенесён в `.forgejo/workflows/ci.yml` закомментированным образцом: тестов против живой БД в проекте нет ни одного, и когда их будут заводить, заготовка пригодится. - `README.md` — mypy был приписан гейту CI, где его нет. Исправлено на фактическое положение дел. ## Проверка - YAML разбирается во всех трёх изменённых workflow. - `actionlint` — код возврата 0 на всех трёх. Инструмент предварительно проверен на намеренно сломанном YAML, чтобы убедиться, что он действительно ловит ошибки, а не молчит всегда. - `ruff check` на всём backend МЕРЫ версией из лока — чисто. - Хуки pre-commit зелёные. - Диффы `paths` — только добавления, все прежние пути на месте (проверено отдельно: тихая поломка триггеров деплоя — самый вероятный способ навредить этой правкой). `deploy-tradein.yml` не тронут — по нему висит открытый PR #2680.
lekss361 added 1 commit 2026-08-06 17:27:11 +00:00
chore(ci): деплой на изменение ролей, ruff-гейт для МЕРЫ, удаление мёртвого workflow
All checks were successful
CI Trade-In / changes (pull_request) Successful in 9s
CI / changes (pull_request) Successful in 7s
CI Trade-In / browser-tests (pull_request) Successful in 47s
CI / frontend-tests (pull_request) Successful in 1m39s
CI Trade-In / frontend-checks (pull_request) Successful in 1m41s
CI / openapi-codegen-check (pull_request) Successful in 2m21s
CI Trade-In / backend-tests (pull_request) Successful in 3m32s
CI / backend-tests (pull_request) Successful in 15m25s
79a130736f
- deploy.yml: добавлен auth/** в path-триггеры. app.core.auth кэширует
  roles.yaml на весь lifetime процесса (@lru_cache) — без триггера правка
  ролей молча не применялась до случайного чужого деплоя.
- ci-tradein.yml: добавлен блокирующий шаг `ruff check` — гейт для tradein
  backend его не гонял вообще. Заодно почищены 3 срабатывания RUF059
  (unused unpacked vars) в test_estimator_pure_units.py:381 — версия ruff,
  зафиксированная в uv.lock (0.15.20), новее той, на которой аудит проверял
  "чистое дерево" (0.7.4, как в .pre-commit-config.yaml); лок не трогаем —
  правим 3 места по established convention (`_` уже используется в 3 других
  тестах того же файла).
- Удалён мёртвый .github/workflows/ci.yml (Forgejo его не исполняет; GitHub
  mirror отстал на 500+ коммитов). Блок postgis-service перенесён как
  закомментированный образец в .forgejo/workflows/ci.yml (тестов против
  живой БД пока нет ни одного).
- README.md: убрана ложная привязка mypy к живому CI-гейту (его там нет,
  только ruff+pytest+coverage); убран stale-блок про .github/workflows/
  (deploy-obsidian.yml там больше не лежит).
lekss361 closed this pull request 2026-08-06 18:36:11 +00:00
All checks were successful
CI Trade-In / changes (pull_request) Successful in 9s
CI / changes (pull_request) Successful in 7s
CI Trade-In / browser-tests (pull_request) Successful in 47s
CI / frontend-tests (pull_request) Successful in 1m39s
CI Trade-In / frontend-checks (pull_request) Successful in 1m41s
CI / openapi-codegen-check (pull_request) Successful in 2m21s
CI Trade-In / backend-tests (pull_request) Successful in 3m32s
CI / backend-tests (pull_request) Successful in 15m25s

Pull request closed

Sign in to join this conversation.
No reviewers
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: lekss361/gendesign#2748
No description provided.