Files
ReleaseUpdater/README.MD

117 lines
4.3 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.
# Updater
## 📖 Описание
`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боте
```csharp
// Получение списка версий
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 напрямую
```bash
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`.