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

問題を報告する ソースを表示 夜間 · 7.3 · 7.2 · 7.1 · 7.0 · 6.5

このページは、カスタムビルドとテストのルールを作成する Bazel ユーザーを対象としています コンテキストにおける Bazel ルールの要件について知りたい方のために、 実行することもできます。

リモート実行により、Bazel は次のような別のプラットフォームでアクションを実行できます。 データセンターです。Bazel は gRPC プロトコル リモート実行可能です。次のコマンドでリモート実行を試すことができます。 bazel-buildfarm 分散型リモート実行を実現することを目的としたオープンソース プロジェクトです。 説明します。

このページでは、Google Cloud リソースについて 環境タイプまたはプラットフォーム:

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

概要

リモート実行用に Bazel ビルドを構成する場合は、 ビルドがリモートで実行されるようにするために、このページで説明するガイドライン エラーがなくなります。これは、リモート実行の特性によるものです。

  • 分離されたビルド アクション。ビルドツールで状態と依存関係が保持されない 漏洩することはできません。

  • 多様な実行環境。ローカルビルド構成は、 リモート実行環境に適しています

このページでは、カスタム Bazel を実装する際に発生する可能性のある問題について説明します。 リモート実行のビルドとテストのルールと、それらのルールを回避する方法について説明します。内容 次のトピックをご覧ください。

ツールチェーン ルールを使用したビルドツールの呼び出し

Bazel ツールチェーン ルールは、ビルドルールに何を伝える構成プロバイダか コンパイラやリンカーなどのビルドツールとそれらの構成方法 ルールの作成者が定義したパラメータを使用します。ツールチェーン ルールを使用すると、 予測可能で事前構成された方法でビルドツールを呼び出すためのテストルール 構築する必要がありますたとえば、ツールチェーン ルールを使用して、 PATHJAVA_HOME、その他のローカル変数を介してビルドツールを 変数に同等の値(またはまったく設定されていない)を 必要があります。

現在、Bazel のビルドルールとテストルールに対して、 Scala RustGo、 他の言語やツールでは、新しいツールチェーン ルールが進行中です。 bash ルールで使用するツールにツールチェーン ルールが存在しない場合は、 ツールチェーン ルールを作成する

暗黙的な依存関係の管理

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

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

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

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

通常、ホスト プラットフォームでビルドされたバイナリは、 任意のリモート実行プラットフォームを使用します。 たとえば、Bazel に付属の SingleJar バイナリは、ホスト プラットフォームをターゲットとしています。 ただし、リモート実行では、SingleJar をプロセスの一部としてコンパイルする必要があります。 リモート実行プラットフォームをターゲットとするコードをビルドします。( ターゲット選択ロジックをご覧ください)。

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

  • ツールのソースコードを公開または外部に参照し、公開できるようにする リモート実行プラットフォーム用に構築されています

  • リモート実行環境(例: ツールチェーン コンテナなど)を使用し、それを実行するためにツールチェーン ルールを使用します。 おすすめします。

config 形式の WORKSPACE ルールの管理

Bazel の WORKSPACE ルールを使用して、ツールのホスト プラットフォームを詳しく調べることができます。 とライブラリ。ローカルビルドでは、Bazel の 実行するためのプラットフォームです。ビルドが明示的にローカルのビルドツールと依存関係に依存している場合は、 変更すると、リモート実行プラットフォームがリモート実行時に失敗します。 ホスト プラットフォームとは異なります。

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

  • バイナリをビルドする。WORKSPACE ルールでのコンパイル アクションの実行 リモート実行プラットフォームと互換性のないバイナリが表示される 異なる場合は注意が必要です。

  • pip パッケージをインストールします。WORKSPACE 経由で pip 個のパッケージがインストールされました 依存関係をホスト プラットフォームにプリインストールする必要があります。 特にホスト プラットフォーム用に構築されたこのようなパッケージは、 リモート実行プラットフォームと互換性がない(ホストと異なる場合) 説明します。

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

  • ホスト プラットフォームのミューテーション。Bazel の外部でファイルを作成しない runfiles ツリー、環境変数の作成、同様の操作など、 リモート実行プラットフォームで予期しない動作が発生することがあります。

潜在的な非密閉動作を見つけるには、Workspace ルールログを使用します。

外部依存関係がホストに依存する特定のオペレーションを実行するかどうか それらのオペレーションを WORKSPACE と build に分割する必要があります。 使用できます。

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

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

リモート実行用の事前チェック済みアーティファクトをより簡単に生成するには、次のコマンドを使用します。 生成されたファイルを出力する WORKSPACE ルール。新しいルールごとに 実行環境で確認し、各ツールチェーン コンテナの リモート実行の出力はソース リポジトリに組み込まれて参照できます。

たとえば、TensorFlow の cuda に関するルールの場合、 および pythonWORKSPACE ルールは、次のような BUILD files を生成します。 ローカル実行では、ホスト環境を確認して生成されたファイルが使用されます。 リモート実行の場合、条件文 リソースに対してチェックインされたファイルをルールが使用し、 表示されます。

BUILD ファイルは genrules を宣言します。 アプリケーションに必要な処理を実行でき、 これは、こちらに示すように repository_ctx.symlink を介して実行されていました。