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

Bazel に破壊的変更を加えることが必要になります。設計を変更し、正しく機能しないものを修正する必要があります。ただし、コミュニティと Bazel エコシステムが追随できるようにする必要があります。そのため、Bazel プロジェクトでは下位互換性ポリシーを採用しています。このドキュメントでは、Bazel のコントリビューターが、このポリシーに準拠するために Bazel に互換性を破る変更を加えるプロセスについて説明します。

  1. 設計ドキュメント ポリシーに準拠します。

  2. GitHub で Issue を報告します。

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

フラグに問題が見つかり、ユーザーがまだ移行していない場合: フラグ migration-ready を削除します。

次のメジャー リリースでフラグを反転する場合は、問題に「breaking-change-X.0」というラベルを追加します。

リポジトリを更新する

Bazel CI は、Bazel@HEAD + Downstream で重要なプロジェクトのリストをテストします。そのほとんどは他の Bazel プロジェクトの依存関係であることが多いため、より広範なコミュニティが移行できないように移行することが重要です。

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

ダウンストリーム パイプラインのプロジェクトの移行は、互換性のない変更の作成者の責任ではありません。ただし、次の手順を行うと、移行を加速し、Bazel ユーザーと Bazel Green チームの両方の負担を軽減できます。

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

フラグの削除

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

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