diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index ea0ac26..1da99e5 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -188,10 +188,11 @@ jobs: fi 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 后可删。 +# ─── 可选:镜像发布到自建 Gitea ─────────────────────────────── +# 客户端 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] diff --git a/README.md b/README.md index 2dcd1e2..4fab9a3 100644 --- a/README.md +++ b/README.md @@ -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 diff --git a/gpui-app/src/ui/dialogs/settings_dialog.rs b/gpui-app/src/ui/dialogs/settings_dialog.rs index a601d76..9284505 100644 --- a/gpui-app/src/ui/dialogs/settings_dialog.rs +++ b/gpui-app/src/ui/dialogs/settings_dialog.rs @@ -502,7 +502,7 @@ impl Render for SettingsDialog { .child(format!( "版本 {}(更新源 {})", update::current_version(), - update::PKG_REPO + update::UPDATE_SOURCE )) .child("Apache-2.0 许可证"), ) diff --git a/gpui-app/src/update/check.rs b/gpui-app/src/update/check.rs index dba3471..9671fa6 100644 --- a/gpui-app/src/update/check.rs +++ b/gpui-app/src/update/check.rs @@ -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, 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| { diff --git a/gpui-app/src/update/mod.rs b/gpui-app/src/update/mod.rs index 1c6401c..623e865 100644 --- a/gpui-app/src/update/mod.rs +++ b/gpui-app/src/update/mod.rs @@ -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;