From 62043593307b9546d544b488fe602d074ebec04b Mon Sep 17 00:00:00 2001 From: Ivan Fontosh Date: Sun, 17 May 2026 21:55:52 +0800 Subject: [PATCH] fix --- .gitea/workflows/release.yml | 98 -------------------------------- app/shared/package.build.test.ts | 8 ++- docs/GITEA_AUTO_UPDATE.md | 65 ++++++++++----------- docs/MANUAL_MAC_UPDATE_UPLOAD.md | 33 +++-------- package.json | 10 +++- 5 files changed, 56 insertions(+), 158 deletions(-) delete mode 100644 .gitea/workflows/release.yml diff --git a/.gitea/workflows/release.yml b/.gitea/workflows/release.yml deleted file mode 100644 index 981ad92..0000000 --- a/.gitea/workflows/release.yml +++ /dev/null @@ -1,98 +0,0 @@ -# Сборка по тегу v* (Win NSIS + Linux AppImage x64/arm64). -# -# Метки runs-on = labels act_runner (Gitea → Действия → Раннеры). -# Публикация обновлений в Git-репозиторий отключена (фаза 1); выкладка на статический VPS — фаза 2. -# -# Secrets для feed больше не нужны. См. docs/GITEA_AUTO_UPDATE.md - -name: Release - -on: - push: - tags: - - 'v*' - -env: - CSC_IDENTITY_AUTO_DISCOVERY: 'false' - -jobs: - release: - runs-on: ubuntu-22.04 - steps: - - uses: actions/checkout@v4 - - - uses: actions/setup-node@v4 - with: - node-version: '22' - cache: 'npm' - - - name: Зависимости Win-сборки на Linux (amd64, без multiarch i386) - shell: bash - run: | - sudo apt-get update - sudo DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ - ca-certificates \ - nsis \ - wine64 - export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" - W64="$(command -v wine64 2>/dev/null || true)" - if [[ -z "$W64" || ! -x "$W64" ]]; then - for p in /usr/bin/wine64 /usr/lib/wine/wine64; do - if [[ -x "$p" ]]; then W64="$p"; break; fi - done - fi - if [[ -z "${W64:-}" || ! -x "$W64" ]]; then - echo "wine64 binary not found after apt install wine64" >&2 - dpkg -L wine64 2>/dev/null | head -80 >&2 || true - exit 1 - fi - printf '%s\n' '#!/bin/sh' "exec $W64 \"\$@\"" | sudo tee /usr/local/bin/wine >/dev/null - sudo chmod +x /usr/local/bin/wine - wine --version - - - name: Версия из тега - shell: bash - run: | - TAG="${GITHUB_REF_NAME:-${GITEA_REF_NAME:-}}" - VERSION="${TAG#v}" - npm version "$VERSION" --allow-same-version --no-git-tag-version - - - run: npm ci - - - run: npm run build - - - name: Зависимости Linux AppImage и кросс-сборка arm64 на amd64 - shell: bash - run: | - sudo apt-get update - sudo DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ - qemu-user-static \ - binfmt-support \ - desktop-file-utils \ - squashfs-tools - - - name: electron-builder (linux AppImage x64, arm64) - run: npx electron-builder --linux AppImage --x64 --arm64 --publish never - - - name: sharp (@img/sharp-win32-x64) для Windows-артефакта при сборке на Linux - shell: bash - run: | - set -euo pipefail - tmp="$(mktemp -d)" - npm pack @img/sharp-win32-x64@0.34.5 --pack-destination "$tmp" - mkdir -p node_modules/@img/sharp-win32-x64 - tar -xzf "$tmp/img-sharp-win32-x64-0.34.5.tgz" -C "$tmp" - cp -a "$tmp/package/." node_modules/@img/sharp-win32-x64/ - test -f node_modules/@img/sharp-win32-x64/lib/sharp-win32-x64.node - rm -rf "$tmp" - - - name: electron-builder (win) - run: npx electron-builder --win --publish never - - - name: Артефакты сборки - shell: bash - run: | - set -euo pipefail - echo "=== release/ ===" - ls -la release/ || true - echo "Готово. Выкладка на update-сервер — вручную или в фазе 2 (VPS + nginx)." diff --git a/app/shared/package.build.test.ts b/app/shared/package.build.test.ts index b62fa9a..aadbcc3 100644 --- a/app/shared/package.build.test.ts +++ b/app/shared/package.build.test.ts @@ -16,6 +16,8 @@ void test('package.json: конфиг electron-builder (mac/win/linux)', () => { mac: { target: unknown }; linux: { target: unknown }; appImage?: { artifactName?: string }; + nsis?: { artifactName?: string }; + dmg?: { artifactName?: string }; files: string[]; }; }; @@ -40,6 +42,10 @@ void test('package.json: конфиг electron-builder (mac/win/linux)', () => { const linuxTargets = pkg.build.linux.target as { target: string; arch: string[] }[]; assert.ok(linuxTargets.some((t) => t.target === 'AppImage')); assert.ok(linuxTargets.some((t) => t.arch.includes('x64') && t.arch.includes('arm64'))); - assert.ok(pkg.build.appImage?.artifactName?.includes('${arch}')); + assert.equal(pkg.build.appImage?.artifactName, '${productName}-${arch}.${ext}'); + assert.equal(pkg.build.nsis?.artifactName, '${productName}-Setup.${ext}'); + assert.equal(pkg.build.dmg?.artifactName, '${productName}-${arch}.${ext}'); + assert.ok(!pkg.build.appImage?.artifactName?.includes('version')); + assert.ok(!pkg.build.nsis?.artifactName?.includes('version')); assert.ok(pkg.build.files.includes('dist/**/*')); }); diff --git a/docs/GITEA_AUTO_UPDATE.md b/docs/GITEA_AUTO_UPDATE.md index 02b06b8..fdabc5e 100644 --- a/docs/GITEA_AUTO_UPDATE.md +++ b/docs/GITEA_AUTO_UPDATE.md @@ -1,52 +1,53 @@ # Автообновления TTRPG Player -## Текущее состояние (фаза 1) +## Сборка и публикация -- Продукт переименован в **TTRPG Player** / **НРИ Плеер** (`productName`: `TTRPGPlayer`, `appId`: `com.ttrpgplayer.app`). -- CI по тегу `v*` **только собирает** установщики в каталог `release/` (Win NSIS, Linux AppImage x64/arm64). Пуш в Git-репозиторий **`DndGamePlayerUpdates`** **отключён**; скрипт `scripts/sync-update-feed.mjs` удалён. -- В `package.json` → `build.publish.url` стоит заглушка `https://updates.invalid.ttrpg/` до настройки реального хоста. -- Секреты **`DND_UPDATE_FEED_URL`**, **`DND_UPDATES_SERVER`**, **`UPDATES_REPO`**, **`DND_UPDATES_PUSH_TOKEN`** в workflow **больше не используются** — их можно удалить из настроек репозитория. -- Публичный репозиторий **`DndGamePlayerUpdates` на Gitea можно удалить** (история с бинарниками ~4 GiB больше не нужна). +- Релизы собираются **локально** (без CI в Gitea). +- Файлы для выкладки кладутся в одну папку на Windows, затем заливаются на VPS (вручную `scp` или утилита **TTRPG Release Publisher** — в разработке). +- **Имена файлов без версии** — версия только в `latest*.yml`. -Клиент по-прежнему использует **electron-updater** (generic provider). Пока URL заглушка, проверка обновлений в установленной сборке завершится ошибкой сети — это ожидаемо до фазы 2. +## URL feed -## Фаза 2 (план): статический VPS +В `package.json` → `build.publish.url` должен быть реальный HTTPS-origin со **слэшем в конце**, например: -Цель: один HTTPS- origin без Git LFS и без роста репозитория. +`https://updates.mailib.ru/` -1. VPS с **nginx** (или аналог), TLS (Let's Encrypt). -2. Каталог, например `/var/www/ttrpg-updates/`, с **фиксированными именами** файлов (без версии в имени установщика) или с semver в `latest*.yml` и прямыми URL на те же имена. -3. CI или ручной шаг: **rsync/scp** артефактов из `release/` на сервер после тега `v*`. -4. В приватном репозитории кода — секрет **`TTRPG_UPDATE_FEED_URL`** (со слэшем в конце), подстановка в `electron-builder` при сборке релиза. -5. Mac: ручная выкладка `.dmg` / `latest-mac.yml` на тот же origin (см. `docs/MANUAL_MAC_UPDATE_UPLOAD.md`). +Пока стоит заглушка `https://updates.invalid.ttrpg/` — автообновление в установленной сборке не заработает, пока не соберёте релиз с правильным URL. -Детали CI для VPS будут добавлены отдельным PR после выбора хоста и схемы имён файлов. +## Фиксированные имена артефактов -## Локальная сборка релиза +| Платформа | Файлы | +|-----------|--------| +| Windows | `latest.yml`, `TTRPGPlayer-Setup.exe`, `TTRPGPlayer-Setup.exe.blockmap` | +| Linux | `latest-linux.yml`, `TTRPGPlayer-x64.AppImage`, `TTRPGPlayer-arm64.AppImage` | +| macOS | `latest-mac.yml`, `TTRPGPlayer-x64.dmg`, `TTRPGPlayer-arm64.dmg` (при двух архитектурах) | + +Номер версии (`1.0.16`) — в поле `version` внутри `latest*.yml`, не в имени файла. + +## Локальная сборка ```bash -npm run pack # Win (на Windows) или см. CI -npm run pack:linux # Linux AppImage -npm run pack:mac # macOS (на Mac) -npm run release:info # версия и пример тега vX.Y.Z +npm ci +npm run build +npm run release:info # версия и пример тега vX.Y.Z (тег опционален, для git) ``` -Артефакты: `TTRPGPlayer-Setup-.exe`, `TTRPGPlayer--.AppImage`, и т.д. (см. `package.json` → `build`). +| Команда | Где запускать | Результат | +|---------|---------------|-----------| +| `npm run pack:win` | Windows | `release/` — Win + `latest.yml` | +| `npm run pack:linux` | Linux или WSL с зависимостями | `release/` — AppImage x64/arm64 + `latest-linux.yml` | +| `npm run pack:mac` | macOS | `release/` — dmg + `latest-mac.yml` | -## Gitea Actions (act_runner) +Скопируйте нужные файлы из `release/` в папку публикации (например `D:\TTRPG-Release\`). -- Workflow: `.gitea/workflows/release.yml` -- Триггер: push тега `v*` -- Runner label: `ubuntu-22.04` (как в настройках раннера) +## Сервер обновлений -Если job падает на Wine/NSIS — см. комментарии в workflow (сборка Win на Linux без i386). +Статический VPS (nginx + HTTPS), каталог `/var/www/ttrpg-updates/`. Подробная пошаговая настройка — в переписке / отдельной инструкции для `updates.mailib.ru`. -## Лицензия и обновления +## Лицензия -Проверка обновлений доступна только при **активной лицензии** (как и раньше). Продуктовые ключи на клиенте: **`TTRPG-…`** и устаревшие **`DND-…`**; новые ключи выдаёт сервер лицензий (отдельный репозиторий `DndGamePlayerLicenseServer` — смена префикса на сервере вне этого PR). +Проверка обновлений только при активной лицензии. Ключи на клиенте: `TTRPG-…` и устаревшие `DND-…`. -## Устаревшая схема (не использовать) +## Устаревшая схема -Раньше артефакты пушились в публичный Git **`DndGamePlayerUpdates`**, ветка `updates`, URL вида -`https://git.mailib.ru/.../DndGamePlayerUpdates/raw/branch/updates/`. -Эта схема приводила к раздуванию репозитория, конфликтам merge, ENOSPC на раннере и HTTP 500 при `git push`. Она **снята с поддержки**. +Git-репозиторий **`DndGamePlayerUpdates`** и CI-пуш артефактов **не используются**. diff --git a/docs/MANUAL_MAC_UPDATE_UPLOAD.md b/docs/MANUAL_MAC_UPDATE_UPLOAD.md index 67d6c93..b4f2efb 100644 --- a/docs/MANUAL_MAC_UPDATE_UPLOAD.md +++ b/docs/MANUAL_MAC_UPDATE_UPLOAD.md @@ -1,6 +1,4 @@ -# Ручная выкладка macOS-обновлений (TTRPG Player) - -До настройки VPS (фаза 2) mac-сборка выполняется **локально на Mac**. Артефакты нужно будет положить на тот же HTTPS-origin, что и Win/Linux (`build.publish.url`). +# macOS: сборка и выкладка обновлений ## Сборка на Mac @@ -10,29 +8,14 @@ npm run build npm run pack:mac ``` -В `release/` появятся, например: +В `release/` (имена **без версии**): -- `TTRPGPlayer--x64.dmg` (и arm64 при универсальной сборке) -- `latest-mac.yml` (если включена публикация generic при сборке) +- `latest-mac.yml` +- `TTRPGPlayer-x64.dmg` +- `TTRPGPlayer-arm64.dmg` (если собирали arm64) -Для локальной проверки updater можно временно указать URL: +Скопируйте эти файлы на Windows в общую папку релиза (вместе с Win/Linux) и залейте на VPS вместе с остальными. -```bash -npx electron-builder --mac --publish never \ - --config.publish.provider=generic \ - --config.publish.url="https://YOUR-UPDATE-HOST/" -``` +## Проверка после выкладки -(подставьте реальный origin со слэшем в конце) - -## Фаза 2: выкладка на статический хост - -1. Скопировать на сервер обновлений: - - `latest-mac.yml` - - `.dmg` / `.zip` с именами, на которые ссылается yml -2. Проверить в браузере: `https://YOUR-UPDATE-HOST/latest-mac.yml` -3. В установленном приложении: **Настройки → Проверить обновления** (нужна активная лицензия). - -## Устаревшая схема (Git feed) - -Раньше файлы коммитили в репозиторий **`DndGamePlayerUpdates`**, ветка `updates`. Этот способ **больше не используется** — репозиторий можно удалить на Gitea. +`https://updates.mailib.ru/latest-mac.yml` (подставьте свой feed URL) diff --git a/package.json b/package.json index ac9a671..e5a69aa 100644 --- a/package.json +++ b/package.json @@ -149,13 +149,19 @@ "icon": "build/icon.png" }, "appImage": { - "artifactName": "${productName}-${version}-${arch}.${ext}" + "artifactName": "${productName}-${arch}.${ext}" + }, + "dmg": { + "artifactName": "${productName}-${arch}.${ext}" + }, + "zip": { + "artifactName": "${productName}-${arch}.${ext}" }, "nsis": { "oneClick": false, "allowToChangeInstallationDirectory": true, "deleteAppDataOnUninstall": false, - "artifactName": "${productName}-Setup-${version}.${ext}" + "artifactName": "${productName}-Setup.${ext}" }, "publish": { "provider": "generic",