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:
@@ -188,10 +188,11 @@ jobs:
|
|||||||
fi
|
fi
|
||||||
gh release upload "$VER" -R "$GITHUB_REPOSITORY" artifacts/* --clobber
|
gh release upload "$VER" -R "$GITHUB_REPOSITORY" artifacts/* --clobber
|
||||||
|
|
||||||
# ─── 可选:镜像发布到自建 Gitea ───────────────────────────────
|
# ─── 可选:镜像发布到自建 Gitea ───────────────────────────────
|
||||||
# 已装机的 v1.0.x 客户端 OTA 更新源仍指向 Gitea Release 附件;
|
# 客户端 OTA 源已切换到 GitHub Releases,但已装机的 v1.0.x 老客户端仍轮询
|
||||||
# 配置 GITEA_URL / GITEA_TOKEN / GITEA_OWNER 三个 Secrets 后本 job 生效,
|
# Gitea Release 附件;配置 GITEA_URL / GITEA_TOKEN / GITEA_OWNER 三个 Secrets 后
|
||||||
# 未配置时自动跳过(不影响 GitHub Release 发布)。客户端 OTA 切到 GitHub 后可删。
|
# 本 job 生效,把这些老客户端喂到能升级到 OTA 切换后的版本为止。未配置时自动
|
||||||
|
# 跳过(不影响 GitHub Release 发布)。老客户端升级完毕后可删除本 job。
|
||||||
mirror-gitea:
|
mirror-gitea:
|
||||||
name: Mirror to Gitea (optional)
|
name: Mirror to Gitea (optional)
|
||||||
needs: [meta, build]
|
needs: [meta, build]
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ gpui-app/
|
|||||||
│ │ ├── tls.rs # rustls 配置与跳过校验
|
│ │ ├── tls.rs # rustls 配置与跳过校验
|
||||||
│ │ ├── v5.rs # MQTT 5.0 客户端构建与事件循环
|
│ │ ├── v5.rs # MQTT 5.0 客户端构建与事件循环
|
||||||
│ │ └── v4.rs # MQTT 3.1.1 客户端构建与事件循环
|
│ │ └── v4.rs # MQTT 3.1.1 客户端构建与事件循环
|
||||||
│ ├── update/ # OTA 自更新(Gitea Release 源)
|
│ ├── update/ # OTA 自更新(GitHub Release 源;v1.0.x 老客户端源仍在 Gitea)
|
||||||
│ │ ├── mod.rs # 门面:版本比较、资产命名约定
|
│ │ ├── mod.rs # 门面:版本比较、资产命名约定
|
||||||
│ │ ├── check.rs # 检查最新版本与资产挑选
|
│ │ ├── check.rs # 检查最新版本与资产挑选
|
||||||
│ │ └── install.rs # 7z 下载暂存、sha256 校验、自替换安装
|
│ │ └── install.rs # 7z 下载暂存、sha256 校验、自替换安装
|
||||||
@@ -139,7 +139,8 @@ MQTTX_LIVE=1 cargo test -p mqttx-desktop --test engine_live -- --ignored
|
|||||||
|
|
||||||
### 可选:镜像到自建 Gitea(老客户端 OTA 源)
|
### 可选:镜像到自建 Gitea(老客户端 OTA 源)
|
||||||
|
|
||||||
已装机的 v1.0.x 客户端 OTA 更新源仍指向 Gitea。在仓库
|
已装机的 v1.0.x 客户端 OTA 更新源仍指向 Gitea(master 上的客户端自 v1.0.1
|
||||||
|
起已切换到 GitHub Releases)。在仓库
|
||||||
**Settings → Secrets and variables → Actions** 配置以下 Secrets 后,每次发布
|
**Settings → Secrets and variables → Actions** 配置以下 Secrets 后,每次发布
|
||||||
会自动把产物同步镜像到 Gitea Release(`mirror-gitea` job,调用
|
会自动把产物同步镜像到 Gitea Release(`mirror-gitea` job,调用
|
||||||
`scripts/publish-gitea.sh`);未配置时该 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_TOKEN` — Gitea 访问令牌(需 `package` + repo 写权限)
|
||||||
- `GITEA_OWNER` — Gitea 侧 owner(如 `JoeAllen`)
|
- `GITEA_OWNER` — Gitea 侧 owner(如 `JoeAllen`)
|
||||||
|
|
||||||
客户端 OTA 更新源切换到 GitHub 后,可删除 `mirror-gitea` job 与
|
待 v1.0.x 老客户端全部升级完毕,可删除 `mirror-gitea` job 与
|
||||||
`scripts/publish-gitea.*`。本地手动镜像(应急)仍可用:
|
`scripts/publish-gitea.*`。本地手动镜像(应急)仍可用:
|
||||||
|
|
||||||
```powershell
|
```powershell
|
||||||
|
|||||||
@@ -502,7 +502,7 @@ impl Render for SettingsDialog {
|
|||||||
.child(format!(
|
.child(format!(
|
||||||
"版本 {}(更新源 {})",
|
"版本 {}(更新源 {})",
|
||||||
update::current_version(),
|
update::current_version(),
|
||||||
update::PKG_REPO
|
update::UPDATE_SOURCE
|
||||||
))
|
))
|
||||||
.child("Apache-2.0 许可证"),
|
.child("Apache-2.0 许可证"),
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -5,6 +5,9 @@ use super::*;
|
|||||||
pub(super) fn agent() -> ureq::Agent {
|
pub(super) fn agent() -> ureq::Agent {
|
||||||
ureq::Agent::new_with_config(
|
ureq::Agent::new_with_config(
|
||||||
ureq::Agent::config_builder()
|
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_global(Some(std::time::Duration::from_secs(10 * 60)))
|
||||||
.timeout_connect(Some(std::time::Duration::from_secs(HTTP_TIMEOUT_SECS)))
|
.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) 表示已是最新。
|
/// 检查更新。返回 Ok(None) 表示已是最新。
|
||||||
pub fn check_latest() -> Result<Option<UpdateInfo>, String> {
|
pub fn check_latest() -> Result<Option<UpdateInfo>, String> {
|
||||||
let base = format!("{GITEA_URL}/api/v1/repos/{PKG_OWNER}/{PKG_REPO}/releases");
|
let base = RELEASES_API;
|
||||||
// 优先 latest 端点;旧版 Gitea 没有时回退到列表取第一个非草稿/预发布
|
// 优先 latest 端点(GitHub 恒可用);回退到列表取第一个非草稿/预发布,作容错
|
||||||
let rel = match http_get_json(&format!("{base}/latest")) {
|
let rel = match http_get_json(&format!("{base}/latest")) {
|
||||||
Ok(v) => v,
|
Ok(v) => v,
|
||||||
Err(_) => {
|
Err(_) => {
|
||||||
let list = http_get_json(&format!("{base}?limit=5"))?;
|
let list = http_get_json(&format!("{base}?per_page=5"))?;
|
||||||
let first = list
|
let first = list
|
||||||
.as_array()
|
.as_array()
|
||||||
.and_then(|l| l.iter().find(|r| {
|
.and_then(|l| l.iter().find(|r| {
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
//! OTA 自更新:以 Gitea Release 为更新源。
|
//! OTA 自更新:以 GitHub Release 为更新源。
|
||||||
//!
|
//!
|
||||||
//! - [`check`] 检查最新版本与资产挑选
|
//! - [`check`] 检查最新版本与资产挑选
|
||||||
//! - [`install`] 下载暂存、校验安装、同意标记与清理
|
//! - [`install`] 下载暂存、校验安装、同意标记与清理
|
||||||
@@ -18,10 +18,16 @@ pub use install::{
|
|||||||
install_consent_matches, install_staged, load_staged, mark_install_consent,
|
install_consent_matches, install_staged, load_staged, mark_install_consent,
|
||||||
};
|
};
|
||||||
|
|
||||||
/// 更新源(自建 Gitea,仓库公开、附件可直接下载,无需认证)。
|
/// 更新源(GitHub Releases;仓库公开,API 与附件下载均无需认证)。
|
||||||
pub const GITEA_URL: &str = "https://gitea.heavenlybook.cn";
|
///
|
||||||
pub const PKG_OWNER: &str = "JoeAllen";
|
/// - api.github.com 未认证配额为 60 次/小时/IP:共享出口 IP 打满时检查会失败,
|
||||||
pub const PKG_REPO: &str = "mqttx";
|
/// 按「错误仅记录、不打扰用户」静默降级,下次成功检查自动追上;
|
||||||
|
/// 附件下载走 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;
|
const HTTP_TIMEOUT_SECS: u64 = 30;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user