diff --git a/deploy/release/component-versions.json b/deploy/release/component-versions.json new file mode 100644 index 0000000..ebe39c5 --- /dev/null +++ b/deploy/release/component-versions.json @@ -0,0 +1,30 @@ +{ + "bj-component-install": { + "fingerprint": "677cf36c4f8d56db1a78e0eeb59fda51cec07aa934ec78df5f57df087038f8b9", + "version": "2026.09.25.14" + }, + "bj-installer": { + "fingerprint": "c36988352e74716714d2a786a52b1e7b390485c33a63740d1d769f7eb5f00845", + "version": "2026.09.25.14" + }, + "bj-lk": { + "fingerprint": "f69c9f1193814138752f1bfce6044b4cad94957c1ac64e7c0920993b91cf0f70", + "version": "2026.09.25.14" + }, + "bj-npr": { + "fingerprint": "5b5301b0c18bfd001bdff3f3b35a9ff6ccccb4f24eb4b88b0334d34d1b63df81", + "version": "2026.09.25.14" + }, + "bj-quikexport": { + "fingerprint": "f7761571352f17173c10989f72a3a9686e58cfc0c0a78ae7299bacbe31d36df6", + "version": "2026.09.25.14" + }, + "bj-server": { + "fingerprint": "f3df59dae371abe2e0d7c50da23d3d7758cc563975ba70e0653c506cd5b0cd51", + "version": "2026.09.25.14" + }, + "crypto-service.jar": { + "fingerprint": "2c4fd536bc9b1c20c69a70e8dcd374a61847b263aeb2e474c45debb01fbd8233", + "version": "2026.09.25.14" + } +} \ No newline at end of file diff --git a/scripts/build-release.sh b/scripts/build-release.sh index 780e345..07dd2ca 100755 --- a/scripts/build-release.sh +++ b/scripts/build-release.sh @@ -6,8 +6,12 @@ # канал stable (по умолчанию) | beta | … # опубликовать publish — сразу загрузить на сервер (нужен репозиторий lic_Bridge-and-Join-s рядом) # -# Версии компонентов: переменные BJ_SERVER_VERSION, INSTALLER_VERSION, COMPONENT_INSTALL_VERSION, NPR_VERSION, QUIKEXPORT_VERSION, LK_VERSION, -# CRYPTO_VERSION (по умолчанию — версия релиза). Криптосервис берётся из CRYPTO_JAR +# Версии компонентов независимы: компонент получает версию релиза, только если он изменился — +# отпечаток его исходников (пакеты, от которых он зависит, со вложенными файлами; go.mod/go.sum; +# версия Go) или контрольная сумма jar криптосервиса отличается от записанных в +# deploy/release/component-versions.json. Иначе остаётся прежняя версия. Принудительно — переменные +# BJ_SERVER_VERSION, INSTALLER_VERSION, COMPONENT_INSTALL_VERSION, NPR_VERSION, QUIKEXPORT_VERSION, +# LK_VERSION, CRYPTO_VERSION. Криптосервис берётся из CRYPTO_JAR # (по умолчанию /opt/bj/crypto-service.jar). Ключ подписи: RELEASE_KEY (~/keys/release-signing.priv). set -eu VERSION=${1:?версия релиза, например 2026.10.1} @@ -19,7 +23,39 @@ KEY=${RELEASE_KEY:-$HOME/keys/release-signing.priv} MOD=git.zetit.ru/zuevav/Bridge-and-Join-s rm -rf "$DIST" && mkdir -p "$DIST" cd "$ROOT" -ver() { eval "v=\${$1:-}"; [ -n "$v" ] && echo "$v" || echo "$VERSION"; } +CV_STATE=${COMPONENT_VERSIONS:-$ROOT/deploy/release/component-versions.json} +CV_NEW="$ROOT/dist/.component-versions-$VERSION.json" +[ -f "$CV_STATE" ] && cp "$CV_STATE" "$CV_NEW" || echo '{}' > "$CV_NEW" +# отпечаток Go-компонента: все файлы пакетов модуля, от которых зависит команда (кроме тестов) +fp_go() { + { go version; cat go.mod go.sum + go list -deps -f '{{if not .Standard}}{{.Dir}}{{end}}' "$1" | grep "^$ROOT" | sort -u | while read -r d; do + find "$d" -type f ! -name '*_test.go' ! -path '*/testdata/*' ! -path "$ROOT/deploy/iso/*" ! -path "$ROOT/deploy/release/*" ! -path "$ROOT/dist/*" | sort | xargs -r sha256sum + done; } | sha256sum | cut -d' ' -f1 +} +# версия компонента: $1 — имя, $2 — переменная-переопределение, $3 — отпечаток +cver() { + eval "v=\${$2:-}" + [ -n "$v" ] && { echo "$v"; return; } + python3 - "$CV_NEW" "$1" "$3" "$VERSION" <<'PY' +import json, sys +path, name, fp, release = sys.argv[1:] +st = json.load(open(path)) +cur = st.get(name, {}) +if cur.get("fingerprint") != fp: + cur = {"version": release, "fingerprint": fp} + st[name] = cur + json.dump(st, open(path, "w"), indent=2, sort_keys=True) +print(cur["version"]) +PY +} +V_SERVER=$(cver bj-server BJ_SERVER_VERSION "$(fp_go ./cmd/bj-server)") +V_INSTALLER=$(cver bj-installer INSTALLER_VERSION "$(fp_go ./cmd/bj-installer)") +V_CINSTALL=$(cver bj-component-install COMPONENT_INSTALL_VERSION "$(fp_go ./cmd/bj-component-install)") +V_NPR=$(cver bj-npr NPR_VERSION "$(fp_go ./cmd/bj-npr)") +V_QEXP=$(cver bj-quikexport QUIKEXPORT_VERSION "$(fp_go ./cmd/bj-quikexport)") +V_LK=$(cver bj-lk LK_VERSION "$(fp_go ./cmd/bj-lk)") +echo " версии: bj-server $V_SERVER, bj-installer $V_INSTALLER, bj-component-install $V_CINSTALL, bj-npr $V_NPR, bj-quikexport $V_QEXP, bj-lk $V_LK" echo "Сборка релиза $VERSION (канал $CHANNEL) в $DIST" # ВАЖНО: клиентский релиз собирается БЕЗ тега internaldocs — технические страницы # справки (архитектура НРД, протокол FTV_M2M, схема базы, крипто, QUIK) в бинарь не @@ -35,31 +71,34 @@ if [ -x "$GARBLE" ] && [ -x "$GO126_ROOT/bin/go" ]; then echo " bj-server: обфускация garble пакета fsql (SQL-рецепты)" PATH="$GO126_ROOT/bin:$PATH" GOROOT="$GO126_ROOT" GOTOOLCHAIN=local \ GOGARBLE="$MOD/internal/lkgateway/fsql" \ - "$GARBLE" -literals build -ldflags "-s -w -X $MOD/internal/lkgateway.BuildVersion=$(ver BJ_SERVER_VERSION)" -o "$DIST/bj-server" ./cmd/bj-server + "$GARBLE" -literals build -ldflags "-s -w -X $MOD/internal/lkgateway.BuildVersion=$V_SERVER" -o "$DIST/bj-server" ./cmd/bj-server else echo " ВНИМАНИЕ: garble или go1.26 (~/sdk/go1.26.8) не найдены — bj-server собирается БЕЗ обфускации," echo " SQL-рецепты DEPO/SPECTRE будут читаться strings. Установка обфускатора:" echo " go install golang.org/dl/go1.26.8@latest && go1.26.8 download" echo " go install mvdan.cc/garble@latest" - go build -trimpath -ldflags "-s -w -X $MOD/internal/lkgateway.BuildVersion=$(ver BJ_SERVER_VERSION)" -o "$DIST/bj-server" ./cmd/bj-server + go build -trimpath -ldflags "-s -w -X $MOD/internal/lkgateway.BuildVersion=$V_SERVER" -o "$DIST/bj-server" ./cmd/bj-server fi -CGO_ENABLED=0 go build -trimpath -ldflags "-s -w -X main.installerVersion=$(ver INSTALLER_VERSION)" -o "$DIST/bj-installer" ./cmd/bj-installer -CGO_ENABLED=0 go build -trimpath -ldflags "-s -w -X main.version=$(ver COMPONENT_INSTALL_VERSION)" -o "$DIST/bj-component-install" ./cmd/bj-component-install -CGO_ENABLED=0 go build -trimpath -ldflags "-s -w -X main.version=$(ver NPR_VERSION)" -o "$DIST/bj-npr" ./cmd/bj-npr -ver NPR_VERSION > "$DIST/bj-npr.version" -CGO_ENABLED=0 go build -trimpath -ldflags "-s -w -X main.version=$(ver QUIKEXPORT_VERSION)" -o "$DIST/bj-quikexport" ./cmd/bj-quikexport -ver QUIKEXPORT_VERSION > "$DIST/bj-quikexport.version" -CGO_ENABLED=0 go build -trimpath -ldflags "-s -w -X main.version=$(ver LK_VERSION)" -o "$DIST/bj-lk" ./cmd/bj-lk -ver LK_VERSION > "$DIST/bj-lk.version" -ver BJ_SERVER_VERSION > "$DIST/bj-server.version" -ver INSTALLER_VERSION > "$DIST/bj-installer.version" -ver COMPONENT_INSTALL_VERSION > "$DIST/bj-component-install.version" +CGO_ENABLED=0 go build -trimpath -ldflags "-s -w -X main.installerVersion=$V_INSTALLER" -o "$DIST/bj-installer" ./cmd/bj-installer +CGO_ENABLED=0 go build -trimpath -ldflags "-s -w -X main.version=$V_CINSTALL" -o "$DIST/bj-component-install" ./cmd/bj-component-install +CGO_ENABLED=0 go build -trimpath -ldflags "-s -w -X main.version=$V_NPR" -o "$DIST/bj-npr" ./cmd/bj-npr +echo "$V_NPR" > "$DIST/bj-npr.version" +CGO_ENABLED=0 go build -trimpath -ldflags "-s -w -X main.version=$V_QEXP" -o "$DIST/bj-quikexport" ./cmd/bj-quikexport +echo "$V_QEXP" > "$DIST/bj-quikexport.version" +CGO_ENABLED=0 go build -trimpath -ldflags "-s -w -X main.version=$V_LK" -o "$DIST/bj-lk" ./cmd/bj-lk +echo "$V_LK" > "$DIST/bj-lk.version" +echo "$V_SERVER" > "$DIST/bj-server.version" +echo "$V_INSTALLER" > "$DIST/bj-installer.version" +echo "$V_CINSTALL" > "$DIST/bj-component-install.version" JAR=${CRYPTO_JAR:-/opt/bj/crypto-service.jar} if [ -f "$JAR" ]; then cp "$JAR" "$DIST/crypto-service.jar" - ver CRYPTO_VERSION > "$DIST/crypto-service.jar.version" + cver crypto-service.jar CRYPTO_VERSION "$(sha256sum "$JAR" | cut -d' ' -f1)" > "$DIST/crypto-service.jar.version" fi +echo " криптосервис: $(cat "$DIST/crypto-service.jar.version" 2>/dev/null || echo нет)" go run ./cmd/bj-release build -dir "$DIST" -version "$VERSION" -channel "$CHANNEL" -key "$KEY" -keyid release -out "$DIST/manifest.json" +# версии и отпечатки этого релиза — в репозиторий (закоммитить вместе с релизом) +mkdir -p "$(dirname "$CV_STATE")" && mv "$CV_NEW" "$CV_STATE" if [ "$PUBLISH" = "publish" ]; then LIC=${LIC_REPO:-$ROOT/../lic_Bridge-and-Join-s} [ -x "$LIC/deploy/publish-release.sh" ] || LIC=$HOME/lic_Bridge-and-Join-s