BazelCon 2022 は、11 月 16 ~ 17 日にニューヨークとオンラインで開催されます。
今すぐご登録ください。

リモート実行用に Bazel ルールを適用する

コレクションでコンテンツを整理 必要に応じて、コンテンツの保存と分類を行います。

このページは、リモート実行のコンテキストで Bazel ルールの要件を理解したいカスタムビルドとテストルールを作成する Bazel ユーザーを対象としています。

リモート実行では、Bazel が別のプラットフォーム(データセンターなど)でアクションを実行できます。Bazel は、リモート実行に gRPC プロトコルを使用します。bazel-buildfarm をリモート実行に役立てることができます。これは、分散リモート実行プラットフォームを提供することを目的としたオープンソース プロジェクトです。

このページでは、さまざまな環境タイプまたはプラットフォームを指すときに、次の用語を使用します。

  • ホスト プラットフォーム - Bazel が実行される場所。
  • 実行プラットフォーム - Bazel アクションが実行される場所。
  • ターゲット プラットフォーム - ビルドの出力先(および一部のアクション)の実行場所。

概要

リモート実行用に Bazel ビルドを設定する場合、このページに記載されているガイドラインに従って、ビルドがリモートで問題なく実行されるようにする必要があります。リモート実行の性質上、次のようになります。

  • 分離されたビルド アクション。 ビルドツールは状態を保持せず、それらの間で依存関係がリークすることはありません。

  • 多様な実行環境。 ローカルの実行構成は、リモート実行環境には必ずしも適していません。

このページでは、リモート実行用にカスタム Bazel ビルドとテストルールを実装するときに発生する可能性のある問題と、その回避方法について説明します。取り上げる内容は次のとおりです。

ツールチェーン ルールによるビルドツールの呼び出し

Bazel ツールチェーン ルールは、ルールの作成者が定義したパラメータを使用して、コンパイラやリンカーなどのビルドツールで使用するビルドツールを指示する構成プロバイダです。ツールチェーン ルールを使用すると、リモート実行と互換性のある、事前構成済みの予測可能な方法でビルドツールをテストルールから呼び出すことができます。たとえば、PATHJAVA_HOME、またはリモートで同等の値に設定されていない(またはまったく設定されていない)その他のローカル変数を介してビルドツールを呼び出す代わりに、ツールチェーン ルールを使用します。実行環境。

現在、Bazel のビルドルールとテストルールには、スカラRu びGoまた、新しい言語に関する他のツールチェーンや、bash 。 ルールで使用するツールにツールチェーン ルールが存在しない場合は、ツールチェーン ルールの作成を検討します。

暗黙的な依存関係の管理

ビルドツールがビルド アクション間の依存関係にアクセスできる場合、各リモートビルド アクションは個別に実行されるため、それらのアクションはリモートで実行されると失敗します。一部のビルドツールは、ビルド アクションをまたいで状態を保持し、ツール呼び出しに明示的に含まれていない依存関係にアクセスするため、リモートで実行されるビルド アクションが失敗します。

たとえば、Bazel がステートフル コンパイラにローカルで foo をビルドするよう指示すると、コンパイラは foo のビルド出力への参照を保持します。Bazel がコンパイラにビルドするよう指示する場合バーこれは、以下に依存します。徒歩コンパイラ呼び出しに含める BUILD ファイルの依存関係を明示的に記述せずに、両方のアクションで同じコンパイラ インスタンスが実行される限り、アクションは正常に実行されます(ローカル実行で一般的な動作です)。 ただし、リモート実行では、ビルド アクションごとに別個のコンパイラ インスタンスが実行されるため、コンパイラ状態と bar の暗黙的な依存関係(foo に対する依存関係)は失われます。ビルドが失敗します。

これらの依存関係の問題を検出して排除するために、Bazel 0.14.1 ではローカル Docker サンドボックスが提供されています。これには、リモート実行と同じ依存関係があります。依存関係に関連するビルドエラーを特定して解決し、サンドボックスを使用してリモート実行用のビルドを準備します。詳しくは、Docker Sandbox による Bazel リモート実行のトラブルシューティングをご覧ください。

プラットフォームに依存するバイナリの管理

通常、ホスト プラットフォーム上にビルドされたバイナリは、依存関係の不一致が原因で、任意のリモート実行プラットフォームで安全に実行できません。たとえば、Bazel に付属する SingleJar バイナリがホスト プラットフォームをターゲットにします。ただし、リモート実行では、コードの実行プロセスの一環として SingleJar をコンパイルして、リモート実行プラットフォームをターゲットとする必要があります。(ターゲット選択ロジックをご覧ください)。

ビルドに必要なビルドツールのバイナリを、ソースコードで実行しないでください。ただし、実行プラットフォームで安全に実行できることが確実な場合を除きます。代わりに、次のいずれかを行います。

  • このツールをリモートで送信するか、外部から参照して、リモート実行プラットフォーム向けにビルドできるようにします。

  • 動作が安定している場合は、ツールをリモート実行環境(ツールチェーン コンテナなど)にプリインストールし、ツールチェーン ルールを使用してビルドで実行します。

構成スタイルの WORKSPACE ルールの管理

Bazel の WORKSPACE ルールは、ビルドに必要なツールとライブラリのホスト プラットフォームを調査するために使用できます。これは、ローカルビルドの場合も Bazel の実行プラットフォームです。ビルドがローカルのビルドツールとアーティファクトに明示的に依存している場合、リモート実行プラットフォームがホスト プラットフォームと同一でない場合、リモート実行中にビルドが失敗します。

WORKSPACE ルールによって実行される以下のアクションは、リモート実行と互換性がありません。

  • バイナリをビルドするWORKSPACE ルールでコンパイル アクションを実行すると、ホスト プラットフォームと異なる場合、リモート実行プラットフォームと互換性のないバイナリが生成されます。

  • pip パッケージをインストールする。 WORKSPACE ルールを介してインストールされた pip パッケージでは、依存関係がホスト プラットフォームにプリインストールされている必要があります。ホスト プラットフォーム専用に作成されたこのようなパッケージは、ホスト プラットフォームと異なる場合、リモート実行プラットフォームと互換性がありません。

  • ローカルのツールやアーティファクトへのシンボリック リンク。 WORKSPACE ルールを介して作成されたホスト プラットフォームにインストールされたツールまたはライブラリへのシンボリック リンクにより、リモート実行プラットフォームでビルドが失敗することがあります。これは、Bazel がそのような場所を見つけることができないためです。代わりに、シンボリック リンク ツールとライブラリが Bazel の runfiles ツリーからアクセスできるように、標準のビルド アクションを使用してシンボリック リンクを作成します。repository_ctx.symlink を使用して、外部リポジトリ ディレクトリ外のターゲット ファイルをシンボリック リンクしないでください。

  • ホスト プラットフォームの変更。 リモート実行プラットフォームで予期しない動作が発生する可能性があるため、Bazel runfiles ツリーの外部でファイルを作成したり、環境変数や同様のアクションを作成したりしないでください。

密閉型でない動作を見つけるには、ワークスペースのルールのログを使用します。

外部の依存関係がホスト プラットフォームに依存する特定のオペレーションを実行する場合は、次のように、そのオペレーションを WORKSPACE とビルドルールに分割する必要があります。

  • プラットフォーム検査と依存関係の列挙。 これらのオペレーションは、安全に WORKSPACE ルールを介してローカルに実行できます。これにより、インストールされているライブラリの確認、ビルドが必要なパッケージのダウンロード、コンパイルに必要なアーティファクトの準備を行うことができます。リモート実行では、これらのルールでは、ホスト プラットフォーム検査中に通常取得される情報を提供するために、事前にチェックされたアーティファクトの使用もサポートする必要があります。事前にチェックされたアーティファクトにより、Bazel は依存関係をローカルであるかのように記述できます。これには、条件文または --override_repository フラグを使用します。

  • ターゲット固有のアーティファクトやプラットフォームのミューテーションを生成またはコンパイルする。 これらのオペレーションは、通常のビルドルールを介して実行する必要があります。外部依存関係のターゲット固有のアーティファクトを生成するアクションは、ビルド中に実行する必要があります。

リモート実行用に事前にチェックされたアーティファクトを簡単に生成するには、WORKSPACE ルールを使用して、生成されたファイルを出力します。各ツールチェーン コンテナ内など、新しい実行環境ごとにこれらのルールを実行して、リモート リポジトリのビルド出力をソース リポジトリにチェックインして参照できます。

たとえば、cudapython に関する Tensorflow ルールの場合、WORKSPACE ルールは次のような BUILD files。ローカル実行では、ホスト環境の確認で生成されたファイルが使用されます。リモート実行では、環境変数の条件ステートメントによって、リポジトリにチェックインされたファイルをルールで使用できます。

BUILD ファイルは、ローカルとリモートの両方で実行できる genrules を宣言し、以前 repository_ctx.symlink によって行われた必要な処理を実行します(こちらよりご確認ください。