ci: harden community release baseline
This commit is contained in:
@@ -65,11 +65,20 @@ jobs:
|
|||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v5
|
uses: actions/checkout@v5
|
||||||
|
|
||||||
- name: Validate static UI files
|
- name: Setup Node.js
|
||||||
run: |
|
uses: actions/setup-node@v4
|
||||||
test -f apps/ui/Dockerfile
|
with:
|
||||||
test -f apps/ui/index.html
|
node-version: 22
|
||||||
test -f apps/ui/nginx.conf
|
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
|
- name: Build UI image
|
||||||
run: docker build -f apps/ui/Dockerfile .
|
run: docker build -f apps/ui/Dockerfile .
|
||||||
|
|||||||
@@ -69,7 +69,7 @@ Progress:
|
|||||||
|
|
||||||
### `feat/community-release-hardening`
|
### `feat/community-release-hardening`
|
||||||
|
|
||||||
Status: in_progress
|
Status: done
|
||||||
|
|
||||||
Goal:
|
Goal:
|
||||||
- закрепить воспроизводимый Community release path и release checklist без скрытых переходных допущений.
|
- закрепить воспроизводимый Community release path и release checklist без скрытых переходных допущений.
|
||||||
@@ -80,6 +80,12 @@ Main code areas:
|
|||||||
- `deploy/community/*`
|
- `deploy/community/*`
|
||||||
- `docs/community-release-checklist.md`
|
- `docs/community-release-checklist.md`
|
||||||
- `docs/deploy-and-staging-smoke.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:
|
Implementation slices:
|
||||||
1. проверить соответствие CI Community manifests;
|
1. проверить соответствие CI Community manifests;
|
||||||
@@ -91,6 +97,22 @@ DoD:
|
|||||||
- checklist соответствует реальному Community deploy surface;
|
- 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`
|
### `feat/common-public-improvements`
|
||||||
|
|
||||||
Status: ready
|
Status: ready
|
||||||
|
|||||||
@@ -2,21 +2,20 @@
|
|||||||
|
|
||||||
## 1. Назначение
|
## 1. Назначение
|
||||||
|
|
||||||
Этот документ описывает именно тот кусок staging smoke, который нельзя честно закрыть одними `curl` и unauthenticated route checks.
|
Этот документ описывает тот кусок Community staging smoke, который нельзя честно закрыть одними `curl` и unauthenticated route checks.
|
||||||
|
|
||||||
Он покрывает:
|
Он покрывает:
|
||||||
|
|
||||||
- login/logout;
|
- login/logout;
|
||||||
- UI shell после входа;
|
- UI shell после входа;
|
||||||
- `Secrets -> Auth Profiles -> Wizard -> Test run`;
|
- `Secrets -> Auth Profiles -> Wizard -> Test run`;
|
||||||
- protocol smoke через UI и MCP;
|
- `REST` smoke через UI и MCP.
|
||||||
- streaming pages после реальных вызовов.
|
|
||||||
|
|
||||||
Использовать вместе с:
|
Использовать вместе с:
|
||||||
|
|
||||||
- [deploy-and-staging-smoke.md](/home/a.tolmachev/code/rust/mcpaas/docs/deploy-and-staging-smoke.md)
|
- [deploy-and-staging-smoke.md](deploy-and-staging-smoke.md)
|
||||||
- [staging-regression-notes.md](/home/a.tolmachev/code/rust/mcpaas/docs/staging-regression-notes.md)
|
- [staging-regression-notes.md](staging-regression-notes.md)
|
||||||
- [manual-regression-checklist.md](/home/a.tolmachev/code/rust/mcpaas/docs/manual-regression-checklist.md)
|
- [manual-regression-checklist.md](manual-regression-checklist.md)
|
||||||
|
|
||||||
## 2. Что нужно заранее
|
## 2. Что нужно заранее
|
||||||
|
|
||||||
@@ -27,7 +26,7 @@
|
|||||||
- `CRANK_STAGING_ADMIN_EMAIL=... CRANK_STAGING_ADMIN_PASSWORD=... just authenticated-staging-smoke https://<domain>`
|
- `CRANK_STAGING_ADMIN_EMAIL=... CRANK_STAGING_ADMIN_PASSWORD=... just authenticated-staging-smoke https://<domain>`
|
||||||
- известны bootstrap admin credentials;
|
- известны bootstrap admin credentials;
|
||||||
- на стенде есть demo data или подготовленный disposable workspace;
|
- на стенде есть demo data или подготовленный disposable workspace;
|
||||||
- браузер открыт с devtools, чтобы фиксировать network/console findings.
|
- браузер открыт с devtools, чтобы фиксировать network и console findings.
|
||||||
|
|
||||||
## 3. Канонический проход
|
## 3. Канонический проход
|
||||||
|
|
||||||
@@ -39,9 +38,7 @@ export CRANK_STAGING_ADMIN_PASSWORD=secret
|
|||||||
just authenticated-staging-smoke https://<domain>
|
just authenticated-staging-smoke https://<domain>
|
||||||
```
|
```
|
||||||
|
|
||||||
После завершения прохода готовый блок для
|
После завершения прохода готовый блок для [staging-regression-notes.md](staging-regression-notes.md) можно сгенерировать так:
|
||||||
[staging-regression-notes.md](/home/a.tolmachev/code/rust/mcpaas/docs/staging-regression-notes.md)
|
|
||||||
можно сгенерировать так:
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
just staging-note-block <domain> <deploy-sha> "codex + operator"
|
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 на `/`;
|
- valid login -> redirect на `/`;
|
||||||
- нет redirect loop;
|
- нет redirect loop;
|
||||||
- password-only note видна;
|
- password-only note видна;
|
||||||
- planned actions на login не выглядят рабочими.
|
|
||||||
3. После входа проверить:
|
3. После входа проверить:
|
||||||
- current workspace в navbar;
|
- current workspace в navbar;
|
||||||
- user identity;
|
- user identity;
|
||||||
@@ -80,7 +76,7 @@ just staging-note-block <domain> <deploy-sha> "codex + operator"
|
|||||||
|
|
||||||
- `status: passed | partial | failed`
|
- `status: passed | partial | failed`
|
||||||
- есть ли console errors;
|
- есть ли console errors;
|
||||||
- есть ли failing XHR/fetch;
|
- есть ли failing XHR или fetch;
|
||||||
- есть ли broken layout.
|
- есть ли broken layout.
|
||||||
|
|
||||||
### 3.3. Secrets and auth profiles
|
### 3.3. Secrets and auth profiles
|
||||||
@@ -111,19 +107,17 @@ just staging-note-block <domain> <deploy-sha> "codex + operator"
|
|||||||
- upstream сохраняется;
|
- upstream сохраняется;
|
||||||
- test run отрабатывает с `auth_profile_ref`.
|
- 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`
|
- `REST`
|
||||||
- `GraphQL`
|
|
||||||
- `gRPC`
|
|
||||||
|
|
||||||
Для каждого:
|
Порядок:
|
||||||
|
|
||||||
1. создать или открыть operation;
|
1. создать или открыть operation;
|
||||||
2. выполнить `Test run`;
|
2. выполнить `Test run`;
|
||||||
@@ -133,21 +127,9 @@ just staging-note-block <domain> <deploy-sha> "codex + operator"
|
|||||||
- `tools/list`
|
- `tools/list`
|
||||||
- `tools/call`
|
- `tools/call`
|
||||||
|
|
||||||
### 3.6. Streaming smoke
|
|
||||||
|
|
||||||
Проверить:
|
|
||||||
|
|
||||||
- `window` tool;
|
|
||||||
- `session` tool;
|
|
||||||
- `async_job` tool;
|
|
||||||
|
|
||||||
Если WebSocket/SOAP upstream на стенде отсутствуют:
|
|
||||||
|
|
||||||
- явно записать `not exercised`, а не оставлять пустым.
|
|
||||||
|
|
||||||
## 4. Что нужно занести в staging notes
|
## 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;
|
- deploy commit;
|
||||||
- кто проходил smoke;
|
- кто проходил smoke;
|
||||||
@@ -160,11 +142,7 @@ just staging-note-block <domain> <deploy-sha> "codex + operator"
|
|||||||
- secrets/auth profiles;
|
- secrets/auth profiles;
|
||||||
- wizard;
|
- wizard;
|
||||||
- REST;
|
- REST;
|
||||||
- GraphQL;
|
- MCP smoke.
|
||||||
- gRPC;
|
|
||||||
- streaming;
|
|
||||||
- WebSocket;
|
|
||||||
- SOAP.
|
|
||||||
|
|
||||||
## 5. Готовый блок для вставки
|
## 5. Готовый блок для вставки
|
||||||
|
|
||||||
@@ -190,7 +168,7 @@ just staging-note-block <domain> <deploy-sha> "codex + operator"
|
|||||||
- secrets
|
- secrets
|
||||||
- logs
|
- logs
|
||||||
- usage
|
- usage
|
||||||
- streaming
|
- rest smoke
|
||||||
- mcp smoke
|
- mcp smoke
|
||||||
|
|
||||||
### Passed
|
### Passed
|
||||||
@@ -199,11 +177,7 @@ just staging-note-block <domain> <deploy-sha> "codex + operator"
|
|||||||
- shell pages open after auth
|
- shell pages open after auth
|
||||||
- secrets/auth profile flow status: `<passed|partial|failed>`
|
- secrets/auth profile flow status: `<passed|partial|failed>`
|
||||||
- REST smoke: `<passed|partial|failed>`
|
- REST smoke: `<passed|partial|failed>`
|
||||||
- GraphQL smoke: `<passed|partial|failed>`
|
- MCP 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>`
|
|
||||||
|
|
||||||
### Findings
|
### 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/deployment.md`
|
||||||
- `docs/deploy-and-staging-smoke.md`
|
- `docs/deploy-and-staging-smoke.md`
|
||||||
- `docs/authenticated-staging-pass.md`
|
- `docs/authenticated-staging-pass.md`
|
||||||
|
- `docs/public-smoke-targets.md`
|
||||||
|
- `docs/staging-regression-notes.md`
|
||||||
|
|
||||||
Root-файлы:
|
Root-файлы:
|
||||||
|
|
||||||
@@ -70,6 +72,7 @@ Community release должен поставлять:
|
|||||||
5. Post-deploy smoke выполнен по:
|
5. Post-deploy smoke выполнен по:
|
||||||
- `docs/deploy-and-staging-smoke.md`
|
- `docs/deploy-and-staging-smoke.md`
|
||||||
- `docs/authenticated-staging-pass.md`
|
- `docs/authenticated-staging-pass.md`
|
||||||
|
- `docs/public-smoke-targets.md`
|
||||||
|
|
||||||
## 6. Правило для будущих коммерческих редакций
|
## 6. Правило для будущих коммерческих редакций
|
||||||
|
|
||||||
@@ -118,4 +121,6 @@ Community release должен поставлять:
|
|||||||
- `docs/deployment.md`
|
- `docs/deployment.md`
|
||||||
- `docs/deploy-and-staging-smoke.md`
|
- `docs/deploy-and-staging-smoke.md`
|
||||||
- `docs/authenticated-staging-pass.md`
|
- `docs/authenticated-staging-pass.md`
|
||||||
|
- `docs/public-smoke-targets.md`
|
||||||
|
- `docs/staging-regression-notes.md`
|
||||||
- `docs/implementation-plan.md`
|
- `docs/implementation-plan.md`
|
||||||
|
|||||||
@@ -2,35 +2,35 @@
|
|||||||
|
|
||||||
## 1. Назначение
|
## 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:
|
Для Community-поставки source of truth для runtime manifests:
|
||||||
|
|
||||||
- `deploy/community/docker-compose.yml`
|
- `deploy/community/docker-compose.yml`
|
||||||
- `deploy/community/.env.example`
|
- `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 прохода использовать отдельный документ:
|
Для полного 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. Когда использовать
|
## 2. Когда использовать
|
||||||
|
|
||||||
Запускать после:
|
Запускать после:
|
||||||
|
|
||||||
- merge в `main` и успешного `Deploy`;
|
- merge в `main` и успешного `Deploy`;
|
||||||
- изменения `nginx`/routing;
|
- изменений `nginx` или routing;
|
||||||
- изменения auth/session;
|
- изменений auth/session;
|
||||||
- изменения `mcp-server`;
|
- изменений `mcp-server`;
|
||||||
- изменения streaming/tool execution;
|
- изменений secrets/auth profiles;
|
||||||
- изменения secrets/auth profiles;
|
- изменений UI routing и login flow;
|
||||||
- изменения UI routing и login flow.
|
- изменений `deploy/community/*`.
|
||||||
|
|
||||||
## 3. Предусловия
|
## 3. Предусловия
|
||||||
|
|
||||||
@@ -39,8 +39,8 @@
|
|||||||
- задеплоенный стек `ui`, `admin-api`, `mcp-server`, `postgres`;
|
- задеплоенный стек `ui`, `admin-api`, `mcp-server`, `postgres`;
|
||||||
- корректный `.env` на сервере;
|
- корректный `.env` на сервере;
|
||||||
- валидный deploy через `.github/workflows/deploy.yml`;
|
- валидный deploy через `.github/workflows/deploy.yml`;
|
||||||
- server deployment path собран из public Community manifest, а не из ad-hoc compose файла;
|
- server deployment path, собранный из `deploy/community/docker-compose.yml`;
|
||||||
- включенный `CRANK_DEMO_SEED=true`, если нужен предзаполненный smoke state;
|
- `CRANK_DEMO_SEED=true`, если нужен предзаполненный smoke state;
|
||||||
- bootstrap admin credentials для входа в UI.
|
- bootstrap admin credentials для входа в UI.
|
||||||
|
|
||||||
## 3.1. Быстрый automated smoke
|
## 3.1. Быстрый automated smoke
|
||||||
@@ -64,7 +64,7 @@ bash scripts/staging-smoke.sh https://<domain>
|
|||||||
- `/mcp/health`;
|
- `/mcp/health`;
|
||||||
- legacy `/html/...` redirects.
|
- legacy `/html/...` redirects.
|
||||||
|
|
||||||
Это не заменяет ручной smoke pass ниже, а только быстро отсеивает грубые deploy/routing поломки.
|
Это не заменяет ручной smoke pass ниже, а только быстро отсеивает грубые deploy или routing поломки.
|
||||||
|
|
||||||
## 4. Server-side smoke
|
## 4. Server-side smoke
|
||||||
|
|
||||||
@@ -79,10 +79,10 @@ docker compose logs --tail=100 mcp-server
|
|||||||
|
|
||||||
Ожидаемо:
|
Ожидаемо:
|
||||||
|
|
||||||
- `admin-api` в `Up` / `healthy`;
|
- `admin-api` в `Up` или `healthy`;
|
||||||
- `mcp-server` в `Up` / `healthy`;
|
- `mcp-server` в `Up` или `healthy`;
|
||||||
- нет циклических restart-ов;
|
- нет циклических restart-ов;
|
||||||
- нет `NotPresent`, `password authentication failed`, `panic`, `invalid transition` и аналогичных fatal ошибок.
|
- нет `password authentication failed`, `panic`, `invalid transition` и аналогичных fatal ошибок.
|
||||||
|
|
||||||
Проверка health endpoints:
|
Проверка health endpoints:
|
||||||
|
|
||||||
@@ -133,7 +133,6 @@ curl -I https://<domain>/html/wizard/
|
|||||||
- нет redirect loop;
|
- нет redirect loop;
|
||||||
- invalid login показывает ошибку;
|
- invalid login показывает ошибку;
|
||||||
- страница честно помечает password-only flow;
|
- страница честно помечает password-only flow;
|
||||||
- `Forgot password`, `Google SSO`, `Request access` визуально disabled/planned.
|
|
||||||
3. Выполнить login.
|
3. Выполнить login.
|
||||||
4. Проверить navbar:
|
4. Проверить navbar:
|
||||||
- workspace switch;
|
- workspace switch;
|
||||||
@@ -181,17 +180,15 @@ Smoke считается успешным, если:
|
|||||||
|
|
||||||
- wizard не требует `${secrets.*}`;
|
- wizard не требует `${secrets.*}`;
|
||||||
- `auth_profile_ref` реально доезжает до execution path;
|
- `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`
|
- `REST` -> `Open-Meteo`
|
||||||
- `GraphQL` -> `Countries`
|
|
||||||
- `gRPC` -> `grpcb.in`
|
|
||||||
|
|
||||||
Порядок:
|
Порядок:
|
||||||
|
|
||||||
@@ -202,33 +199,19 @@ Smoke считается успешным, если:
|
|||||||
5. проверить MCP path;
|
5. проверить MCP path;
|
||||||
6. выполнить `tools/list` и `tools/call`.
|
6. выполнить `tools/list` и `tools/call`.
|
||||||
|
|
||||||
## 10. Streaming smoke
|
## 10. Acceptance criteria
|
||||||
|
|
||||||
На deployed стенде проверить:
|
Deploy или staging smoke считается успешным, если:
|
||||||
|
|
||||||
- `window` tool выполняется и не возвращает бесконечный поток;
|
|
||||||
|
|
||||||
Если есть real upstream:
|
|
||||||
|
|
||||||
- `WebSocket window/session`
|
|
||||||
- `SOAP import + inspect + test run`
|
|
||||||
|
|
||||||
Если real upstream нет, это остается на локальном e2e/fixture stack.
|
|
||||||
|
|
||||||
## 11. Acceptance criteria
|
|
||||||
|
|
||||||
Deploy/staging smoke считается успешным, если:
|
|
||||||
|
|
||||||
- server health зеленый;
|
- server health зеленый;
|
||||||
- reverse proxy отдает правильные routes;
|
- reverse proxy отдает правильные routes;
|
||||||
- login/session живы;
|
- login/session живы;
|
||||||
- all core pages открываются;
|
- все core pages открываются;
|
||||||
- secrets/auth/wizard связка работает;
|
- связка `Secrets -> Auth Profiles -> Wizard -> Test run` работает;
|
||||||
- минимум `REST`, `GraphQL`, `gRPC` проходят `create -> test-run -> publish -> MCP call`;
|
- минимум один `REST` operation проходит `create -> test-run -> publish -> MCP call`;
|
||||||
- streaming pages отображают реальные session/job artifacts;
|
|
||||||
- нет критичных JS ошибок в браузере.
|
- нет критичных JS ошибок в браузере.
|
||||||
|
|
||||||
## 12. Если что-то падает
|
## 11. Если что-то падает
|
||||||
|
|
||||||
Порядок разбора:
|
Порядок разбора:
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -13,10 +13,10 @@
|
|||||||
|
|
||||||
Документ не привязан к конкретному hypervisor, cloud provider, типу VM или домашней инфраструктуре.
|
Документ не привязан к конкретному 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 именно для открытой редакции вынесен в
|
Отдельный 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. Базовая модель деплоя
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
## 1. Назначение
|
## 1. Назначение
|
||||||
|
|
||||||
Этот документ фиксирует post-integration baseline для UI, auth, secrets и streaming slices.
|
Этот документ фиксирует post-integration baseline для Community UI, auth, secrets и REST/MCP slices.
|
||||||
|
|
||||||
Цель:
|
Цель:
|
||||||
|
|
||||||
@@ -20,7 +20,6 @@
|
|||||||
- `postgres`;
|
- `postgres`;
|
||||||
- `admin-api`;
|
- `admin-api`;
|
||||||
- `mcp-server`;
|
- `mcp-server`;
|
||||||
- fixture servers для streaming;
|
|
||||||
- локальный UI proxy.
|
- локальный UI proxy.
|
||||||
|
|
||||||
Покрытые автоматикой сценарии:
|
Покрытые автоматикой сценарии:
|
||||||
@@ -33,9 +32,7 @@
|
|||||||
- usage;
|
- usage;
|
||||||
- workspace/settings;
|
- workspace/settings;
|
||||||
- wizard;
|
- wizard;
|
||||||
- REST window tool;
|
- REST draft/test/publish flow.
|
||||||
- gRPC session tools;
|
|
||||||
- async job tools.
|
|
||||||
|
|
||||||
## 3. Когда запускать этот pass
|
## 3. Когда запускать этот pass
|
||||||
|
|
||||||
@@ -46,9 +43,7 @@
|
|||||||
- operations/wizard;
|
- operations/wizard;
|
||||||
- agents;
|
- agents;
|
||||||
- secrets/auth profiles;
|
- secrets/auth profiles;
|
||||||
- streaming configuration;
|
|
||||||
- MCP transport;
|
- MCP transport;
|
||||||
- REST SSE, gRPC streaming, WebSocket, SOAP adapters;
|
|
||||||
- deploy routing/UI routes.
|
- deploy routing/UI routes.
|
||||||
|
|
||||||
## 4. Обязательные команды перед ручным проходом
|
## 4. Обязательные команды перед ручным проходом
|
||||||
@@ -89,12 +84,7 @@ cd apps/ui && npm run e2e
|
|||||||
### 5.3. Wizard
|
### 5.3. Wizard
|
||||||
|
|
||||||
- открыть `/wizard/`;
|
- открыть `/wizard/`;
|
||||||
- переключить protocol cards:
|
- убедиться, что доступна только `REST` protocol card;
|
||||||
- `REST`
|
|
||||||
- `GraphQL`
|
|
||||||
- `gRPC`
|
|
||||||
- `WebSocket`
|
|
||||||
- `SOAP`
|
|
||||||
- для нового upstream проверить режимы auth:
|
- для нового upstream проверить режимы auth:
|
||||||
- `No auth`
|
- `No auth`
|
||||||
- `Use existing auth profile`
|
- `Use existing auth profile`
|
||||||
@@ -166,24 +156,11 @@ cd apps/ui && npm run e2e
|
|||||||
|
|
||||||
## 6. Protocol smoke pass
|
## 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)
|
- REST: [rest-open-meteo.operation.json](../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.
|
|
||||||
|
|
||||||
## 7. Acceptance criteria
|
## 7. Acceptance criteria
|
||||||
|
|
||||||
@@ -193,8 +170,7 @@ Regression pass считается завершенным, если одновр
|
|||||||
- Playwright suite passed;
|
- Playwright suite passed;
|
||||||
- login/shell/manual navigation не ломаются;
|
- login/shell/manual navigation не ломаются;
|
||||||
- `Secrets -> Auth Profiles -> Wizard -> Test run` связка работает;
|
- `Secrets -> Auth Profiles -> Wizard -> Test run` связка работает;
|
||||||
- public smoke targets проходят для `REST`, `GraphQL`, `gRPC`;
|
- public REST smoke target проходит;
|
||||||
- streaming demo scenarios проходят на локальном e2e стеке;
|
|
||||||
- нет критичных UI regressions на clean routes, i18n и auth redirects.
|
- нет критичных UI regressions на clean routes, i18n и auth redirects.
|
||||||
|
|
||||||
## 8. Если что-то падает
|
## 8. Если что-то падает
|
||||||
|
|||||||
@@ -1,40 +1,32 @@
|
|||||||
# Public Smoke Targets
|
# 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`
|
`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-ы
|
## 2. Готовые operation payload-ы
|
||||||
|
|
||||||
- REST: [rest-open-meteo.operation.json](/home/a.tolmachev/code/rust/mcpaas/examples/mcp-smoke/rest-open-meteo.operation.json)
|
- REST: [rest-open-meteo.operation.json](../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)
|
- REST test input: [rest-open-meteo.test-input.json](../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)
|
|
||||||
|
|
||||||
## 3. Как использовать
|
## 3. Как использовать
|
||||||
|
|
||||||
### 3.1. Через UI
|
### 3.1. Через UI
|
||||||
|
|
||||||
1. Создай operation вручную в `Wizard`.
|
1. Создать operation вручную в `Wizard`.
|
||||||
2. Подставь значения из соответствующего `*.operation.json`.
|
2. Подставить значения из `rest-open-meteo.operation.json`.
|
||||||
3. Для `gRPC` можно либо:
|
3. На шаге теста использовать `rest-open-meteo.test-input.json`.
|
||||||
- просто использовать готовый `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`.
|
|
||||||
|
|
||||||
### 3.2. Через admin-api
|
### 3.2. Через admin-api
|
||||||
|
|
||||||
@@ -70,7 +62,7 @@ curl -sS -c cookie.txt \
|
|||||||
--data '{"email":"<your-email>","password":"<your-password>"}'
|
--data '{"email":"<your-email>","password":"<your-password>"}'
|
||||||
```
|
```
|
||||||
|
|
||||||
## 4. Что именно проверяют примеры
|
## 4. Что именно проверяет пример
|
||||||
|
|
||||||
### 4.1. REST: Open-Meteo
|
### 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. Практическая рекомендация
|
## 5. Практическая рекомендация
|
||||||
|
|
||||||
Для первого smoke pass используй именно эти три operation:
|
Для первого smoke pass использовать operation:
|
||||||
|
|
||||||
- `weather_current_open_meteo`
|
- `weather_current_open_meteo`
|
||||||
- `country_lookup_countries`
|
|
||||||
- `grpcb_add_sum`
|
|
||||||
|
|
||||||
Этого достаточно, чтобы проверить весь путь:
|
Этого достаточно, чтобы проверить весь путь:
|
||||||
|
|
||||||
|
|||||||
@@ -35,18 +35,17 @@
|
|||||||
|
|
||||||
### Infra notes
|
### Infra notes
|
||||||
|
|
||||||
- this pass covered only unauthenticated public/staging smoke;
|
- this pass covered only unauthenticated public or staging smoke;
|
||||||
- authenticated UI flows, MCP tool calls, secrets/auth-profile flows and protocol smoke were not exercised in this entry.
|
- authenticated UI flows, MCP tool calls, secrets/auth-profile flows and REST smoke were not exercised in this entry.
|
||||||
|
|
||||||
### Follow-up
|
### Follow-up
|
||||||
|
|
||||||
- run a full authenticated browser smoke after the next deploy;
|
- run a full authenticated browser smoke after the next deploy;
|
||||||
- record `REST`, `GraphQL`, `gRPC` protocol smoke results in the next entry;
|
- record REST and MCP smoke results in the next entry.
|
||||||
- add WebSocket/SOAP status as `not exercised` or `passed/failed` explicitly.
|
|
||||||
|
|
||||||
## 1. Назначение
|
## 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)
|
- [deploy-and-staging-smoke.md](deploy-and-staging-smoke.md)
|
||||||
- [manual-regression-checklist.md](/home/a.tolmachev/code/rust/mcpaas/docs/manual-regression-checklist.md)
|
- [manual-regression-checklist.md](manual-regression-checklist.md)
|
||||||
- [authenticated-staging-pass.md](/home/a.tolmachev/code/rust/mcpaas/docs/authenticated-staging-pass.md)
|
- [authenticated-staging-pass.md](authenticated-staging-pass.md)
|
||||||
|
|
||||||
Шаблон нового блока можно быстро сгенерировать через:
|
Если нужно сгенерировать заготовку новой записи:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
just staging-note-block <domain> <deploy-sha> "codex + operator"
|
just staging-note-block <domain> <deploy-sha> "codex + operator"
|
||||||
@@ -68,17 +67,14 @@ just staging-note-block <domain> <deploy-sha> "codex + operator"
|
|||||||
|
|
||||||
## 2. Как вести записи
|
## 2. Как вести записи
|
||||||
|
|
||||||
Каждый deploy или ручной regression pass должен добавляться новым блоком в начало документа.
|
Добавлять новую запись сверху документа.
|
||||||
|
|
||||||
На один блок фиксировать:
|
В каждой записи обязательно фиксировать:
|
||||||
|
|
||||||
- дата и время;
|
- какой deploy проверялся;
|
||||||
- окружение;
|
- кто проводил проверку;
|
||||||
- commit/tag/image;
|
- какой scope реально покрыт;
|
||||||
- кто запускал pass;
|
- какие findings найдены;
|
||||||
- какие smoke steps прошли;
|
|
||||||
- какие дефекты подтверждены;
|
|
||||||
- какие наблюдения являются только инфраструктурными;
|
|
||||||
- какие follow-up fixes нужны.
|
- какие follow-up fixes нужны.
|
||||||
|
|
||||||
Если замечание исправлено, не удалять его из истории, а отметить:
|
Если замечание исправлено, не удалять его из истории, а отметить:
|
||||||
@@ -106,7 +102,7 @@ just staging-note-block <domain> <deploy-sha> "codex + operator"
|
|||||||
- secrets
|
- secrets
|
||||||
- logs
|
- logs
|
||||||
- usage
|
- usage
|
||||||
- streaming
|
- rest smoke
|
||||||
- mcp smoke
|
- mcp smoke
|
||||||
|
|
||||||
### Passed
|
### Passed
|
||||||
@@ -142,7 +138,7 @@ just staging-note-block <domain> <deploy-sha> "codex + operator"
|
|||||||
- `high`
|
- `high`
|
||||||
primary flow broken, но система частично работает
|
primary flow broken, но система частично работает
|
||||||
- `medium`
|
- `medium`
|
||||||
заметный UX/runtime дефект с обходным путем
|
заметный UX или runtime дефект с обходным путем
|
||||||
- `low`
|
- `low`
|
||||||
косметика, wording, layout, docs mismatch
|
косметика, wording, layout, docs mismatch
|
||||||
|
|
||||||
@@ -156,14 +152,13 @@ just staging-note-block <domain> <deploy-sha> "codex + operator"
|
|||||||
- page-level JS exception;
|
- page-level JS exception;
|
||||||
- incorrect MCP result;
|
- incorrect MCP result;
|
||||||
- secret/auth profile flow mismatch;
|
- secret/auth profile flow mismatch;
|
||||||
- deploy route returning HTML instead of JSON;
|
- deploy route returning HTML instead of JSON.
|
||||||
- streaming session/job inconsistency.
|
|
||||||
|
|
||||||
### Не считать product finding
|
### Не считать product finding
|
||||||
|
|
||||||
- разовый сетевой timeout;
|
- разовый сетевой timeout;
|
||||||
- локальный browser glitch без воспроизведения;
|
- локальный browser glitch без воспроизведения;
|
||||||
- внешний upstream outage из публичного smoke target;
|
- внешний upstream outage из public REST smoke target;
|
||||||
- предупреждения, не влияющие на flow;
|
- предупреждения, не влияющие на flow;
|
||||||
- заранее известные `planned` capability blocks.
|
- заранее известные `planned` capability blocks.
|
||||||
|
|
||||||
@@ -176,11 +171,8 @@ just staging-note-block <domain> <deploy-sha> "codex + operator"
|
|||||||
- auth/login status;
|
- auth/login status;
|
||||||
- clean routes status;
|
- clean routes status;
|
||||||
- `Secrets -> Auth Profiles -> Wizard -> Test run` статус;
|
- `Secrets -> Auth Profiles -> Wizard -> Test run` статус;
|
||||||
- `REST`, `GraphQL`, `gRPC` smoke results;
|
- REST smoke results;
|
||||||
- streaming pages status;
|
- MCP smoke result.
|
||||||
- WebSocket/SOAP note:
|
|
||||||
- `not exercised`
|
|
||||||
- или `failed/passed` с причиной.
|
|
||||||
|
|
||||||
## 7. Последняя актуальная запись
|
## 7. Последняя актуальная запись
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +0,0 @@
|
|||||||
{
|
|
||||||
"code": "BR"
|
|
||||||
}
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
{
|
|
||||||
"a": 7,
|
|
||||||
"b": 5
|
|
||||||
}
|
|
||||||
@@ -37,18 +37,3 @@ Usage:
|
|||||||
```bash
|
```bash
|
||||||
./scripts/staging-note-block.sh rmcp.itexp.me abc1234 "codex + operator" partial
|
./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
|
- secrets
|
||||||
- logs
|
- logs
|
||||||
- usage
|
- usage
|
||||||
- streaming
|
- rest smoke
|
||||||
- mcp smoke
|
- mcp smoke
|
||||||
|
|
||||||
### Passed
|
### Passed
|
||||||
@@ -39,11 +39,7 @@ cat <<EOF
|
|||||||
- shell pages open after auth
|
- shell pages open after auth
|
||||||
- secrets/auth profile flow status: \`<passed|partial|failed>\`
|
- secrets/auth profile flow status: \`<passed|partial|failed>\`
|
||||||
- REST smoke: \`<passed|partial|failed>\`
|
- REST smoke: \`<passed|partial|failed>\`
|
||||||
- GraphQL smoke: \`<passed|partial|failed>\`
|
- MCP 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>\`
|
|
||||||
|
|
||||||
### Findings
|
### Findings
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user