发布指南
简介
Apache Kyuubi 项目会定期宣布并发布版本。一次发布指的是项目的若干个构件包,它们已获批准,可面向公众分发和使用。根据对其质量和可变性的评估,发布可能会带有不同程度的限定说明,例如 “alpha”“beta”“incubating”“stable” 等。
Kyuubi 社区高度重视发布工作。发布是项目的公开形象,大多数用户仅通过发布来了解和使用该项目。每次发布都需要经过整个 Kyuubi 社区的公开投票签署确认。
每次发布都由一名发布经理(Release Manager)执行,发布经理从 Kyuubi 的提交者中选出。本文档描述了发布经理执行发布所遵循的流程。对该流程的任何变更都应在 dev 邮件列表上进行讨论并获得通过。
请记住,发布软件具有法律后果。本指南是全基金会范围的产品发布政策和发布分发政策的补充。
概述
发布流程包含以下几个步骤:
- 决定发布
- 为发布做准备
- 为 feature 版本切出分支
- 构建发布候选版本
- 对发布候选版本进行投票
- 如有必要,修复问题并返回第 3 步。
- 完成发布
- 推广发布
- 删除已废弃发布候选版本的 dist 仓库目录
- 发布 docker 镜像
决定发布
决定发布并选出发布经理是发布流程的第一步。这是整个社区达成共识的决定。
任何人都可以在 dev 邮件列表上提出发布建议,给出充分的理由,并提名一位提交者担任发布经理(可以是自己)。这一过程没有正式的流程要求、投票要求或时间要求。任何反对意见都应在启动发布之前通过共识方式解决。
通常,社区倾向于采用 1-2 名发布经理轮换的机制。保持一个较小的核心经理团队,可以让足够多的人在这一领域积累经验并持续改进流程,而无需发布经理在每次发布时重新学习流程。话虽如此,如果你是一位有兴趣以这种方式服务社区的提交者,请通过 dev 邮件列表与社区取得联系。
进入下一步的检查清单
- 社区同意发布
- 社区选定发布经理
为发布做准备
在进行首次发布之前,你需要执行一次性的配置步骤。这将为签署发布配置你的安全密钥,并配置对各个发布仓库的访问权限。
一次性设置说明
ASF 身份认证
环境变量 ASF_USERNAME 和 ASF_PASSWORD 在发布流程中的多个地方会被反复使用,你既可以在 ~/.bashrc 或 ~/.zshrc 中一次性设置它们,也可以每次在终端中手动导出它们。
export ASF_USERNAME=<your apache username>
export ASF_PASSWORD=<your apache password>Java Home
可用的环境变量 JAVA_HOME,可以通过执行 echo $JAVA_HOME 来检查。请注意,Java 版本必须为 8。
Subversion
除了 git 之外,Apache 发布还需要 svn,详情请参考 https://www.apache.org/dev/version-control.html#https-svn。
GPG Key
你需要拥有一个 GPG 密钥来为发布产物签名。请留意 ASF 全局的发布签名指南。如果你的 Apache 账户还没有关联 GPG 密钥,请按照该指南创建一个。
确定你的 Apache GPG 密钥及其 Key ID,方法如下:
gpg --list-keys --keyid-format SHORT这会列出你的 GPG 密钥。其中应有一把密钥对应你的 Apache 账户,例如:
pub rsa4096 2021-08-30 [SC]
8FC8075E1FDC303276C676EE8001952629BCC75D
uid [ultimate] Cheng Pan <chengpan@apache.org>
sub rsa4096 2021-08-30 [E]注意:为了遵循 Apache 的发布签名规范,所有新生成的 RSA 密钥至少应为 4096 位。请勿生成新的 DSA 密钥。
这里的密钥 ID 是 pub 行中的 8 位十六进制字符串:29BCC75D。
要导出 PGP 公钥,请使用:
gpg --armor --export 29BCC75D如果你有多个 GPG 密钥,可以按如下方式指定默认密钥:
echo 'default-key <key-fpr>' > ~/.gnupg/gpg.conf最后一步是用你的代码签名密钥更新 KEYS 文件:https://www.apache.org/dev/openpgp.html#export-public-key
svn checkout --depth=files "https://dist.apache.org/repos/dist/release/kyuubi" work/svn-kyuubi
(gpg --list-sigs "${ASF_USERNAME}@apache.org" && gpg --export --armor "${ASF_USERNAME}@apache.org") >> work/svn-kyuubi/KEYS
svn commit --username "${ASF_USERNAME}" --password "${ASF_PASSWORD}" --message "Update KEYS" work/svn-kyuubi为了让自己拥有在 Apache Nexus 暂存仓库中暂存 Java 制品的正确权限,请通过以下方式将你的 GPG 公钥提交到 ubuntu 服务器。
gpg --keyserver hkp://keyserver.ubuntu.com --send-keys ${PUBLIC_KEY} # send public key to ubuntu server
gpg --keyserver hkp://keyserver.ubuntu.com --recv-keys ${PUBLIC_KEY} # verify为功能版本创建分支
Kyuubi 使用版本号规则 {MAJOR_VERSION}.{MINOR_VERSION}.{PATCH_VERSION}[-{OPTIONAL_SUFFIX}],例如 1.7.0。**功能版本(Feature Release)是指 MAJOR_VERSION 或 MINOR_VERSION 发生变化,而补丁版本(Patch Release)**是指 PATCH_VERSION 发生变化。
准备功能版本的主要步骤是创建发布分支。这通过标准的 Git 分支机制完成,分支创建后应当向社区公告。
注意:如果你要发布的是补丁版本,可以跳过这一步。
发布分支的命名规则为 branch-{MAJOR_VERSION}.{MINOR_VERSION},例如 branch-1.7。
创建发布分支后,别忘了在 master 分支上提升版本号。
构建发布候选版本
别忘了切换到发布分支!
- 设置环境变量。
export RELEASE_VERSION=<release version, e.g. 1.7.0>
export RELEASE_RC_NO=<RC number, e.g. 0>
export NEXT_VERSION=<e.g. 1.7.1>- 提升版本号,并为发布候选版本创建 git 标签。
考虑到在你的发布期间,其他提交者可能会合并 PR,你应该先完成版本号的修改,然后再回来创建发布候选版本标签,继续执行后续的发布流程。
标签格式为 v${RELEASE_VERSION}-rc${RELEASE_RC_NO},例如 v1.7.0-rc0
注意:在所有投票通过之后,务必以
v${RELEASE_VERSION}的格式创建最终标签。
# Bump to the release version
build/mvn versions:set -DgenerateBackupPoms=false -DnewVersion="${RELEASE_VERSION}"
(cd kyuubi-server/web-ui && npm version "${RELEASE_VERSION}")
git commit -am "[RELEASE] Bump ${RELEASE_VERSION}"
# Create tag
git tag v${RELEASE_VERSION}-rc${RELEASE_RC_NO}
# Prepare for the next development version
build/mvn versions:set -DgenerateBackupPoms=false -DnewVersion="${NEXT_VERSION}-SNAPSHOT"
(cd kyuubi-server/web-ui && npm version "${NEXT_VERSION}-SNAPSHOT")
git commit -am "[RELEASE] Bump ${NEXT_VERSION}-SNAPSHOT"
# Push branch to apache remote repo
git push apache
# Push tag to apache remote repo
git push apache v${RELEASE_VERSION}-rc${RELEASE_RC_NO}
# Go back to release candidate tag
git checkout v${RELEASE_VERSION}-rc${RELEASE_RC_NO}- 打包源码和二进制制品,并将其上传至 Apache 暂存 SVN 仓库;将 jar 包发布到 Apache 暂存 Maven 仓库。
build/release/release.sh publish要使你的发布在暂存仓库中可用,你必须在 Apache Nexus 中关闭暂存仓库。在关闭之前,你可以多次重新运行部署到暂存仓库的操作。但一旦关闭,它将创建一个新的暂存仓库。因此请确保关闭它,以便下一个 RC(如果需要)使用新的仓库。一切就绪后,在 Apache Nexus 上关闭暂存仓库。
- 从 GitHub 生成预发布说明,用于后续的投票。
前往发布页面,点击 "Draft a new release" 按钮,页面将跳转到新页面以准备发布。
填写表单要求的所有必要信息。在表单底部,勾选 "This is a pre-release" 复选框。最后,点击 "Publish release" 按钮完成此步骤。
注意:预发布说明用于投票 purposes。它会被标记为 Pre-release 标签。在所有投票工作(开发和社区)完成后,不要忘记取消勾选 "This is a pre-release" 复选框。预发布版本来自 vx.y.z-rcN 标签,最终版本应来自 vx.y.z 标签。
对发布候选版本投票
发布投票在 Apache Kyuubi 开发者邮件列表上进行。
- 如果可能,在邮件中附上发布说明的草稿。
- 建议以 UTC 格式表示投票截止时间。
- 确保邮件为纯文本格式,且链接正确无误。
注意:你可以通过运行
build/release/script/dev_kyuubi_vote.sh脚本自动生成用于开发者邮件列表的投票邮件内容。
投票完成后,你还需要发送一封包含投票结果汇总的邮件,主题格式类似 [VOTE][RESULT] Release Apache Kyuubi …
完成发布
请小心!
此步骤不可逆,因此请确保你选择了正确的暂存仓库。一旦将构件移入发布目录,就无法移除。
投票通过后,为了将二进制文件上传到 Apache 镜像,你需要将二进制文件从 dev 目录(投票应在该目录下进行)移动到 release 目录。这种"移动"操作是你向实际发布目录添加内容的唯一方式。(注意:只有 PMC 成员才能移动到 release 目录)
将 "dev" 中的子目录移动到 "release" 中对应的目录。如果你已将签名密钥添加到 KEYS 文件中,请同时更新发布副本。
build/release/release.sh finalize请验证 https://www.apache.org/dist/kyuubi/ 中的资源是否已存在。资源可能需要一段时间才会显示出来,之后将通过 Apache 网络进行镜像分发。
对于 Maven Central 仓库,你可以从 Apache Nexus Repository Manager 进行发布。登录后,打开「Staging Repositories」,找到已通过投票的仓库,选中并点击「Release」,然后确认。如果成功,它将出现在 https://repository.apache.org/content/repositories/releases/org/apache/kyuubi/ 之下,同时也会出现在 https://repository.apache.org/content/groups/maven-staging-group/org/apache/kyuubi/ 之下(请查找正确的发布版本)。一段时间后,这将自动同步到 Maven Central。
推广发布
更新网站
Fork 并克隆 Apache Kyuubi 网站
- 在
src/zh/news/、src/en/news/中添加一个新的 Markdown 文件 - 在
src/zh/release/、src/en/release/中添加一个新的 Markdown 文件 - 更新
hugo.toml中[params]部分定义的releases。
创建公告
一切就绪后,在网站上创建公告,然后向邮件列表发送邮件。你可以通过 build/release/script/announce.sh 自动生成公告。邮件列表包括:announce@apache.org、dev@kyuubi.apache.org、user@spark.apache.org。
请注意,你必须使用 apache.org 邮箱向 announce@apache.org 发送公告。
请享用一杯你喜欢的饮品,并祝贺你完成了 Kyuubi 的发布。
删除已废弃的候选版本 dist 仓库目录
最后,删除已废弃的 dist 仓库目录。
cd work/svn-dev
svn delete https://dist.apache.org/repos/dist/dev/kyuubi/{RELEASE_TAG} \
--username "${ASF_USERNAME}" \
--password "${ASF_PASSWORD}" \
--message "Remove deprecated Apache Kyuubi ${RELEASE_TAG}"保持其他构件的最新状态
评论
登录后参与评论
KnowForge