Github + 阿里云oss实现类似codex的自动更新!

终于把 JCode 的"自动更新"功能搞定了!

现在的软件更新节奏是非常离谱的,很多 AI 软件都是接近日更的状态。比如 Codex、Claude、Trae、ZCode 这些软件更新频率都非常高。这么高的更新频率,让用户每天跑去官网下载是不可能的。

所以基本都是"自动更新"!

它们的逻辑都是:先自动帮你下载好,然后会显示一个更新图标,点一下,软件就自动更新了。

我的 JCode 之前一直放在网盘中,如果我不通知,大家可能都不知道有更新了!

所以我也准备加这一个功能。

从思路上来讲好像也不复杂,就是定时去检查一下,有更新就自动下载,然后在软件上做个提醒,然后覆盖之前的软件。

实际操作起来还是花了点功夫,主要的时间花在配置上!

我怕下一次,我就忘记了,所以专门写一篇文章记录一下,也分享一下,有需要的可以参考下!

我这个软件是使用 Tauri 2 + Rust 开发的!它本身就提供了 tauri-plugin-updater 插件,有了框架支持之后,代码部分就简单多了。直接上 Opus 搞定!

1、整体架构

先来看一下整体的结构:

scss 复制代码
开发者打 tag (vX.Y.Z)
        │
        ▼
GitHub Actions (.github/workflows/release.yml)
  ├─ tauri build --bundles nsis        产出 JCode_X.Y.Z_x64-setup.exe
  ├─ 用私钥签名                         产出同名 .sig
  ├─ 生成 latest.json(含 version / signature / url)
  └─ ossutil 上传到阿里云 OSS
        │
        ▼
阿里云 OSS  oss://<bucket>/<prefix>/updater/   (本项目 prefix=jcode)
  ├─ latest.json                       ← 客户端轮询这个
  └─ JCode_X.Y.Z_x64-setup.exe(.sig)   ← 各历史版本安装包
        │
        ▲
JCode 客户端(tauri-plugin-updater)
  启动 + 每 6 小时静默 check()
  → 有新版 → 后台 download() → 校验签名
  → 模式A:显示「重启更新」图标,点击 install()+relaunch()
  → 模式B:收进托盘时自动 install()+relaunch()

这里主要是涉及到了两个平台,一个是 GitHub Actions,一个是阿里云 OSS。一个负责自动编译生成安装包,一个负责存储软件和版本信息。配置完成之后,只要提交代码,自动触发,自动完成!

使用软件的人什么都不用管,只要点击更新即可!

为了保证能安全更新和自动发布,所以引入了证书和 workflow 来实现持续集成(CI)!

上面的整套机制 + workflow + 非对称密钥,已经全部开发完成了!

这部分不需要我干预,Opus 做得熟门熟路。但是它给我留了一些任务,让我自己配置 GitHub 和 OSS!

配置教程已经给我写好了:

一个简单的问题,落地到实操层面,就会有大量的细节。

当你第一次接触这些东西,就会有一些思想上的压力。这个功能其实早就开发好了,只是因为怕配置麻烦,一直没有动手。

最后,终于把这个问题给推进了!

这里最难的就是搞清楚阿里云的后台......出了名的绕!

2、阿里云 OSS 配置

我们先来攻克最麻烦的部分!

2.1 几个概念先理清

  • OSS(对象存储) :阿里云的文件托管服务,把文件放上去就能通过公网 URL 下载。 我们用它放安装包和更新清单。
  • Bucket(存储桶) :OSS 里的"顶层空间",名字全局唯一 ,本手册用 jrelease
  • 项目前缀(OSS_PREFIX :桶里给每个软件分的专属目录名 ,本手册用 jcode。 一个桶靠不同前缀同时放多个软件的更新、互不干扰。
  • 地域 / Endpoint :Bucket 所在机房,如杭州 = oss-cn-hangzhou.aliyuncs.com。 选离用户近的地域,下载更快。
  • 读写权限(ACL) :要让任何人匿名下载安装包,所以 Bucket 设为 公共读
  • AccessKey :一对 AccessKey ID + AccessKey Secret,相当于"账号密码", CI 用它来上传文件。

App 下载用的公网地址长这样(<前缀> 这一段就是 jcode,记住这个格式,后面要用):

ruby 复制代码
https://<Bucket>.<地域Endpoint>/<前缀>/updater/<文件名>
例如:https://jrelease.oss-cn-hangzhou.aliyuncs.com/jcode/updater/latest.json

2.2 创建 Bucket

  1. 登录 阿里云 OSS 控制台

  2. 创建 Bucket

    • Bucket 名称jrelease

      OSS 桶名只能小写字母/数字/连字符 ,且全阿里云全局唯一 。若 jrelease 也被占用, 再换一个,并把后文所有出现的桶名都替换成你的实际桶名。

    • 地域 :选离用户近的,如「华东1(杭州)」。记住这个地域

    • 读写权限 :选 公共读(Public Read)。

    • 其余默认,创建。

具体操作

对象存储 OSS 下面,创建 Bucket:

填写名字,选择分区:

这里的名字全网唯一,我这里写的是 jrelease,这个后面要用的!

除此之外,这里有很多选项,密密麻麻,都不管它,直接点击完成创建。

修改访问权限:

先要在权限控制中关闭"阻止公共访问"。

然后修改读写配置:

把它修改为公共读!

然后获取必要的信息:

截图中有 Endpoint 和 Bucket 域名!

这个步骤,主要是为了获取下面表格中的四个数据。

Name 值(本手册示例) 从哪来 / 说明
OSS_ACCESS_KEY_ID 子账号的 AccessKey ID 2.3 步保存的
OSS_ACCESS_KEY_SECRET 子账号的 AccessKey Secret 2.3 步保存的
OSS_ENDPOINT oss-cn-hangzhou.aliyuncs.com 你 Bucket 的地域(不带 https://
OSS_BUCKET jrelease 你的 Bucket 名
OSS_PUBLIC_BASE https://jrelease.oss-cn-hangzhou.aliyuncs.com Bucket + 地域拼成的公网前缀( https://,只到桶根、不含 jcode
OSS_PREFIX jcode 本项目在桶里的前缀目录名;CI 会上传到 <OSS_PREFIX>/updater/

表格中最上面的两个数值,需要通过其它方式获取!

下面就来说说这两项如何获取。

2.3 RAM 用户 + 密钥 + 授权

因为我们需要使用接口来操作阿里云的 OSS,所以这里我们必须要有访问密钥和相应的授权。这一步主要就是为了获取 AccessKey!

由于用主账号风险极大,所以最合适的方式是,建一个只有 OSS 权限的子账号:

  1. RAM 访问控制控制台创建用户

    • 勾选 「OpenAPI 调用访问」(生成 AccessKey),登录密码可不勾。
    • 创建后立即保存 AccessKey IDAccessKey Secret(Secret 只显示一次)。
  2. 给这个用户授权:在用户详情 → 添加权限 → 添加 AliyunOSSFullAccess (或更精细:仅对该 Bucket 的读写自定义策略)。

具体操作

打开身份管理,创建一个用户,比如叫 release!然后选中这个用户,找到凭证管理。

点击创建 AccessKey:

这里有好多种方式啊,我直接选了其他,然后继续创建。

这里需要下载 CSV 文件或者复制,保存一下 ID 和 Secret!

然后根据安全建议,勾选最大闲置时间!

获取访问信息之后,再点击权限管理。

新增授权:

搜索 OSS,然后勾选 AliyunOSSFullAccess,确认新增授权。

这样账号、密钥、授权就搞定了。这一步主要是获取到了 ID 和 Secret!

3、GitHub 配置

阿里云 OSS 配置完成了,获取到了相关的信息,就可以配置 GitHub 了!

这个步骤就简单多了。

打开托管在 GitHub 上的项目,然后点击 Settings -> Secrets and variables -> Actions

然后找到 New repository secret,一个一个添加就可以了!这些数值上面的表格中都有了。

5、自动化编译

上面两个地方的配置全部完成之后,就可以实现自动打包发布了。因为内容比较多,最好是根据列表检查一次,确保每一个步骤已经到位了。

配置阶段(一次性):

  • 私钥已配进 GitHub Secret TAURI_SIGNING_PRIVATE_KEY
  • 建了空的 TAURI_SIGNING_PRIVATE_KEY_PASSWORD
  • 私钥文件已另存备份(U盘/密码管理器等)
  • 阿里云建好 Bucket,权限=公共读
  • 建好 RAM 子账号 + AccessKey,授权 OSS
  • 6 条 OSS Secrets 都填了(含 OSS_PREFIX=jcode
  • tauri.conf.json 的 endpoint = 桶根 + jcode 前缀 + /updater/latest.json,与上传路径一致

每次发版(重复):

  • tauri.conf.jsonCargo.tomlversion(要比上版高)
  • git push 提交
  • git tag v0.9.x && git push origin v0.9.x
  • 看 GitHub Actions 跑绿
  • 去 OSS 确认 jcode/updater/latest.json 和新 .exe 已就位

假设全部配置已经正确,接下来就是根据每次发版来操作就好了。

修改版本号,推送代码,然后添加 tag,再推送 tag。

一旦推送了 v 开头的 tag 之后,就会触发自动构建:

然后就会按设定好的工作流进行操作了。构建并签名这一步时间会长一些,我实测大概是 18 分钟左右。其他都挺快的。

因为配置略复杂,中间还出现了好几个问题,所以编译失败了好几次。一直修改到 v0.9.10,终于编译成功了。

成功之后,会把安装包和配置文件自动上传到阿里云 OSS!

这样自动编译和自动发布新版本就已经完成了!

6、软件更新

安装一个已经支持自动更新的版本,比如 v0.9.10。然后再发布一个更新的版本 v0.9.11,打开 v0.9.10 版本,就会自动获取最新版本,提示更新了!

如果有更新,软件右上角会有一个明显的更新按钮:

设置里面也会有更新提示:

只要点击一下按钮,就可以自动更新了。更新过程不需要完整安装,刷一下就好了,非常快。当然软件本身也才几 M,即便全量覆盖,也非常快!

体验相当丝滑,不输 Codex!

另外说一句,这个项目已经完全开源:

github.com/JarvisPMS/J...

主要包含以下功能点:

markdown 复制代码
- **配置隔离 · 多开互不影响**:每个平台独立 `CLAUDE_CONFIG_DIR`,每次启动单开一个终端,可同时运行多个 Claude Code,授权、历史、会话互不污染。
​
- **协议自动转换**:Anthropic 原生直连;OpenAI 兼容端点经本地代理转成 Claude Code 可用的 Messages API。
​
- **一键启动**:点图标或拖入文件夹即启动,自动注入 Key、Base URL、模型、配置目录、权限模式与网络代理。
​
- **多平台预设**:内置 Claude、阿里百炼、DeepSeek、Kimi、智谱、火山方舟、OpenRouter、Ollama 等十余个平台,也可自定义。
​
- **平台编排**:启用/隐藏、拖拽排序、默认目录、启动参数、模型标签一站管理。
​
- **本地代理**:支持按平台直连与按模型名映射转发,适配第三方客户端。
​
- **批量测试**:多平台并发跑同一提示词,实时看输出、工具调用、耗时与 Token。
​
- **Token 统计**:会话数、消息数、消耗、活跃天数、热力图、模型排行一览。
​
- **密钥安全**:本地加密存储,支持从旧版系统 Keychain 迁移。
​
- **配置备份**:平台配置一键导入/导出,便于迁移与多机同步。

用起来很简单,但是细节还是挺多的。虽然整个项目一行代码都没写,但是断断续续也搞了好一阵子了!对我自己而言是非常够用了。

相关推荐
阿里云大数据AI技术3 小时前
光轮智能 × 阿里云:共建 Physical AI 云上数据、评测与持续学习基础设施
人工智能·机器学习
机器之心3 小时前
实锤了:Claude Code偷查用户,时区、中国AI实验室全是关键词
人工智能·openai
网易云信3 小时前
Cursor点燃个人开发者,企业级AI为何频频受挫?Agent工厂从提效工具到AI员工的跃迁
人工智能·开源
网易云信3 小时前
解锁触手可及的温暖:网易智企 x Wander Puffs AI 云游泡芙
人工智能
转转技术团队3 小时前
从 PRD 到可验证代码:AI 需求开发闭环实践
人工智能
机器之心4 小时前
飞书让表格变成「AI同事」加入群聊,不打开表就能用表
人工智能·openai
Bigfish_coding4 小时前
前端转agent-【python】-15 AI Agent 可观测性入门:LangFuse 链路追踪、Token 监控与 LLM 质量评估
人工智能
我唔知啊4 小时前
我把 Claude Code 拆成了一间餐厅:从一句话到一次回复,中间到底发生了什么
人工智能