Files
DndGamePlayer/docs/GITEA_AUTO_UPDATE.md
T
2026-05-11 22:27:24 +08:00

17 KiB
Raw Blame History

Автообновление через 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. Либо с компьютера:
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 и которая подключена к твоему 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 для 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.

Если раннер создаёт администратор сайта на уровне всего инстанса — смысл тот же: важно, чтобы у раннера были метки, совпадающие с 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. Закоммить все изменения в приватный репо, затем:
git tag v1.0.1
git push origin main
git push origin v1.0.1

(ветка может быть не main — подставь свою.)

  1. Открой в Gitea «Действия» у приватного репо — должен появиться запуск Release. Дождись успеха job’ов build-windows и publish-update-feed (после появления раннера, см. раздел выше).

  2. После успеха открой публичный DndGamePlayerUpdates → ветка updates — в корне должны появиться latest.yml, установщики и т.д.


Контрольный чеклист

  1. package.jsonbuild.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

Ассистент может выполнить у тебя локально:

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 ассистент только правит файлы в рабочей копии.