Files
DndGamePlayer/docs/GITEA_AUTO_UPDATE.md
T
Ivan Fontosh 600b8f8321
Release / build-windows (push) Failing after 54s
Release / publish-update-feed (push) Has been skipped
ci: Gitea release on ubuntu runner (Wine for Win), drop github-only labels
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-11 22:24:02 +08:00

203 lines
15 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Автообновление через Gitea (приватный код + публичный feed)
Исходники остаются в **закрытом** репозитории с игрой. Файлы обновлений (`latest.yml`, установщики) лежат в **отдельном публичном** репозитории — по HTTPS их скачивает `electron-updater`.
## Твой публичный репозиторий (уже есть)
- Клон: `https://git.mailib.ru/ifontosh/DndGamePlayerUpdates.git`
- Владелец/репо для секретов: **`ifontosh/DndGamePlayerUpdates`**
- Базовый URL feed (вшивается в сборку и должен совпадать с secret **`DND_UPDATE_FEED_URL`**):
**`https://git.mailib.ru/ifontosh/DndGamePlayerUpdates/raw/branch/updates/`**
Обрати внимание: слово **`branch`** в пути — это часть URL Gitea, не имя ветки. Имя ветки — в конце: **`updates`**.
В `package.json` уже указан этот же `build.publish.url` (для локального `npm run pack` и метаданных electron-builder).
---
## Шаг 0 — репозиторий сейчас пустой (важно)
На странице репо написано, что **контента нет**. Пока нет **ни одного коммита**, CI не сможет сделать `git clone`.
Сделай так (любой способ):
1. На сайте открой `ifontosh/DndGamePlayerUpdates` → кнопка вроде **«Инициализировать репозиторий»** / **«Добавить файл»** → создай файл `README.md` с парой строк и закоммить **в ветку по умолчанию** (часто `main`).
2. Либо с компьютера:
```bash
git clone https://git.mailib.ru/ifontosh/DndGamePlayerUpdates.git
cd DndGamePlayerUpdates
echo "# DndGamePlayer updates feed" > README.md
git add README.md
git commit -m "init"
git push origin main
```
(Если ветка по умолчанию у тебя `master` — подставь её вместо `main`.)
После этого репозиторий **не пустой** — workflow сможет клонировать и создать ветку **`updates`**.
---
## Шаг 1 — токен для записи в публичный репозиторий
Нужен **персональный токен** (PAT), с которым CI сможет **пушить** в `DndGamePlayerUpdates`.
В Gitea на русском обычно так (названия могут чуть отличаться в твоей теме):
1. Вверху справа **аватар****Настройки** (или «Параметры»).
2. Слева найди раздел вроде **«Приложения»** / **«Токены доступа»** / **«Токены»** (в англ. интерфейсе: **Settings → Applications → Generate New Token**).
3. Создай новый токен:
- имя: например `dnd-release-ci`;
- права: достаточно доступа к репозиторию с **записью** (для пуша в `DndGamePlayerUpdates`). Если есть галочки — включи что-то вроде **«Запись в репозиторий»** / **write:repository** / полный доступ к репо.
4. **Скопируй токен один раз** и сохрани в менеджере паролей — потом Gitea его не покажет.
Этот токен пойдёт в secret **`DND_UPDATES_PUSH_TOKEN`** (см. ниже). **Не вставляй токен в код и не коммить его.**
> На **git.mailib.ru** имена секретов **не могут начинаться с `GITEA_`** (зарезервировано). Поэтому в workflow используются `DND_UPDATES_*`, а не `GITEA_*`.
---
## Шаг 2 — секреты в приватном репозитории с кодом (`dnd_player`)
Открой **приватный** репозиторий, где лежит исходник игры (не `DndGamePlayerUpdates`).
Дальше (русский Gitea 1.26, ориентир по меню):
1. Вкладка **«Настройки»** репозитория (вверху рядом с «Код», «Задачи» — иногда шестерёнка **«Настройки»**).
2. Слева раздел **«Секреты»** / **«Действия»** → **«Секреты»** (в англ. UI: **Settings → Actions → Secrets**). Если видишь **«Переменные»** — секреты обычно рядом; нам нужны именно **секреты** (скрытые значения).
Добавь **четыре** секрета (имя **точно** как в таблице — workflow их читает):
| Имя секрета | Что вписать в значение |
| ------------------------ | -------------------------------------------------------------------------------------------------------- |
| `DND_UPDATE_FEED_URL` | `https://git.mailib.ru/ifontosh/DndGamePlayerUpdates/raw/branch/updates/` (обязательно **слэш в конце**) |
| `DND_UPDATES_SERVER` | `https://git.mailib.ru` (**без** слэша в конце) |
| `UPDATES_REPO` | `ifontosh/DndGamePlayerUpdates` |
| `DND_UPDATES_PUSH_TOKEN` | токен из шага 1 (одна длинная строка) |
Сохрани каждый секрет кнопкой вроде **«Сохранить»** / **«Добавить»**.
Если раньше создавал секреты `GITEA_SERVER` / `GITEA_TOKEN` — их workflow **не читает**; удали или оставь, но **обязательно** заведи новые имена из таблицы.
---
## Шаг 3 — включить Actions (если ещё не включены)
1. В том же **приватном** репозитории: **«Настройки»**.
2. Раздел **«Действия»** / **«Actions»** — включи использование Actions для этого репозитория, если Gitea это спрашивает.
3. Убедись, что в корне репозитория есть файл **`.gitea/workflows/release.yml`** (он уже в проекте `dnd_player`).
Бегунки Gitea должны иметь доступ в интернет (для `npm ci`, `actions/checkout` и т.д.) — это настраивает админ сервера.
### Раннеры и метки `runs-on`
Сообщение **«No matching online runner with label: windows-latest»** значит: в workflow были метки **как на GitHub**, а у тебя **свой act_runner** с **другими** метками.
- В **Администрирование****Действия****Раннеры** (или в настройках сайта) посмотри, какие **метки (labels)** у онлайн-раннера.
- В файле **`.gitea/workflows/release.yml`** у job’ов поле **`runs-on:`** должно **точно совпадать** с одной из этих меток (например `ubuntu-22.04`, `ubuntu-latest`, `self-hosted`).
Сейчас в workflow по умолчанию стоит **`ubuntu-22.04`**. Если у раннера другая метка — замени в **трёх** местах (`build-windows` и два раза `publish-update-feed`, если дублируется) на свою.
Сборка **Windows (NSIS)** идёт **на Linux** с установкой **Wine** (отдельный Mac-runner не обязателен для Windows). Отдельная job **macOS** в workflow временно отключена: без Mac-раннера она всё равно не стартовала; когда появится раннер с macOS — можно снова добавить job и второй артефакт (см. комментарии в `release.yml`).
---
## Шаг 4 — выпуск версии
1. В `package.json` версия должна совпасть с тегом (workflow при пуше тега делает `npm version` из имени тега — удобно).
2. Закоммить все изменения в **приватный** репо, затем:
```bash
git tag v1.0.1
git push origin main
git push origin v1.0.1
```
(ветка может быть не `main` — подставь свою.)
3. Открой в Gitea **«Действия»** / **«Actions»** у приватного репо — должен появиться запуск **Release**. Дождись зелёных галочек у job’ов Windows, macOS и **publish-update-feed**.
4. После успеха открой **публичный** `DndGamePlayerUpdates` → ветка **`updates`** — в корне должны появиться `latest.yml`, установщики и т.д.
---
## Контрольный чеклист
1. **`package.json``build.publish.url`** =
`https://git.mailib.ru/ifontosh/DndGamePlayerUpdates/raw/branch/updates/`
Совпадает с **`DND_UPDATE_FEED_URL`** (со слэшем в конце).
2. В **DndGamePlayerUpdates** есть хотя бы один коммит (не пустой репо).
3. В приватном репо заданы **все четыре** секрета из таблицы шага 2 (имена **не** начинаются с `GITEA_`).
4. В репо с кодом есть **`.gitea/workflows/release.yml`**.
5. Релиз: пуш тега `v*` → в Actions три job’а; в публичном репо появляется ветка **`updates`** с `latest.yml` и установщиками.
6. В приложении: обновления только **`app.isPackaged`** и при **активной лицензии** (см. `app/main/update/installAutoUpdater.ts`).
---
## Поведение приложения
- Проверка только в **собранной** установке (`app.isPackaged`).
- Только если **лицензия активна**.
- Первый запрос примерно через **12 с** после старта; при смене лицензии — снова (не чаще **30 с**).
- Для отладки можно задать переменную окружения **`DND_UPDATE_FEED_URL`** при запуске `.exe` — переопределит feed.
Подпись кода в CI отключена: `CSC_IDENTITY_AUTO_DISCOVERY=false`.
---
## Локальная отладка feed
Запуск установленного приложения с другим URL (без пересборки): задать **`DND_UPDATE_FEED_URL`** в ярлыке или системных переменных окружения.
---
## Как сделать так, чтобы ассистент в Cursor мог «выпустить релиз»
У ассистента **нет своего аккаунта** на `git.mailib.ru`. Релиз = **появление тега `v*`** на нужном коммите в **приватном** репозитории с кодом → Gitea Actions собирает и пушит feed. Ниже два рабочих варианта.
### Вариант A — Gitea MCP (удобно из чата)
У тебя уже подключён MCP **user-gitea-mailib** с инструментом **`create_tag`**: по API создаётся тег на сервере (аналог `git tag` + `git push` тега).
**Что сделать один раз:**
1. В Cursor MCP для Gitea должен быть **включён и залогинен** под учёткой, у которой есть право **создавать теги** в приватном репо с `dnd_player`.
2. Знать **`owner`** и **`repo`** этого репозитория (как в URL: `https://git.mailib.ru/OWNER/REPO`).
**Как просить в чате:**
«Создай тег `v1.0.2` в репозитории `OWNER/REPO` с целевой веткой `main`» (или укажи SHA коммита). Перед этим **весь код релиза уже должен быть запушен** в эту ветку — тег вешается на последний коммит (или на явный `target`).
После создания тега зайди в **Действия** репозитория и проверь workflow **Release**.
_(Отдельно: `create_release` в MCP создаёт **запись релиза** на Gitea; сборку у тебя запускает именно **тег** и `release.yml`.)_
### Вариант B — команды `git` в терминале Cursor
Ассистент может выполнить у тебя локально:
```bash
git fetch origin
git tag v1.0.2 origin/main # или другая ветка / коммит
git push origin v1.0.2
```
**Что сделать один раз:**
1. Чтобы `git push` **не спрашивал пароль** каждый раз: настроить **учётные данные** (Windows: диспетчер учётных данных / `git credential-manager`; либо **SSH-ключ** и remote `git@git.mailib.ru:...`).
2. Убедиться, что из того же окружения, где работает Cursor, `git push` в приватный репо уже проходил успешно.
Тогда в чате можно написать: «Поставь тег `v1.0.2` на `origin/main` и запушь тег» — ассистент выполнит команды в `dnd_player`.
### Ограничения
- Ассистент **не видит** твои пароли и не обходит Gitea: всё упирается в **MCP-токен** или **твои локальные git credentials**.
- Если MCP отключён и git без настроенного доступа — релиз тегом придётся пушить **тебе** вручную (как в шаге 4 выше).
---
## Про коммит и пуш кода (не тег)
Закоммитить и запушить **изменения в файлах** ассистент может через те же механизмы: либо ты делаешь `git push` после правок, либо настроенный **git** / отдельный скрипт. Без доступа к remote ассистент только правит файлы в рабочей копии.