build: versions.env как единый контракт продукта, платформы и toolchain

Версии были размазаны: PACKAGE_VERSION в build.sh, схема конфигурации в
profile.ts и в hy2xs.env, версии toolchain в deps.sh, Debian 13 в
нескольких местах. Расхождение уже перестало быть теоретическим - пакет
1.0.0 сообщал "HY2XS admin version v0.0.22".

Введён корневой versions.env: версия продукта, линия релиза, схема
конфигурации, целевая платформа, версии и контрольные суммы
Go/Bun/Node/pnpm, политика выбора Hysteria.

Чего в нём нет намеренно:

1. Прикладных зависимостей - у них есть pnpm-lock.yaml, bun.lock,
   go.sum. Второй слой неизбежно разъедется с настоящим графом.
2. Конкретной версии Hysteria - здесь только политика
   HYSTERIA_CHANNEL, результат резолва живёт в hysteria-lock.env.
   Пин версии здесь вернул бы ручное обновление.

Подход - проверка, а не генерация. profile.ts, hy2xs.env и
packageManager в двух package.json остаются обычными файлами, чтобы
bun test, tsc и go test работали из чистого чекаута до сборки. Новый
шаг verify_versions_contract роняет сборку до создания tarball при
расхождении. Контракт оркестратора сверяется не grep'ом по исходникам,
а выводом print-contract.ts: это доказывает, что в бинарь попало то же
значение.

Версия админки перестала быть константой и приезжает через ldflags;
собранный бинарь проверяется запуском hy2xs-admin version.

Контрольные суммы toolchain больше не передаются через окружение. Для
Bun зафиксированы обе суммы: артефакт выбирается по наличию AVX2,
поэтому одной архитектурно недостаточно. Production-сборка снова
запускается одной командой.
This commit is contained in:
2026-08-27 12:15:24 +05:00
parent abdcb881f3
commit 9da61c9482
8 changed files with 430 additions and 25 deletions
+62
View File
@@ -0,0 +1,62 @@
# HY2XS: единственный источник истины для контракта
# «продукт / платформа / toolchain».
#
# Что здесь ЕСТЬ:
# версия продукта, линия релиза, схема конфигурации, целевая платформа,
# версии и контрольные суммы build-toolchain, политика выбора Hysteria.
#
# Чего здесь НЕТ и быть не должно:
# 1. Прикладные зависимости (Vue, Gin, GORM, npm/Go модули). У них уже есть
# канонические lock-механизмы: apps/frontend/pnpm-lock.yaml,
# orchestrator/bun.lock, apps/go.sum. Второй слой неизбежно разъедется
# с настоящим графом зависимостей.
# 2. Конкретная версия Hysteria. Здесь живёт только ПОЛИТИКА выбора
# (HYSTERIA_CHANNEL). Результат резолва конкретной сборки замораживается
# в tools/build/hysteria-lock.env. Пин версии здесь вернул бы ручное
# обновление, от которого мы ушли.
#
# Файл читается сборкой (tools/build/lib/versions.sh) и проверяется шагом
# verify_versions_contract: рассинхрон с package.json / profile.ts /
# hy2xs.env / go.mod роняет сборку до создания tarball.
#
# Синтаксис — POSIX shell: файл должен безопасно подключаться через `.`
# без jq, Node и Python.
# ------------------------------------------------------------- продукт ---
HY2XS_VERSION=1.0.0
HY2XS_RELEASE_LINE=1
HY2XS_CONFIG_SCHEMA_VERSION=2
# ------------------------------------------------------------ платформа ---
HY2XS_BUILD_OS=debian
HY2XS_BUILD_OS_VERSION=13
HY2XS_BUILD_ARCH=amd64
HY2XS_TARGET_OS=debian
HY2XS_TARGET_OS_VERSION=13
HY2XS_TARGET_ARCH=amd64
# ------------------------------------------------------------ toolchain ---
GO_VERSION=1.21.13
GO_LINUX_AMD64_SHA256=502fc16d5910562461e6a6631fb6377de2322aad7304bf2bcd23500ba9dab4a7
# Bun выбирает артефакт по наличию AVX2, поэтому одной контрольной суммы
# архитектурно недостаточно: обе должны быть зафиксированы заранее.
BUN_VERSION=1.3.13
BUN_LINUX_X64_SHA256=79c0771fa8b92c33aae41e15a0e0d307ea99d0e2f00317c71c6c53237a78e25a
BUN_LINUX_X64_BASELINE_SHA256=9d8a24292a7068090205daac0a5a223f5f69736f5287e37bf88d3b4031edc750
NODE_VERSION=20.19.0
NODE_LINUX_X64_SHA256=b4e336584d62abefad31baecff7af167268be9bb7dd11f1297112e6eed3ca0d5
# pnpm ставится через corepack, отдельного архива с контрольной суммой нет.
PNPM_VERSION=9.15.9
# ------------------------------------------------ политика выбора Hysteria ---
# stable — резолвить последний стабильный upstream-релиз на build-машине;
# pinned — использовать закоммиченный tools/build/hysteria-lock.env офлайн.
HYSTERIA_CHANNEL=stable