文档
构建和发布
特定于目标的 sidecar、签名的更新程序资产以及在平台安装程序后发布的发布索引。
从英文自动翻译。 查看英文原文
分销模式
桌面版本打包了一个 Vite 前端、一个 Bun 编译的 sidecar,并在 Tauri 应用程序中生成了 SQLite 迁移。该存储库定义了 macOS Apple Silicon 和 Intel、Windows x64 和 ARM64 以及 Linux x64 和 ARM64 版本。发布自动化配置在 .github/workflows/release.yml;平台构建检查也通过独立运行 build-platforms.yml.
工作流定义描述了发布过程。安装程序的可用性和有效性必须根据其特定的运行和发布资产来确定。源代码本身并不能证明签名凭据、公证结果或在目标计算机上的成功安装。
建设管道
scripts/build.ts 运行六个有序阶段并在一个阶段失败时中止:
- 安装: freeze-lockfile 安装,包括所有操作系统和 CPU 架构的可选依赖项。
- 查看: 工作区类型检查。单元测试是一个单独的 CI 命令。
- 编译: 构建边车
scripts/compile-sidecar.ts对于 Rust 目标三元组。 - 资源: 阶段
packages/db/drizzle作为捆绑迁移。 - 捆: 构建前端,然后使用目标、捆绑包、签名和更新程序设置调用 Tauri。
- 文物: 索引安装程序资产,写入 SHA-256 校验和,并从 Git 历史记录生成发行说明。
bun scripts/build.ts --help
bun scripts/build.ts --dry-run
bun run build:sidecar
bun scripts/build.ts --only=resources
bun scripts/build.ts --no-updater --only 和 --skip 接受艺名; --target, --bundles, 和 --out-dir 选择输出。默认目标是报告的主机 rustc -vV。 Sidecar 二进制文件被写入 apps/desktop/src-tauri/binaries/sidecar-<triple>, 和 .exe 在 Windows 上。相同的二进制文件和迁移树保持不变,以避免不必要的开发重启。
使用 compile-sidecar.ts 通过管道:它应用嵌入式主机捆绑适应。直接通用编译命令并不代表相同的构建过程。默认工件目录是 apps/desktop/src-tauri/target/release-artifacts.
这 resources 步骤副本 packages/db/drizzle/ 进入 apps/desktop/src-tauri/resources/migrations/ 并且可以安全地重复。这 artifacts 步骤写 SHA256SUMS 和 RELEASE_NOTES.md,根据自最后一个标签以来的提交构建。步骤别名被接受 --only 和 --skip: deps, checks/test, sidecar, migrations, 和 notes/checksums/release。剧本永远不会读 .env* 文件或打印秘密值。
CI与出版
| 工作流程 | 配置的职责 |
|---|---|
ci.yml | 冻结安装、工作区类型检查/测试、sidecar/资源暂存、Rust 剪辑/测试以及配套的 JavaScript 检查。 |
build-platforms.yml | 手动或 build/** 分支针对六个目标架构进行构建。捆绑使用 --no-updater 并上传索引工件而不发布版本。 |
release.yml | 版本标签验证、签名平台构建、每个平台清单、六平台清单合并、安装程序发布和最终索引发布。 |
ios.yml | 未签名的模拟器构建和配对往返;没有 App Store 或 TestFlight 出版物。 |
发布工作流程运行时间为 v* 标签或非分支存储库上手动选择的现有版本标签。 release-ref.ts 检查标签和应用程序版本并解析提交。每个构建都会创建一个平台版本,例如后缀为的版本标签 macos-arm64 或 linux-x64。只有在所有平台版本发布后,版本索引才会发布合并后的版本 latest.json.
stage-release.ts 在发布之前检查选定的工件、校验和/签名关系以及清单链接。已经发布的版本不会被覆盖。该索引版本有资格成为最新的稳定版本;预发布仍标记为预发布。
更新程序构建需要与公钥相对应的 Tauri 签名私钥和密码配置 tauri.conf.json。 macOS 发布签名/公证使用 Apple 证书和帐户设置; Windows 导入签名证书并将其指纹传递给捆绑程序。缺少所需的发布签名输入会使发布构建失败。通过 CI 秘密存储配置这些。
当 npm 令牌可用时,单独的发布作业会发布 nikcli 插件包。它会跳过已发布的版本,并在无法发布主范围时可以使用配置的后备包名称。此软件包作业不会建立桌面安装程序的可用性。
更新程序行为
配置的更新程序端点是存储库的最新 GitHub 版本下载,网址为 latest.json。 Rust 更新程序在启动时和每四个小时进行一次检查,并通过其服务排队进行手动检查。每个请求都使用 30 秒超时。清单标识特定于平台的资产和签名;公钥是应用程序配置的一部分。
update://status 包含检查、最新、可用、下载、就绪和失败状态。发行说明包含 [critical] 将可用更新标记为不可驳回。准备重新启动状态也是不可解除的。这会影响提示;安装仍然尊重未保存的工作防护。
install_update 记录并重新检查发布的版本,然后下载经过签名验证的包。编辑器在下载之前保存并再次保存 apply_update,保护下载过程中所做的编辑。未保存的工作会阻止这两项操作;失败的保存保留已验证的字节以供重试。订阅后将恢复本机状态,并且检查不能替代活动进度或待重启。 Windows 在安装程序控制之前耗尽 sidecar;其他平台提供安装后重新启动的功能。
保持释放键稳定
应用程序使用其嵌入的公钥来验证更新签名。使用不同私钥签名的版本不可互换。在宣布版本可供用户使用之前,请验证目标平台上生成的安装程序和更新程序资产。
数据库兼容性
打包申请开放 cadcamfun.db 在他们的应用程序数据目录下。数据库层在启动时使用捆绑包中包含的迁移来应用挂起的迁移。因此,架构升级和二进制更新是相关的,即使它们是单独的工件。
生成的发行说明将跟踪的迁移树与之前的发行标签进行比较。据报告,已更改的树无法安全降级;未更改的树被报告为迁移兼容;不可用的历史记录被报告为未知。这种自动比较并不能验证所有可能的应用程序级兼容性问题。
在用旧版本替换二进制文件之前,请保留当前数据并检查版本的兼容性说明。正向迁移代码并不意味着反向迁移。按照实际数据目录的数据库备份和恢复过程进行操作。
发布验证
bun test scripts
bun scripts/build.ts --only=artifacts --dry-run 帮助程序测试验证目标映射、签名要求、工件命名、清单处理和暂存规则。试运行打印计划的操作,无需编译或签名。既不能替代实际的本机捆绑包、更新程序下载/安装测试,也不能替代配套产品的物理设备接受度。
对于操作版本,保留确切的标记/提交、工作流程结果、特定于目标的安装程序和更新资产、校验和/签名文件以及已发布的清单。验证已安装的应用程序是否启动其捆绑的 sidecar 和迁移,以及更新程序是否选择了预期的平台资产。
目标和资产参考
| 平台 | 生Rust目标 | 清单键 | 更新程序资产 |
|---|---|---|---|
| macOS 苹果芯片 | aarch64-apple-darwin | darwin-aarch64 | .app.tar.gz |
| macOS 英特尔 | x86_64-apple-darwin | darwin-x86_64 | .app.tar.gz |
| Windows ARM64 | aarch64-pc-windows-msvc | windows-aarch64, windows-aarch64-msi | .exe, .msi |
| Windows x64 | x86_64-pc-windows-msvc | windows-x86_64, windows-x86_64-msi | .exe, .msi |
| Linux ARM64 | aarch64-unknown-linux-gnu | linux-aarch64-deb, linux-aarch64-rpm | .deb, .rpm |
| Linux x64 | x86_64-unknown-linux-gnu | linux-x86_64-deb, linux-x86_64-rpm | .deb, .rpm |
生成器需要上述每种格式的一个资产,其相邻的 .sig 文件和发行说明。资产名称使用 <triple>-- 前缀;拒绝重复的姓名和孤儿签名。 Tauri 更新程序 2.13.1 自动选择已安装的软件包类型; Linux 使用没有 AppImage 的签名 Debian/RPM 软件包。
合并清单必须就版本、发布日期和注释达成一致。出版需要以上所有十个键。 Windows 基本密钥保留了对旧客户端的 NSIS 兼容性; MSI 密钥保留 MSI 安装。 URL 必须使用没有凭据、查询或片段的 HTTPS。暂存会检查每个目标前缀、包后缀、签名和发布 URL。
本地构建选项和签名输入
bun --no-env-file scripts/build.ts --only=compile,resources --target=aarch64-apple-darwin --dry-run
bun --no-env-file scripts/build.ts --skip=install,check --target=x86_64-unknown-linux-gnu --bundles=deb,rpm --no-updater --dry-run 消除 --dry-run 仅当安装了选定的目标工具链和本机必备组件时。交叉编译 Bun 可执行文件本身并不提供跨平台 Tauri 链接器和捆绑器。 --only 和 --skip 是相互排斥的; --skip-install 是一个方便的别名。 --no-updater 省略更新程序存档/签名创建及其签名门。
| 输入 | 用于 |
|---|---|
TAURI_SIGNING_PRIVATE_KEY, TAURI_SIGNING_PRIVATE_KEY_PASSWORD | 更新者签名。环境提供的密钥优先于本地签名配置。 |
忽略本地 tauri-signing.json | 当未提供环境密钥时,本地更新程序密钥回退。其声明的公钥必须等于配置的更新程序公钥。 |
CADCAM_RELEASE=1 | 在构建验证中启用平台发布签名要求。 |
APPLE_CERTIFICATE, APPLE_CERTIFICATE_PASSWORD, APPLE_ID, APPLE_PASSWORD, APPLE_TEAM_ID | macOS 发布证书和公证配置。 |
WINDOWS_CERTIFICATE, WINDOWS_CERTIFICATE_PASSWORD,导入的证书指纹 | Windows 发布签名; CI 导入并随后删除证书。 |
该构建仅为捆绑步骤加载本地更新程序凭据,并将签名值通过环境传递到该子进程。不要打印本地签名文件或将真实的密钥材料放入文档示例中。与已安装应用程序的公钥不匹配的私钥无法为该应用程序生成可接受的更新。
发布故障诊断
| 失败 | 解释和下一步检查 |
|---|---|
| 标签/应用程序版本不一致 | 所选择的 v-前缀标签与 Tauri 配置中的版本不匹配。发布验证在平台构建之前停止。 |
| 不支持的目标 | 使用受支持的架构/平台映射并安装 Rust 目标;清单发布支持上述六个键。 |
| 缺少更新程序签名密钥 | 通过秘密存储/本地配置提供签名输入或选择一个有意的 --no-updater 开发构建。 |
| 零个或多个更新程序资产 | 检查索引的目标目录;陈旧或不匹配的档案使选择不明确。 |
| 清单元数据不一致 | 所有平台作业必须使用相同的已解析版本/日期/注释并提交。 |
| 版本已经发布 | 工作流程拒绝修改它。重新运行不是覆盖机制。 |
| 已安装应用程序的更新程序检查失败 | 检查端点可达性、清单目标密钥、下载 URL、资产签名和嵌入式公钥。 |
| 安装因未保存的工作而被拒绝 | 通过编辑器保存或放弃活动工作,然后重试挂起的更新。 |
有用的发布报告记录了哪个阶段失败了以及它正在构建哪个目标。包括非秘密工件名称、验证错误和工作流标识符。在更新程序练习期间保留以前安装的版本和经过验证的数据备份;迁移兼容性与签名有效性分开检查。
实施锚点: scripts/release-helpers.ts, signing-config.ts, updater-manifest.ts, stage-release.ts, 和 apps/desktop/src-tauri/src/updater.rs.
六个构建步骤
| # | 步 | 别名 | 它的作用 |
|---|---|---|---|
| 1 | install | 部门 | bun install --frozen-lockfile |
| 2 | check | 检查、测试、测试 | bun run typecheck |
| 3 | compile | 边车 | 编译 apps/sidecar/src/main.ts 至 src-tauri/binaries/sidecar-<triple> |
| 4 | resources | 资源、迁移 | 复制 packages/db/drizzle/ 至 src-tauri/resources/migrations/ |
| 5 | bundle | 捆绑 | 桌面应用 vite build, 然后 bunx tauri build |
| 6 | artifacts | 工件、注释、校验和、发布 | SHA256SUMS 和 RELEASE_NOTES.md 自最后一个标签以来的提交 |
步骤始终按此顺序运行,失败的步骤会停止运行。剧本永远不会读 .env 文件并且从不打印秘密值。
| 选项 | Effect |
|---|---|
--only=a,b / --skip=a,b | 运行或跳过步骤(名称或别名) |
--skip-install | 与相同 --skip=install |
--target=<triple> | 生Rust目标;默认是主机三元组 rustc -vV |
--bundles=<list> | 转发至 tauri build --bundles |
--no-updater | 没有更新程序存档和签名的安装程序 |
--out-dir=<path> | 其中步骤6写入;默认 apps/desktop/src-tauri/target/release-artifacts |
--dry-run | 打印计划;不写任何东西 |
bun scripts/build.ts --dry-run # whole plan, no side effects
bun scripts/build.ts --only=resources # restage migrations (idempotent)
bun scripts/build.ts --only=compile,resources # rebuild the sidecar and migrations
bun scripts/build.ts --only=notes --dry-run # preview release notes
bun scripts/build.ts --target=aarch64-apple-darwin 本地更新程序签名使用忽略的 tauri-signing.json 当环境中未设置签名密钥时。仍然需要平台证书 CADCAM_RELEASE=1.
发布矩阵
| 目标 | 跑步者 | 捆绑包 | 释放子弹 |
|---|---|---|---|
aarch64-apple-darwin | macOS-14 | 应用程序、dmg | macos-arm64 |
x86_64-apple-darwin | macOS-14 | 应用程序、dmg | macos-x64 |
x86_64-pc-windows-msvc | windows-最新 | 微星、nsis | 窗口-x64 |
aarch64-pc-windows-msvc | windows-11-arm | 微星、nsis | 窗户臂64 |
x86_64-unknown-linux-gnu | ubuntu-22。04 | 德布,转速 | linux-x64 |
aarch64-unknown-linux-gnu | ubuntu-22.04-arm | 德布,转速 | linux-arm64 |
- 可信作业根据应用程序版本验证发布标签。
- 每个矩阵作业运行
bun --no-env-file scripts/build.ts --target=… --bundles=… --out-dir=release,为其包格式签名并构建清单。 Windows 导入并随后删除其可选签名证书。 - 合并作业验证所有六个架构清单及其十个包条目合二为一
latest.json. - 在创建或恢复单一版本发布并发布之前,一项完成作业会验证所有安装程序工件、签名、校验和和注释。
每次推送时的 CI 都会运行两项作业:安装、类型检查和测试(并暂存 sidecar 二进制文件和迁移),以及使用 Clippy 和 src-tauri 测试。