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 };
|
mac: { target: unknown };
|
||||||
linux: { target: unknown };
|
linux: { target: unknown };
|
||||||
appImage?: { artifactName?: string };
|
appImage?: { artifactName?: string };
|
||||||
|
nsis?: { artifactName?: string };
|
||||||
|
dmg?: { artifactName?: string };
|
||||||
files: 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[] }[];
|
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.target === 'AppImage'));
|
||||||
assert.ok(linuxTargets.some((t) => t.arch.includes('x64') && t.arch.includes('arm64')));
|
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/**/*'));
|
assert.ok(pkg.build.files.includes('dist/**/*'));
|
||||||
});
|
});
|
||||||
|
|||||||
+33
-32
@@ -1,52 +1,53 @@
|
|||||||
# Автообновления TTRPG Player
|
# Автообновления TTRPG Player
|
||||||
|
|
||||||
## Текущее состояние (фаза 1)
|
## Сборка и публикация
|
||||||
|
|
||||||
- Продукт переименован в **TTRPG Player** / **НРИ Плеер** (`productName`: `TTRPGPlayer`, `appId`: `com.ttrpgplayer.app`).
|
- Релизы собираются **локально** (без CI в Gitea).
|
||||||
- CI по тегу `v*` **только собирает** установщики в каталог `release/` (Win NSIS, Linux AppImage x64/arm64). Пуш в Git-репозиторий **`DndGamePlayerUpdates`** **отключён**; скрипт `scripts/sync-update-feed.mjs` удалён.
|
- Файлы для выкладки кладутся в одну папку на Windows, затем заливаются на VPS (вручную `scp` или утилита **TTRPG Release Publisher** — в разработке).
|
||||||
- В `package.json` → `build.publish.url` стоит заглушка `https://updates.invalid.ttrpg/` до настройки реального хоста.
|
- **Имена файлов без версии** — версия только в `latest*.yml`.
|
||||||
- Секреты **`DND_UPDATE_FEED_URL`**, **`DND_UPDATES_SERVER`**, **`UPDATES_REPO`**, **`DND_UPDATES_PUSH_TOKEN`** в workflow **больше не используются** — их можно удалить из настроек репозитория.
|
|
||||||
- Публичный репозиторий **`DndGamePlayerUpdates` на Gitea можно удалить** (история с бинарниками ~4 GiB больше не нужна).
|
|
||||||
|
|
||||||
Клиент по-прежнему использует **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).
|
Пока стоит заглушка `https://updates.invalid.ttrpg/` — автообновление в установленной сборке не заработает, пока не соберёте релиз с правильным URL.
|
||||||
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`).
|
|
||||||
|
|
||||||
Детали 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
|
```bash
|
||||||
npm run pack # Win (на Windows) или см. CI
|
npm ci
|
||||||
npm run pack:linux # Linux AppImage
|
npm run build
|
||||||
npm run pack:mac # macOS (на Mac)
|
npm run release:info # версия и пример тега vX.Y.Z (тег опционален, для git)
|
||||||
npm run release:info # версия и пример тега vX.Y.Z
|
|
||||||
```
|
```
|
||||||
|
|
||||||
Артефакты: `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 вида
|
Git-репозиторий **`DndGamePlayerUpdates`** и CI-пуш артефактов **не используются**.
|
||||||
`https://git.mailib.ru/.../DndGamePlayerUpdates/raw/branch/updates/`.
|
|
||||||
Эта схема приводила к раздуванию репозитория, конфликтам merge, ENOSPC на раннере и HTTP 500 при `git push`. Она **снята с поддержки**.
|
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
# Ручная выкладка macOS-обновлений (TTRPG Player)
|
# macOS: сборка и выкладка обновлений
|
||||||
|
|
||||||
До настройки VPS (фаза 2) mac-сборка выполняется **локально на Mac**. Артефакты нужно будет положить на тот же HTTPS-origin, что и Win/Linux (`build.publish.url`).
|
|
||||||
|
|
||||||
## Сборка на Mac
|
## Сборка на Mac
|
||||||
|
|
||||||
@@ -10,29 +8,14 @@ npm run build
|
|||||||
npm run pack:mac
|
npm run pack:mac
|
||||||
```
|
```
|
||||||
|
|
||||||
В `release/` появятся, например:
|
В `release/` (имена **без версии**):
|
||||||
|
|
||||||
- `TTRPGPlayer-<version>-x64.dmg` (и arm64 при универсальной сборке)
|
- `latest-mac.yml`
|
||||||
- `latest-mac.yml` (если включена публикация generic при сборке)
|
- `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 со слэшем в конце)
|
`https://updates.mailib.ru/latest-mac.yml` (подставьте свой feed URL)
|
||||||
|
|
||||||
## Фаза 2: выкладка на статический хост
|
|
||||||
|
|
||||||
1. Скопировать на сервер обновлений:
|
|
||||||
- `latest-mac.yml`
|
|
||||||
- `.dmg` / `.zip` с именами, на которые ссылается yml
|
|
||||||
2. Проверить в браузере: `https://YOUR-UPDATE-HOST/latest-mac.yml`
|
|
||||||
3. В установленном приложении: **Настройки → Проверить обновления** (нужна активная лицензия).
|
|
||||||
|
|
||||||
## Устаревшая схема (Git feed)
|
|
||||||
|
|
||||||
Раньше файлы коммитили в репозиторий **`DndGamePlayerUpdates`**, ветка `updates`. Этот способ **больше не используется** — репозиторий можно удалить на Gitea.
|
|
||||||
|
|||||||
+8
-2
@@ -149,13 +149,19 @@
|
|||||||
"icon": "build/icon.png"
|
"icon": "build/icon.png"
|
||||||
},
|
},
|
||||||
"appImage": {
|
"appImage": {
|
||||||
"artifactName": "${productName}-${version}-${arch}.${ext}"
|
"artifactName": "${productName}-${arch}.${ext}"
|
||||||
|
},
|
||||||
|
"dmg": {
|
||||||
|
"artifactName": "${productName}-${arch}.${ext}"
|
||||||
|
},
|
||||||
|
"zip": {
|
||||||
|
"artifactName": "${productName}-${arch}.${ext}"
|
||||||
},
|
},
|
||||||
"nsis": {
|
"nsis": {
|
||||||
"oneClick": false,
|
"oneClick": false,
|
||||||
"allowToChangeInstallationDirectory": true,
|
"allowToChangeInstallationDirectory": true,
|
||||||
"deleteAppDataOnUninstall": false,
|
"deleteAppDataOnUninstall": false,
|
||||||
"artifactName": "${productName}-Setup-${version}.${ext}"
|
"artifactName": "${productName}-Setup.${ext}"
|
||||||
},
|
},
|
||||||
"publish": {
|
"publish": {
|
||||||
"provider": "generic",
|
"provider": "generic",
|
||||||
|
|||||||
Reference in New Issue
Block a user