7fc952cc39
Co-authored-by: Cursor <cursoragent@cursor.com>
221 lines
17 KiB
Markdown
221 lines
17 KiB
Markdown
# Автообновление через 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 **не читает**; удали или оставь, но **обязательно** заведи новые имена из таблицы.
|
||
|
||
---
|
||
|
||
## Раннер act_runner — без этого «Всего: 0» и сборки не будет
|
||
|
||
Gitea **не запускает** workflow на своём процессе: нужна **отдельная машина** (сервер, VPS или даже твой ПК), на которой крутится программа **[act_runner](https://docs.gitea.com/usage/actions/act-runner)** и которая **подключена** к твоему `git.mailib.ru`.
|
||
|
||
Пока в **«Настройки» → «Действия» → «Раннеры»** написано **«Всего: 0»**, любой workflow (в том числе `release.yml`) **останется в ожидании** — нечему выполнять шаги.
|
||
|
||
### Что сделать по шагам
|
||
|
||
1. Подготовь **Linux x86_64** (Ubuntu 22.04 удобнее всего) с доступом в интернет и к `git.mailib.ru` по HTTPS.
|
||
2. В репозитории **DndGamePlayer**: **«Настройки»** → **«Действия»** → **«Раннеры»** → кнопка **«Создать новый раннер»**.
|
||
3. В мастере выбери ОС (Linux), тип (**репозиторий** / repository), скопируй команду **регистрации** и одноразовый токен.
|
||
4. На машине скачай [релиз act_runner](https://gitea.com/gitea/act_runner/releases) для Linux, распакуй, выполни скопированную команду вида `./act_runner register ...`.
|
||
5. **Метки (labels):** при регистрации добавь метку **`ubuntu-22.04`** — она же указана в **`.gitea/workflows/release.yml`** в `runs-on:`. Если задашь другие метки (например только `self-hosted`) — **поменяй `runs-on`** в workflow на те же строки и закоммить.
|
||
6. Запуск демона: `./act_runner daemon` (или оформи как **systemd**-службу, чтобы раннер поднимался после перезагрузки).
|
||
7. Обнови страницу **«Раннеры»** — должен появиться **1** раннер в состоянии **online** (зелёный).
|
||
|
||
Официальная документация: [Gitea — Act Runner](https://docs.gitea.com/usage/actions/act-runner).
|
||
|
||
Если раннер создаёт **администратор сайта** на уровне всего инстанса — смысл тот же: важно, чтобы у раннера были метки, совпадающие с `runs-on` в workflow, и чтобы он был **online**.
|
||
|
||
---
|
||
|
||
## Шаг 3 — включить Actions (если ещё не включены)
|
||
|
||
1. В том же **приватном** репозитории: **«Настройки»**.
|
||
2. Раздел **«Действия»** / **«Actions»** — включи использование Actions для этого репозитория, если Gitea это спрашивает.
|
||
3. Убедись, что в корне репозитория есть файл **`.gitea/workflows/release.yml`** (он уже в проекте `dnd_player`).
|
||
|
||
Бегунки Gitea должны иметь доступ в интернет (для `npm ci`, `actions/checkout` и т.д.) — это настраивает админ сервера.
|
||
|
||
### Метки `runs-on` (если раннер уже есть, но job не берётся)
|
||
|
||
- В списке раннеров посмотри **метки** у online-раннера.
|
||
- В **`.gitea/workflows/release.yml`** в `runs-on:` должны быть **те же** метки. Сейчас по умолчанию: **`ubuntu-22.04`** (в job `build-windows` и `publish-update-feed`).
|
||
|
||
Сборка **Windows (NSIS)** в CI идёт **на Linux** с **Wine**. Отдельная **macOS**-сборка в workflow отключена, пока нет Mac-раннера (см. комментарии в `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 **«Действия»** у приватного репо — должен появиться запуск **Release**. Дождись успеха job’ов **build-windows** и **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’ы **build-windows** и **publish-update-feed**; в публичном репо появляется ветка **`updates`** с `latest.yml` и установщиками (нужен online-раннер, см. раздел про act_runner).
|
||
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 ассистент только правит файлы в рабочей копии.
|