ci: harden community release baseline
This commit is contained in:
@@ -65,11 +65,20 @@ jobs:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v5
|
||||
|
||||
- name: Validate static UI files
|
||||
run: |
|
||||
test -f apps/ui/Dockerfile
|
||||
test -f apps/ui/index.html
|
||||
test -f apps/ui/nginx.conf
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: 22
|
||||
cache: npm
|
||||
cache-dependency-path: apps/ui/package-lock.json
|
||||
|
||||
- name: Install UI dependencies
|
||||
working-directory: apps/ui
|
||||
run: npm ci
|
||||
|
||||
- name: Build UI bundle
|
||||
working-directory: apps/ui
|
||||
run: npm run build
|
||||
|
||||
- name: Build UI image
|
||||
run: docker build -f apps/ui/Dockerfile .
|
||||
|
||||
@@ -69,7 +69,7 @@ Progress:
|
||||
|
||||
### `feat/community-release-hardening`
|
||||
|
||||
Status: in_progress
|
||||
Status: done
|
||||
|
||||
Goal:
|
||||
- закрепить воспроизводимый Community release path и release checklist без скрытых переходных допущений.
|
||||
@@ -80,6 +80,12 @@ Main code areas:
|
||||
- `deploy/community/*`
|
||||
- `docs/community-release-checklist.md`
|
||||
- `docs/deploy-and-staging-smoke.md`
|
||||
- `docs/authenticated-staging-pass.md`
|
||||
- `docs/public-smoke-targets.md`
|
||||
- `docs/staging-regression-notes.md`
|
||||
- `scripts/staging-smoke.sh`
|
||||
- `scripts/authenticated-staging-smoke.sh`
|
||||
- `scripts/staging-note-block.sh`
|
||||
|
||||
Implementation slices:
|
||||
1. проверить соответствие CI Community manifests;
|
||||
@@ -91,6 +97,22 @@ DoD:
|
||||
- checklist соответствует реальному Community deploy surface;
|
||||
- пост-деплойная проверка повторяема.
|
||||
|
||||
Verification:
|
||||
- `python3` YAML parse for `.github/workflows/ci.yml`
|
||||
- `docker compose -f deploy/community/docker-compose.yml --env-file deploy/community/.env.example config -q`
|
||||
- `docker compose -f deploy/community/docker-compose.yml --env-file deploy/community/.env.example --profile cache config -q`
|
||||
- `just check`
|
||||
- `apps/ui` build
|
||||
- Community-targeted Playwright smoke including `staging-authenticated.spec.js`
|
||||
|
||||
Progress:
|
||||
- done:
|
||||
- `UI Checks` in `CI` now run real `npm ci` and `npm run build` before the container image build
|
||||
- Community release docs and helper scripts now describe only the real `REST-only` deploy smoke baseline
|
||||
- staging templates and regression notes no longer require `GraphQL`, `gRPC`, `WebSocket`, `SOAP`, or streaming scenarios in Community
|
||||
- Community public smoke targets are reduced to the canonical `REST -> Open-Meteo` path
|
||||
- obsolete split-helper artifact `scripts/export-community.sh` and stale premium smoke payloads have been removed from the public repo
|
||||
|
||||
### `feat/common-public-improvements`
|
||||
|
||||
Status: ready
|
||||
|
||||
@@ -2,21 +2,20 @@
|
||||
|
||||
## 1. Назначение
|
||||
|
||||
Этот документ описывает именно тот кусок staging smoke, который нельзя честно закрыть одними `curl` и unauthenticated route checks.
|
||||
Этот документ описывает тот кусок Community staging smoke, который нельзя честно закрыть одними `curl` и unauthenticated route checks.
|
||||
|
||||
Он покрывает:
|
||||
|
||||
- login/logout;
|
||||
- UI shell после входа;
|
||||
- `Secrets -> Auth Profiles -> Wizard -> Test run`;
|
||||
- protocol smoke через UI и MCP;
|
||||
- streaming pages после реальных вызовов.
|
||||
- `REST` smoke через UI и MCP.
|
||||
|
||||
Использовать вместе с:
|
||||
|
||||
- [deploy-and-staging-smoke.md](/home/a.tolmachev/code/rust/mcpaas/docs/deploy-and-staging-smoke.md)
|
||||
- [staging-regression-notes.md](/home/a.tolmachev/code/rust/mcpaas/docs/staging-regression-notes.md)
|
||||
- [manual-regression-checklist.md](/home/a.tolmachev/code/rust/mcpaas/docs/manual-regression-checklist.md)
|
||||
- [deploy-and-staging-smoke.md](deploy-and-staging-smoke.md)
|
||||
- [staging-regression-notes.md](staging-regression-notes.md)
|
||||
- [manual-regression-checklist.md](manual-regression-checklist.md)
|
||||
|
||||
## 2. Что нужно заранее
|
||||
|
||||
@@ -27,7 +26,7 @@
|
||||
- `CRANK_STAGING_ADMIN_EMAIL=... CRANK_STAGING_ADMIN_PASSWORD=... just authenticated-staging-smoke https://<domain>`
|
||||
- известны bootstrap admin credentials;
|
||||
- на стенде есть demo data или подготовленный disposable workspace;
|
||||
- браузер открыт с devtools, чтобы фиксировать network/console findings.
|
||||
- браузер открыт с devtools, чтобы фиксировать network и console findings.
|
||||
|
||||
## 3. Канонический проход
|
||||
|
||||
@@ -39,9 +38,7 @@ export CRANK_STAGING_ADMIN_PASSWORD=secret
|
||||
just authenticated-staging-smoke https://<domain>
|
||||
```
|
||||
|
||||
После завершения прохода готовый блок для
|
||||
[staging-regression-notes.md](/home/a.tolmachev/code/rust/mcpaas/docs/staging-regression-notes.md)
|
||||
можно сгенерировать так:
|
||||
После завершения прохода готовый блок для [staging-regression-notes.md](staging-regression-notes.md) можно сгенерировать так:
|
||||
|
||||
```bash
|
||||
just staging-note-block <domain> <deploy-sha> "codex + operator"
|
||||
@@ -55,7 +52,6 @@ just staging-note-block <domain> <deploy-sha> "codex + operator"
|
||||
- valid login -> redirect на `/`;
|
||||
- нет redirect loop;
|
||||
- password-only note видна;
|
||||
- planned actions на login не выглядят рабочими.
|
||||
3. После входа проверить:
|
||||
- current workspace в navbar;
|
||||
- user identity;
|
||||
@@ -80,7 +76,7 @@ just staging-note-block <domain> <deploy-sha> "codex + operator"
|
||||
|
||||
- `status: passed | partial | failed`
|
||||
- есть ли console errors;
|
||||
- есть ли failing XHR/fetch;
|
||||
- есть ли failing XHR или fetch;
|
||||
- есть ли broken layout.
|
||||
|
||||
### 3.3. Secrets and auth profiles
|
||||
@@ -111,19 +107,17 @@ just staging-note-block <domain> <deploy-sha> "codex + operator"
|
||||
- upstream сохраняется;
|
||||
- test run отрабатывает с `auth_profile_ref`.
|
||||
|
||||
### 3.5. Protocol smoke
|
||||
### 3.5. REST protocol smoke
|
||||
|
||||
Использовать:
|
||||
|
||||
- [public-smoke-targets.md](/home/a.tolmachev/code/rust/mcpaas/docs/public-smoke-targets.md)
|
||||
- [public-smoke-targets.md](public-smoke-targets.md)
|
||||
|
||||
Обязательные кейсы:
|
||||
Обязательный кейс:
|
||||
|
||||
- `REST`
|
||||
- `GraphQL`
|
||||
- `gRPC`
|
||||
|
||||
Для каждого:
|
||||
Порядок:
|
||||
|
||||
1. создать или открыть operation;
|
||||
2. выполнить `Test run`;
|
||||
@@ -133,21 +127,9 @@ just staging-note-block <domain> <deploy-sha> "codex + operator"
|
||||
- `tools/list`
|
||||
- `tools/call`
|
||||
|
||||
### 3.6. Streaming smoke
|
||||
|
||||
Проверить:
|
||||
|
||||
- `window` tool;
|
||||
- `session` tool;
|
||||
- `async_job` tool;
|
||||
|
||||
Если WebSocket/SOAP upstream на стенде отсутствуют:
|
||||
|
||||
- явно записать `not exercised`, а не оставлять пустым.
|
||||
|
||||
## 4. Что нужно занести в staging notes
|
||||
|
||||
По итогам authenticated pass в [staging-regression-notes.md](/home/a.tolmachev/code/rust/mcpaas/docs/staging-regression-notes.md) обязательно добавить:
|
||||
По итогам authenticated pass в [staging-regression-notes.md](staging-regression-notes.md) обязательно добавить:
|
||||
|
||||
- deploy commit;
|
||||
- кто проходил smoke;
|
||||
@@ -160,11 +142,7 @@ just staging-note-block <domain> <deploy-sha> "codex + operator"
|
||||
- secrets/auth profiles;
|
||||
- wizard;
|
||||
- REST;
|
||||
- GraphQL;
|
||||
- gRPC;
|
||||
- streaming;
|
||||
- WebSocket;
|
||||
- SOAP.
|
||||
- MCP smoke.
|
||||
|
||||
## 5. Готовый блок для вставки
|
||||
|
||||
@@ -190,7 +168,7 @@ just staging-note-block <domain> <deploy-sha> "codex + operator"
|
||||
- secrets
|
||||
- logs
|
||||
- usage
|
||||
- streaming
|
||||
- rest smoke
|
||||
- mcp smoke
|
||||
|
||||
### Passed
|
||||
@@ -199,11 +177,7 @@ just staging-note-block <domain> <deploy-sha> "codex + operator"
|
||||
- shell pages open after auth
|
||||
- secrets/auth profile flow status: `<passed|partial|failed>`
|
||||
- REST smoke: `<passed|partial|failed>`
|
||||
- GraphQL smoke: `<passed|partial|failed>`
|
||||
- gRPC smoke: `<passed|partial|failed>`
|
||||
- streaming pages status: `<passed|partial|failed>`
|
||||
- WebSocket: `<not exercised|passed|failed>`
|
||||
- SOAP: `<not exercised|passed|failed>`
|
||||
- MCP smoke: `<passed|partial|failed>`
|
||||
|
||||
### Findings
|
||||
|
||||
@@ -218,8 +192,11 @@ just staging-note-block <domain> <deploy-sha> "codex + operator"
|
||||
- ...
|
||||
```
|
||||
|
||||
## 6. Практический статус
|
||||
## 6. Почему automated smoke недостаточно
|
||||
|
||||
На текущий момент этот документ подготовлен как operational template.
|
||||
Скрипт [scripts/authenticated-staging-smoke.sh](../scripts/authenticated-staging-smoke.sh) полезен как быстрый sanity check, но он:
|
||||
|
||||
Он не заменяет реальный authenticated browser pass и не должен отмечаться как `passed`, пока результаты не занесены в [staging-regression-notes.md](/home/a.tolmachev/code/rust/mcpaas/docs/staging-regression-notes.md).
|
||||
- проверяет только минимальный browser flow;
|
||||
- не создает реальный disposable operation;
|
||||
- не заменяет ручной `REST -> publish -> MCP call` проход;
|
||||
- не должен отмечаться как `passed`, пока результаты не занесены в [staging-regression-notes.md](staging-regression-notes.md).
|
||||
|
||||
@@ -21,6 +21,8 @@
|
||||
- `docs/deployment.md`
|
||||
- `docs/deploy-and-staging-smoke.md`
|
||||
- `docs/authenticated-staging-pass.md`
|
||||
- `docs/public-smoke-targets.md`
|
||||
- `docs/staging-regression-notes.md`
|
||||
|
||||
Root-файлы:
|
||||
|
||||
@@ -70,6 +72,7 @@ Community release должен поставлять:
|
||||
5. Post-deploy smoke выполнен по:
|
||||
- `docs/deploy-and-staging-smoke.md`
|
||||
- `docs/authenticated-staging-pass.md`
|
||||
- `docs/public-smoke-targets.md`
|
||||
|
||||
## 6. Правило для будущих коммерческих редакций
|
||||
|
||||
@@ -118,4 +121,6 @@ Community release должен поставлять:
|
||||
- `docs/deployment.md`
|
||||
- `docs/deploy-and-staging-smoke.md`
|
||||
- `docs/authenticated-staging-pass.md`
|
||||
- `docs/public-smoke-targets.md`
|
||||
- `docs/staging-regression-notes.md`
|
||||
- `docs/implementation-plan.md`
|
||||
|
||||
@@ -2,35 +2,35 @@
|
||||
|
||||
## 1. Назначение
|
||||
|
||||
Этот документ фиксирует обязательный post-deploy smoke pass для staging/production-like окружения.
|
||||
Этот документ фиксирует обязательный post-deploy smoke pass для `Community` staging или production-like окружения.
|
||||
|
||||
Он нужен для двух задач:
|
||||
|
||||
- быстро проверить, что свежий deploy реально жив, а не просто "docker compose up -d завершился";
|
||||
- дать следующему агенту и оператору один канонический сценарий проверки после релиза.
|
||||
- быстро проверить, что свежий deploy реально жив, а не просто `docker compose up -d` завершился без ошибок;
|
||||
- дать оператору и следующему агенту один канонический сценарий проверки после релиза.
|
||||
|
||||
Для Community-поставки source of truth для runtime manifests:
|
||||
|
||||
- `deploy/community/docker-compose.yml`
|
||||
- `deploy/community/.env.example`
|
||||
|
||||
Результаты прохождения этого checklist нужно заносить в [staging-regression-notes.md](/home/a.tolmachev/code/rust/mcpaas/docs/staging-regression-notes.md).
|
||||
Результаты прохождения этого checklist нужно заносить в [staging-regression-notes.md](staging-regression-notes.md).
|
||||
|
||||
Для полного browser-authenticated прохода использовать отдельный документ:
|
||||
|
||||
- [authenticated-staging-pass.md](/home/a.tolmachev/code/rust/mcpaas/docs/authenticated-staging-pass.md)
|
||||
- [authenticated-staging-pass.md](authenticated-staging-pass.md)
|
||||
|
||||
## 2. Когда использовать
|
||||
|
||||
Запускать после:
|
||||
|
||||
- merge в `main` и успешного `Deploy`;
|
||||
- изменения `nginx`/routing;
|
||||
- изменения auth/session;
|
||||
- изменения `mcp-server`;
|
||||
- изменения streaming/tool execution;
|
||||
- изменения secrets/auth profiles;
|
||||
- изменения UI routing и login flow.
|
||||
- изменений `nginx` или routing;
|
||||
- изменений auth/session;
|
||||
- изменений `mcp-server`;
|
||||
- изменений secrets/auth profiles;
|
||||
- изменений UI routing и login flow;
|
||||
- изменений `deploy/community/*`.
|
||||
|
||||
## 3. Предусловия
|
||||
|
||||
@@ -39,8 +39,8 @@
|
||||
- задеплоенный стек `ui`, `admin-api`, `mcp-server`, `postgres`;
|
||||
- корректный `.env` на сервере;
|
||||
- валидный deploy через `.github/workflows/deploy.yml`;
|
||||
- server deployment path собран из public Community manifest, а не из ad-hoc compose файла;
|
||||
- включенный `CRANK_DEMO_SEED=true`, если нужен предзаполненный smoke state;
|
||||
- server deployment path, собранный из `deploy/community/docker-compose.yml`;
|
||||
- `CRANK_DEMO_SEED=true`, если нужен предзаполненный smoke state;
|
||||
- bootstrap admin credentials для входа в UI.
|
||||
|
||||
## 3.1. Быстрый automated smoke
|
||||
@@ -64,7 +64,7 @@ bash scripts/staging-smoke.sh https://<domain>
|
||||
- `/mcp/health`;
|
||||
- legacy `/html/...` redirects.
|
||||
|
||||
Это не заменяет ручной smoke pass ниже, а только быстро отсеивает грубые deploy/routing поломки.
|
||||
Это не заменяет ручной smoke pass ниже, а только быстро отсеивает грубые deploy или routing поломки.
|
||||
|
||||
## 4. Server-side smoke
|
||||
|
||||
@@ -79,10 +79,10 @@ docker compose logs --tail=100 mcp-server
|
||||
|
||||
Ожидаемо:
|
||||
|
||||
- `admin-api` в `Up` / `healthy`;
|
||||
- `mcp-server` в `Up` / `healthy`;
|
||||
- `admin-api` в `Up` или `healthy`;
|
||||
- `mcp-server` в `Up` или `healthy`;
|
||||
- нет циклических restart-ов;
|
||||
- нет `NotPresent`, `password authentication failed`, `panic`, `invalid transition` и аналогичных fatal ошибок.
|
||||
- нет `password authentication failed`, `panic`, `invalid transition` и аналогичных fatal ошибок.
|
||||
|
||||
Проверка health endpoints:
|
||||
|
||||
@@ -133,7 +133,6 @@ curl -I https://<domain>/html/wizard/
|
||||
- нет redirect loop;
|
||||
- invalid login показывает ошибку;
|
||||
- страница честно помечает password-only flow;
|
||||
- `Forgot password`, `Google SSO`, `Request access` визуально disabled/planned.
|
||||
3. Выполнить login.
|
||||
4. Проверить navbar:
|
||||
- workspace switch;
|
||||
@@ -181,17 +180,15 @@ Smoke считается успешным, если:
|
||||
|
||||
- wizard не требует `${secrets.*}`;
|
||||
- `auth_profile_ref` реально доезжает до execution path;
|
||||
- plaintext не возвращается после create/rotate.
|
||||
- plaintext не возвращается после create или rotate.
|
||||
|
||||
## 9. MCP and protocol smoke
|
||||
## 9. MCP and REST smoke
|
||||
|
||||
Использовать примеры из [public-smoke-targets.md](/home/a.tolmachev/code/rust/mcpaas/docs/public-smoke-targets.md).
|
||||
Использовать пример из [public-smoke-targets.md](public-smoke-targets.md).
|
||||
|
||||
Обязательные ручные кейсы:
|
||||
Обязательный ручной кейс:
|
||||
|
||||
- `REST` -> `Open-Meteo`
|
||||
- `GraphQL` -> `Countries`
|
||||
- `gRPC` -> `grpcb.in`
|
||||
|
||||
Порядок:
|
||||
|
||||
@@ -202,33 +199,19 @@ Smoke считается успешным, если:
|
||||
5. проверить MCP path;
|
||||
6. выполнить `tools/list` и `tools/call`.
|
||||
|
||||
## 10. Streaming smoke
|
||||
## 10. Acceptance criteria
|
||||
|
||||
На deployed стенде проверить:
|
||||
|
||||
- `window` tool выполняется и не возвращает бесконечный поток;
|
||||
|
||||
Если есть real upstream:
|
||||
|
||||
- `WebSocket window/session`
|
||||
- `SOAP import + inspect + test run`
|
||||
|
||||
Если real upstream нет, это остается на локальном e2e/fixture stack.
|
||||
|
||||
## 11. Acceptance criteria
|
||||
|
||||
Deploy/staging smoke считается успешным, если:
|
||||
Deploy или staging smoke считается успешным, если:
|
||||
|
||||
- server health зеленый;
|
||||
- reverse proxy отдает правильные routes;
|
||||
- login/session живы;
|
||||
- all core pages открываются;
|
||||
- secrets/auth/wizard связка работает;
|
||||
- минимум `REST`, `GraphQL`, `gRPC` проходят `create -> test-run -> publish -> MCP call`;
|
||||
- streaming pages отображают реальные session/job artifacts;
|
||||
- все core pages открываются;
|
||||
- связка `Secrets -> Auth Profiles -> Wizard -> Test run` работает;
|
||||
- минимум один `REST` operation проходит `create -> test-run -> publish -> MCP call`;
|
||||
- нет критичных JS ошибок в браузере.
|
||||
|
||||
## 12. Если что-то падает
|
||||
## 11. Если что-то падает
|
||||
|
||||
Порядок разбора:
|
||||
|
||||
|
||||
+2
-2
@@ -13,10 +13,10 @@
|
||||
|
||||
Документ не привязан к конкретному hypervisor, cloud provider, типу VM или домашней инфраструктуре.
|
||||
|
||||
Практический post-deploy smoke checklist вынесен отдельно в [deploy-and-staging-smoke.md](/home/github-ops/crank/docs/deploy-and-staging-smoke.md).
|
||||
Практический post-deploy smoke checklist вынесен отдельно в [deploy-and-staging-smoke.md](deploy-and-staging-smoke.md).
|
||||
|
||||
Отдельный release checklist именно для открытой редакции вынесен в
|
||||
[community-release-checklist.md](/home/github-ops/crank/docs/community-release-checklist.md).
|
||||
[community-release-checklist.md](community-release-checklist.md).
|
||||
|
||||
## 2. Базовая модель деплоя
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
## 1. Назначение
|
||||
|
||||
Этот документ фиксирует post-integration baseline для UI, auth, secrets и streaming slices.
|
||||
Этот документ фиксирует post-integration baseline для Community UI, auth, secrets и REST/MCP slices.
|
||||
|
||||
Цель:
|
||||
|
||||
@@ -20,7 +20,6 @@
|
||||
- `postgres`;
|
||||
- `admin-api`;
|
||||
- `mcp-server`;
|
||||
- fixture servers для streaming;
|
||||
- локальный UI proxy.
|
||||
|
||||
Покрытые автоматикой сценарии:
|
||||
@@ -33,9 +32,7 @@
|
||||
- usage;
|
||||
- workspace/settings;
|
||||
- wizard;
|
||||
- REST window tool;
|
||||
- gRPC session tools;
|
||||
- async job tools.
|
||||
- REST draft/test/publish flow.
|
||||
|
||||
## 3. Когда запускать этот pass
|
||||
|
||||
@@ -46,9 +43,7 @@
|
||||
- operations/wizard;
|
||||
- agents;
|
||||
- secrets/auth profiles;
|
||||
- streaming configuration;
|
||||
- MCP transport;
|
||||
- REST SSE, gRPC streaming, WebSocket, SOAP adapters;
|
||||
- deploy routing/UI routes.
|
||||
|
||||
## 4. Обязательные команды перед ручным проходом
|
||||
@@ -89,12 +84,7 @@ cd apps/ui && npm run e2e
|
||||
### 5.3. Wizard
|
||||
|
||||
- открыть `/wizard/`;
|
||||
- переключить protocol cards:
|
||||
- `REST`
|
||||
- `GraphQL`
|
||||
- `gRPC`
|
||||
- `WebSocket`
|
||||
- `SOAP`
|
||||
- убедиться, что доступна только `REST` protocol card;
|
||||
- для нового upstream проверить режимы auth:
|
||||
- `No auth`
|
||||
- `Use existing auth profile`
|
||||
@@ -166,24 +156,11 @@ cd apps/ui && npm run e2e
|
||||
|
||||
## 6. Protocol smoke pass
|
||||
|
||||
Для smoke-проверки MCP использовать готовые public targets из [public-smoke-targets.md](/home/a.tolmachev/code/rust/mcpaas/docs/public-smoke-targets.md).
|
||||
Для smoke-проверки MCP использовать готовый public target из [public-smoke-targets.md](public-smoke-targets.md).
|
||||
|
||||
Обязательные кейсы:
|
||||
Обязательный кейс:
|
||||
|
||||
- REST: [rest-open-meteo.operation.json](/home/a.tolmachev/code/rust/mcpaas/examples/mcp-smoke/rest-open-meteo.operation.json)
|
||||
- GraphQL: [graphql-countries.operation.json](/home/a.tolmachev/code/rust/mcpaas/examples/mcp-smoke/graphql-countries.operation.json)
|
||||
- gRPC: [grpc-grpcb-add.operation.json](/home/a.tolmachev/code/rust/mcpaas/examples/mcp-smoke/grpc-grpcb-add.operation.json)
|
||||
|
||||
Streaming regression на локальном e2e стеке:
|
||||
|
||||
- REST SSE window tool;
|
||||
- gRPC session tools;
|
||||
- async job tools.
|
||||
|
||||
Ручной post-deploy pass должен дополнительно проверить:
|
||||
|
||||
- WebSocket window/session flow после появления real upstream;
|
||||
- SOAP import/inspection/test run на disposable WSDL fixture.
|
||||
- REST: [rest-open-meteo.operation.json](../examples/mcp-smoke/rest-open-meteo.operation.json)
|
||||
|
||||
## 7. Acceptance criteria
|
||||
|
||||
@@ -193,8 +170,7 @@ Regression pass считается завершенным, если одновр
|
||||
- Playwright suite passed;
|
||||
- login/shell/manual navigation не ломаются;
|
||||
- `Secrets -> Auth Profiles -> Wizard -> Test run` связка работает;
|
||||
- public smoke targets проходят для `REST`, `GraphQL`, `gRPC`;
|
||||
- streaming demo scenarios проходят на локальном e2e стеке;
|
||||
- public REST smoke target проходит;
|
||||
- нет критичных UI regressions на clean routes, i18n и auth redirects.
|
||||
|
||||
## 8. Если что-то падает
|
||||
|
||||
@@ -1,40 +1,32 @@
|
||||
# Public Smoke Targets
|
||||
|
||||
Этот документ фиксирует три публичных upstream-сервиса, которые можно использовать для ручной проверки `REST`, `GraphQL` и `gRPC` operation в Crank без поднятия своих тестовых backend-ов.
|
||||
Этот документ фиксирует публичный upstream-сервис, который можно использовать для ручной проверки `REST` operation в `crank-community` без поднятия своего тестового backend-а.
|
||||
|
||||
Все примеры ниже уже сверены с реальными публичными endpoint-ами и дублируются готовыми payload-файлами в [examples/mcp-smoke](/home/a.tolmachev/code/rust/mcpaas/examples/mcp-smoke).
|
||||
Для Community канонический smoke target только один:
|
||||
|
||||
## 1. Источники
|
||||
- `REST`
|
||||
|
||||
- REST: Open-Meteo Weather Forecast API
|
||||
Коммерческие протоколы и их smoke targets живут в private репозиториях и не входят в Community release baseline.
|
||||
|
||||
Все примеры ниже дублируются готовыми payload-файлами в [examples/mcp-smoke](../examples/mcp-smoke).
|
||||
|
||||
## 1. Источник
|
||||
|
||||
- REST: Open-Meteo Weather Forecast API
|
||||
`https://open-meteo.com/en/docs`
|
||||
- GraphQL: Countries GraphQL API
|
||||
`https://github.com/trevorblades/countries/blob/main/README.md`
|
||||
Playground / endpoint: `https://countries.trevorblades.com/`
|
||||
- gRPC: grpcb.in
|
||||
`https://grpcb.in/`
|
||||
Public proto: `https://raw.githubusercontent.com/moul/pb/master/addsvc/addsvc.proto`
|
||||
|
||||
## 2. Готовые operation payload-ы
|
||||
|
||||
- REST: [rest-open-meteo.operation.json](/home/a.tolmachev/code/rust/mcpaas/examples/mcp-smoke/rest-open-meteo.operation.json)
|
||||
- REST test input: [rest-open-meteo.test-input.json](/home/a.tolmachev/code/rust/mcpaas/examples/mcp-smoke/rest-open-meteo.test-input.json)
|
||||
- GraphQL: [graphql-countries.operation.json](/home/a.tolmachev/code/rust/mcpaas/examples/mcp-smoke/graphql-countries.operation.json)
|
||||
- GraphQL test input: [graphql-countries.test-input.json](/home/a.tolmachev/code/rust/mcpaas/examples/mcp-smoke/graphql-countries.test-input.json)
|
||||
- gRPC: [grpc-grpcb-add.operation.json](/home/a.tolmachev/code/rust/mcpaas/examples/mcp-smoke/grpc-grpcb-add.operation.json)
|
||||
- gRPC test input: [grpc-grpcb-add.test-input.json](/home/a.tolmachev/code/rust/mcpaas/examples/mcp-smoke/grpc-grpcb-add.test-input.json)
|
||||
- gRPC proto reference: [grpc-grpcb-addsvc.proto](/home/a.tolmachev/code/rust/mcpaas/examples/mcp-smoke/grpc-grpcb-addsvc.proto)
|
||||
- REST: [rest-open-meteo.operation.json](../examples/mcp-smoke/rest-open-meteo.operation.json)
|
||||
- REST test input: [rest-open-meteo.test-input.json](../examples/mcp-smoke/rest-open-meteo.test-input.json)
|
||||
|
||||
## 3. Как использовать
|
||||
|
||||
### 3.1. Через UI
|
||||
|
||||
1. Создай operation вручную в `Wizard`.
|
||||
2. Подставь значения из соответствующего `*.operation.json`.
|
||||
3. Для `gRPC` можно либо:
|
||||
- просто использовать готовый `descriptor_set_b64` из JSON payload;
|
||||
- либо отдельно загрузить `.proto` из [grpc-grpcb-addsvc.proto](/home/a.tolmachev/code/rust/mcpaas/examples/mcp-smoke/grpc-grpcb-addsvc.proto).
|
||||
4. На шаге теста используй `*.test-input.json`.
|
||||
1. Создать operation вручную в `Wizard`.
|
||||
2. Подставить значения из `rest-open-meteo.operation.json`.
|
||||
3. На шаге теста использовать `rest-open-meteo.test-input.json`.
|
||||
|
||||
### 3.2. Через admin-api
|
||||
|
||||
@@ -70,7 +62,7 @@ curl -sS -c cookie.txt \
|
||||
--data '{"email":"<your-email>","password":"<your-password>"}'
|
||||
```
|
||||
|
||||
## 4. Что именно проверяют примеры
|
||||
## 4. Что именно проверяет пример
|
||||
|
||||
### 4.1. REST: Open-Meteo
|
||||
|
||||
@@ -94,71 +86,11 @@ curl -sS -c cookie.txt \
|
||||
}
|
||||
```
|
||||
|
||||
### 4.2. GraphQL: Countries
|
||||
|
||||
- Protocol: `GraphQL`
|
||||
- Endpoint: `https://countries.trevorblades.com/`
|
||||
- Проверка:
|
||||
- fixed GraphQL query
|
||||
- variable mapping
|
||||
- `response_path`
|
||||
- nested array extraction
|
||||
|
||||
Ожидаемый upstream query:
|
||||
|
||||
```graphql
|
||||
query GetCountry($code: ID!) {
|
||||
country(code: $code) {
|
||||
code
|
||||
name
|
||||
capital
|
||||
emoji
|
||||
currency
|
||||
languages {
|
||||
code
|
||||
name
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 4.3. gRPC: grpcb.in / addsvc.Add.Sum
|
||||
|
||||
- Protocol: `gRPC`
|
||||
- Endpoint: `http://grpcb.in:9000`
|
||||
- Service: `addsvc.Add`
|
||||
- Method: `Sum`
|
||||
- Проверка:
|
||||
- descriptor-backed unary gRPC call
|
||||
- `request.grpc.*` mapping
|
||||
- protobuf JSON response normalization
|
||||
- `to_number` transform from protobuf `int64` string
|
||||
|
||||
Проверенный реальный вызов:
|
||||
|
||||
```bash
|
||||
docker run --rm fullstorydev/grpcurl:latest \
|
||||
-plaintext \
|
||||
-d '{"a":7,"b":5}' \
|
||||
grpcb.in:9000 \
|
||||
addsvc.Add/Sum
|
||||
```
|
||||
|
||||
Ожидаемый ответ:
|
||||
|
||||
```json
|
||||
{
|
||||
"v": "12"
|
||||
}
|
||||
```
|
||||
|
||||
## 5. Практическая рекомендация
|
||||
|
||||
Для первого smoke pass используй именно эти три operation:
|
||||
Для первого smoke pass использовать operation:
|
||||
|
||||
- `weather_current_open_meteo`
|
||||
- `country_lookup_countries`
|
||||
- `grpcb_add_sum`
|
||||
|
||||
Этого достаточно, чтобы проверить весь путь:
|
||||
|
||||
|
||||
@@ -35,18 +35,17 @@
|
||||
|
||||
### Infra notes
|
||||
|
||||
- this pass covered only unauthenticated public/staging smoke;
|
||||
- authenticated UI flows, MCP tool calls, secrets/auth-profile flows and protocol smoke were not exercised in this entry.
|
||||
- this pass covered only unauthenticated public or staging smoke;
|
||||
- authenticated UI flows, MCP tool calls, secrets/auth-profile flows and REST smoke were not exercised in this entry.
|
||||
|
||||
### Follow-up
|
||||
|
||||
- run a full authenticated browser smoke after the next deploy;
|
||||
- record `REST`, `GraphQL`, `gRPC` protocol smoke results in the next entry;
|
||||
- add WebSocket/SOAP status as `not exercised` or `passed/failed` explicitly.
|
||||
- record REST and MCP smoke results in the next entry.
|
||||
|
||||
## 1. Назначение
|
||||
|
||||
Этот документ фиксирует результаты ручных проверок на staging/production-like окружении после deploy.
|
||||
Этот документ фиксирует результаты ручных проверок на staging или production-like окружении после deploy.
|
||||
|
||||
Он нужен для трех задач:
|
||||
|
||||
@@ -56,11 +55,11 @@
|
||||
|
||||
Использовать вместе с:
|
||||
|
||||
- [deploy-and-staging-smoke.md](/home/a.tolmachev/code/rust/mcpaas/docs/deploy-and-staging-smoke.md)
|
||||
- [manual-regression-checklist.md](/home/a.tolmachev/code/rust/mcpaas/docs/manual-regression-checklist.md)
|
||||
- [authenticated-staging-pass.md](/home/a.tolmachev/code/rust/mcpaas/docs/authenticated-staging-pass.md)
|
||||
- [deploy-and-staging-smoke.md](deploy-and-staging-smoke.md)
|
||||
- [manual-regression-checklist.md](manual-regression-checklist.md)
|
||||
- [authenticated-staging-pass.md](authenticated-staging-pass.md)
|
||||
|
||||
Шаблон нового блока можно быстро сгенерировать через:
|
||||
Если нужно сгенерировать заготовку новой записи:
|
||||
|
||||
```bash
|
||||
just staging-note-block <domain> <deploy-sha> "codex + operator"
|
||||
@@ -68,17 +67,14 @@ just staging-note-block <domain> <deploy-sha> "codex + operator"
|
||||
|
||||
## 2. Как вести записи
|
||||
|
||||
Каждый deploy или ручной regression pass должен добавляться новым блоком в начало документа.
|
||||
Добавлять новую запись сверху документа.
|
||||
|
||||
На один блок фиксировать:
|
||||
В каждой записи обязательно фиксировать:
|
||||
|
||||
- дата и время;
|
||||
- окружение;
|
||||
- commit/tag/image;
|
||||
- кто запускал pass;
|
||||
- какие smoke steps прошли;
|
||||
- какие дефекты подтверждены;
|
||||
- какие наблюдения являются только инфраструктурными;
|
||||
- какой deploy проверялся;
|
||||
- кто проводил проверку;
|
||||
- какой scope реально покрыт;
|
||||
- какие findings найдены;
|
||||
- какие follow-up fixes нужны.
|
||||
|
||||
Если замечание исправлено, не удалять его из истории, а отметить:
|
||||
@@ -106,7 +102,7 @@ just staging-note-block <domain> <deploy-sha> "codex + operator"
|
||||
- secrets
|
||||
- logs
|
||||
- usage
|
||||
- streaming
|
||||
- rest smoke
|
||||
- mcp smoke
|
||||
|
||||
### Passed
|
||||
@@ -142,7 +138,7 @@ just staging-note-block <domain> <deploy-sha> "codex + operator"
|
||||
- `high`
|
||||
primary flow broken, но система частично работает
|
||||
- `medium`
|
||||
заметный UX/runtime дефект с обходным путем
|
||||
заметный UX или runtime дефект с обходным путем
|
||||
- `low`
|
||||
косметика, wording, layout, docs mismatch
|
||||
|
||||
@@ -156,14 +152,13 @@ just staging-note-block <domain> <deploy-sha> "codex + operator"
|
||||
- page-level JS exception;
|
||||
- incorrect MCP result;
|
||||
- secret/auth profile flow mismatch;
|
||||
- deploy route returning HTML instead of JSON;
|
||||
- streaming session/job inconsistency.
|
||||
- deploy route returning HTML instead of JSON.
|
||||
|
||||
### Не считать product finding
|
||||
|
||||
- разовый сетевой timeout;
|
||||
- локальный browser glitch без воспроизведения;
|
||||
- внешний upstream outage из публичного smoke target;
|
||||
- внешний upstream outage из public REST smoke target;
|
||||
- предупреждения, не влияющие на flow;
|
||||
- заранее известные `planned` capability blocks.
|
||||
|
||||
@@ -176,11 +171,8 @@ just staging-note-block <domain> <deploy-sha> "codex + operator"
|
||||
- auth/login status;
|
||||
- clean routes status;
|
||||
- `Secrets -> Auth Profiles -> Wizard -> Test run` статус;
|
||||
- `REST`, `GraphQL`, `gRPC` smoke results;
|
||||
- streaming pages status;
|
||||
- WebSocket/SOAP note:
|
||||
- `not exercised`
|
||||
- или `failed/passed` с причиной.
|
||||
- REST smoke results;
|
||||
- MCP smoke result.
|
||||
|
||||
## 7. Последняя актуальная запись
|
||||
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
{
|
||||
"code": "BR"
|
||||
}
|
||||
@@ -1,4 +0,0 @@
|
||||
{
|
||||
"a": 7,
|
||||
"b": 5
|
||||
}
|
||||
@@ -37,18 +37,3 @@ Usage:
|
||||
```bash
|
||||
./scripts/staging-note-block.sh rmcp.itexp.me abc1234 "codex + operator" partial
|
||||
```
|
||||
|
||||
## export-community.sh
|
||||
|
||||
Helper that replaces the working tree of the extracted `crank-community`
|
||||
repository with the tracked monorepo baseline for private split rehearsal.
|
||||
|
||||
It is not the final public export mechanism.
|
||||
Final `crank-community` import must follow
|
||||
`docs/community-source-whitelist.md`.
|
||||
|
||||
Usage:
|
||||
|
||||
```bash
|
||||
./scripts/export-community.sh /path/to/crank-community-working-tree
|
||||
```
|
||||
|
||||
@@ -1,35 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
usage() {
|
||||
cat <<'EOF'
|
||||
Usage:
|
||||
./scripts/export-community.sh /path/to/crank-community-working-tree
|
||||
|
||||
The target directory must already be a git working tree for crank-community.
|
||||
EOF
|
||||
}
|
||||
|
||||
if [[ "${1:-}" == "-h" || "${1:-}" == "--help" ]]; then
|
||||
usage
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if [[ $# -ne 1 ]]; then
|
||||
usage >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
repo_root="$(git rev-parse --show-toplevel)"
|
||||
target_dir="$(cd "$1" && pwd)"
|
||||
|
||||
if [[ ! -d "$target_dir/.git" ]]; then
|
||||
echo "target is not a git working tree: $target_dir" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
find "$target_dir" -mindepth 1 -maxdepth 1 ! -name .git -exec rm -rf {} +
|
||||
|
||||
git -C "$repo_root" ls-files -z -- . ':(exclude)templates/repositories/**' \
|
||||
| rsync -a --delete --from0 --files-from=- "$repo_root/" "$target_dir/"
|
||||
@@ -30,7 +30,7 @@ cat <<EOF
|
||||
- secrets
|
||||
- logs
|
||||
- usage
|
||||
- streaming
|
||||
- rest smoke
|
||||
- mcp smoke
|
||||
|
||||
### Passed
|
||||
@@ -39,11 +39,7 @@ cat <<EOF
|
||||
- shell pages open after auth
|
||||
- secrets/auth profile flow status: \`<passed|partial|failed>\`
|
||||
- REST smoke: \`<passed|partial|failed>\`
|
||||
- GraphQL smoke: \`<passed|partial|failed>\`
|
||||
- gRPC smoke: \`<passed|partial|failed>\`
|
||||
- streaming pages status: \`<passed|partial|failed>\`
|
||||
- WebSocket: \`<not exercised|passed|failed>\`
|
||||
- SOAP: \`<not exercised|passed|failed>\`
|
||||
- MCP smoke: \`<passed|partial|failed>\`
|
||||
|
||||
### Findings
|
||||
|
||||
|
||||
Reference in New Issue
Block a user