feat: polish deployment and cd pipeline

This commit is contained in:
a.tolmachev
2026-03-25 21:37:13 +03:00
parent 7baef66180
commit 26a1397699
6 changed files with 65 additions and 20 deletions
+14
View File
@@ -83,3 +83,17 @@ jobs:
- name: Run UI tests - name: Run UI tests
working-directory: apps/ui working-directory: apps/ui
run: npm run test -- --run run: npm run test -- --run
deployment:
name: Deployment Artifacts
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v5
- name: Validate docker compose
run: docker compose config -q
- name: Build deployable images
run: docker compose build admin-api mcp-server ui
+28 -6
View File
@@ -1,22 +1,33 @@
name: Deploy name: Deploy
on: on:
push: workflow_run:
branches: workflows:
- main - CI
types:
- completed
workflow_dispatch: workflow_dispatch:
concurrency: concurrency:
group: deploy-${{ github.ref }} group: deploy-${{ github.event_name == 'workflow_run' && github.event.workflow_run.head_branch || github.ref }}
cancel-in-progress: true cancel-in-progress: true
jobs: jobs:
deploy: deploy:
if: >
github.event_name == 'workflow_dispatch' ||
(
github.event_name == 'workflow_run' &&
github.event.workflow_run.conclusion == 'success' &&
github.event.workflow_run.head_branch == 'main'
)
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v5 uses: actions/checkout@v5
with:
ref: ${{ github.event_name == 'workflow_run' && github.event.workflow_run.head_sha || github.sha }}
- name: Configure SSH key - name: Configure SSH key
run: | run: |
@@ -50,6 +61,7 @@ jobs:
ssh "${{ secrets.DEPLOY_USER }}@${{ secrets.DEPLOY_HOST }}" " ssh "${{ secrets.DEPLOY_USER }}@${{ secrets.DEPLOY_HOST }}" "
set -e set -e
cd '${{ secrets.DEPLOY_PATH }}' cd '${{ secrets.DEPLOY_PATH }}'
docker compose config -q
docker compose up -d --build --remove-orphans docker compose up -d --build --remove-orphans
" "
@@ -57,6 +69,16 @@ jobs:
run: | run: |
ssh "${{ secrets.DEPLOY_USER }}@${{ secrets.DEPLOY_HOST }}" " ssh "${{ secrets.DEPLOY_USER }}@${{ secrets.DEPLOY_HOST }}" "
set -e set -e
curl --fail --silent http://127.0.0.1:3001/health >/dev/null cd '${{ secrets.DEPLOY_PATH }}'
curl --fail --silent http://127.0.0.1:3002/health >/dev/null for attempt in \$(seq 1 30); do
if curl --fail --silent http://127.0.0.1:3000/ >/dev/null \
&& curl --fail --silent http://127.0.0.1:3001/health >/dev/null \
&& curl --fail --silent http://127.0.0.1:3002/health >/dev/null; then
exit 0
fi
sleep 2
done
echo 'deployment health verification failed' >&2
docker compose ps >&2
exit 1
" "
+8
View File
@@ -65,6 +65,14 @@ MCPaaS - это low-code платформа для публикации внеш
Конфигурации операций должны импортироваться и экспортироваться в `YAML`, чтобы их можно было переносить между окружениями, хранить в git и редактировать вне UI. Конфигурации операций должны импортироваться и экспортироваться в `YAML`, чтобы их можно было переносить между окружениями, хранить в git и редактировать вне UI.
## CI/CD статус
В репозитории настроены:
- `CI` для Rust, UI и deployment artifacts;
- `CD`, который запускается после успешного `CI` на `main` или вручную;
- containerized production-like deployment через `docker compose`.
## Поддерживаемые протоколы ## Поддерживаемые протоколы
В MVP платформа ориентируется на три основных протокольных сценария интеграции: В MVP платформа ориентируется на три основных протокольных сценария интеграции:
+7 -7
View File
@@ -2,21 +2,21 @@
## Current ## Current
### `feat/hardening` ### `feat/deployment-cd-polish`
Status: completed Status: completed
DoD: DoD:
- демонстрационные сценарии воспроизводимы - CI проверяет deployment artifacts
- логирование и ошибки читаемы - CD запускается только после успешного CI на `main` или вручную
- YAML roundtrip проверен - compose не публикует внутренние сервисы шире, чем нужно
- publish/reload flow стабилен - deploy workflow проверяет health сервисов после запуска
- документация по запуску достаточна для повторения демо - deployment documentation синхронизирована с фактическим pipeline
## Next ## Next
- `feat/deployment-cd-polish` - `feat/ui-polish`
## Backlog ## Backlog
+3 -3
View File
@@ -33,7 +33,7 @@ services:
volumes: volumes:
- artifact_storage:${MCPAAS_STORAGE_ROOT:-/var/lib/rmcp/storage} - artifact_storage:${MCPAAS_STORAGE_ROOT:-/var/lib/rmcp/storage}
ports: ports:
- "3001:3001" - "127.0.0.1:3001:3001"
healthcheck: healthcheck:
test: ["CMD", "curl", "--fail", "http://127.0.0.1:3001/health"] test: ["CMD", "curl", "--fail", "http://127.0.0.1:3001/health"]
interval: 15s interval: 15s
@@ -57,7 +57,7 @@ services:
volumes: volumes:
- artifact_storage:${MCPAAS_STORAGE_ROOT:-/var/lib/rmcp/storage} - artifact_storage:${MCPAAS_STORAGE_ROOT:-/var/lib/rmcp/storage}
ports: ports:
- "3002:3002" - "127.0.0.1:3002:3002"
healthcheck: healthcheck:
test: ["CMD", "curl", "--fail", "http://127.0.0.1:3002/health"] test: ["CMD", "curl", "--fail", "http://127.0.0.1:3002/health"]
interval: 15s interval: 15s
@@ -70,7 +70,7 @@ services:
dockerfile: apps/ui/Dockerfile dockerfile: apps/ui/Dockerfile
restart: unless-stopped restart: unless-stopped
ports: ports:
- "3000:3000" - "127.0.0.1:3000:3000"
healthcheck: healthcheck:
test: ["CMD", "wget", "-qO-", "http://127.0.0.1:3000/"] test: ["CMD", "wget", "-qO-", "http://127.0.0.1:3000/"]
interval: 15s interval: 15s
+5 -4
View File
@@ -163,6 +163,7 @@ services:
- поднимать `postgres`, `admin-api`, `mcp-server`, `ui`; - поднимать `postgres`, `admin-api`, `mcp-server`, `ui`;
- использовать env vars вместо hardcoded config; - использовать env vars вместо hardcoded config;
- иметь persistent storage для БД и artifacts; - иметь persistent storage для БД и artifacts;
- публиковать `ui`, `admin-api` и `mcp-server` только на loopback, если перед ними уже стоит reverse proxy;
- не публиковать внутренние сервисы наружу без необходимости; - не публиковать внутренние сервисы наружу без необходимости;
- содержать healthchecks. - содержать healthchecks.
@@ -190,7 +191,7 @@ CI должен выполнять:
CD для MVP должен: CD для MVP должен:
- запускаться только для `main`; - запускаться только после успешного `CI` на `main` или вручную;
- собирать production artifacts; - собирать production artifacts;
- доставлять deployment files на целевой Linux host; - доставлять deployment files на целевой Linux host;
- выполнять controlled restart; - выполнять controlled restart;
@@ -200,11 +201,11 @@ CD для MVP должен:
1. push в `main` 1. push в `main`
2. успешный `CI` 2. успешный `CI`
3. build images 3. build images или удаленная сборка на хосте
4. upload env и deployment files 4. upload env и deployment files
5. `docker compose pull` 5. `docker compose config -q`
6. `docker compose up -d` 6. `docker compose up -d`
7. healthcheck verification 7. healthcheck verification для `ui`, `admin-api`, `mcp-server`
Для MVP допустим deployment с удаленной сборкой на целевом Linux host через `ssh + rsync + docker compose up -d --build`, если не используется отдельный container registry. Для MVP допустим deployment с удаленной сборкой на целевом Linux host через `ssh + rsync + docker compose up -d --build`, если не используется отдельный container registry.