Bazel Starlark ルールでは、次の 2 つのシナリオで Bazel LTS リリースとの互換性が損なわれる可能性があります。
- このルールは、依存する機能が Bazel から Bazel から削除されるため、今後の LTS リリースとの互換性が損なわれます。
- このルールは、依存している機能が新しい Bazel LTS リリースでのみ使用できるため、現行の LTS リリースまたは古い LTS リリースとの互換性が損なわれます。
一方、ルール自体で、互換性のない変更をユーザーに送信することもできます。Bazel バージョンで互換性を破る変更と組み合わせることで、ルール バージョンと Bazel バージョンのアップグレードが Bazel ユーザーに不満を生じさせることがよくあります。このページでは、ユーザーが Bazel とルールを簡単にアップグレードできるように、ルールの作成者が Bazel とルールの互換性を維持する方法について説明します。
管理しやすい移行プロセス
Bazel のすべてのバージョンとルールのすべてのバージョン間の互換性を保証することは不可能です。しかし、Google の目的は、Bazel ユーザーが移行プロセスを管理できるようにすることです。管理可能な移行プロセスは、ユーザーにルールのメジャー バージョンと Bazel のメジャー バージョンを同時にアップグレードすることを強制しないプロセスで、互換性のない変更を一度に 1 つのソースから処理できるようにします。
たとえば、次のような互換性マトリックスを使用します。
- rules_foo 1.x と Bazel 4.x から rules_foo 2.x と Bazel 5.x への移行は、ユーザーが rules_foo と Bazel のメジャー バージョンを同時にアップグレードする必要があるため、管理しやすいとは見なされません。
- rules_foo 2.x と Bazel 5.x から rules_foo 3.x と Bazel 6.x への移行は、ユーザーが rules_foo をメジャー Bazel バージョンを変更せずに 2.x から 3.x にアップグレードしてから Bazel 5.x から 6.x にアップグレードできるため、管理しやすいとみなされます。
rules_foo 1.x | rules_foo 2.x | rules_foo 3.x | HEAD | |
---|---|---|---|---|
Bazel 4.x | ✅ | ❌ | ❌ | ❌ |
Bazel 5.x | ❌ | ✅ | ✅ | ❌ |
Bazel 6.x | ❌ | ❌ | ✅ | ✅ |
HEAD | ❌ | ❌ | ❌ | ✅ |
❌: Bazel LTS リリースと互換性のあるメジャー ルール バージョンがない。
✅: 少なくとも 1 つのバージョンのルールが、最新バージョンの Bazel LTS リリースと互換性がある。
おすすめの方法
Bazel ルールの作成者は、次のベスト プラクティスに沿ってユーザーの管理プロセスを簡単に移行できます。
- ルールはセマンティック バージョニングに従う必要があります。同じメジャー バージョンのマイナー バージョンには下位互換性があります。
- HEAD のルールは最新の Bazel LTS リリースに対応している必要があります。
- HEAD のルールは Bazel と Bazel に対応している。これを行うには、次の操作を行います。
- Bazel で HEAD を使用して独自の CI テストを設定する
- プロジェクトを Bazel ダウンストリーム テストに追加します。Bazel の変更がプロジェクトに影響する場合は、Bazel チームがプロジェクトに報告します。ダウンストリーム プロジェクト ポリシーに従ってタイムリーに対応する必要があります。
- ルールの最新のメジャー バージョンは、最新の Bazel LTS リリースと互換性がある必要があります。
- ルールの新しいメジャー バージョンは、ルールの以前のメジャー バージョンでサポートされる最新の Bazel LTS リリースと互換性がある必要があります。
2. と 3. の確立は 4. と 5 の達成を可能にするため、最も重要なタスクです。。
ルールの作成者は、HEAD の Bazel と最新の Bazel LTS リリースの両方との互換性を維持しやすくするために、次のことができます。
- 下位互換性のある機能を最新の LTS リリースにバックポートするようにリクエストするには、リリース プロセスで詳細を確認してください。
- Bazel 機能の検出を行うには、bazel_features を使用します。
一般に、おすすめする方法では、Bazel と互換性のない変更に対してルールを移行し、最新の Bazel LTS リリースとの互換性を損なうことなく、HEAD で新しい Bazel 機能を使用できます。