Rust 项目的全自动发布

Rust 项目的全自动发布

💡 原文英文,约2700词,阅读约需10分钟。
📝

内容提要

本文介绍如何为Rust项目搭建全自动发布流程,组合使用五个工具:git-cliff自动生成变更日志;release-plz在CI中创建发布PR,处理版本与依赖更新并发布到crates.io;cargo-dist构建多平台二进制包并创建GitHub Release;Dependabot自动更新依赖;Mergify自动合并Dependabot的PR。配置完成后,开发者只需合并发布PR,即可一键完成版本发布、打标签、构建产物和发布,几乎无需手动操作。

🔎

延伸解读

为什么需要全自动发布流程

文章指出,仅手动更新 Cargo.toml 并运行 cargo publish 无法覆盖二进制发布场景。对于需要跨平台分发的 Rust 项目,手动创建标签、更新变更日志、构建多平台产物等步骤繁琐且易错。作者组合五个工具将大部分工作交给 GitHub Actions,开发者只需合并发布 PR 即可触发后续流程,从而减少手动操作和拼写错误等风险。

五个工具的分工与衔接

git-cliff 从 git 历史生成变更日志;release-plz 在 CI 中创建发布 PR,处理版本、依赖更新并发布到 crates.io;cargo-dist 负责构建多平台二进制包并创建 GitHub Release;Dependabot 自动更新 Rust 和 GitHub Actions 依赖;Mergify 自动合并 Dependabot 的 PR。配置上需让 release-plz 关闭 GitHub Release 创建,交由 cargo-dist 处理,避免职责重叠。

配置中的关键细节与限制

文章强调几个易忽略点:release-plz 需使用个人访问令牌而非默认 GITHUB_TOKEN,否则由 Actions 创建的标签不会触发后续工作流;需在仓库设置中允许 Actions 创建和批准 PR,并配置 crates.io 发布令牌。cargo-dist 首次需本地安装并运行 cargo dist init 生成工作流,之后可重复运行以更新配置。此外,cargo-dist 解析变更日志要求仓库根目录存在 CHANGELOG.md。

适用场景与待改进之处

该流程适合希望将发布工作集中到 CI、减少本地手动操作的 Rust 项目,尤其是需要多平台二进制分发的场景。作者也列出当前工具的不足:git-cliff 的 GitHub 集成尚待改进(如添加贡献者姓名),release-plz 尚不支持通过命令设置发布 PR 中的版本,cargo-dist 尚缺交叉编译支持。读者在采用前需评估这些限制是否影响自身发布需求。

❓

Q&A

如何为Rust项目实现全自动发布?

组合使用五个工具:git-cliff自动生成变更日志;release-plz在CI中创建发布PR,处理版本与依赖更新并发布到crates.io;cargo-dist构建多平台二进制包并创建GitHub Release;Dependabot自动更新依赖;Mergify自动合并Dependabot的PR。配置完成后,开发者只需合并发布PR,即可一键完成版本发布、打标签、构建产物和发布。

release-plz 在自动化发布中具体负责什么?

release-plz 在 CI 中运行,负责创建发布 PR(包含版本号更新和变更日志),处理依赖更新,并在合并后检测 Cargo.toml 中的版本变化,自动运行 cargo publish 将新版本发布到 crates.io,同时创建 git 标签。

cargo-dist 如何帮助发布 Rust 二进制文件?

cargo-dist 将二进制分发过程分解为 plan、build、publish 和 announce 等步骤,自动生成 GitHub Actions 工作流,构建多平台二进制包(如 Linux、macOS、Windows),创建 GitHub Release,并生成安装脚本(如 shell 和 powershell),方便用户安装。

为什么 release-plz 需要使用 PAT 而不是默认的 GITHUB_TOKEN?

因为由 GitHub Actions 的 GITHUB_TOKEN 创建的标签不会触发其他工作流(如 on: push: tags),而使用个人访问令牌(PAT)可以模拟用户身份创建标签,从而触发后续工作流(如 cargo-dist 的发布流程),同时避免单独设置工作流权限。

如何配置 Dependabot 和 Mergify 来实现依赖自动更新与合并?

创建 .github/dependabot.yml 配置 Dependabot 定期检查 Cargo 和 GitHub Actions 依赖更新并创建 PR;创建 .github/mergify.yml 配置 Mergify 规则,自动合并 Dependabot 的 PR(使用 squash 方法),并自动更新其他 PR 到最新主分支。还需在 Mergify 网站设置集成并启用分支保护规则。

git-cliff 在发布流程中起什么作用?如何配置?

git-cliff 是一个高度可定制的变更日志生成器,它根据 git 历史自动生成变更日志。通过运行 cargo install git-cliff --locked 安装,然后执行 git cliff --init 生成 cliff.toml 配置文件,提交到仓库根目录,release-plz 会使用该配置在发布 PR 中更新变更日志。

整个自动化发布流程中,开发者需要手动做什么?

开发者只需在 release-plz 创建发布 PR 后,手动合并该 PR。合并后,release-plz 会自动发布到 crates.io 并打标签,cargo-dist 会自动构建二进制并创建 GitHub Release。其他如依赖更新、PR 合并等均由 Dependabot 和 Mergify 自动完成。

🏷️

标签

➡️

继续阅读