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:
@@ -24,6 +24,8 @@ prepare_stage() {
|
||||
|
||||
printf '%s\n' "$version" >"$STAGE_DIR/metadata/package.version"
|
||||
printf '%s\n' "$build_id" >"$STAGE_DIR/metadata/package.build_id"
|
||||
printf '%s\n' "$HY2XS_RELEASE_LINE" >"$STAGE_DIR/metadata/package.release_line"
|
||||
printf '%s\n' "$HY2XS_CONFIG_SCHEMA_VERSION" >"$STAGE_DIR/metadata/package.config_schema_version"
|
||||
}
|
||||
|
||||
run_orchestrator_tests() {
|
||||
@@ -95,12 +97,19 @@ bundle_ui() {
|
||||
"$PNPM_BIN" run build:prod
|
||||
)
|
||||
|
||||
# Версия админки приходит из versions.env через ldflags: один и тот же
|
||||
# исполняемый файл обязан знать версию пакета, из которого он собран.
|
||||
local admin_ldflags="-s -w -X 'hy2xs-admin/model/constant.Version=v${HY2XS_VERSION}'"
|
||||
|
||||
(
|
||||
cd "$ui_src"
|
||||
GOOS=linux GOARCH=amd64 CGO_ENABLED=0 GOTOOLCHAIN=local "$GO_BIN" mod download
|
||||
GOOS=linux GOARCH=amd64 CGO_ENABLED=0 GOTOOLCHAIN=local "$GO_BIN" build -trimpath -ldflags "-s -w" -o "../$ADMIN_BUILD_DIR/hy2xs-admin" .
|
||||
GOOS="$HY2XS_TARGET_GOOS" GOARCH="$HY2XS_TARGET_ARCH" CGO_ENABLED=0 GOTOOLCHAIN=local "$GO_BIN" mod download
|
||||
GOOS="$HY2XS_TARGET_GOOS" GOARCH="$HY2XS_TARGET_ARCH" CGO_ENABLED=0 GOTOOLCHAIN=local "$GO_BIN" build \
|
||||
-trimpath -ldflags "$admin_ldflags" -o "../$ADMIN_BUILD_DIR/hy2xs-admin" .
|
||||
)
|
||||
|
||||
verify_admin_version_contract "$ADMIN_BUILD_DIR/hy2xs-admin"
|
||||
|
||||
install -m 0755 "$ADMIN_BUILD_DIR/hy2xs-admin" "$STAGE_DIR/ui/hy2xs-admin/hy2xs-admin"
|
||||
if [ -f "$ui_src/docs/sql/h_ui_db.sql" ]; then
|
||||
mkdir -p "$STAGE_DIR/ui/hy2xs-admin/docs/sql"
|
||||
@@ -131,13 +140,15 @@ write_metadata() {
|
||||
printf 'name=HY2XS\n'
|
||||
printf 'license=AGPL-3.0-only\n'
|
||||
printf 'version=%s\n' "$version"
|
||||
printf 'release_line=%s\n' "$HY2XS_RELEASE_LINE"
|
||||
printf 'config_schema_version=%s\n' "$HY2XS_CONFIG_SCHEMA_VERSION"
|
||||
printf 'build_id=%s\n' "$build_id"
|
||||
printf 'build_host_os=debian13\n'
|
||||
printf 'build_host_arch=amd64\n'
|
||||
printf 'target_os=linux\n'
|
||||
printf 'target_arch=amd64\n'
|
||||
printf 'target_distro=debian\n'
|
||||
printf 'target_version=13\n'
|
||||
printf 'build_host_os=%s%s\n' "$HY2XS_BUILD_OS" "$HY2XS_BUILD_OS_VERSION"
|
||||
printf 'build_host_arch=%s\n' "$HY2XS_BUILD_ARCH"
|
||||
printf 'target_os=%s\n' "$HY2XS_TARGET_GOOS"
|
||||
printf 'target_arch=%s\n' "$HY2XS_TARGET_ARCH"
|
||||
printf 'target_distro=%s\n' "$HY2XS_TARGET_OS"
|
||||
printf 'target_version=%s\n' "$HY2XS_TARGET_OS_VERSION"
|
||||
printf 'source_git_commit=%s\n' "$source_git_commit"
|
||||
printf 'dirty_tree=%s\n' "$dirty_tree"
|
||||
printf 'build_profile=production\n'
|
||||
@@ -152,6 +163,7 @@ write_metadata() {
|
||||
printf 'hysteria_version=%s\n' "$HYSTERIA_VERSION"
|
||||
printf 'hysteria_artifact_url=%s\n' "$HYSTERIA_ARTIFACT_URL"
|
||||
printf 'hysteria_artifact_sha256=%s\n' "$HYSTERIA_ARTIFACT_SHA256"
|
||||
printf 'hysteria_sha_source=%s\n' "${HYSTERIA_SHA_SOURCE:-unknown}"
|
||||
printf 'hysteria_channel=%s\n' "${HYSTERIA_CHANNEL:-unknown}"
|
||||
printf 'hysteria_resolution=%s\n' "${HYSTERIA_RESOLUTION:-unknown}"
|
||||
printf 'hysteria_resolved_at=%s\n' "${HYSTERIA_RESOLVED_AT:-unknown}"
|
||||
|
||||
Reference in New Issue
Block a user