feat(update): OTA 更新源切换到 GitHub Releases

- RELEASES_API 指向 api.github.com/repos/LiJoeAllen/mqttx/releases;
  latest 端点优先,回退列表分页改 per_page=5(GitHub 参数)
- agent 显式设置 User-Agent: mqttx-ota(GitHub API 要求携带 UA)
- api.github.com 未认证配额 60 次/小时/IP:共享出口 IP 打满时检查静默
  降级(错误仅记录),附件下载走 github.com CDN 不受配额限制
- 设置对话框「关于」的更新源展示改为 GitHub(UPDATE_SOURCE 常量)
- v1.0.x 老客户端 OTA 源仍是 Gitea,靠 CI mirror-gitea job 喂养
  (配置 GITEA_URL/GITEA_TOKEN/GITEA_OWNER Secrets 后生效),
  老客户端升级完毕后可移除镜像 job 与 publish-gitea 脚本
This commit is contained in:
2026-09-30 12:41:11 +08:00
parent 1132cdd41d
commit 68273e8e63
5 changed files with 27 additions and 16 deletions
+4 -3
View File
@@ -189,9 +189,10 @@ jobs:
gh release upload "$VER" -R "$GITHUB_REPOSITORY" artifacts/* --clobber
# ─── 可选:镜像发布到自建 Gitea ───────────────────────────────
# 已装机的 v1.0.x 客户端 OTA 更新源仍指向 Gitea Release 附件;
# 配置 GITEA_URL / GITEA_TOKEN / GITEA_OWNER 三个 Secrets 后本 job 生效,
# 未配置时自动跳过(不影响 GitHub Release 发布)。客户端 OTA 切到 GitHub 后可删。
# 客户端 OTA 源已切换到 GitHub Releases,但已装机的 v1.0.x 老客户端仍轮询
# Gitea Release 附件;配置 GITEA_URL / GITEA_TOKEN / GITEA_OWNER 三个 Secrets 后
# 本 job 生效,把这些老客户端喂到能升级到 OTA 切换后的版本为止。未配置时自动
# 跳过(不影响 GitHub Release 发布)。老客户端升级完毕后可删除本 job。
mirror-gitea:
name: Mirror to Gitea (optional)
needs: [meta, build]
+4 -3
View File
@@ -60,7 +60,7 @@ gpui-app/
│ │ ├── tls.rs # rustls 配置与跳过校验
│ │ ├── v5.rs # MQTT 5.0 客户端构建与事件循环
│ │ └── v4.rs # MQTT 3.1.1 客户端构建与事件循环
│ ├── update/ # OTA 自更新(Gitea Release 源)
│ ├── update/ # OTA 自更新(GitHub Release 源;v1.0.x 老客户端源仍在 Gitea)
│ │ ├── mod.rs # 门面:版本比较、资产命名约定
│ │ ├── check.rs # 检查最新版本与资产挑选
│ │ └── install.rs # 7z 下载暂存、sha256 校验、自替换安装
@@ -139,7 +139,8 @@ MQTTX_LIVE=1 cargo test -p mqttx-desktop --test engine_live -- --ignored
### 可选:镜像到自建 Gitea(老客户端 OTA 源)
已装机的 v1.0.x 客户端 OTA 更新源仍指向 Gitea。在仓库
已装机的 v1.0.x 客户端 OTA 更新源仍指向 Gitea(master 上的客户端自 v1.0.1
起已切换到 GitHub Releases)。在仓库
**Settings → Secrets and variables → Actions** 配置以下 Secrets 后,每次发布
会自动把产物同步镜像到 Gitea Release(`mirror-gitea` job,调用
`scripts/publish-gitea.sh`);未配置时该 job 自动跳过:
@@ -148,7 +149,7 @@ MQTTX_LIVE=1 cargo test -p mqttx-desktop --test engine_live -- --ignored
- `GITEA_TOKEN` — Gitea 访问令牌(需 `package` + repo 写权限)
- `GITEA_OWNER` — Gitea 侧 owner(如 `JoeAllen`)
客户端 OTA 更新源切换到 GitHub 后,可删除 `mirror-gitea` job 与
待 v1.0.x 老客户端全部升级完毕,可删除 `mirror-gitea` job 与
`scripts/publish-gitea.*`。本地手动镜像(应急)仍可用:
```powershell
+1 -1
View File
@@ -502,7 +502,7 @@ impl Render for SettingsDialog {
.child(format!(
"版本 {}(更新源 {})",
update::current_version(),
update::PKG_REPO
update::UPDATE_SOURCE
))
.child("Apache-2.0 许可证"),
)
+6 -3
View File
@@ -5,6 +5,9 @@ use super::*;
pub(super) fn agent() -> ureq::Agent {
ureq::Agent::new_with_config(
ureq::Agent::config_builder()
// GitHub API 要求请求携带 User-Agent(缺省 ureq/x.y 也能过,
// 但标识应用更符合其规范,也便于服务端区分流量)
.user_agent("mqttx-ota")
// 整体上限:防止慢速滴流的下载无限占用阻塞线程
.timeout_global(Some(std::time::Duration::from_secs(10 * 60)))
.timeout_connect(Some(std::time::Duration::from_secs(HTTP_TIMEOUT_SECS)))
@@ -66,12 +69,12 @@ pub fn pick_assets(rel: &serde_json::Value) -> Option<(String, String, u64, Opti
/// 检查更新。返回 Ok(None) 表示已是最新。
pub fn check_latest() -> Result<Option<UpdateInfo>, String> {
let base = format!("{GITEA_URL}/api/v1/repos/{PKG_OWNER}/{PKG_REPO}/releases");
// 优先 latest 端点;旧版 Gitea 没有时回退到列表取第一个非草稿/预发布
let base = RELEASES_API;
// 优先 latest 端点(GitHub 恒可用);回退到列表取第一个非草稿/预发布,作容错
let rel = match http_get_json(&format!("{base}/latest")) {
Ok(v) => v,
Err(_) => {
let list = http_get_json(&format!("{base}?limit=5"))?;
let list = http_get_json(&format!("{base}?per_page=5"))?;
let first = list
.as_array()
.and_then(|l| l.iter().find(|r| {
+11 -5
View File
@@ -1,4 +1,4 @@
//! OTA 自更新:以 Gitea Release 为更新源。
//! OTA 自更新:以 GitHub Release 为更新源。
//!
//! - [`check`] 检查最新版本与资产挑选
//! - [`install`] 下载暂存、校验安装、同意标记与清理
@@ -18,10 +18,16 @@ pub use install::{
install_consent_matches, install_staged, load_staged, mark_install_consent,
};
/// 更新源(自建 Gitea,仓库公开、附件可直接下载,无需认证)。
pub const GITEA_URL: &str = "https://gitea.heavenlybook.cn";
pub const PKG_OWNER: &str = "JoeAllen";
pub const PKG_REPO: &str = "mqttx";
/// 更新源(GitHub Releases;仓库公开,API 与附件下载均无需认证)。
///
/// - api.github.com 未认证配额为 60 次/小时/IP:共享出口 IP 打满时检查会失败,
/// 按「错误仅记录、不打扰用户」静默降级,下次成功检查自动追上;
/// 附件下载走 github.com CDN,不受 API 配额限制。
/// - v1.0.x 老客户端的 OTA 源仍是自建 Gitea,CI 的 mirror-gitea job 会把每次
/// 发布镜像回 Gitea,老客户端升级完毕后可移除该 job。
pub const RELEASES_API: &str = "https://api.github.com/repos/LiJoeAllen/mqttx/releases";
/// 更新源展示名(设置对话框「关于」)。
pub const UPDATE_SOURCE: &str = "GitHub";
const HTTP_TIMEOUT_SECS: u64 = 30;