互換性を破る変更のロールアウト ガイド

Bazel に対して互換性を破る変更が行われることは避けられません。デザインを変えて うまくいかないものは修正するねただし、コミュニティと Bazel エコシステムが確実に対応できるようにする必要があります。そのため、Bazel プロジェクトでは下位互換性ポリシーを採用しています。このドキュメントでは、Bazel のコントリビューターが Bazel に互換性を破る変更を加えるためのプロセスについて説明します。

  1. 設計書に関するポリシーに準拠する。

  2. GitHub で問題を報告します。

  3. 変更を実装します。

  4. ラベルを更新する

  5. 互換性のないフラグを反転します。

GitHub の問題

Bazel リポジトリで GitHub の問題を提出します。例をご覧ください。

次のようにすることをおすすめします。

  • タイトルはフラグの名前で始まります(フラグ名は incompatible_ で始まります)。

  • ラベル incompatible-change を追加します。

  • 説明には、変更の説明と、関連する設計ドキュメントへのリンクが含まれます。

  • この説明には、コードの更新方法を説明する移行レシピが含まれています。機械的な変更の場合は、移行ツールへのリンクを含めることが理想的です。

  • 説明には、移行しない場合に表示されるエラー メッセージの例が含まれています。これにより、検索エンジンから GitHub の問題を発見しやすくなります。エラー メッセージが有用で対処可能なものであることを確認します。 可能であれば、エラー メッセージに互換性のないフラグの名前を含める必要があります。

移行ツールについては、Buildifier への貢献を検討してください。BUILDWORKSPACE.bzl ファイルに自動修正を適用できます。警告を報告する場合もあります。

実装

Bazel で新しいフラグを作成します。デフォルト値は false です。ヘルプテキストには GitHub の問題の URL を含める必要があります。フラグ名は incompatible_ で始まるため、メタデータタグが必要です。

      metadataTags = {
        OptionMetadataTag.INCOMPATIBLE_CHANGE,
      },

commit の説明に、フラグの簡単な概要を追加します。また、次の形式で RELNOTES: を追加します。 RELNOTES: --incompatible_name_of_flag has been added. See #xyz for details

また、コードがドキュメントと矛盾する commit ウィンドウがなくなるように、commit により関連ドキュメントも更新する必要があります。Google のドキュメントはバージョン管理されているため、ドキュメントに加えた変更が意図せず早期にリリースされることはありません。

ラベル

commit がマージされ、互換性のない変更を導入する準備が整ったら、GitHub の問題にラベル migration-ready を追加します。

フラグに問題があり、ユーザーの移行がまだ想定されていない場合は、フラグ migration-ready を削除します。

次回のメジャー リリースでフラグを切り替える場合は、問題に「breaking-change-X.0」ラベルを追加してください。

リポジトリを更新する

Bazel CI では、Bazel@HEAD + Downstream で重要なプロジェクトのリストをテストします。それらのほとんどは他の Bazel プロジェクトの依存関係であることが多いため、他の Bazel プロジェクトとの依存関係があるので、他の Bazel プロジェクトに移行して、移行の妨げとならないようにすることが重要です。

これらのプロジェクトの移行ステータスをモニタリングするには、bazelisk-plus-incompatible-flags パイプラインを使用します。このパイプラインの仕組みはこちらで確認できます。

ダウンストリームのパイプラインでのプロジェクトの移行は、互換性のない変更作成者が完全に行う責任ではありません。ただし、移行を加速し、Bazel ユーザーと Bazel グリーンチームの双方の作業を容易にするには、以下を行うことができます。

  1. GitHub の問題を報告して、互換性のない変更によって壊れたダウンストリーム プロジェクトのオーナーに通知します。
  2. PR を送信してダウンストリームのプロジェクトを修正。
  3. 移行については、Bazel コミュニティ(Bazel Rules Authors SIG など)にお問い合わせください。

旗を反転する

フラグのデフォルト値を true に切り替える前に、次のことを確認してください。

  • エコシステムのコア リポジトリが移行される。

    bazelisk-plus-incompatible-flags パイプラインでは、フラグが The following flags didn't break any passing Bazel team owned/co-owned projects の下に表示されます。

  • ユーザーの懸念や疑問が解消された。

フラグを Bazel で切り替える準備ができているものの、Google での内部移行でブロックされた場合は、内部 blazerc ファイルでフラグの値を false に設定して、フラグ切り替えのブロックを解除することを検討してください。こうすることで、できるだけ早く Bazel ユーザーが新しい動作に依存するようにすることができます。

フラグのデフォルトを true に変更する場合は、次のようにします。

  • commit の説明で RELNOTES[INC] を使用します。形式は RELNOTES[INC]: --incompatible_name_of_flag is flipped to true. See #xyz for details です。commit の説明の残りの部分には追加情報を含めることができます。
  • 説明に Fixes #xyz を使用して、commit がマージされたときに GitHub の問題がクローズされるようにします。
  • ドキュメントを確認し、必要に応じて更新します。
  • フラグの削除を追跡するには、新しい問題 #abc を提出します。

フラグの削除

フラグが HEAD で反転された後は、最終的に Bazel から削除する必要があります。 互換性のないフラグを削除する場合:

  • 互換性のない重大な変更の場合は、ユーザーの移行時間を確保することを検討してください。理想的には、このフラグは少なくとも 1 つのメジャー リリースで利用できるべきです。
  • フラグを削除する commit では、説明に Fixes #abc を使用し、commit がマージされたときに GitHub の問題がクローズされるようにします。