ci(release): независимый деплой окружений (testnet/main разным темпом) #150

Merged
ant merged 2 commits from ci/independent-env-deploy into dev 2026-06-16 08:17:57 +00:00
Owner

Заменяет «паровоз» dev → testnet → main независимыми деплоями: прод и тест катятся разным темпом и на разные версии одновременно, без диверджа веток и без merge-конфликтов.

Почему

FF-паровоз держался на том, что promote.sh main берёт источником testnetmain мог получить только то, что уже на testnet. Неудобно: нельзя катить прод и тест в своём темпе, нет независимого отката/hotfix.

Идея

testnet и main — два самостоятельных fast-forward-указателя на выбранный релизный тег dev. Оба живут на линейной истории dev, поэтому двигаются только вперёд по FF — расхождений и конфликтов быть не может, но каждый контур двигается независимо.

Изменения

  • scripts/promote.sh <testnet|main> [<версия|ref>] — FF выбранного релизного тега (по умолчанию последний на origin/dev) на ветку окружения. main больше не зависит от testnet. Пинит к тегу-cut (а не к сырой верхушке dev) — прод/тест не получат непомеченную WIP после cut. Только вперёд; откат — через dispatch.
  • .github/workflows/release.yaml — у workflow_dispatch появились inputs environment (testnet/main) + ref. Это покрывает то, что FF не умеет: откат на старую версию, редеплой без бампа, hotfix в один контур. Сборка идёт из вычекнутого ref, окружение — из inputs.environment. Авто-триггер (push в testnet/main с изменением lerna.json) сохранён.
  • scripts/RELEASE.md — модель и инварианты переписаны.

Сохранённые принципы деплоя

Бамп версии один раз на dev (cut), образы по версии, BUILD_MODE по окружению, webhooks per env, npm publish/доки только на main, «no direct commits on testnet/main».

Как пользоваться после merge

pnpm run cut            # бамп версии + тег на dev
pnpm run testnet        # последний тег → staging
pnpm run production     # последний тег → prod (независимо от testnet)
scripts/promote.sh main v2026.6.16   # конкретную версию в прод
# откат/редеплой/hotfix → Gitea Actions → Release → Run workflow (environment+ref)

Проверки

bash -n скрипта — OK; YAML парсится; dry-run резолва тега на реальном репо: git describe origin/devv2026.6.16, версия из тега читается. End-to-end workflow_dispatch на act_runner не гонял — стоит проверить ручным запуском после merge.

Примечание: одностроку про релиз-флоу в CLAUDE.md обновлю отдельно из mono-ai-1.

Заменяет «паровоз» `dev → testnet → main` независимыми деплоями: прод и тест катятся **разным темпом и на разные версии одновременно**, без диверджа веток и без merge-конфликтов. ## Почему FF-паровоз держался на том, что `promote.sh main` берёт источником `testnet` — `main` мог получить только то, что уже на `testnet`. Неудобно: нельзя катить прод и тест в своём темпе, нет независимого отката/hotfix. ## Идея `testnet` и `main` — два самостоятельных **fast-forward-указателя на выбранный релизный тег `dev`**. Оба живут на линейной истории `dev`, поэтому двигаются только вперёд по FF — расхождений и конфликтов быть не может, но каждый контур двигается независимо. ## Изменения - **`scripts/promote.sh <testnet|main> [<версия|ref>]`** — FF выбранного релизного тега (по умолчанию последний на `origin/dev`) на ветку окружения. `main` больше не зависит от `testnet`. Пинит к тегу-cut (а не к сырой верхушке dev) — прод/тест не получат непомеченную WIP после cut. Только вперёд; откат — через dispatch. - **`.github/workflows/release.yaml`** — у `workflow_dispatch` появились inputs `environment` (testnet/main) + `ref`. Это покрывает то, что FF не умеет: **откат** на старую версию, **редеплой** без бампа, **hotfix** в один контур. Сборка идёт из вычекнутого `ref`, окружение — из `inputs.environment`. Авто-триггер (push в testnet/main с изменением `lerna.json`) сохранён. - **`scripts/RELEASE.md`** — модель и инварианты переписаны. ## Сохранённые принципы деплоя Бамп версии один раз на `dev` (`cut`), образы по версии, `BUILD_MODE` по окружению, webhooks per env, npm publish/доки только на `main`, «no direct commits on testnet/main». ## Как пользоваться после merge ``` pnpm run cut # бамп версии + тег на dev pnpm run testnet # последний тег → staging pnpm run production # последний тег → prod (независимо от testnet) scripts/promote.sh main v2026.6.16 # конкретную версию в прод # откат/редеплой/hotfix → Gitea Actions → Release → Run workflow (environment+ref) ``` ## Проверки `bash -n` скрипта — OK; YAML парсится; dry-run резолва тега на реальном репо: `git describe origin/dev` → `v2026.6.16`, версия из тега читается. End-to-end workflow_dispatch на act_runner не гонял — стоит проверить ручным запуском после merge. Примечание: одностроку про релиз-флоу в `CLAUDE.md` обновлю отдельно из mono-ai-1.
claude added 1 commit 2026-06-16 06:49:38 +00:00
ci(release): независимый деплой окружений — testnet/main как FF-указатели на теги dev
Typecheck / desktop (pull_request) Successful in 13m58s
Typecheck / controller (pull_request) Successful in 13m15s
9c2729d243
Паровоз dev→testnet→main заменён независимыми указателями: каждое окружение —
самостоятельный fast-forward-указатель на выбранный релизный тег dev. Прод и тест
катятся разным темпом и на разные версии одновременно, без диверджа и конфликтов
(оба — FF-указатели на линейную историю dev).

- promote.sh <testnet|main> [ref]: FF выбранного тега (по умолчанию — последний на
  origin/dev) на ветку окружения; main больше не зависит от testnet; только вперёд.
- release.yaml: workflow_dispatch получил inputs environment+ref — откат на старую
  версию / редеплой без бампа / hotfix в один контур (то, что FF не умеет). Сборка
  идёт из вычекнутого ref, окружение — из inputs.environment. Авто-триггер по
  изменению lerna.json сохранён.
- RELEASE.md: модель и инварианты переписаны под независимые указатели.

Принципы деплоя сохранены: бамп версии один раз на dev, образы по версии,
BUILD_MODE по окружению, webhooks per env, npm publish/доки только на main.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
claude added 1 commit 2026-06-16 07:45:07 +00:00
ci(release): promote по умолчанию шлёт текущий HEAD (не последний тег)
Typecheck / desktop (pull_request) Has been cancelled
Typecheck / controller (pull_request) Has been cancelled
532e34c53b
Дефолт promote.sh — текущий HEAD чекаута; второй аргумент по-прежнему задаёт явный
ref (ветка/тег/sha). Типичный путь: cut на dev → promote testnet → promote main,
все три от того же HEAD. testnet/main остаются независимыми FF-указателями.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
ant merged commit f42b703098 into dev 2026-06-16 08:17:57 +00:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: C9S/mono#150