fix
This commit is contained in:
@@ -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)."
|
||||
@@ -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/**/*'));
|
||||
});
|
||||
|
||||
+33
-32
@@ -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-<version>.exe`, `TTRPGPlayer-<version>-<arch>.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-пуш артефактов **не используются**.
|
||||
|
||||
@@ -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-<version>-x64.dmg` (и arm64 при универсальной сборке)
|
||||
- `latest-mac.yml` (если включена публикация generic при сборке)
|
||||
|
||||
Для локальной проверки updater можно временно указать URL:
|
||||
|
||||
```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. В установленном приложении: **Настройки → Проверить обновления** (нужна активная лицензия).
|
||||
- `TTRPGPlayer-x64.dmg`
|
||||
- `TTRPGPlayer-arm64.dmg` (если собирали arm64)
|
||||
|
||||
## Устаревшая схема (Git feed)
|
||||
Скопируйте эти файлы на Windows в общую папку релиза (вместе с Win/Linux) и залейте на VPS вместе с остальными.
|
||||
|
||||
Раньше файлы коммитили в репозиторий **`DndGamePlayerUpdates`**, ветка `updates`. Этот способ **больше не используется** — репозиторий можно удалить на Gitea.
|
||||
## Проверка после выкладки
|
||||
|
||||
`https://updates.mailib.ru/latest-mac.yml` (подставьте свой feed URL)
|
||||
|
||||
+8
-2
@@ -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",
|
||||
|
||||
Reference in New Issue
Block a user