Files
mono/scripts/promote.sh
T
coopops 44e45dfb00
Typecheck / desktop (pull_request) Failing after 8m19s
Typecheck / controller (pull_request) Successful in 12m30s
[@dark-sun] ci(release): FF-промоушн dev→testnet→main вместо merge -X theirs
Релизный флоу переведён на линейную fast-forward модель — устраняет
регулярные конфликты на 20 package.json при релизе.

Корень проблемы: publish-alpha.sh/publish-prod.sh бампали версию НА КАЖДОЙ
ветке (alpha-N на testnet, чистую на main) через `git merge -X theirs` +
back-merge. Два независимых bump-коммита за цикл + merge'и плодили
расхождение веток → конфликты (особенно при гонке push/pull).

Новая модель:
- Версию бампает lerna ОДИН раз на dev (scripts/cut-release.sh).
- Тот же коммит едет вверх по FF: scripts/promote.sh testnet|main
  (server-side fast-forward push, рабочее дерево не трогается).
- testnet/main не несут своих коммитов → ветки не диверджатся → конфликты
  структурно невозможны.

release.yaml:
- Триггер: push в testnet/main с изменением lerna.json (вместо тега v*).
  Окружение определяет ВЕТКА (main→prod, testnet→staging), не суффикс -alpha.
- Версия читается из закоммиченного lerna.json (едет с коммитом по FF).
- Гейты npm-publish/доки: branch == main (вместо !contains '-alpha').
- Образы/webhook по-прежнему версия-тегированы → playbooks/приёмник деплоя
  не затрагиваются.

Удалены publish-alpha.sh/publish-prod.sh и мёртвые дубли тех же merge-X-theirs
скриптов (root sync:main, components/contracts production/testnet/docs-publish).
Документация — scripts/RELEASE.md + CLAUDE.md PR-flow.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 18:29:09 +00:00

43 lines
1.7 KiB
Bash
Executable File

#!/bin/bash
set -e
# Fast-forward промоушн БЕЗ merge: target-ветка просто двигается на коммит
# source-ветки. testnet и main не несут собственных коммитов — это указатели на
# протестированный коммит dev. Ветки не диверджатся → конфликты невозможны.
#
# scripts/promote.sh testnet # dev → testnet (staging-деплой)
# scripts/promote.sh main # testnet → main (production-деплой)
#
# Если push отвергнут как non-fast-forward — это ГАРД, не баг: значит в target
# попал прямой коммит, и target обогнал source. Выровняй вручную (в testnet/main
# прямых коммитов быть не должно — только FF-промоушн).
TARGET="$1"
case "$TARGET" in
testnet) SOURCE="dev" ;;
main) SOURCE="testnet" ;;
*)
echo "Использование: $0 <testnet|main>"
exit 1
;;
esac
git fetch origin
echo "FF-промоушн: origin/$SOURCE → origin/$TARGET"
# Server-side fast-forward: двигаем удалённый $TARGET на коммит удалённого $SOURCE.
# Рабочее дерево не трогаем (никаких checkout/merge). Без --force: сервер
# отвергнет, если это не fast-forward.
git push origin "origin/${SOURCE}:refs/heads/${TARGET}"
if [ "$TARGET" = "main" ]; then
ENV_LABEL="PRODUCTION (+ npm publish + доки)"
else
ENV_LABEL="staging/testnet"
fi
echo
echo "Готово. origin/$TARGET = origin/$SOURCE."
echo "CI задеплоит: $ENV_LABEL."