FrigaT 1420c2c0eb
All checks were successful
CI / build-test (push) Successful in 55s
Release / pack-and-publish (release) Successful in 55s
FIX сверки версий
2025-12-12 09:48:02 +03:00
ci
2025-11-27 11:14:09 +03:00
CI
2025-11-25 07:44:34 +03:00
2025-11-25 08:18:07 +03:00

Updater

Workflow

📖 Описание

Updater — это инструмент для безопасного обновления приложений.
Он состоит из двух частей:

  • ReleaseUpdater.dll — библиотека для работы с API Gitea/GitHub:

    • Получение списка доступных версий.
    • Выбор нужной версии.
    • Скачивание архива релиза.
    • События жизненного цикла (BeforeInstall, AfterInstall, UpdateFailed).
    • Запуск обновления либо напрямую (UpdateInlineAsync), либо через внешний процесс (UpdateWithExternalAsync).
  • Updater.exe — консольное приложение:

    • Принимает параметры (--zip, --installPath, --appExe).
    • Распаковывает архив в папку установки.
    • Перезапускает приложение.
    • Работает как «чистый установщик», чтобы избежать проблем с блокировкой файлов.

🏗 Архитектура

Solution/
 ├─ ReleaseUpdater/        # Class Library (.dll)
 │   ├─ ReleaseUpdaterFacade.cs
 │   ├─ GiteaReleaseProvider.cs
 │   ├─ HttpAssetDownloader.cs
 │   ├─ SemVerService.cs
 │   └─ Models.cs
 │
 ├─ Updater/               # Console App (.exe)
 │   ├─ Program.cs
 │   ├─ Core/
 │   │   ├─ IExtractor.cs / ZipExtractor.cs
 │   │   ├─ IInstaller.cs / SafeFileInstaller.cs
 │   │   ├─ IProcessManager.cs / ProcessManager.cs
 │   │   ├─ UpdaterApp.cs
 │   │   └─ Options.cs
 │
 └─ UpdaterSolution.sln

Возможности

  • Получение списка версий из Gitea API.
  • Обновление до последней или конкретной версии.
  • Два режима обновления:
    • Inline — всё внутри DLL.
    • External — через Updater.exe.
  • События:
    • BeforeInstall — перед установкой.
    • AfterInstall — после успешной установки.
    • UpdateFailed — при ошибке (автоматический запуск текущей версии).
  • Безопасная установка: бэкап и откат при ошибке.

🚀 Использование

В Telegramботе

// Получение списка версий
var versions = await ReleaseUpdaterFacade.GetVersionsAsync(apiUrl, token);

// Обновление до последней версии
await ReleaseUpdaterFacade.UpdateInlineAsync(apiUrl, token, installPath, "MyBot.exe", "latest");

// Обновление через внешний Updater.exe
await ReleaseUpdaterFacade.UpdateWithExternalAsync(apiUrl, token, installPath, "MyBot.exe", "3.5.2");

Запуск Updater.exe напрямую

Updater.exe --zip "C:\Temp\update.zip" --installPath "C:\Apps\MyBot" --appExe "MyBot.exe"

🔧 Параметры Updater.exe

  • --zip <path> — путь к архиву .zip.
  • --installPath <dir> — папка установки.
  • --appExe <file.exe> — исполняемый файл приложения.
  • --restartDelayMs <int> — задержка перед перезапуском (по умолчанию 500 мс).

📦 Коды возврата

  • 0 — успешное обновление.
  • 2 — ошибка аргументов.
  • 3 — ошибка распаковки.
  • 4 — ошибка установки.
  • 5 — ошибка перезапуска.

🛠 Пример сценария

  1. Бот получает команду /update latest.
  2. ReleaseUpdater.dll:
    • Запрашивает список релизов через Gitea API.
    • Скачивает архив последней версии.
    • Вызывает событие BeforeInstall.
    • Запускает Updater.exe с параметрами.
  3. Updater.exe:
    • Распаковывает архив.
    • Перезапускает приложение.
    • Возвращает код 0.
  4. ReleaseUpdater.dll вызывает событие AfterInstall.
Description
No description provided
Readme MIT 287 KiB
2025-12-12 09:48:22 +03:00
Languages
C# 100%