Github +阿里云oss实现类似codex的自动更新!
终于把 JCode 的“自动更新”功能搞定了!

现在的软件更新节奏是非常离谱的,很多 AI 软件都是接近日更的状态。比如 Codex、Claude、Trae、ZCode 这些软件更新频率都非常高。这么高的更新频率,让用户每天跑去官网下载是不可能的。
所以基本都是“自动更新”!
它们的逻辑都是:先自动帮你下载好,然后会显示一个更新图标,点一下,软件就自动更新了。
我的 JCode 之前一直放在网盘中,如果我不通知,大家可能都不知道有更新了!
所以我也准备加这一个功能。
从思路上来讲好像也不复杂,就是定时去检查一下,有更新就自动下载,然后在软件上做个提醒,然后覆盖之前的软件。
实际操作起来还是花了点功夫,主要的时间花在配置上!
我怕下一次,我就忘记了,所以专门写一篇文章记录一下,也分享一下,有需要的可以参考下!
我这个软件是使用 Tauri 2 + Rust 开发的!它本身就提供了 tauri-plugin-updater 插件,有了框架支持之后,代码部分就简单多了。直接上 Opus 搞定!
1、整体架构
先来看一下整体的结构:
开发者打 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,记住这个格式,后面要用):
https://<Bucket>.<地域Endpoint>/<前缀>/updater/<文件名>
例如:https://jrelease.oss-cn-hangzhou.aliyuncs.com/jcode/updater/latest.json
2.2 创建 Bucket
- 登录 阿里云 OSS 控制台。
- 点 创建 Bucket:
- Bucket 名称:
jrelease。OSS 桶名只能小写字母/数字/连字符,且全阿里云全局唯一。若jrelease也被占用, 再换一个,并把后文所有出现的桶名都替换成你的实际桶名。 - 地域:选离用户近的,如「华东1(杭州)」。记住这个地域。
- 读写权限:选 公共读(Public Read)。
- 其余默认,创建。
- Bucket 名称:
具体操作
对象存储 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 权限的子账号:
- 进 RAM 访问控制控制台 → 创建用户。
- 勾选 「OpenAPI 调用访问」(生成 AccessKey),登录密码可不勾。
- 创建后立即保存
AccessKey ID和AccessKey Secret(Secret 只显示一次)。
- 给这个用户授权:在用户详情 → 添加权限 → 添加
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.json和Cargo.toml的version(要比上版高) 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!
另外说一句,这个项目已经完全开源:

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