Bazel に互換性を破る変更が行われることは避けられません。設計を変更し、正しく機能しないものを修正する必要があります。ただし、コミュニティと Bazel エコシステムが追随できるようにする必要があります。そのため、Bazel プロジェクトでは下位互換性ポリシーが導入されています。このドキュメントでは、Bazel のコントリビューターが、このポリシーに準拠するために Bazel に互換性を破る変更を加えるプロセスについて説明します。
GitHub の問題
Bazel リポジトリで GitHub の問題を提出します。例
次のことをおすすめします。
タイトルはフラグの名前で始まります(フラグ名は
incompatible_
で始まります)。ラベル
incompatible-change
を追加します。説明には、変更の説明と関連する設計ドキュメントへのリンクが含まれます。
説明には、コードの更新方法を説明する移行レシピが含まれています。機械的な変更の場合は、移行ツールへのリンクを含めるのが理想的です。
説明には、移行しなかった場合にユーザーに表示されるエラー メッセージの例が含まれています。これにより、検索エンジンから GitHub の問題を見つけやすくなります。有用で対処可能なエラー メッセージにします。可能であれば、エラー メッセージに互換性のないフラグの名前を含める必要があります。
移行ツールについては、Buildifier への貢献を検討してください。BUILD
、WORKSPACE
、.bzl
ファイルに自動修正を適用できます。警告が報告されることもあります。
実装
Bazel で新しいフラグを作成します。デフォルト値は false にする必要があります。ヘルプテキストには、GitHub の問題の URL を含める必要があります。フラグ名が incompatible_
で始まるため、メタデータタグが必要です。
metadataTags = {
OptionMetadataTag.INCOMPATIBLE_CHANGE,
},
コミットの説明に、フラグの簡単な概要を追加します。また、次の形式で 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
パイプラインを使用します。このパイプラインの仕組みをこちらでご確認ください。
migration-ready
ラベルは Google の開発サポートチームがモニタリングしています。このラベルを GitHub の問題に追加すると、次のように処理されます。
GitHub の問題にコメントを作成して、失敗したリストと移行が必要なダウンストリーム プロジェクトを追跡します(例を参照)。
GitHub の問題を報告して、互換性のない変更によって破損したすべてのダウンストリーム プロジェクトのオーナーに通知します(例を参照)。
目標リリース日までにすべての問題に対処できるようフォローアップする
ダウンストリーム パイプラインのプロジェクトの移行は、互換性のない変更の作成者の責任ではありませんが、次の手順を行うと、移行を加速し、Bazel ユーザーと Bazel Green チームの両方の負担を軽減できます。
PR を送信してダウンストリーム プロジェクトを修正します。
移行についてサポートが必要な場合は、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 の問題がクローズされるようにします。