From 9f82a541fc3ebf7bfa9343ab1b45f7e8c286f36e Mon Sep 17 00:00:00 2001 From: Ivan Fontosh Date: Mon, 18 May 2026 00:55:53 +0800 Subject: [PATCH] chore(release): point updater feed at updates.mailib.ru (v1.0.16) Set build.publish.url to the production HTTPS feed, bump version to 1.0.16, add publish-to-updates.ps1 for VPS upload, and normalize Linux AppImage names from x86_64 to x64 after pack:linux. Co-authored-by: Cursor --- docs/GITEA_AUTO_UPDATE.md | 43 +++++++++++++-------------- package.json | 7 +++-- scripts/publish-to-updates.ps1 | 53 ++++++++++++++++++++++++++++++++++ scripts/release-linux-pack.mjs | 30 +++++++++++++++++++ 4 files changed, 107 insertions(+), 26 deletions(-) create mode 100644 scripts/publish-to-updates.ps1 diff --git a/docs/GITEA_AUTO_UPDATE.md b/docs/GITEA_AUTO_UPDATE.md index 4a86909..4617d91 100644 --- a/docs/GITEA_AUTO_UPDATE.md +++ b/docs/GITEA_AUTO_UPDATE.md @@ -2,17 +2,18 @@ ## Сборка и публикация -- Релизы собираются **локально** (без CI в Gitea). -- Файлы для выкладки кладутся в одну папку на Windows, затем заливаются на VPS (вручную `scp` или утилита **TTRPG Release Publisher** — в разработке). +- Релизы собираются **локально** (CI отключён). +- Артефакты кладутся в `D:\TTRPG-Release\` (или копируются из `release\` после сборки). +- Публикация на VPS: `powershell -ExecutionPolicy Bypass -File scripts\publish-to-updates.ps1` - **Имена файлов без версии** — версия только в `latest*.yml`. -## URL feed +## Feed URL -В `package.json` → `build.publish.url` должен быть реальный HTTPS-origin со **слэшем в конце**, например: +В `package.json` → `build.publish.url`: `https://updates.mailib.ru/` -Пока стоит заглушка `https://updates.invalid.ttrpg/` — автообновление в установленной сборке не заработает, пока не соберёте релиз с правильным URL. +Обязателен **слэш в конце**. URL вшивается в установщик при `npm run pack:win`. ## Фиксированные имена артефактов @@ -20,36 +21,32 @@ |-----------|--------| | 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`, не в имени файла. +| macOS | `latest-mac.yml`, `TTRPGPlayer-x64.dmg`, `TTRPGPlayer-arm64.dmg` | ## Локальная сборка ```bash npm ci npm run build -npm run release:info # версия и пример тега vX.Y.Z (тег опционален, для git) +npm run release:info ``` -| Команда | Где запускать | Результат | -|---------|---------------|-----------| -| `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` | +| Команда | Где | Результат | +|---------|-----|-----------| +| `npm run pack:win` | Windows | `release\` — Win + `latest.yml` | +| `npm run pack:linux` | Linux / WSL | AppImage + `latest-linux*.yml` | +| `npm run pack:mac` | macOS | dmg + `latest-mac.yml` | -Linux AppImage не собирается напрямую из Windows PowerShell: `mksquashfs` — Linux-инструмент. На Windows запускайте команду внутри WSL. +Linux из PowerShell напрямую не собирается — только WSL/Linux (`scripts/release-linux-pack.mjs`). -Скопируйте нужные файлы из `release/` в папку публикации (например `D:\TTRPG-Release\`). +После `pack:win` скопируйте из `release\` в `D:\TTRPG-Release\` файлы из таблицы выше. -## Сервер обновлений +## Сервер -Статический VPS (nginx + HTTPS), каталог `/var/www/ttrpg-updates/`. Подробная пошаговая настройка — в переписке / отдельной инструкции для `updates.mailib.ru`. +- Домен: `https://updates.mailib.ru/` +- nginx `root`: `/var/www/updates_mailib_ru` +- Проверка: `curl https://updates.mailib.ru/latest.yml` ## Лицензия -Проверка обновлений только при активной лицензии. Ключи на клиенте: `TTRPG-…` и устаревшие `DND-…`. - -## Устаревшая схема - -Git-репозиторий **`DndGamePlayerUpdates`** и CI-пуш артефактов **не используются**. +Обновления доступны при активной лицензии. Ключи: `TTRPG-…` и устаревшие `DND-…`. diff --git a/package.json b/package.json index 3561fa8..dc3dc91 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "TTRPGPlayer", - "version": "1.0.15", + "version": "1.0.16", "description": "TTRPG Player — редактор и проигрыватель НРИ", "main": "dist/main/index.cjs", "scripts": { @@ -19,7 +19,8 @@ "pack:dir": "npm run build && node scripts/release-win-prep.mjs && electron-builder --dir", "pack:mac": "npm run build && electron-builder --mac", "pack:win": "npm run build && node scripts/release-win-prep.mjs && electron-builder --win", - "pack:linux": "node scripts/release-linux-pack.mjs" + "pack:linux": "node scripts/release-linux-pack.mjs", + "publish:updates": "powershell -ExecutionPolicy Bypass -File scripts/publish-to-updates.ps1" }, "keywords": [], "author": "", @@ -165,7 +166,7 @@ }, "publish": { "provider": "generic", - "url": "https://updates.invalid.ttrpg/" + "url": "https://updates.mailib.ru/" } } } diff --git a/scripts/publish-to-updates.ps1 b/scripts/publish-to-updates.ps1 new file mode 100644 index 0000000..a4a9d43 --- /dev/null +++ b/scripts/publish-to-updates.ps1 @@ -0,0 +1,53 @@ +# Заливка релиза на https://updates.mailib.ru/ (nginx root: /var/www/updates_mailib_ru) +# Использование: +# 1) Положите артефакты в $LocalDir (или соберите pack:win и скопируйте из release\) +# 2) powershell -ExecutionPolicy Bypass -File scripts\publish-to-updates.ps1 + +$ErrorActionPreference = 'Stop' + +$Key = "$env:USERPROFILE\.ssh\ttrpg_updates_root" +$LocalDir = 'D:\TTRPG-Release' +$SshTarget = 'root@185.173.94.234' +$RemoteDir = '/var/www/updates_mailib_ru' + +if (-not (Test-Path $Key)) { + Write-Error "SSH key not found: $Key" +} +if (-not (Test-Path $LocalDir)) { + Write-Error "Local release folder not found: $LocalDir" +} + +$patterns = @( + 'latest.yml', + 'latest-linux*.yml', + 'latest-mac.yml', + 'TTRPGPlayer-Setup.exe', + 'TTRPGPlayer-Setup.exe.blockmap', + 'TTRPGPlayer-x64.AppImage', + 'TTRPGPlayer-x86_64.AppImage', + 'TTRPGPlayer-arm64.AppImage', + 'TTRPGPlayer-x64.dmg', + 'TTRPGPlayer-arm64.dmg' +) + +$files = @() +foreach ($pat in $patterns) { + $files += Get-ChildItem -Path $LocalDir -Filter $pat -File -ErrorAction SilentlyContinue +} +$files = $files | Sort-Object -Property Name -Unique + +if (-not $files) { + Write-Error "No release files matched in $LocalDir" +} + +Write-Host "Uploading to ${SshTarget}:${RemoteDir}" +foreach ($f in $files) { + Write-Host " -> $($f.Name)" + & scp -i $Key $f.FullName "${SshTarget}:${RemoteDir}/" +} + +& ssh -i $Key $SshTarget "chown -R www-data:www-data $RemoteDir && ls -la $RemoteDir" + +Write-Host '' +Write-Host 'Verify:' +Write-Host ' curl https://updates.mailib.ru/latest.yml' diff --git a/scripts/release-linux-pack.mjs b/scripts/release-linux-pack.mjs index 328e7a7..c35af0e 100644 --- a/scripts/release-linux-pack.mjs +++ b/scripts/release-linux-pack.mjs @@ -6,6 +6,8 @@ * the AppImage. Build from Linux/WSL instead. */ import { spawnSync } from 'node:child_process'; +import fs from 'node:fs'; +import path from 'node:path'; import process from 'node:process'; function run(command, args) { @@ -19,6 +21,33 @@ function run(command, args) { } } +/** electron-builder для AppImage x64 часто даёт `x86_64` в имени — выравниваем под feed. */ +function normalizeLinuxReleaseNames() { + const releaseDir = path.resolve('release'); + if (!fs.existsSync(releaseDir)) return; + + for (const name of fs.readdirSync(releaseDir)) { + if (!name.includes('x86_64')) continue; + const from = path.join(releaseDir, name); + const to = path.join(releaseDir, name.replaceAll('x86_64', 'x64')); + if (from !== to && !fs.existsSync(to)) { + fs.renameSync(from, to); + console.log(`[pack:linux] renamed ${name} -> ${path.basename(to)}`); + } + } + + for (const ymlName of fs.readdirSync(releaseDir)) { + if (!ymlName.startsWith('latest-linux') || !ymlName.endsWith('.yml')) continue; + const ymlPath = path.join(releaseDir, ymlName); + const text = fs.readFileSync(ymlPath, 'utf8'); + const next = text.replaceAll('x86_64', 'x64'); + if (next !== text) { + fs.writeFileSync(ymlPath, next); + console.log(`[pack:linux] patched ${ymlName} (x86_64 -> x64)`); + } + } +} + if (process.platform === 'win32') { console.error( [ @@ -35,3 +64,4 @@ if (process.platform === 'win32') { run('npm', ['run', 'build']); run('electron-builder', ['--linux']); +normalizeLinuxReleaseNames();