永続ワーカーの作成

<ph type="x-smartling-placeholder"></ph> 問題を報告する <ph type="x-smartling-placeholder"></ph> ソースを表示 夜間 · 7.3 · 7.2 · 7.1 · 7.0 · 6.5

永続ワーカーを使用すると、ビルドを高速化できます。条件 ビルド内で、起動コストが高いアクションを繰り返し実行したり、 クロスアクション キャッシュのメリットを享受したい場合は、独自の永続ディスクを アクションを実行できます

Bazel サーバーは、stdin/stdout を使用してワーカーと通信します。これは、 プロトコル バッファまたは JSON 文字列の使用がサポートされています。

ワーカーの実装は 2 つの部分に分かれています。

ワーカーの作成

永続ワーカーはいくつかの要件を満たします。

  • 読みます。 WorkRequests stdin から。
  • 書き込み WorkResponses (そして WorkResponse のみ)を stdout に追加します。
  • --persistent_worker フラグを受け入れます。ラッパーはデータを認識する --persistent_worker コマンドライン フラグを指定し、次の場合にのみ永続化します。 渡されない場合、ワンショット コンパイルを実行して終了する必要があります。

プログラムがこれらの要件を満たしていれば、 労働者!

処理リクエスト

WorkRequest には、ワーカーに対する引数のリスト、 ワーカーがアクセスできる入力を表すパスとダイジェストのペア(これは 必須ですが、この情報をキャッシュに使用できます。リクエスト ID(0) パフォーマンスが向上します

注: プロトコル バッファの仕様では「スネークケース」が使用されますが、(request_id), JSON プロトコルでは「キャメルケース」という(requestId)。このドキュメントではキャメルケースを使用しています これは JSON の例で異なりますが、フィールドについて話すときは、 構成されます。

{
  "arguments" : ["--some_argument"],
  "inputs" : [
    { "path": "/path/to/my/file/1", "digest": "fdk3e2ml23d"},
    { "path": "/path/to/my/file/2", "digest": "1fwqd4qdd" }
 ],
  "requestId" : 12
}

オプションの verbosity フィールドを使用して、追加のデバッグ出力をリクエストできます。 割り当てることができます。何をどのように出力するかは、ワーカーによって異なります。高 値を指定すると、出力が冗長になります。--worker_verbose フラグを Bazel で verbosity フィールドを 10 に設定しているが、小さい値も大きい値も使用可能 出力の量を手動で調整します。

オプションの sandbox_dir フィールドは、サポートされているワーカーのみが 多重サンドボックス化

仕事用の回答

WorkResponse には、リクエスト ID、ゼロまたはゼロ以外の終了コード、 処理中に発生したエラーを説明する出力メッセージ 表示されます。ワーカーは、そのツールの stdoutstderr をキャプチャする必要があります。 WorkResponse で報告できます。次の stdout に書き込む ワーカー プロセスはワーカー プロトコルに干渉するため安全ではありません。 ワーカー プロセスの stderr への書き込みは安全ですが、結果は 個々のアクションに関連付けられたものではなく、ワーカーごとのログファイルに収集されます。

{
  "exitCode" : 1,
  "output" : "Action failed with the following message:\nCould not find input
    file \"/path/to/my/file/1\"",
  "requestId" : 12
}

protobuf の標準に従い、すべてのフィールドは省略可能です。ただし、Bazel では WorkRequest と対応する WorkResponse(同じリクエストを持つため) リクエスト ID がゼロ以外の場合は、そのリクエスト ID を指定する必要があります。有効な ID です WorkResponse

{
  "requestId" : 12,
}

request_id が 0 の場合は、「シングルプレックス」を示します。このリクエストが 他のリクエストと並行して処理できません。サーバーは 特定のワーカーが、request_id 0 または request_id は 0 よりも大きくなります。シングル プレックス リクエストは、 が次のサンプル リクエストを受け取るまで、サーバーは別のリクエストを送信しません。 (キャンセル リクエストを除きます。以下を参照してください)。

  • 各プロトコル バッファの先頭には、varint 形式の長さが付加されています( MessageLite.writeDelimitedTo()
  • JSON のリクエストとレスポンスの前にサイズインジケーターはありません。
  • JSON リクエストは protobuf と同じ構造を保持しますが、標準の すべてのフィールド名でキャメルケースを使用します。
  • 下位互換性と上位互換性を維持するために、 JSON ワーカーはこれらのメッセージ内の不明なフィールドを許容する必要がある 欠損値には protobuf のデフォルトを使用します。
  • Bazel はリクエストを protobuf として保存し、 protobuf の JSON 形式

キャンセル

ワーカーは、処理リクエストが完了前にキャンセルできるようにすることもできます。 これは、ローカル環境で実行を行う場合に特に便利です。 より高速なリモート実行によって定期的に実行を中断できます。許可する supports-worker-cancellation: 1execution-requirements フィールド(下記参照)に移動し、 --experimental_worker_cancellation フラグ。

キャンセル リクエストは、cancel フィールドが設定された WorkRequest です( 同様に、キャンセル レスポンスwas_cancelled を含む WorkResponse です。 設定されます。キャンセル リクエストまたはキャンセルに含める必要がある唯一のフィールドです。 レスポンスは、キャンセルするリクエストを示す request_id です。request_id フィールドは、シングルプレックス ワーカーの場合 0、または以前のワーカーの 0 以外の request_id になります。 Multiplex ワーカーに WorkRequest を送信しました。サーバーがキャンセル リクエストを送信する可能性がある ワーカーがすでに応答しているリクエストの場合、 キャンセルは 無視する必要があります。

キャンセル以外の各 WorkRequest メッセージには、次のどちらかの場合に 1 回だけ応答する必要があります。 キャンセルされたわけではありません。サーバーがキャンセル リクエストを送信すると、ワーカーは request_id を設定して WorkResponse を返し、was_cancelled を返す フィールドを true に設定します。通常の WorkResponse の送信も可能ですが、 output フィールドと exit_code フィールドは無視されます。

WorkRequest に対するレスポンスを送信したら、ワーカーは 作成されます。サーバーでは自由にファイルをクリーンアップでき 一時ファイルも含まれます。

ワーカーを使用するルールを作成する

また、ユーザーによって実行されるアクションを生成するルールも できます。ワーカーを使用する Starlark ルールの作成は、 作成することもできます。

また、ワーカー自体への参照を含む必要があります。また、 生成するアクションにはいくつかの要件があります。

ワーカーの参照

ワーカーを使用するルールには、ワーカーを参照するフィールドを含める必要がある そのため、\*\_binary ルールのインスタンスを作成して、 判断できますワーカーが MyWorker.Java の場合、これは 関連ルール:

java_binary(
    name = "worker",
    srcs = ["MyWorker.Java"],
)

これにより、「ワーカー」ワーカー バイナリを参照するラベルです。その後、 ワーカーを使用するルールを定義します。このルールでは、作成する属性を ワーカーバイナリを指します

ビルドしたワーカー バイナリが、一番上にある「work」という名前のパッケージにある場合は、 場合、これは属性定義である可能性があります。

"worker": attr.label(
    default = Label("//work:worker"),
    executable = True,
    cfg = "exec",
)

cfg = "exec" は、ワーカーが 実行プラットフォーム(つまり、Worker を使用して 使用しないでください)。

作業アクションの要件

ワーカーを使用するルールによって、ワーカーが実行するアクションが作成されます。これらの いくつかの要件があります

  • "arguments" フィールドこれは文字列のリストを受け取ります。最後の文字列を除くすべての文字列を これらは起動時にワーカーに渡される引数です。最後の要素は 「arguments」list は flag-file(@ で始まる)引数です。ワーカーの読み取り 指定されたフラグファイルの引数を WorkRequest 単位で取得します。お客様の ワーカーの起動時以外の引数をこのフラグファイルに書き込むことができます。

  • "execution-requirements" フィールド "supports-workers" : "1""supports-multiplex-workers" : "1"、またはその両方です。

    「引数」"execution-requirements"フィールドはすべての アクションをワーカーに送信するよう設定できますまた 組織が実行すべきアクションは JSON ワーカーは、変数名に "requires-worker-protocol" : "json" を [実行要件]フィールドに入力します"requires-worker-protocol" : "proto" も というのが有効な実行要件ですが、proto ワーカーでは必須ではありません。 これらがデフォルトなので

    また、実行要件で worker-key-mnemonic を設定することもできます。この 実行可能ファイルを複数のアクション タイプで再利用する場合や、 このワーカーによるアクションを区別できます

  • アクションの過程で生成された一時ファイルは、 作業ディレクトリです。これにより、サンドボックス化が有効になります。

で確認できます。

ルール定義が「worker」であると仮定属性に加えて、 「srcs」に入力を表す「output」という属性 出力を表す「args」ワーカーを表す属性 ctx.actions.run の呼び出しは次のようになります。

ctx.actions.run(
  inputs=ctx.files.srcs,
  outputs=[ctx.outputs.output],
  executable=ctx.executable.worker,
  mnemonic="someMnemonic",
  execution_requirements={
    "supports-workers" : "1",
    "requires-worker-protocol" : "json"},
  arguments=ctx.attr.args + ["@flagfile"]
 )

別の例については、 永続ワーカーの実装

Bazel コードベースでは、 Java コンパイラ ワーカー および サンプル JSON ワーカー 統合テストで使われる

こちらの スキャフォールディング 適切なコールバックを渡すことで、Java ベースのツールをワーカーにすることができます。

ワーカーを使用するルールの例については、Bazel の ワーカー統合テストを実行します。

外部の貢献者は、さまざまな言語でワーカーを導入しています。CANNOT TRANSLATE 見て Bazel 永続ワーカーの多言語実装。 Google Chat では GitHub で他にも多くのサンプルがあります