发一个版本
一次发布是:检查、编运行时、打安装包、查发出去的文件、写一份签名的发布清单、放上 GitHub Releases。清单一出现,装着的人就会收到更新提示;装的时候先备份,失败就退回原来的版本。
发之前
- 3.4 里那几样全过:后端、前端、桌面壳的测试,类型检查,隐私、密钥、旧名字的关卡。
- 版本号在几个地方要一致:
pyproject.toml、src/aeria/__init__.py、webui_frontend/package.json、desktop/package.json、desktop/src-tauri/Cargo.toml、desktop/src-tauri/tauri.conf.json。 CHANGELOG.md写好这个版本的那一节:写给用的人看,说变了什么,不写开发过程;官网的「更新记录」另放一份(site/content/changelog/<版本>.md,写上发布日期)。
编运行时、打安装包
.venv/bin/python scripts/build_runtime.py --channel stable \
--update-source-json '{"type": "github", "repository": "<组织>/<仓库>"}'
运行时用 Nuitka 编成本机程序,发出去的包里没有 .py 源码。编完自己审计一遍:不能有源码、.env 和密钥文件、密钥形状的字符串、数据库、日志、私人数据目录。
然后把编好的运行时(build/runtime/<平台>/)整个放进 desktop/src-tauri/resources/runtime/,打安装包:
cd desktop
npx tauri build --bundles app,dmg
有苹果开发者证书的,签名、公证的步骤在仓库的 docs/DESKTOP_APP.md;没有的话包也能用,只是 macOS 会提示「无法验证开发者」。
查发出去的文件
python3 scripts/audit_artifact.py dist/*.tar.gz desktop/src-tauri/target/release/bundle desktop/dist
每个文件整个扫,包里套的包、.dmg 都打开查;任何一项命中就失败。正式发布前还要在一个干净的目录里,从 git archive 出来的源码重新编一遍,不让本机上没提交的文件、构建机的路径和时区混进安装包。
写清单、签名、发出去
aeria-release manifest --channel stable --version <版本> --build-id <编号> --sequence <上次 + 1> \
--minimum-safe <最低安全版本> --changelog-file <这一节> \
--package "macos-arm64=<下载地址>@<本地文件>" --out dist/manifest-stable.payload.json
aeria-release sign --key <私钥> --in dist/manifest-stable.payload.json --out dist/manifest-stable.json
aeria-release verify --in dist/manifest-stable.json --channel stable
在 GitHub 上建一个 Release,先传各平台的包和安装包,最后传 manifest-stable.json:清单一出现,客户端就会去下它指着的包。
装着的人那边
- 桌面版几个小时内会查到新版本,也可以手动「检查更新」。可以现在更新、稍后提醒,或者跳过这个版本。
- 装的时候先停下运行时、整机备份,再迁移数据、自检;任何一步失败,数据从备份恢复,还用原来的版本。
- 强制更新只用在当前版本已经不安全的时候(泄露隐私、串数据、凭证泄露、数据损坏),清单里要写明原因。
- 发现某个版本有问题、还没修好:发一份新清单把它列进「撤回」,装着它的人会进安全模式,只能更新、备份、诊断。
对应的代码
- 编运行时和审计:
scripts/build_runtime.py、scripts/audit_artifact.py。 - 清单、签名、验签:
src/aeria_release/cli.py(aeria-release)、manifest.py、signing.py;随程序发出去的公钥:src/aeria_release/trusted_keys.json。 - 去哪找新版本:
src/aeria_release/providers.py的GitHubReleasesProvider;装和回滚:src/aeria/update/service.py。 - 流水线定义:
.github/workflows/release.yml(手动触发)。 - 测试:
tests/test_4_1_update.py的「迁移失败,数据从备份恢复,指针不动」「签名不对的清单不收」「包和清单对不上,不装」「恶意包:越界路径、链接、设备文件一律拒绝」;tests/test_4_1_release.py。
没做到的
- 官方仓库还没公开,第一个公开版本(0.1.0)也还没发。
- 每个平台的包要在那个系统上编;三个平台一起编要靠 GitHub 上的流水线,它还没跑过。
- Windows 包的签名要一张代码签名证书,现在没有。