发布流程

Bevy 使用三个月的开发周期,以数周的滚动发布流程为界。

这意味着 Bevy 大约每三个到四个月发布一个新版本。为了避免赶工并鼓励可持续发展,我们不选择特定日期或截止日期。

开发周期

在一个为期三个月的开发周期中,维护者将重要的 PR 和问题收集到 GitHub 里程碑中。里程碑中包含的问题将被优先处理,社区通常会尽力在整个周期内合并尽可能多的问题。

在发布之前(通常在之前发布的两个半月之后),我们开始积极地从里程碑中清除那些看起来不太可能及时准备好的内容。通常剩下的主要内容是

  • 正在积极开发中的快速简便的功能。
  • 修复重要的回归或崩溃问题。
  • 大型或引人注目的功能,只需要进行一些小的润色。

当里程碑完成时,我们打开一个新的工作组来处理发布准备工作,发布一个发布候选版本(例如,0.14.0-rc.1),并开始发布流程。

发布候选版本

在发布之前,Bevy 每周发布一个新的发布候选版本。发布发布候选版本可以让用户识别 bug 和回归,让生态系统中的箱子有时间更新,以便它们在发布日之前做好准备,并为 Bevy 贡献者提供额外的时间编写发布说明和迁移指南。

发布发布候选版本时,我们还会宣布一个一般的目标发布日期。这通常大约在一周之后。如果在测试窗口中发现严重 bug 或回归问题,我们会修复它们并发布一个新的发布候选版本。然后,我们要么

  • 如果我们认为需要比当前窗口更多的测试时间,则宣布新的日期,或者
  • 如果我们认为当前窗口有足够的时间,则保持相同的目标发布日期。

当我们成功达到发布候选版本的目標日期時,我们将进行最终发布。

发布清单

发布时,维护者会遵循以下清单

次要版本

次要版本发布前

  1. 检查回归标签。
  2. 检查合适的里程碑并关闭它。
  3. 检查 GitHub 项目页面是否有陈旧问题。
  4. 运行 generate-release 工具。
    1. 创建迁移指南。
    2. 写博客文章。
    3. 生成贡献者列表
    4. 生成变更日志。
  5. 更新书籍。
  6. 使用“发布”工作流程,为所有箱子提升版本号。
    1. 更改提交信息,使其更友好。
  7. 在 GitHub 上创建标签。
  8. 编辑 GitHub 发布。添加指向 发布公告迁移指南 的链接。
  9. latest 标签提升到最新版本。
  10. 运行 update-screenshots 工作流程 更新屏幕截图。这将阻止博客文章发布(并大约需要 40 分钟),所以请尽早执行
  11. 运行 build-wasm-examples 工作流程 更新 Wasm 示例。

次要版本发布

  1. 使用 bash tools/publish.sh 在 crates.io 上发布
  2. 在以下平台宣布
    1. HackerNews
    2. Twitter
    3. Reddit:/r/bevy,/r/rust,/r/rust_gamedev
    4. Discord:Bevy,Rust 中的游戏开发,Rust 编程语言社区
    5. 本月 Rust 游戏开发新闻通讯
    6. 本周 Rust 新闻通讯

次要版本发布后

  1. 使用“发布后版本提升”工作流程,将所有箱子的版本号提升到下一个版本(如 0.X-dev),以确保为 Dev Docs 正确显示版本。
  2. 将 Bevy 网站的 learning-code-examples 工具(学习材料的代码示例验证和格式化)使用的 Bevy 版本更新到最新版本。

补丁

补丁版本发布前

  1. 检查合适的里程碑。
  2. 关闭里程碑,如果还有任何剩余问题,则打开下一个里程碑并将其转移。
  3. latest 标签创建一个新的分支 release-0.X.Y,并将里程碑中的所有 PR 移植到新分支。
version="0.X.Y"

git checkout latest
git checkout -b release-$version
echo

prs=`gh pr list --repo bevyengine/bevy --search "milestone:$version" --state merged --json mergeCommit,mergedAt,title,number --limit 100`
while read -r commit number title <&3; do
    echo "PR #$number: $title (https://github.com/bevyengine/bevy/pull/$number)"    
    if git cherry-pick $commit; then
      echo
    else
      echo "please resolve conflict then press enter"
      read
    fi
done 3<<(echo $prs | jq --raw-output '. |= sort_by(.mergedAt) | .[] | "\(.mergeCommit.oid) \(.number) \(.title)"')
  1. 使用 “发布”工作流程中的命令 在本地提升所有箱子的版本号,使用 patch 作为新版本。
    • 更改提交信息,使其更友好:git commit --amend -m "Release 0.X.Y
  2. 在 GitHub 上创建标签。
  3. 编辑 GitHub 发布。添加指向此补丁版本与先前版本的比较的链接。
  4. latest 标签提升到最新版本。
  5. 运行 update-screenshots 工作流程 更新屏幕截图。
  6. 运行此 build-wasm-examples 工作流程 更新 Wasm 示例。

补丁版本发布

  1. 在 crates.io 上发布
    • bash tools/publish.sh
  2. 在以下平台宣布
    1. Discord:Bevy,#announcements

补丁版本发布后

发布候选版本

RC 版本发布前

  1. 检查合适的里程碑。
  2. 对于第一个 RC 版本,从 main 分支创建一个新的分支 release-0.X.0 以进行发布。
  3. 对于后续的 RC 版本,将里程碑中所有已合并但尚未合并到发布分支的 PR 移植到发布分支。
version="0.X"

git checkout release-$version.0

# List the last 100 PRs merged in the milestone
prs=`gh pr list --repo bevyengine/bevy --search "milestone:$version" --state merged --json mergeCommit,mergedAt,title,number --limit 100`
while read -r commit number title <&3; do
    # Ignore commits that are already present by sha
    if git merge-base --is-ancestor $commit HEAD; then
      continue
    fi
    # Ignore commits that are already present by PR number
    if git log --format=oneline | grep " (#$number)$" > /dev/null; then
      continue
    fi

    echo "PR #$number: $title (https://github.com/bevyengine/bevy/pull/$number)"
    if git cherry-pick $commit; then
      echo
    else
      echo "please resolve conflict then press enter"
      read
    fi
done 3<<(echo $prs | jq --raw-output '. |= sort_by(.mergedAt) | .[] | "\(.mergeCommit.oid) \(.number) \(.title)"')
  1. 使用 “发布”工作流程中的命令 在本地提升所有箱子的版本号,使用 rc 作为新版本。
    • 更改提交信息,使其更友好:git commit --amend -m "Release 0.X.0-rc.Y
  2. 在 GitHub 上创建标签。
  3. 编辑 GitHub 发布。添加指向此发布候选版本 (rc) 与先前版本的比较的链接。

RC 版本发布

  1. 在 crates.io 上发布
    • bash tools/publish.sh
  2. 在以下平台宣布
    1. Discord:Bevy,#dev-announcements

RC 版本发布后

  1. 将 Bevy 网站的 learning-code-examples 工具(学习材料的代码示例验证和格式化)使用的 Bevy 版本更新到最新版本。
  2. 检查 docs.rs 是否能够构建所有箱子的文档
version="0.X.0-rc.Y"
for crate in `cargo test -p 2>&1 | grep '  bevy'`
do
    curl -s -i https://docs.rs/crate/$crate/$version | grep "failed to build" | grep $version
done