ci: изолировать пайплайны на отдельной VM

- Woodpecker workflows требуют агент с меткой isolation=dedicated-vm
- шаги выполняются в lms-ci:1 с nested dockerd, без хост-Docker сокета
- ci/Dockerfile: прогретый immutable-образ (Java, Python, Node, Gradle-кэш)
- ci-dind.sh поднимает dockerd внутри privileged-шага; ci-build-image.sh собирает образ
- deploy/WOODPECKER.md: отдельная VM, firewall, отсутствие production-секретов,
  trusted repo, чек-лист безопасности
This commit is contained in:
2026-10-28 22:50:23 +03:00
parent 685916c4bd
commit f3d614bb33
15 changed files with 287 additions and 137 deletions

View File

@@ -190,8 +190,9 @@ legacy-активов на production, сдачи по выбранной лаб
push/MR выполняет workflow `check` (`test ktlintCheck detekt evidenceCheck`)
и `smoke` (`scripts/ldd-smoke.sh`: полный стек, health, вход админа, один
курс). Полный `release` обязателен для тегов и запускается вручную для
веток. Агент — local backend с Java 21, Docker Compose v2, Python 3, Node и
Chromium/Firefox/WebKit; установка — [`deploy/WOODPECKER.md`](../deploy/WOODPECKER.md).
веток. Агент — Docker backend на отдельной VM, шаги в nested dind; Java 21,
Docker Compose v2, Python 3, Node и Chromium/Firefox/WebKit; установка —
[`deploy/WOODPECKER.md`](../deploy/WOODPECKER.md).
- [ ] Заданы сроки сессии: `LMS_ACCESS_TOKEN_TTL=15m`,
`LMS_REFRESH_TOKEN_TTL=7d`, `LMS_SESSION_TIMEOUT=7d`,
`LMS_SESSION_ABSOLUTE_TIMEOUT=30d`, `LMS_REFRESH_TOKEN_RETENTION=30d`
@@ -323,10 +324,10 @@ legacy-активов на production, сдачи по выбранной лаб
1. **Прогнать инвентаризацию legacy-активов на production/staging** через
`/admin/legacy-assets` или `scripts/legacy-assets.sh`, привязать нужные
файлы к статьям, остальные удалить.
2. **Развернуть Woodpecker и проверить CI.** Поднять server и local-backend
агент по [`deploy/WOODPECKER.md`](../deploy/WOODPECKER.md), включить
репозиторий, дождаться зелёных `check`/`smoke` на push-MR и `release` на
теге.
2. **Развернуть Woodpecker и проверить CI.** Поднять server и Docker-backend
агент на отдельной VM по [`deploy/WOODPECKER.md`](../deploy/WOODPECKER.md),
включить репозиторий, дождаться зелёных `check`/`smoke` на push-MR и
`release` на теге.
3. **Дальнейшее расширение E2E** — визуальная регрессия и остальные мобильные
страницы, если UI продолжит расти.
4. **Пакетные сдачи ведомости**, если появятся курсы, где открытие ведомости

View File

@@ -1,9 +1,9 @@
# 17. Handoff: состояние проекта после закрытия продуктовых рисков
**Дата:** 2026-10-28.
**Ветка:** `feature/groups-courses` (последняя история — `git log --oneline`).
**HEAD до переделки CI:** `d98c3b0` (`feat: закрыть остаточный backlog`);
история CI-правки — следующий коммит в `git log`.
**Ветка:** `feature/groups-courses`.
**История:** `git log --oneline`; последние изменения — Woodpecker CI и
изоляция тестовой среды на отдельной VM.
**Пуш:** не выполнялся.
**Рабочее дерево:** чистое. `exports/` и `texput.log` игнорируются и в коммиты не входят.
@@ -129,6 +129,8 @@
вход админа, один курс;
- `release` на тег или вручную: тесты, миграции, mutation, runtime/load,
browser E2E, финальный evidence.
- workflows требуют метку `isolation=dedicated-vm`; шаги идут в nested dind
без хост-Docker сокета, агент — на отдельной VM без production-доступа.
- `scripts/ci-preflight.sh` проверяет Java 21, Docker Compose v2, Python 3,
Node и Playwright. Установка server/agent — `deploy/WOODPECKER.md`.
- Первый реальный Woodpecker pipeline ещё не подтверждён.
@@ -211,11 +213,10 @@ cat build/reports/evidence/index.md
у обычных пользователей.
2. **Первый реальный CI-прогон.**
Развернуть Woodpecker server и local-backend агент по
Развернуть Woodpecker server и Docker-backend агент на отдельной VM по
`deploy/WOODPECKER.md`, включить репозиторий в Woodpecker и дождаться
зелёных workflow `check`/`smoke` на push-MR и `release` на теге. Агенту
нужны Java 21, Docker Compose v2, Python 3, Node и браузеры
Chromium/Firefox/WebKit.
зелёных workflow `check`/`smoke` на push-MR и `release` на теге. Шаги идут
в nested dind; VM не имеет доступа к production и production-секретам.
3. **Визуальная регрессия и мобильный набор E2E.**
Сейчас 6 сценариев × 3 браузера, без screenshot-diff. Добавлять по мере
@@ -299,7 +300,9 @@ cat build/reports/evidence/index.md
`SessionCookieRefreshFilter.kt`.
- `web/.../admin/AdminAuditController.kt`, `LegacyAssetsController.kt`.
- `services/gateway/.../JwtAuthenticationFilter.kt`.
- `scripts/ldd-*.sh`, `scripts/ci-preflight.sh`, `scripts/legacy-assets.sh`.
- `scripts/ldd-*.sh`, `scripts/ci-preflight.sh`, `scripts/ci-dind.sh`,
`scripts/ci-build-image.sh`, `scripts/legacy-assets.sh`.
- `.woodpecker/{check,smoke,release}.yaml` — CI на Gitea + Woodpecker.
- `ci/Dockerfile` — прогретый образ `lms-ci:1` для изолированного dind.
- `deploy/backup.sh`, `deploy/deploy.sh`, `deploy/DEPLOY.md`,
`deploy/WOODPECKER.md`.

View File

@@ -240,6 +240,8 @@ mutation, runtime + scale и browser E2E, затем финальный `evidenc
на каждом push/MR, после `check`;
- `release` — полный `ldd-release.sh` с Chromium/Firefox/WebKit и Node:
обязателен для тегов, для веток запускается вручную.
- workflows требуют метку `isolation=dedicated-vm`; агент работает на
отдельной VM, шаги — в `lms-ci:1` с nested dockerd и без хост-Docker сокета.
- smoke/release начинаются с `scripts/ci-preflight.sh`, который проверяет
Java 21, Docker Compose v2, Python 3, Node и Playwright.
- Первый реальный прогон на Woodpecker-агенте ещё не подтверждён; локальные
@@ -293,8 +295,8 @@ optional json fields`.
6. **Инвентаризация legacy-активов на production не выполнена.** UI, API и
скрипт готовы, но реальные файлы нужно привязать или удалить вручную.
7. **Первый CI-прогон не подтверждён.** Конфигурация `.woodpecker/` и
preflight готовы, но Woodpecker-сервер и local-backend агент ещё нужно
развернуть и проверить на первом push-MR и теге.
preflight готовы, но Woodpecker-сервер и Docker-backend агент на отдельной
VM ещё нужно развернуть и проверить на первом push-MR и теге.
8. **Полный release не на каждом коммите.** На push/MR идёт smoke,
а mutation/browser/scale — для тегов или вручную.
9. **Интеграция «Контингент» исключена из плана** — без нового ТЗ и доступа к