feat: migrate CI workflow from GitHub Actions to Gitea and update auto-update logic for Gitea releases
CI / build (push) Successful in 10m43s

This commit is contained in:
2026-08-02 17:45:31 +07:00
parent 229a02b543
commit 3a2f02d480
3 changed files with 154 additions and 91 deletions
+18 -6
View File
@@ -1,4 +1,4 @@
//! Автообновление через GitHub Releases.
//! Автообновление через релизы Gitea.
//!
//! Служба и так работает от SYSTEM, поэтому скачивает и ставит обновление
//! сама: ни задач Планировщика, ни отдельного привилегированного режима больше
@@ -8,6 +8,9 @@
//!
//! Останавливает и поднимает службу сам установщик (см. `[Code]` в setup.iss),
//! так что возвращать панель на место после обновления не требуется.
//!
//! API релизов у Gitea совпадает с GitHub по нужным нам полям (`tag_name`,
//! `assets[].browser_download_url`), поэтому разбор один на оба.
use std::{
path::PathBuf,
@@ -24,9 +27,17 @@ use crate::Shared;
/// Версия из Cargo.toml — её же CI подставляет в тег релиза и имя установщика.
const CURRENT_VERSION: &str = env!("CARGO_PKG_VERSION");
// Координаты репозитория.
const GITHUB_OWNER: &str = "robonen";
const GITHUB_REPO: &str = "syshelper";
// Координаты репозитория в Gitea.
const DEFAULT_BASE: &str = "https://git.robonen.ru";
const REPO_OWNER: &str = "robonen";
const REPO_NAME: &str = "syshelper";
/// Базовый адрес Gitea: из переменной окружения на этапе сборки, иначе из
/// константы выше. CI подставляет собственный адрес инстанса.
const BASE_URL: &str = match option_env!("SYSHELPER_UPDATE_BASE") {
Some(url) => url,
None => DEFAULT_BASE,
};
const CHECK_INTERVAL: Duration = Duration::from_secs(6 * 60 * 60);
/// Даём службе подняться, прежде чем лезть в сеть.
@@ -129,11 +140,12 @@ fn client() -> Result<&'static reqwest::Client, String> {
}
async fn fetch_latest(client: &reqwest::Client) -> Result<Latest, String> {
let url = format!("https://api.github.com/repos/{GITHUB_OWNER}/{GITHUB_REPO}/releases/latest");
let base = BASE_URL.trim_end_matches('/');
let url = format!("{base}/api/v1/repos/{REPO_OWNER}/{REPO_NAME}/releases/latest");
let release: Release = client
.get(url)
.header("Accept", "application/vnd.github+json")
.header("Accept", "application/json")
.send()
.await
.map_err(|e| e.to_string())?