648a5ae05f
- Дистрибутив ИШ — компонент выпуска 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
122 lines
8.6 KiB
Bash
Executable File
122 lines
8.6 KiB
Bash
Executable File
#!/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
|