Files
Bridge-and-Join-s/scripts/build-release.sh
T
zuevav 648a5ae05f ИШ обновляется через сервер лицензий вместе с bj; наглядный ход установки ИШ
- Дистрибутив ИШ — компонент выпуска igate-dist (версия = версия ИШ). В выпуск
  попадает только одобренный архив: deploy/release/igate-approved (версия и
  sha256), сборка сверяет контрольную сумму. Клиент получает его обновлением;
  bj-server после обновления (и при запуске) сам обновляет ИШ, если на сервере
  он старее; итог — событие в «Новостях». Настройки, каналы и база ИШ
  сохраняются, прежняя версия — в /var/backups.
- Установка «с сервера» берёт самый новый проверенный дистрибутив: с образа или из
  обновления. С сайта НРД — только в режиме разработки.
- Большие файлы: одна прежняя копия вместо пяти; предел скачивания — по размеру.
- Ход установки ИШ — этапами: пройденные, текущий («идёт 0:41 · обычно до 1:30»,
  дольше обычного — предупреждение), журнал под раскрытием; кнопка на время
  установки выключена.
- Установщик: уникальные этапы; igate-cli и сессия ключницы с принудительным
  завершением (timeout -k); зависшая установка (ход не менялся 15 минут)
  снимается повторным запуском; служба установки — не дольше 40 минут.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014FsEKyJrYF69Cj9ZXzFLRi
2026-10-06 17:42:54 +03:00

122 lines
8.6 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/bin/sh
# Сборка и подпись релиза bj для сервера обновлений (lic.zetit.ru).
#
# scripts/build-release.sh 2026.10.1 [канал] [опубликовать]
# 2026.10.1 версия релиза
# канал stable (по умолчанию) | beta | …
# опубликовать publish — сразу загрузить на сервер (нужен репозиторий lic_Bridge-and-Join-s рядом)
#
# Версии компонентов независимы: компонент получает версию релиза, только если он изменился —
# отпечаток его исходников (пакеты, от которых он зависит, со вложенными файлами; 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}
CHANNEL=${2:-stable}
PUBLISH=${3:-}
ROOT=$(cd "$(dirname "$0")/.." && pwd)
DIST=${DIST:-$ROOT/dist/release-$VERSION}
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"
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) в бинарь не
# попадают (см. internal/lkgateway/internaldocs_off.go). Свою сборку со справкой
# делаем отдельно: go build -tags internaldocs. Не добавляйте этот тег сюда.
# bj-server несёт SQL-рецепты чтения DEPO/SPECTRE/QUIK (пакет internal/lkgateway/fsql).
# В релизе обфусцируем ТОЛЬКО этот пакет garble (-literals): строки запросов шифруются
# и не читаются `strings`; шаблоны и обработчики не затрагиваются. garble требует
# отдельный SDK go1.26 (модуль-кэшный тулчейн ему не подходит).
GARBLE=${GARBLE:-$(command -v garble || echo "$HOME/go/bin/garble")}
GO126_ROOT=${GO126_ROOT:-$HOME/sdk/go1.26.8}
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=$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=$V_SERVER" -o "$DIST/bj-server" ./cmd/bj-server
fi
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"
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 нет)"
# Дистрибутив ИШ — только версия, проверенная ZETIT вместе с bj: deploy/release/igate-approved («версия sha256»).
# Архив НРД — из IGATE_ZIP (по умолчанию ~/ish-upgrade/igate-<версия через дефис>-amd64.zip); контрольная
# сумма должна совпасть с одобренной. Версия компонента = версия ИШ: клиенты получают его с обновлением,
# bj-server сам обновляет ИШ, если на сервере он старее.
IGA="$ROOT/deploy/release/igate-approved"
if [ -f "$IGA" ]; then
read -r IG_VER IG_SHA < "$IGA"
IG_ZIP=${IGATE_ZIP:-$HOME/ish-upgrade/igate-$(echo "$IG_VER" | tr . -)-amd64.zip}
[ -f "$IG_ZIP" ] || { echo "нет дистрибутива ИШ $IG_VER: $IG_ZIP (IGATE_ZIP=…)"; exit 1; }
[ "$(sha256sum "$IG_ZIP" | cut -d' ' -f1)" = "$IG_SHA" ] || { echo "дистрибутив ИШ $IG_ZIP не совпадает с одобренным (deploy/release/igate-approved)"; exit 1; }
cp "$IG_ZIP" "$DIST/igate-dist"
echo "$IG_VER" > "$DIST/igate-dist.version"
echo " ИШ: $IG_VER (одобренный дистрибутив)"
fi
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
rm -f "$DIST"/*.version
"$LIC/deploy/publish-release.sh" "$DIST" "$CHANNEL"
fi