发布流程

在TVM中,发布管理员的职责意味着您需要负责以下几项工作:

  • 准备发布说明

  • 准备您的设置

  • 准备发布候选版本

    • 创建发布分支

    • 向社区通报时间安排

    • 在该分支中进行必要的版本更新代码变更

  • 运行发布版本的投票流程

    • 创建发布候选版本

    • 发起投票和处理问题

  • 完成并发布一个版本:

    • 更新TVM网站

    • 完成发布说明

    • 发布公告

准备发布说明

版本说明包含新功能、改进、错误修复、已知问题和弃用等内容。TVM提供月度开发报告汇总每月开发进展,对编写版本说明的人员很有帮助。

建议在创建发布分支之前,先在Github上开启一个议题来收集对发布说明草稿的反馈。可以参考tests/scripts/release目录下的脚本作为起点。

准备候选版本

在发布之前,可能需要对发布分支进行一些必要的代码更改。确保所有版本号都是最新的

准备GPG密钥

如果您已经上传了密钥,可以跳过本节。

After generating the gpg key, you need to upload your key to a public key server. Please refer to https://www.apache.org/dev/openpgp.html#generate-key for details.

如果要在另一台机器上进行发布,你可以通过gpg --exportgpg --import命令将你的gpg密钥传输到那台机器上。

The last step is to update the KEYS file with your code signing key https://www.apache.org/dev/openpgp.html#export-public-key. Check in the changes to the TVM main branch, as well as 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
# edit KEYS file
svn ci --username $ASF_USERNAME --password "$ASF_PASSWORD" -m "Update KEYS"
# update downloads.apache.org (note that only PMC members can update the dist/release directory)
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版本创建发布候选分支:

  • 需要在一个拉取请求中提交两个提交:第一个提交需要将版本号从0.6.dev0更新到0.6.0,第二个提交在同一个拉取请求中将版本号从0.6.0更新到0.7.dev0。对于这个拉取请求的标题,需要注明:[Dont Squash]

  • 合并后,在第一个版本号提交上切出一个分支。分支命名应基于发布版本号但不包含补丁号。例如,要为v0.6.0创建候选版本,分支应命名为v0.6,并在切出分支后向该分支的HEAD推送一个名为v0.6.0.rc0的标签。

git clone https://github.com/apache/tvm.git
cd tvm/

# Update version numbers of first commit
# ...
git add .
git commit -m "Bump version numbers to v0.6.0"

# Update version numbers of second commit
# ...
git add .
git commit -m "Bump version numbers to v0.7.dev0"

# After pull request merged
# cut branch on first commit
git checkout <first-commit-id>

# Replace v0.6 with the relevant version
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

确保源代码中的版本号是正确的(示例:https://github.com/apache/tvm/pull/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]

  • 通过点击目标:分支 > 最近提交 > $commit_hash 来选择提交

  • 将发布说明草稿复制并粘贴到描述框中

  • 选择“这是一个预发布版本”

  • 点击“发布版本”

请注意,在创建标签后仍然可以对分支进行修改,而标签是固定的。如果此版本需要任何更改,就必须创建一个新标签。

移除之前的候选版本(如果已应用),

git push --delete origin v0.6.0.rc1

创建源代码工件,

# Replace v0.6.0 with the relevant version
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。具体操作示例可参考:https://github.com/apache/tvm/pull/12190。 在发布分支包含的最后一个提交之后,立即在main分支上为该提交打上开发标签(例如v0.11.dev0)以用于下一个版本。这个标签是必要的,这样从main分支构建的每日构建包才能获得正确的版本号。

上传候选版本

在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"

精选(Cherry-Picking)

在发布分支已创建但尚未进行投票表决之前,发布经理可以从main分支精选提交。由于GitHub上的发布分支受保护,要将这些修复合并到发布分支(例如v0.11),发布经理必须针对该发布分支提交包含精选更改的PR。该PR应大致匹配来自main的原始PR,并额外说明为何精选该提交。社区随后会按照常规评审流程处理这些PR。请注意,针对发布分支的这些PR必须经过签名

对候选版本发起投票

首次投票在Apache TVM开发者邮件列表(dev@tvm.apache.org)进行。为获得更多关注,开发者也可以创建以"[VOTE]"开头的GitHub issue,该议题会自动同步至dev@邮件列表。可参考历史投票线程了解流程规范。邮件格式需遵循以下模板。

  • 在邮件中提供发布说明草稿的链接

  • 提供候选发布版本的工件链接

  • 确保邮件为文本格式且链接正确

对于dev@投票,必须至少有3个具有约束力的+1票,并且+1票数多于-1票数。投票结束后,您还应发送一封汇总邮件,包含总票数统计,邮件主题格式类似于[VOTE][RESULT] ….

在ASF中,投票至少开放72小时(3天)。如果在此期间未获得足够的约束性投票数,则无法关闭投票截止时间。您需要延长投票期限。

如果投票未通过,社区需要相应修改发布内容:创建新的候选版本并重新进行投票流程。

发布版本

投票通过后,要将二进制文件上传到Apache镜像站点,您需要将二进制文件从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

# If you've added your signing key to the KEYS file, also update the release copy.
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

# make release docs directory
mkdir v0.9.0
pushd v0.9.0

# download the release docs from CI
# find this URL by inspecting the CI logs for the most recent build of the release branch
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

# add the docs and push
git add .
git commit -m "Add v0.9.0 docs"
git push

随后,修改下载页面以支持最新版本。具体操作示例可参考此处

发布公告

announce@apache.orgdev@tvm.apache.org发送公告邮件。公告应包含发布说明和下载页面的链接。

补丁版本

补丁版本应仅用于关键错误修复。补丁版本必须经过与常规版本相同的流程,发布经理可酌情决定将候选版本的投票窗口缩短至24小时,以确保快速交付修复。每个补丁版本都应提升发布基础分支上的版本号(例如v0.11),并为候选版本创建标签(例如v0.11.1.rc0)。