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

問題を報告 ソースを表示

Bazel に互換性を破る変更が行われることは避けられません。設計を変更し、正しく機能しない部分を修正する必要があります。ただし、コミュニティと Bazel エコシステムがついていけるようにする必要があります。そのため、Bazel プロジェクトでは下位互換性ポリシーが導入されています。このドキュメントでは、Bazel のコントリビューターが、このポリシーに準拠するために Bazel に互換性を破る変更を加えるプロセスについて説明します。

  1. 設計ドキュメントに関するポリシーに従います。

  2. GitHub の問題を提出します。

  3. 変更を実装します。

  4. ラベルを更新します。

  5. リポジトリを更新します。

  6. 互換性のないフラグを切り替えます。

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

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

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

リポジトリを更新する

Bazel CI は、Bazel@HEAD + Downstream で重要なプロジェクトのリストをテストします。そのほとんどは他の Bazel プロジェクトの依存関係であることが多いため、より広範なコミュニティが移行できないように移行することが重要です。これらのプロジェクトの移行ステータスをモニタリングするには、bazelisk-plus-incompatible-flags パイプラインを使用します。このパイプラインの仕組みをこちらでご確認ください。

Google の開発サポートチームは migration-ready ラベルをモニタリングしています。このラベルを GitHub の問題に追加すると、以下が処理されます。

  1. GitHub Issue にコメントを作成して、移行する必要がある障害とダウンストリーム プロジェクトのリストを追跡します(例を参照)。

  2. GitHub の問題を提出し、互換性のない変更によって機能しなくなるすべてのダウンストリーム プロジェクトのオーナーに通知します(例を参照

  3. 目標リリース日までにすべての問題に対処できるようフォローアップする

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

  1. PR を送信してダウンストリーム プロジェクトを修正します。

  2. 移行についてサポートが必要な場合は、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 の説明の残りの部分には、追加情報を含めることができます。
  • commit がマージされたときに GitHub の問題がクローズされるように、説明に Fixes #xyz を使用します。
  • 必要に応じてドキュメントを確認し、更新します。
  • フラグの削除を追跡するには、新しい問題 #abc を提出します。

フラグの削除

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

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