feat(staging): add live staging check suite (smoke + access + e2e)
This commit is contained in:
136
docs/STAGING_CHECK.md
Normal file
136
docs/STAGING_CHECK.md
Normal file
@@ -0,0 +1,136 @@
|
||||
# STAGING_CHECK.md — Инструкция по запуску staging check suite (ORCH-33)
|
||||
|
||||
## Что это
|
||||
|
||||
`scripts/staging_check.py` — самостоятельный скрипт проверки **живого** staging-стенда orchestrator (порт 8501). Не unit-тесты — реальные HTTP-вызовы против работающих сервисов.
|
||||
|
||||
Три блока проверок:
|
||||
|
||||
| Блок | Название | Что проверяет |
|
||||
|------|----------|---------------|
|
||||
| A | SMOKE | `/health`, `/queue`, `ORCH_STAGING=true` |
|
||||
| B | ACCESS | Plane sandbox (R), Gitea sandbox (R+push), реестр проектов |
|
||||
| C | E2E | Создать задачу → триггер конвейера → ветка + коммент → cleanup |
|
||||
|
||||
Exit code: **0** = все PASS, **non-zero** = есть FAIL.
|
||||
|
||||
---
|
||||
|
||||
## Требования к окружению
|
||||
|
||||
Скрипт читает токены/URL из env (те же переменные, что использует orchestrator):
|
||||
|
||||
| Переменная | Описание |
|
||||
|-----------|----------|
|
||||
| `ORCH_STAGING` | Должна быть `true` — защита от случайного запуска на проде |
|
||||
| `ORCH_PLANE_API_TOKEN` | Plane API token (`X-API-Key`) |
|
||||
| `ORCH_PLANE_API_URL` | Plane base URL **без** `/api/v1` (скрипт добавляет сам) |
|
||||
| `ORCH_PLANE_WORKSPACE_SLUG` | Workspace slug (`ag_proj`) |
|
||||
| `ORCH_GITEA_TOKEN` | Gitea token (`Authorization: token …`) |
|
||||
| `ORCH_GITEA_URL` | Gitea base URL (`http://localhost:3000`) |
|
||||
| `ORCH_PLANE_WEBHOOK_SECRET` | HMAC-секрет для подписи `/webhook/plane` (если пустой — без подписи) |
|
||||
|
||||
Все эти переменные **уже есть** внутри контейнера `orchestrator-staging`.
|
||||
|
||||
---
|
||||
|
||||
## Способы запуска
|
||||
|
||||
### 1. Внутри контейнера (рекомендуемый)
|
||||
|
||||
```bash
|
||||
docker exec orchestrator-staging \
|
||||
python3 /repos/orchestrator/scripts/staging_check.py --mode stub
|
||||
```
|
||||
|
||||
### 2. С хоста (если есть токены в env)
|
||||
|
||||
```bash
|
||||
export ORCH_STAGING=true
|
||||
export ORCH_PLANE_API_TOKEN=...
|
||||
# ... остальные переменные ...
|
||||
|
||||
python3 scripts/staging_check.py \
|
||||
--base-url http://localhost:8501 \
|
||||
--mode stub
|
||||
```
|
||||
|
||||
### 3. Из docker exec с передачей URL
|
||||
|
||||
```bash
|
||||
docker exec orchestrator-staging \
|
||||
python3 /repos/orchestrator/scripts/staging_check.py \
|
||||
--base-url http://localhost:8501 \
|
||||
--mode stub
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Режимы (`--mode`)
|
||||
|
||||
| Режим | Описание | Скорость |
|
||||
|-------|----------|----------|
|
||||
| `stub` (дефолт) | Проверяет **ранние артефакты** конвейера: ветка + QG-0-коммент. Создаются ДО запуска Claude CLI → быстро, детерминированно, без расхода LLM-кредитов. | ~30-90 сек |
|
||||
| `full-real` | Дополнительно ждёт реального завершения аналитика. Долго, расходует LLM-кредиты. | 5-15+ мин |
|
||||
|
||||
**Текущий дефолт: `stub`** — достаточен для проверки работоспособности стенда.
|
||||
|
||||
---
|
||||
|
||||
## Что проверяет блок C (E2E) и почему это безопасно
|
||||
|
||||
Порядок `start_pipeline` в коде orchestrator:
|
||||
1. Resolve проекта из реестра
|
||||
2. Получить name/description из Plane API (если в webhook пустые)
|
||||
3. **QG-0 гейт** (name ≥ 5 симв, description ≥ 20 симв)
|
||||
4. **Создать work_item_id + ветку в Gitea + начальные доки**
|
||||
5. **Записать строку задачи в БД**
|
||||
6. Поставить аналитика в очередь (вот тут Claude CLI)
|
||||
|
||||
Блок C проверяет **шаги 4-5**, аналитика (шаг 6) **не ждёт**.
|
||||
Тест-задача создаётся ТОЛЬКО в **SANDBOX** (`project_id 8c5a3025-...`),
|
||||
ветка создаётся ТОЛЬКО в **orchestrator-sandbox**.
|
||||
|
||||
### CLEANUP (обязателен)
|
||||
|
||||
`try/finally` гарантирует удаление тестовых артефактов:
|
||||
- Удаляет ветку из `orchestrator-sandbox`
|
||||
- Удаляет задачу из Plane SANDBOX
|
||||
|
||||
Cleanup отрабатывает даже при падении e2e.
|
||||
|
||||
---
|
||||
|
||||
## Принцип HMAC-подписи
|
||||
|
||||
Скрипт читает `ORCH_PLANE_WEBHOOK_SECRET` из env и формирует подпись:
|
||||
```python
|
||||
hmac.new(secret.encode(), body, hashlib.sha256).hexdigest()
|
||||
```
|
||||
Передаёт как заголовок `X-Plane-Signature`. Алгоритм совпадает с `verify_plane_signature` в `src/webhooks/plane.py`.
|
||||
|
||||
---
|
||||
|
||||
## Изолированность от прода
|
||||
|
||||
| Проверка | Гарантия |
|
||||
|---------|---------|
|
||||
| A3 `ORCH_STAGING=true` | При false — abort до деструктивных блоков |
|
||||
| B6 Реестр без боевых | ET/ORCH project_id absent в `known_plane_project_ids()` |
|
||||
| C: only SANDBOX project_id | Webhook payload указывает только `8c5a3025-...` |
|
||||
| C: only orchestrator-sandbox repo | Gitea operations на `admin/orchestrator-sandbox` |
|
||||
| C: cleanup в finally | Артефакты удаляются даже при ошибке |
|
||||
|
||||
---
|
||||
|
||||
## Добавление в деплой-хук
|
||||
|
||||
```bash
|
||||
# В deploy.sh, после docker-compose up -d orchestrator-staging
|
||||
docker exec orchestrator-staging \
|
||||
python3 /repos/orchestrator/scripts/staging_check.py --mode stub
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "Staging check FAILED — rolling back"
|
||||
exit 1
|
||||
fi
|
||||
```
|
||||
Reference in New Issue
Block a user