发布流程
TVM 项目的发布管理员需要负责以下工作内容:
- 准备发布说明。
- 搭建发布环境。
- 准备候选版本。
- 创建发布分支。
- 向社区同步时间安排。
- 在分支中完成必要的版本更新。
- 组织发布投票流程。
- 创建候选版本。
- 发起投票并跟踪问题处理。
- 完成最终发布。
- 更新 TVM 官网。
- 定稿发布说明。
- 发布公告。
准备发布说明
发布说明应包含新功能、改进、错误修复、已知问题和弃用内容等。TVM 提供的 月度开发报告 汇总了每月的开发进展,可作为编写参考。
建议在创建发布分支前,先在 GitHub 上创建 issue 收集对发布说明草案的反馈。可参考 tests/scripts/release
目录下的脚本作为起点。
准备候选版本
在正式发布前,可能需要对发布分支进行必要的代码修改。请确保所有版本号都已更新。
准备 GPG 密钥
如果已上传密钥,可跳过本节。
生成 GPG 密钥后,需要将其上传到公共密钥服务器。详情请参考 https://www.apache.org/dev/openpgp.html#generate-key。
如果需要在其他机器上进行发布,可以通过 gpg --export
和 gpg --import
命令迁移密钥。
最后一步是使用代码签名密钥更新 KEYS 文件:Apache 公钥导出指南。将更改提交到 TVM 主分支以及 ASF SVN:
# --depth=files 可避免检出已有文件夹 。
svn co --depth=files "https://dist.apache.org/repos/dist/dev/tvm" svn-tvm
cd svn-tvm
# 编辑 KEYS 文件 。
svn ci --username $ASF_USERNAME --password "$ASF_PASSWORD" -m "Update KEYS"
# 更新 downloads.apache.org(注意:只有 PMC 成员可更新 dist/release 目录)。
svn rm --username $ASF_USERNAME --password "$ASF_PASSWORD" https://dist.apache.org/repos/dist/release/tvm/KEYS -m "Update KEYS"
svn cp --username $ASF_USERNAME --password "$ASF_PASSWORD" https://dist.apache.org/repos/dist/dev/tvm/KEYS https://dist.apache.org/repos/dist/release/tvm/ -m "Update KEYS"
创建候选版本分支
以 v0.6 版本为例:
- 需要在一个 Pull Request 中提交两个 commit:第一个 commit 将版本号从 0.6.dev0 更新为 0.6.0;第二个 commit 将版本号从 0.6.0 更新为 0.7.dev0;Pull Request 标题需注明:[Dont Squash]。
- 合并后,基于第一个版本号更新 commit 创建分支。分支名称应使用基础版本号(不含补丁号),例如为
v0.6.0
创建候选版本时,分支应命名为v0.6
,并在创建后立即推送v0.6.0.rc0
标签到分支头部。
git clone https://github.com/apache/tvm.git
cd tvm/
# 更新第一个 commit 的版本号。
# ...
git add .
git commit -m "Bump version numbers to v0.6.0"
# 更新第二个 commit 的版本号。
# ...
git add .
git commit -m "Bump version numbers to v0.7.dev0"
# After pull request merged
# Pull Request 合并后
# 基于第一个 commit 创建分支。
git checkout <first-commit-id>
# 将 v0.6 替换为实际版本号。
git branch v0.6
git push --set-upstream origin v0.6
git tag v0.6.0.rc0
git push origin refs/tags/v0.6.0.rc0
确保源代码中的版本号正确(示例:PR #14300)。运行 python3 version.py
更新版本号。创建候选版本分支后应立即更新版本号。
在 GitHub 仓库的 "Releases" 标签页点击 "Draft a new release":
- 通过检查版本号并确保 TVM 能构建和运行单元测试来验证发布。
- 提供格式为
v1.0.0.rc0
的发布标签(0 表示第一个候选版本),标签必须完全匹配v[0-9]+\.[0-9]+\.[0-9]+\.rc[0-9]
模式。 - 通过点击 Target: branch > Recent commits > $commit_hash 选择提交。
- 将发布说明草案复制到描述框中。
- 勾选 "This is a pre-release"。
- 点击 "Publish release"。
注意:创建分支后仍可进行更改,但标签是固定的。如果发布需要任何修改,必须创建新标签。
删除之前的候选版本(如适用):
git push --delete origin v0.6.0.rc1
创建源代码:
# 将 v0.6.0 替换为实际版本号。
git clone git@github.com:apache/tvm.git apache-tvm-src-v0.6.0
cd apache-tvm-src-v0.6.0
git checkout v0.6
git submodule update --init --recursive
git checkout v0.6.0.rc0
rm -rf .DS_Store
find . -name ".git*" -print0 | xargs -0 rm -rf
cd ..
brew install gnu-tar
gtar -czvf apache-tvm-src-v0.6.0.rc0.tar.gz apache-tvm-src-v0.6.0
使用 GPG 密钥签名制品。首先确保 GPG 使用正确的私钥:
$ cat ~/.gnupg/gpg.conf
default-key F42xxxxxxxxxxxxxxx
创建 GPG 签名和文件哈希:
gpg --armor --output apache-tvm-src-v0.6.0.rc0.tar.gz.asc --detach-sig apache-tvm-src-v0.6.0.rc0.tar.gz
shasum -a 512 apache-tvm-src-v0.6.0.rc0.tar.gz > apache-tvm-src-v0.6.0.rc0.tar.gz.sha512
在 main 上更新 TVM 版本
创建候选版本后,确保更新主分支(main
)的版本号。例如,如果发布 v0.10.0
,需要将代码库中的版本号从 v0.10.dev0
更新为 v0.11.dev0
。示例参考:PR #12190。在发布分支包含的最后一个 commit 之后立即为主分支打上开发标签(如 v0.11.dev0
),这是确保从主分支构建的 nightly 包版本号正确的必要步骤。
上传候选版本
编辑 GitHub 的发布页面,上传前几步创建的制品。
发布管理员还需要将制品上传到 ASF SVN:
# the --depth=files will avoid checkout existing folders
svn co --depth=files "https://dist.apache.org/repos/dist/dev/tvm" svn-tvm
cd svn-tvm
mkdir tvm-v0.6.0-rc0
# copy files into it
svn add tvm-0.6.0-rc0
svn ci --username $ASF_USERNAME --password "$ASF_PASSWORD" -m "Add RC"
拣选提交
在创建发布分支后但投票结束前,发布管理员可以从主分支(main
)拣选 commit。由于 GitHub 上的发布分支受保护,要将修复合并到发布分支(如 v0.11
),发布管理员必须针对发布分支提交包含拣选更改的 PR。PR 应大致匹配原始 PR,并额外说明拣选原因。社区随后对这些 PR 进行常规评审和合并流程。注意:针对发布分支的 PR 必须进行签名。
发起候选版本投票
第一轮投票在 Apache TVM 开发者邮件列表(dev@tvm.apache.org)进行。为获得更多关注,可以创建以 "[VOTE]" 开头的 GitHub issue,它会自动镜像到 dev@。参考过往投票线程了解流程。邮件应包含以下内容:
- 发布说明草案链接。
- 候选版本制品链接。
- 确保邮件为纯文本格式且链接正确。
dev@ 投票需要至少 3 张有效赞成票且赞成票多于反对票。投票结束后应发送汇总邮件说明结果,主题类似 [VOTE][RESULT] ...
在 ASF,投票至少开放 72 小时(3 天)。如果在此时间内未获得足够有效票数,不能关闭投票,需要延长截止时间。
如果投票未通过,社区需要相应修改发布内容:创建新的候选版本并重新进行投票流程。
完成发布
投票通过后,将二进制文件从 dev 目录(投票所在目录)移动到 release 目录。这是向正式发布目录添加内容的唯一方式(注意:只有 PMC 成员可移动到 release 目录)。
export SVN_EDITOR=vim
svn mkdir https://dist.apache.org/repos/dist/release/tvm
svn mv https://dist.apache.org/repos/dist/dev/tvm/tvm-v0.6.0-rc2 https://dist.apache.org/repos/dist/release/tvm/tvm-v0.6.0
# 如果已将签名密钥添加到 KEYS 文件,同时更新 release 副本
svn co --depth=files "https://dist.apache.org/repos/dist/release/tvm" svn-tvm
curl "https://dist.apache.org/repos/dist/dev/tvm/KEYS" > svn-tvm/KEYS
(cd svn-tvm && svn ci --username $ASF_USERNAME --password "$ASF_PASSWORD" -m"Update KEYS")
记得在 GitHub 上创建新的发布标签(本例中为 v0.6.0)并删除预发布候选标签:
git push --delete origin v0.6.0.rc2
更新 TVM 官网
官网仓库位于 https://github.com/apache/tvm-site。修改下载页面以包含发布制品、GPG 签名和 SHA 哈希。由于 TVM 文档持续更新,需上传固定的发布文档版本。如果更新官网时 CI 已删除发布的文档,可以在 Jenkins 上重新启动发布分支的 CI 构建。参考以下示例代码:
git clone https://github.com/apache/tvm-site.git
pushd tvm-site
git checkout asf-site
pushd docs
# 创建发布文档目录。
mkdir v0.9.0
pushd v0.9.0
# 从 CI 下载发布文档 。
# 通过检查发布分支最近构建的 CI 日志找到此 URL
curl -LO https://tvm-jenkins-artifacts-prod.s3.us-west-2.amazonaws.com/tvm/v0.9.0/1/docs/docs.tgz
tar xf docs.tgz
rm docs.tgz
# 添加文档并推送。
git add .
git commit -m "Add v0.9.0 docs"
git push
发布公告
向 announce@apache.org 和 dev@tvm.apache.org 发送公告邮件。公告应包含发布说明和下载页面的链接。
补丁发布
补丁版本应仅用于关键错误修复。补丁版本必须经过与常规发布相同的流程,但发布管理员可酌情将候选版本投票窗口缩短至 24 小时以确保快速交付修复。每个补丁版本应更新发布基础分支(如 v0.11
)的版本号,并为候选版本创建标签(如 v0.11.1.rc0
)。