feat: simplify config toml, add local after commands

This commit is contained in:
2026-09-07 02:43:23 +05:00
parent eca349a706
commit 97eea5e064
3 changed files with 335 additions and 56 deletions
+53 -17
View File
@@ -49,7 +49,7 @@ Deploy successful! (total 2.3s)
ищется по обычной цепочке, так что временный локальный `./deploy.toml`
переопределяет глобальный — создали файл, задеплоились, удалили.
Схема:
Схема**один проект = один блок**, все параметры точечными ключами:
```toml
[servers.my-vps] # профиль сервера: описывается один раз
@@ -60,29 +60,65 @@ key_path = "~/.ssh/id_ed25519"
base_dir = "/var/www/pages" # корень для относительных sync target
[projects.my-node-app]
server = "my-vps" # ссылка на профиль
workdir = "~/code/my-node-app" # где выполнять локальные команды (~ разворачивается)
[projects.my-node-app.env] # переменные для локальных команд сборки
PUBLIC_BASE_PATH = "/my-node-app"
[projects.my-node-app.local] # шаги сборки на вашей машине
commands = ["npm ci", "npm run build"]
[[projects.my-node-app.sync]] # что заливать на сервер
source = "dist" # файл или папка (относительно workdir)
target = "my-node-app" # относительный -> base_dir сервера;
# абсолютный "/path" используется как есть
[projects.my-node-app.remote] # команды управления на сервере
commands = ["pm2 restart pages"]
server = "my-vps" # ссылка на профиль SSH
workdir = 'C:\code\my-node-app' # где выполнять локальные команды (~ разворачивается)
branch = "main" # опционально: защита от деплоя чужой ветки
env.PUBLIC_BASE_PATH = "/my-node-app" # переменные для локальной сборки
local.commands = ["npm ci", "npm run build"] # шаги сборки на вашей машине
sync = "dist" # залить dist -> <base_dir>/my-node-app
remote.commands = ["pm2 restart pages"] # команды управления по SSH
```
### Поле `sync`
Три формы — выбирай по смыслу:
```toml
sync = "dist" # один источник; target = имя проекта
sync = ["dist", "static"] # несколько источников; target = имя проекта
sync = [{ source = "web/build", target = "/opt/static" }] # полные правила
```
Во всех формах `target` без `/` на конце резолвится через `base_dir` сервера
(`"my-node-app"``/var/www/pages/my-node-app`). Абсолютный target
(`"/opt/static"`) используется как есть. Отдельных блоков `[[...sync]]`,
`[projects.x.env]`, `[projects.x.local]`, `[projects.x.remote]` больше нет —
это не нужно помнить и копировать, всё в блоке проекта.
Проект может задать параметры подключения и напрямую (`host`, `user`, `port`,
`key_path` вместо `server`) — тогда они имеют приоритет над профилем.
Приоритет параметров SSH: проект → `[servers.<name>]``~/.ssh/config` → дефолт.
### Локальные команды после деплоя (`local_after`)
Выполняются на вашей машине **после** sync + remote и **всегда** — и при
успехе, и после любого упавшего шага (deploy всё равно упадёт). Для очистки
артефактов или вебхука с результатом:
```toml
[projects.my-node-app]
server = "my-vps"
workdir = 'C:\code\my-node-app'
local.commands = ["npm run build"]
sync = "dist"
remote.commands = ["pm2 restart pages"]
[projects.my-node-app.local_after]
commands = [
'del /q dist',
'curl -s -X POST https://example.com/hook -d "result=%XBP_DEPLOY_RESULT%"',
]
```
Внутри доступны переменные (в cmd — `%VAR%`, в sh — `$VAR`):
- `XBP_DEPLOY_RESULT``success` либо `failed`;
- `XBP_ERROR` — текст ошибки (только при `failed`).
Эти же переменные доступны в `--dry-run`, где показываются в плане без
выполнения.
### Windows-нюанс TOML
В basic-строках `"..."` бэкслеши — escape-символы, путь `C:\Users` сломает парсинг.