Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ CHANNEL_GATEWAY_CONTEXT=../../portable-agent-channel-gateway
ACTION_SERVICE_CONTEXT=../../portable-agent-action-service
MCP_GATEWAY_CONTEXT=../../portable-agent-mcp-gateway
CALENDAR_MCP_CONTEXT=../../portable-agent-calendar-mcp
TEST_LAB_PATH=../portable-agent-test-lab

KEYCLOAK_DB_USER=keycloak
KEYCLOAK_DB_PASSWORD=local_keycloak_db_change_me
Expand Down
17 changes: 15 additions & 2 deletions .github/workflows/app-smoke.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ on:
- "compose/**"
- "config/versions.env"
- "Taskfile.yml"
- "scripts/check-apps.ps1"
- "scripts/run-test-lab.ps1"
- "scripts/check-compose.ps1"
- "scripts/check-keycloak.ps1"
- "scripts/start-local.ps1"
Expand All @@ -31,6 +31,7 @@ jobs:
ACTION_SERVICE_CONTEXT: ${{ github.workspace }}/repos/action-service
MCP_GATEWAY_CONTEXT: ${{ github.workspace }}/repos/mcp-gateway
CALENDAR_MCP_CONTEXT: ${{ github.workspace }}/repos/calendar-mcp
TEST_LAB_PATH: ${{ github.workspace }}/repos/test-lab
steps:
- name: Получить deploy
uses: actions/checkout@v7
Expand All @@ -45,6 +46,7 @@ jobs:
"action=$($versions.ACTION_SERVICE_IMAGE.Split(':')[-1])" >> $env:GITHUB_OUTPUT
"gateway=$($versions.MCP_GATEWAY_IMAGE.Split(':')[-1])" >> $env:GITHUB_OUTPUT
"calendar=$($versions.CALENDAR_MCP_IMAGE.Split(':')[-1])" >> $env:GITHUB_OUTPUT
"test_lab=$($versions.TEST_LAB_REF)" >> $env:GITHUB_OUTPUT

- name: Получить Channel Gateway
uses: actions/checkout@v7
Expand Down Expand Up @@ -81,13 +83,24 @@ jobs:
ref: ${{ steps.versions.outputs.calendar }}
path: repos/calendar-mcp

- name: Получить Test Lab
uses: actions/checkout@v7
with:
repository: portable-agent/test-lab
ref: ${{ steps.versions.outputs.test_lab }}
path: repos/test-lab

- uses: go-task/setup-task@v2
with:
version: 3.53.1

- name: Запустить полный срез
shell: pwsh
run: ./scripts/start-local.ps1 -Apps

- name: Проверить путь от текста до события
shell: pwsh
run: ./scripts/check-apps.ps1 -TimeoutSeconds 60
run: ./scripts/run-test-lab.ps1

- name: Удалить только тестовый Compose project
if: always()
Expand Down
3 changes: 3 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,9 @@
- `docs/` — русская документация;
- `.github/workflows/` — CI.

`deploy` управляет окружением, а black-box сценарии принадлежат репозиторию `test-lab`. Не добавляй
сюда HTTP-проверки продуктового поведения; вызывай единый сценарий через `run-test-lab.ps1`.

## Команды

```powershell
Expand Down
12 changes: 7 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -62,18 +62,20 @@ task test:e2e
сохраняет локальные данные. `task reset` удаляет только volumes текущего Compose project и всегда
требует явного подтверждения.

`check-apps.ps1` отправляет demo-команду в Channel Gateway, проверяет предложение, создаёт и
подтверждает действие, ждёт Temporal workflow и проверяет, что Calendar MCP сохранил ровно одно
событие с тем же `eventId`.
`deploy` поднимает окружение, затем `run-test-lab.ps1` передаёт локальную тестовую конфигурацию в
соседний репозиторий `portable-agent-test-lab`. Сам black-box сценарий принадлежит `test-lab`: он
отправляет demo-команду в Channel Gateway, подтверждает действие, ждёт Temporal workflow и проверяет,
что Calendar MCP сохранил ровно одно событие с тем же `eventId`.

Та же проверка выполняется workflow `Full application smoke` при изменениях Compose-пути. Workflow
читает полные Git SHA из `config/versions.env`, собирает именно эти версии сервисов в отдельном
Compose project и всегда удаляет только созданные им контейнеры и volumes.

`-Apps` собирает образы из соседних локальных репозиториев через `compose/apps.local.yaml`. Пути можно
переопределить переменными `CHANNEL_GATEWAY_CONTEXT`, `AGENT_RUNTIME_CONTEXT`, `ACTION_SERVICE_CONTEXT`,
`MCP_GATEWAY_CONTEXT` и `CALENDAR_MCP_CONTEXT`; вход в GHCR для локального запуска не нужен. По
умолчанию Channel Gateway доступен на `http://localhost:18084`, Agent Runtime — на
`MCP_GATEWAY_CONTEXT` и `CALENDAR_MCP_CONTEXT`; вход в GHCR для локального запуска не нужен.
`TEST_LAB_PATH` по умолчанию указывает на соседний `../portable-agent-test-lab`; путь можно
переопределить в `.env`. Channel Gateway доступен на `http://localhost:18084`, Agent Runtime — на
`http://localhost:18080`, Action API — на
`http://localhost:18081`, MCP Gateway — на `http://localhost:18083`, а Calendar MCP — на
`http://localhost:18082`.
Expand Down
2 changes: 1 addition & 1 deletion Taskfile.yml
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ tasks:
desc: Поднять полный срез и выполнить сквозной тест встречи
cmds:
- task: services:up
- '{{.POWERSHELL}} {{.POWERSHELL_ARGS}} -File ./scripts/check-apps.ps1'
- '{{.POWERSHELL}} {{.POWERSHELL_ARGS}} -File ./scripts/run-test-lab.ps1'

verify:
desc: Выполнить локальные проверки конфигурации и документации
Expand Down
1 change: 1 addition & 0 deletions config/versions.env
Original file line number Diff line number Diff line change
Expand Up @@ -16,3 +16,4 @@ AGENT_RUNTIME_IMAGE=ghcr.io/portable-agent/agent-runtime:4dd541e459d0bdbf889ddc1
ACTION_SERVICE_IMAGE=ghcr.io/portable-agent/action-service:8d449ab990001e31cd42a7655a16c5716c5d6f20
MCP_GATEWAY_IMAGE=ghcr.io/portable-agent/mcp-gateway:0a3884d52ad1156ed173a4ecf9182ea3a0d2e686
CALENDAR_MCP_IMAGE=ghcr.io/portable-agent/calendar-mcp:bbab64774eab482c9d3543c7b8220b4cb42df56e
TEST_LAB_REF=1ee8b67bb67b13507f32c8761ffa697ea6a7794b
27 changes: 27 additions & 0 deletions docs/decisions/0004-test-lab-ownership.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
# ADR 0004: владение сквозными тестами

Статус: принято.

## Контекст

Первый сквозной сценарий находился в `deploy`. Из-за этого репозиторий развёртывания одновременно
управлял окружением и описывал продуктовое поведение. Такой сценарий было трудно переиспользовать для
Compose, Kubernetes и удалённого тестового стенда.

## Решение

`deploy` владеет жизненным циклом окружения: запускает сервисы, ждёт healthchecks и передаёт только
локальную тестовую конфигурацию. Репозиторий `test-lab` владеет black-box сценариями и их порогами.
Контейнер теста подключается к существующей Compose-сети и обращается к приложениям по внутренним
DNS-именам. Публиковать защищённые порты на всех интерфейсах для теста не требуется.

Команда `task test:e2e` остаётся единой точкой входа. Локально она использует соседний репозиторий,
заданный через `TEST_LAB_PATH`; CI явно получает обе репы. Временные учётные данные берутся из
локального Keycloak fixture и не копируются в Git.

## Последствия

- один и тот же сценарий можно запускать против Compose и будущего Kubernetes-стенда;
- `deploy` не дублирует HTTP-проверки продукта;
- unit-, component- и integration-тесты остаются в репозиториях сервисов;
- добавление нового E2E требует сценария в `test-lab`, но не нового скрипта в `deploy`.
5 changes: 3 additions & 2 deletions docs/development.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,9 @@ Taskfile — единая точка входа. Внутренние PowerShell
Допустимые имена: `channel-gateway`, `agent-runtime`, `action-service`, `mcp-gateway` и
`calendar-mcp`. Неизвестное имя отклоняется до вызова Docker.

`task test:e2e` поднимает полный локальный срез, ждёт healthchecks и проверяет путь от текста до
сохранённого события. Следующий пакет передаст запуск black-box сценариев репозиторию `test-lab`.
`task test:e2e` поднимает полный локальный срез и ждёт healthchecks. Затем `deploy` вызывает
`task test:e2e` в соседнем репозитории `test-lab`, который владеет black-box сценарием от текста до
сохранённого события. Если репозитории лежат не рядом, задай `TEST_LAB_PATH` в локальном `.env`.

`task down` не удаляет данные. `task reset` предназначен для явного пересоздания тестового состояния
и запрашивает подтверждение.
Expand Down
4 changes: 2 additions & 2 deletions docs/index.md
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
# Deploy

Репозиторий содержит инженерный полигон Portable Agent. Compose поднимает инфраструктуру и локальный
полный локальный slice `Channel Gateway → Agent Runtime → Action Service → MCP Gateway → Calendar MCP`. Минимальный
slice `Channel Gateway → Agent Runtime → Action Service → MCP Gateway → Calendar MCP`. Минимальный
Helm chart устанавливается и проверяется в одноразовом k3d-кластере.

Текущий результат:

1. acceptance-тест полного backend-пути в `test-lab`;
1. запуск acceptance-теста полного backend-пути из отдельного `test-lab`;
2. единый локальный JWT с отдельными audience сервисов;
3. общий Channel Gateway и Agent Runtime с закрытыми API и контрактом `2.2.0`;
4. воспроизводимый Compose с локальной сборкой всех приложений.
Expand Down
6 changes: 4 additions & 2 deletions docs/runbook.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,10 @@
task test:e2e
```

Она отправляет текст через Channel Gateway, затем создаёт действие с тем же случайным `requestKey`,
подтверждает его и сверяет результат Action Service с событием в тестовом календарном коннекторе.
Команда поднимает окружение и запускает сценарий из соседнего `test-lab`. Он отправляет текст через
Channel Gateway, создаёт действие со случайным `requestKey`, подтверждает его и сверяет результат
Action Service с событием в тестовом календарном коннекторе. Если `test-lab` лежит в другой папке,
задай `TEST_LAB_PATH` в `.env`.

Первый Docker build скачивает Gradle и Python packages и может быть заметно медленнее повторных
запусков. BuildKit сохраняет слои для следующих сборок.
1 change: 1 addition & 0 deletions mkdocs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,3 +14,4 @@ nav:
- Отдельный deploy-репозиторий: decisions/0001-deploy-repository.md
- Платформа разработки: decisions/0002-developer-platform.md
- Единые команды разработчика: decisions/0003-taskfile-workflow.md
- Владение сквозными тестами: decisions/0004-test-lab-ownership.md
141 changes: 0 additions & 141 deletions scripts/check-apps.ps1

This file was deleted.

Loading
Loading