ci: перевести merge gate на Gitea + Woodpecker
- .woodpecker/check.yaml, smoke.yaml, release.yaml - local-backend агент: Java 21, Docker Compose v2, Python 3, Node/Playwright - concurrency lms-ci, чтобы smoke/release не занимали порты одновременно - deploy/WOODPECKER.md: server, OAuth Gitea, systemd-агент, security note - удалён .gitlab-ci.yml
This commit is contained in:
@@ -196,12 +196,12 @@
|
||||
привязка групп, авторские материалы курса.
|
||||
- Полная security-матрица и negative-тесты «свой/чужой курс».
|
||||
- Upgrade-тест миграций.
|
||||
- Индексы; пагинация аудита и bulk-выдача групп с именами — выполнены;
|
||||
оставшийся N+1 в отдельных лабораторных списках — follow-up (§ 9.1).
|
||||
- Индексы; keyset-пагинация аудита, bulk-выдача групп и пакетные детали
|
||||
лабораторных — выполнены.
|
||||
- Аудит скачиваний и чувствительных действий (`identity.audit_events`,
|
||||
`/admin/audit`).
|
||||
- CI merge gate: `test ktlintCheck detekt evidenceCheck` и smoke полного стека
|
||||
на каждом push/MR; полный `release-evidence` — для тегов/вручную.
|
||||
- CI на Gitea + Woodpecker: `check` (`test ktlintCheck detekt evidenceCheck`)
|
||||
и `smoke` на каждом push/MR; полный `release` — для тегов/вручную.
|
||||
- Проверка backup: создание, retention, `verify`, restore на staging.
|
||||
- Документация, deploy/runbook, smoke.
|
||||
|
||||
@@ -357,8 +357,9 @@ identity V13, **academic V12**, progress V13.
|
||||
- **Сессии.** Web-сессия скользящая 7 дней, абсолютный потолок 30 дней
|
||||
(`LMS_SESSION_ABSOLUTE_TIMEOUT`); истёкшие refresh-токены чистит ночная
|
||||
задача (`LMS_REFRESH_TOKEN_RETENTION`).
|
||||
- **CI.** Конфигурация и `ci-preflight.sh` готовы; первый реальный pipeline
|
||||
на GitLab shell-runners ещё нужно подтвердить.
|
||||
- **CI.** Конфигурация `.woodpecker/` и `ci-preflight.sh` готовы; Woodpecker
|
||||
server/agent и первый реальный pipeline ещё нужно развернуть и подтвердить
|
||||
(`deploy/WOODPECKER.md`).
|
||||
- **Внешняя интеграция «Контингент»/`next.uniyar.ac.ru` исключена из плана**
|
||||
до появления нового ТЗ и доступа к API.
|
||||
|
||||
@@ -378,7 +379,8 @@ identity V13, **academic V12**, progress V13.
|
||||
7 дней sliding с абсолютным потолком 30 дней; logout, смена пароля и
|
||||
закрытие доступа отзывают refresh.
|
||||
- Security-матрица и миграционный upgrade-тест зелёные (identity до `V13`).
|
||||
- CI на каждом push/MR прогоняет `test ktlintCheck detekt evidenceCheck` и
|
||||
smoke полного стека; полный release-evidence обязателен для тегов.
|
||||
- CI (Gitea + Woodpecker) на каждом push/MR прогоняет
|
||||
`test ktlintCheck detekt evidenceCheck` и smoke полного стека; полный
|
||||
`release` обязателен для тегов.
|
||||
- Backup перед деплоем обязателен; restore проверен на staging.
|
||||
- Документация, deploy/runbook и smoke обновлены.
|
||||
|
||||
@@ -76,8 +76,8 @@
|
||||
После закрытия рисков актуальный LDD-baseline — **346 тестов, 0 failures**
|
||||
(см. раздел 7). `ktlintCheck` и `detekt` прошли без замечаний. У gateway теперь есть unit-тесты публичных auth-путей и 401; маршрутизация
|
||||
gateway дополнительно проверена конфигурацией и security-матрицей ниже.
|
||||
Тот же набор команд выполняет `.gitlab-ci.yml`; на каждый push/MR добавлен
|
||||
smoke-job, полный release-evidence обязателен для тегов.
|
||||
Тот же набор команд выполняет `.woodpecker/` (Gitea + Woodpecker 3.x); на
|
||||
каждый push/MR добавлен smoke-workflow, полный release обязателен для тегов.
|
||||
|
||||
### 2.2. Upgrade-тест миграций
|
||||
|
||||
@@ -186,13 +186,12 @@ legacy-активов на production, сдачи по выбранной лаб
|
||||
Там же задан `LMS_DB_PASSWORD`; `.env.prod` не коммитится.
|
||||
- [ ] Проверить, что на сервере нет незакоммиченных изменений и выполнен
|
||||
`git pull` нужной ветки/тега.
|
||||
- [ ] **CI зелёный.** `.gitlab-ci.yml` на каждом push/MR выполняет
|
||||
`test ktlintCheck detekt evidenceCheck` и job `smoke`
|
||||
(`scripts/ldd-smoke.sh`: полный стек, health, вход админа, один курс).
|
||||
Полный `release-evidence` обязателен для тегов и запускается вручную для
|
||||
веток. `check` использует privileged-сервисы `docker:dind` для Testcontainers;
|
||||
`smoke`/`release-evidence` — shell-runner с Java 21, Docker Compose v2,
|
||||
Python 3, Node и Chromium Playwright.
|
||||
- [ ] **CI зелёный.** `.woodpecker/` (Gitea + Woodpecker 3.x) на каждом
|
||||
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).
|
||||
- [ ] Заданы сроки сессии: `LMS_ACCESS_TOKEN_TTL=15m`,
|
||||
`LMS_REFRESH_TOKEN_TTL=7d`, `LMS_SESSION_TIMEOUT=7d`,
|
||||
`LMS_SESSION_ABSOLUTE_TIMEOUT=30d`, `LMS_REFRESH_TOKEN_RETENTION=30d`
|
||||
@@ -306,9 +305,9 @@ legacy-активов на production, сдачи по выбранной лаб
|
||||
WebKit = 18/18, но нет screenshot-diff и полного набора мобильных страниц.
|
||||
На Fedora WebKit запускается через Docker-образ Playwright, потому что
|
||||
системных Ubuntu-библиотек нет.
|
||||
5. **Первый реальный CI-прогон не подтверждён.** Конфигурация, smoke и
|
||||
`scripts/ci-preflight.sh` готовы, но наличие GitLab shell-runners с тегами
|
||||
`lms-shell`/`lms-release` и первый tag-job нужно проверить в GitLab.
|
||||
5. **Первый реальный CI-прогон не подтверждён.** Конфигурация `.woodpecker/`,
|
||||
smoke и `scripts/ci-preflight.sh` готовы, но Woodpecker-сервер и агент на
|
||||
сервере ещё нужно развернуть и проверить первый push-MR pipeline и tag-job.
|
||||
6. **Внешняя интеграция «Контингент» исключена из плана.** Отдельного
|
||||
anti-corruption слоя, синхронизации и внешних идентификаторов не будет без
|
||||
нового ТЗ и доступа к API.
|
||||
@@ -324,10 +323,10 @@ legacy-активов на production, сдачи по выбранной лаб
|
||||
1. **Прогнать инвентаризацию legacy-активов на production/staging** через
|
||||
`/admin/legacy-assets` или `scripts/legacy-assets.sh`, привязать нужные
|
||||
файлы к статьям, остальные удалить.
|
||||
2. **Проверить CI на реальном runner.** Убедиться, что есть shell-runners
|
||||
`lms-shell`/`lms-release` с Java 21, Docker Compose v2, Python 3,
|
||||
Node/Chromium/Firefox/WebKit; дождаться зелёного push-MR pipeline и
|
||||
tag-job `release-evidence`.
|
||||
2. **Развернуть Woodpecker и проверить CI.** Поднять server и local-backend
|
||||
агент по [`deploy/WOODPECKER.md`](../deploy/WOODPECKER.md), включить
|
||||
репозиторий, дождаться зелёных `check`/`smoke` на push-MR и `release` на
|
||||
теге.
|
||||
3. **Дальнейшее расширение E2E** — визуальная регрессия и остальные мобильные
|
||||
страницы, если UI продолжит расти.
|
||||
4. **Пакетные сдачи ведомости**, если появятся курсы, где открытие ведомости
|
||||
@@ -348,13 +347,13 @@ web-сессия с отзывом и абсолютным потолком, key
|
||||
|
||||
После этапа 6 и закрытия рисков текущая функциональность проверена через
|
||||
LDD-контур: реестр `docs/evidence/claims.json` (**51 claims, 25 P0 / 26 P1**),
|
||||
gate `./gradlew evidenceCheck`, upgrade-скрипт, runtime-smoke, smoke-job,
|
||||
gate `./gradlew evidenceCheck`, upgrade-скрипт, runtime-smoke, smoke-workflow,
|
||||
mutation testing и браузерный Playwright E2E. Результат:
|
||||
**51/51 claims proven, P0 gaps = 0, 346 тестов, 0 failures**; mutation strength
|
||||
`CourseAccessService` 75%, `PromotionPlanner` 69%; browser E2E 18/18 (6 сценариев × Chromium/Firefox/WebKit);
|
||||
конкурентные apply/rollback и масштабный нагрузочный smoke (100 групп /
|
||||
1000 студентов, 125 параллельных чтений, 0 ошибок, p95 < 1 с) зелёные.
|
||||
Smoke-job выполняется на каждом push/MR, полный `release-evidence` обязателен
|
||||
Workflow `smoke` выполняется на каждом push/MR, полный `release` обязателен
|
||||
для тегов и доступен вручную для веток. E2E нашёл и закрыл реальный дефект
|
||||
Jackson 3/Kotlin defaults. Подробности и остаточные ограничения —
|
||||
[`docs/evidence/baseline-2026-10-27.md`](evidence/baseline-2026-10-27.md).
|
||||
|
||||
@@ -2,7 +2,8 @@
|
||||
|
||||
**Дата:** 2026-10-28.
|
||||
**Ветка:** `feature/groups-courses` (последняя история — `git log --oneline`).
|
||||
**Последний коммит перед этой итерацией:** `3aae2b8` (`docs: handoff после закрытия продуктовых рисков`).
|
||||
**HEAD до переделки CI:** `d98c3b0` (`feat: закрыть остаточный backlog`);
|
||||
история CI-правки — следующий коммит в `git log`.
|
||||
**Пуш:** не выполнялся.
|
||||
**Рабочее дерево:** чистое. `exports/` и `texput.log` игнорируются и в коммиты не входят.
|
||||
|
||||
@@ -122,13 +123,15 @@
|
||||
инвентаризация активов).
|
||||
- Runtime/load: 100 групп / 1000 студентов, 125 параллельных чтений,
|
||||
0 ошибок, p95 < 1 c.
|
||||
- CI:
|
||||
- CI: Gitea + Woodpecker 3.x, конфигурация в `.woodpecker/`:
|
||||
- `check` на push/MR: тесты, ktlint, detekt, `evidenceCheck`;
|
||||
- `smoke` на push/MR: preflight + полный стек, health, вход админа, один курс;
|
||||
- `release-evidence` обязателен для тегов, вручную для веток: тесты,
|
||||
миграции, mutation, runtime/load, browser E2E, финальный evidence.
|
||||
- `smoke` на push/MR: после `check` — preflight + полный стек, health,
|
||||
вход админа, один курс;
|
||||
- `release` на тег или вручную: тесты, миграции, mutation, runtime/load,
|
||||
browser E2E, финальный evidence.
|
||||
- `scripts/ci-preflight.sh` проверяет Java 21, Docker Compose v2, Python 3,
|
||||
Node и Playwright; первый реальный GitLab pipeline ещё не подтверждён.
|
||||
Node и Playwright. Установка server/agent — `deploy/WOODPECKER.md`.
|
||||
- Первый реальный Woodpecker pipeline ещё не подтверждён.
|
||||
- Полный `./scripts/ldd-release.sh` локально прошёл; browser E2E — 18/18.
|
||||
|
||||
### 1.9. Миграции
|
||||
@@ -172,7 +175,7 @@
|
||||
# 2. Полный LDD release (долго, нужны Docker/Java/Node + Chromium/Firefox/WebKit)
|
||||
./scripts/ldd-release.sh
|
||||
|
||||
# 3. Быстрый smoke (то же, что CI smoke)
|
||||
# 3. Быстрый smoke (то же, что workflow smoke)
|
||||
./scripts/ldd-smoke.sh
|
||||
|
||||
# 4. Отдельные проверки
|
||||
@@ -208,11 +211,11 @@ cat build/reports/evidence/index.md
|
||||
у обычных пользователей.
|
||||
|
||||
2. **Первый реальный CI-прогон.**
|
||||
Конфиг, smoke и `scripts/ci-preflight.sh` готовы, но нужно убедиться, что в
|
||||
GitLab есть shell-runners с тегами `lms-shell` (smoke) и `lms-release`
|
||||
(полный release), Java 21, Docker Compose v2, Python 3, Node и браузерами
|
||||
Chromium/Firefox/WebKit. `check` использует privileged `docker:dind`.
|
||||
Дождаться зелёного push-MR pipeline и первого tag-job `release-evidence`.
|
||||
Развернуть Woodpecker server и local-backend агент по
|
||||
`deploy/WOODPECKER.md`, включить репозиторий в Woodpecker и дождаться
|
||||
зелёных workflow `check`/`smoke` на push-MR и `release` на теге. Агенту
|
||||
нужны Java 21, Docker Compose v2, Python 3, Node и браузеры
|
||||
Chromium/Firefox/WebKit.
|
||||
|
||||
3. **Визуальная регрессия и мобильный набор E2E.**
|
||||
Сейчас 6 сценариев × 3 браузера, без screenshot-diff. Добавлять по мере
|
||||
@@ -297,4 +300,6 @@ cat build/reports/evidence/index.md
|
||||
- `web/.../admin/AdminAuditController.kt`, `LegacyAssetsController.kt`.
|
||||
- `services/gateway/.../JwtAuthenticationFilter.kt`.
|
||||
- `scripts/ldd-*.sh`, `scripts/ci-preflight.sh`, `scripts/legacy-assets.sh`.
|
||||
- `deploy/backup.sh`, `deploy/deploy.sh`, `deploy/DEPLOY.md`.
|
||||
- `.woodpecker/{check,smoke,release}.yaml` — CI на Gitea + Woodpecker.
|
||||
- `deploy/backup.sh`, `deploy/deploy.sh`, `deploy/DEPLOY.md`,
|
||||
`deploy/WOODPECKER.md`.
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
блокирует сборку.
|
||||
- **runtime** — проверка на реально поднятом стеке. Быстрый smoke
|
||||
(`scripts/ldd-smoke.sh`) выполняется в CI на каждом push/MR; полный
|
||||
runtime/scale — в `release-evidence` и обязателен перед релизом.
|
||||
runtime/scale — в workflow `release` и обязателен перед релизом.
|
||||
|
||||
## Реестр
|
||||
|
||||
@@ -40,7 +40,7 @@
|
||||
# 2. Гейт свидетельств (P0 без evidence = fail)
|
||||
./gradlew evidenceCheck
|
||||
|
||||
# 3. Быстрый smoke полного стека (то же, что CI job smoke)
|
||||
# 3. Быстрый smoke полного стека (то же, что workflow smoke)
|
||||
./scripts/ldd-smoke.sh
|
||||
|
||||
# 4. Полный runtime-smoke + scale load на одноразовой БД
|
||||
@@ -101,9 +101,9 @@ LDD-циклы выполнены 2026-10-27/28; последний — посл
|
||||
все зелёные;
|
||||
- масштабный load: 100 групп / 1000 студентов, 125 параллельных чтений,
|
||||
0 ошибок, p95 < 1 с (порог p95 < 2 с);
|
||||
- CI: job `smoke` (`ldd-smoke.sh`) на каждом push/MR; полный
|
||||
`release-evidence` (`ldd-release.sh`) обязателен для тегов и ручной для
|
||||
веток.
|
||||
- CI: Gitea + Woodpecker, workflow `smoke` (`ldd-smoke.sh`) на каждом push/MR;
|
||||
полный `release` (`ldd-release.sh`) обязателен для тегов и ручной для веток.
|
||||
Установка — `deploy/WOODPECKER.md`.
|
||||
|
||||
В ходе E2E найден и исправлен реальный дефект: Jackson 3 не применял
|
||||
Kotlin-модуль, поэтому DTO с default-значениями требовали все поля JSON
|
||||
|
||||
@@ -87,7 +87,7 @@ identity `V4–V13`, academic `V6–V12`, progress `V13`.
|
||||
|
||||
```bash
|
||||
./scripts/ldd-runtime.sh
|
||||
./scripts/ldd-smoke.sh # то же, что CI job smoke
|
||||
./scripts/ldd-smoke.sh # то же, что CI workflow smoke
|
||||
```
|
||||
|
||||
Сценарий: одноразовая БД, `bootJar`, запуск identity/academic/progress/gateway/web,
|
||||
@@ -106,8 +106,9 @@ identity `V4–V13`, academic `V6–V12`, progress `V13`.
|
||||
материалы анонимно — `401`.
|
||||
|
||||
`ldd-smoke.sh` выполняет тот же полный стек, health, вход админа и один
|
||||
доменный сценарий; это обязательный job `.gitlab-ci.yml` на каждом push/MR,
|
||||
поэтому базовый runtime-контур проверяется до merge, а не только перед релизом.
|
||||
доменный сценарий; это обязательный workflow `.woodpecker/smoke.yaml` на
|
||||
каждом push/MR, поэтому базовый runtime-контур проверяется до merge, а не
|
||||
только перед релизом.
|
||||
|
||||
Результат: **PASS**, evidence: `build/evidence/runtime.json` и
|
||||
`build/evidence/smoke.json`.
|
||||
@@ -232,17 +233,17 @@ advisory lock): два одновременных apply идемпотентны
|
||||
`./scripts/ldd-release.sh` последовательно запускает тесты/линтеры, upgrade,
|
||||
mutation, runtime + scale и browser E2E, затем финальный `evidenceCheck`.
|
||||
|
||||
В `.gitlab-ci.yml`:
|
||||
В `.woodpecker/` (Gitea + Woodpecker 3.x):
|
||||
|
||||
- `check` — `test ktlintCheck detekt evidenceCheck` на push/MR;
|
||||
- `smoke` — `ldd-smoke.sh` (полный стек, health, вход админа, один курс)
|
||||
на каждом push/MR;
|
||||
- `release-evidence` — полный `ldd-release.sh` с Chromium/Firefox/WebKit и
|
||||
Node: обязателен для тегов, для веток запускается вручную.
|
||||
на каждом push/MR, после `check`;
|
||||
- `release` — полный `ldd-release.sh` с Chromium/Firefox/WebKit и Node:
|
||||
обязателен для тегов, для веток запускается вручную.
|
||||
- smoke/release начинаются с `scripts/ci-preflight.sh`, который проверяет
|
||||
Java 21, Docker Compose v2, Python 3, Node и Playwright.
|
||||
- Первый реальный прогон на GitLab shell-runners ещё не подтверждён; локальные
|
||||
скрипты и конфигурация проверены.
|
||||
- Первый реальный прогон на Woodpecker-агенте ещё не подтверждён; локальные
|
||||
скрипты и конфигурация проверены, установка — `deploy/WOODPECKER.md`.
|
||||
|
||||
### 2.12. Найденный дефект
|
||||
|
||||
@@ -291,9 +292,10 @@ optional json fields`.
|
||||
это не N+1 по студентам, но и не пакетная выборка.
|
||||
6. **Инвентаризация legacy-активов на production не выполнена.** UI, API и
|
||||
скрипт готовы, но реальные файлы нужно привязать или удалить вручную.
|
||||
7. **Первый CI-прогон не подтверждён.** Конфигурация и preflight готовы, но
|
||||
наличие shell-runners `lms-shell`/`lms-release` проверяется в GitLab.
|
||||
8. **Полный release-evidence не на каждом коммите.** На push/MR идёт smoke,
|
||||
7. **Первый CI-прогон не подтверждён.** Конфигурация `.woodpecker/` и
|
||||
preflight готовы, но Woodpecker-сервер и local-backend агент ещё нужно
|
||||
развернуть и проверить на первом push-MR и теге.
|
||||
8. **Полный release не на каждом коммите.** На push/MR идёт smoke,
|
||||
а mutation/browser/scale — для тегов или вручную.
|
||||
9. **Интеграция «Контингент» исключена из плана** — без нового ТЗ и доступа к
|
||||
API она не проверялась и не реализуется.
|
||||
@@ -312,7 +314,7 @@ optional json fields`.
|
||||
1. прогнать инвентаризацию legacy-активов на production/staging через
|
||||
`/admin/legacy-assets` или `scripts/legacy-assets.sh` и привязать/удалить
|
||||
найденные файлы;
|
||||
2. подтвердить первый реальный CI-прогон на shell-runners и tag-job;
|
||||
2. развернуть Woodpecker и подтвердить первый push-MR pipeline и tag-job;
|
||||
3. при необходимости расширить E2E на визуальную регрессию и остальные
|
||||
мобильные страницы;
|
||||
4. пакетно отдавать сдачи в ведомости, если появятся медленные курсы.
|
||||
|
||||
Reference in New Issue
Block a user