# Процесс: сборка, релиз, авто-раскат и обновление образа bj Рабочая памятка на каждый выпуск — чтобы не вспоминать заново. **Меняется процесс или пути — правьте этот файл тем же коммитом.** Пометки: ✅ — проверено на практике (последний раз релиз 2026.10.16.1, 16.10.2026); 📜 — по скриптам/README, в этой памятке ещё не прогонялось, перед первым разом сверить. ## 0. Где что (топология) | Узел | Адрес | Роль | |---|---|---| | **astramost** | `195.239.71.22:22451` (внутр. `10.10.10.28`), Astra Linux, `fontvielle` (sudo без пароля), доступ по SSH ограничен по IP | Исходники `/opt/bj/src` (ветка `feature/keywizard-m2m-live`), сборка, релизы, здесь же крутится рабочий bj (`/opt/bj/bj-server`) и база BJ (PostgreSQL). «28 сервер» в разговоре — это он. | | **lic** | ВМ `46.173.19.220`, Ubuntu | Сервер лицензий и обновлений `lic.zetit.ru`. Раздаёт обновления `…/updates/v1/<канал>/manifest.json` и установочный образ (канал `iso`). Публикуем на неё с astramost по `ssh root@46.173.19.220` (по ключу). | | **git** | `ssh://git@git.zetit.ru:32774/zuevav/Bridge-and-Join-s.git` (`origin`) | Исходники bj. | | **lic-репо** | `zuevav/lic_Bridge-and-Join-s`, клон `~/lic_Bridge-and-Join-s` | Код сервера лицензий + скрипты публикации (`deploy/publish-release.sh`). Клиентам не поставляется. | ## 1. Окружение (один раз за сессию на astramost) ```sh export PATH=$HOME/sdk/go1.26.8/bin:$HOME/go/bin:$PATH ``` Предпосылки релиза (проверить при сомнениях): - Go `go1.26.8` и `garble` (`~/go/bin/garble`) — нужны для обфускации пакета `fsql`. - Ключ подписи релиза `~/keys/release-signing.priv` (закрытый, на lic не попадает). - `crypto-service.jar` — `/opt/bj/crypto-service.jar`. - Одобренный ИШ — `~/ish-upgrade/igate-<версия через дефис>-amd64.zip`, sha256 должна совпасть с `deploy/release/igate-approved` (сейчас `107.0.930`). - Доступ `ssh root@46.173.19.220` (для публикации). ## 2. Быстрый деплой на рабочий сервер astramost (без релиза) ✅ Когда надо просто обновить bj на стенде и проверить. **До клиентов не доходит.** ```sh cd /opt/bj/src go build -o /tmp/bj-server ./cmd/bj-server sudo systemctl stop bj-server sudo cp -a /opt/bj/bj-server /opt/bj/bj-server.bak-$(date +%Y%m%d-%H%M%S) # бэкап sudo cp /tmp/bj-server /opt/bj/bj-server sudo chown root:root /opt/bj/bj-server && sudo chmod 755 /opt/bj/bj-server sudo systemctl start bj-server systemctl is-active bj-server ``` Откат — вернуть предыдущий `bj-server.bak-*` на место и перезапустить. ## 3. Релиз и авто-раскат на клиентов ✅ Клиентские установки с авто-обновлением тянут из канала на lic. Чтобы раскатать код (в т.ч. наработки Вадима) автоматом: 1. **Закоммитить и запушить** изменения: ```sh git -c user.name="fontvielle" -c user.email="heathsavagehcyz@hotmail.com" commit -m "…" git push origin feature/keywizard-m2m-live ``` 2. **Версия** — `ГГГГ.ММ.ДД.N` (N — номер выпуска за день). Пример: `2026.10.16.1`. 3. **Собрать и опубликовать**: ```sh scripts/build-release.sh 2026.10.16.1 stable publish ``` - собирает и подписывает манифест; `bj-server` — с garble-обфускацией `fsql` (SQL-рецепты DEPO/QUIK не читаются `strings`); - **версию поднимает только изменившимся компонентам** (по отпечатку исходников); остальные остаются на прежней версии; - неизменные файлы (ИШ ~160 МБ, `crypto-service.jar`) на lic не перезаливает, а копирует там; - публикует на lic и делает выпуск **текущим** для канала. - ⚠️ канал `stable` **хранит только текущий выпуск** — предыдущий удаляется (отката «назад на версию» на сервере нет; откат = собрать и опубликовать прежнюю версию заново). 4. **Закоммитить бамп версий** (скрипт изменил файл состояния): ```sh git add deploy/release/component-versions.json git -c user.name="fontvielle" -c user.email="heathsavagehcyz@hotmail.com" commit -m "Релиз 2026.10.16.1 (stable): версии компонентов" git push origin feature/keywizard-m2m-live ``` 5. **Проверка**: ```sh ssh root@46.173.19.220 'cat /var/lib/bj-license/releases/stable/current' # → новая версия ``` Опции: - **Каналы**: `stable` (все боевые установки), `beta` (обкатка — затрагивает только тех, кто на beta). - **Собрать без публикации**: тот же вызов без `publish` — бандл ляжет в `dist/release-<версия>/`. - **Принудительная версия компонента**: переменные `BJ_SERVER_VERSION`, `INSTALLER_VERSION`, `COMPONENT_INSTALL_VERSION`, `NPR_VERSION`, `QUIKEXPORT_VERSION`, `LK_VERSION`, `CRYPTO_VERSION`. ## 4. Обновление установочного образа (ISO) 📜 Образ — Ubuntu 22.04 Server с автоустановкой, собирается на astramost (`deploy/iso/build-iso-ubuntu.sh`), публикуется в канал `iso` на lic. **Обновить = пересобрать с новым релиз-бандлом (п.3) и переопубликовать.** Загрузку образа на самой astramost не проверить — нет вложенной виртуализации; проверка только на отдельной ВМ по `docs/iso-proverka.md`. Входы (держим на astramost временно, после сборки `build-iso-ubuntu.sh` их рабочая копия в `mktemp` чистится — исходники надо иметь под рукой): - исходный `ubuntu-22.04.x-live-server-amd64.iso`; - каталог релиза `dist/release-<версия>` из п.3; - каталог Валидаты — `zpki`/`zsdk` (из `~/validata-kit/ClientL_Other.zip`, `zpki-*.deb`) + `libldap-2.4-2` из Ubuntu 20.04; - (опц.) слой офлайн-обновлений `LAYER` — `deploy/iso/build-ubuntu-updates-layer.sh` (система ставится уже с обновлениями, PostgreSQL/Java не тянутся из сети); - (опц.) `IGATE` zip — одобренный ИШ (ставится из мастера без интернета). Сборка (порядок аргументов — см. шапку `build-iso-ubuntu.sh`): ```sh deploy/iso/build-iso-ubuntu.sh \ \ dist/release-<версия>/bj-installer \ <версия> \ dist/release-<версия> \ <каталог-Валидаты> \ stable \ bj-ubuntu22-<версия>.iso # LAYER=<каталог> и IGATE= — переменными окружения, если нужны. ``` Публикация образа в канал `iso` на lic — **уточнить по `~/lic_Bridge-and-Join-s` и прошлой сборке** (канал `iso`: `/var/lib/bj-license/releases/iso/`); в этой памятке ещё не прогонялось. ## 5. Атрибуция коммитов Каждый коммит завершать: ``` Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_01XG3zNMMf2LMoDpXo22mwMX ``` Коммитить от `git -c user.name="fontvielle" -c user.email="heathsavagehcyz@hotmail.com"`. ## 6. Полезное - Логи рабочего bj: `/var/log/bj/bj-server.err` (grep `-a`). - Конфиг: `/var/lib/bj/.bj/setup.json` (root/bj, 0600). - Канал обновления установки задаётся в её настройках (`update.channel`, пусто = `stable`); авто-проверка — `update.auto_check` (на рабочем стенде держим выключенной, чтобы обновлялись осознанно).