リモート実行のルールをテストするために Bazel CI を構成する

7.3 · 7.2 · 7.1 · 7.0 · 6.5

このページは、Bazel ルール リポジトリのオーナーとメンテナーを対象としています。ここでは、リポジトリの Bazel 継続的インテグレーション(CI)システムを構成して、リモート実行シナリオとの互換性についてルールをテストする方法について説明します。このページの手順は、GitHub リポジトリに保存されているプロジェクトに適用されます。

前提条件

このページの手順を完了する前に、次のことを確認してください。

テスト用の Bazel CI のセットアップ

  1. .bazelci/presubmit.yml ファイルで次の操作を行います。

    a. rbe_ubuntu1604 という名前の構成を追加します。

    b. rbe_ubuntu1604 構成で、リモート実行に対してテストするビルドとテストのターゲットを追加します。

  2. bazel-toolchains GitHub リポジトリを WORKSPACE ファイルに追加し、最新リリースに固定します。また、buildkite_config という名前の rbe_autoconfig ターゲットも追加します。この例では、rbe_ubuntu1604 の BuildKite CI を使用してリモート実行用のツールチェーン構成を作成します。

load("@bazel_toolchains//rules:rbe_repo.bzl", "rbe_autoconfig")
rbe_autoconfig(name = "buildkite_config")
  1. presubmit.yml ファイルの変更内容を含む pull リクエストを送信します。(プルリクエストの例をご覧ください)。

  2. ビルド結果を表示するには、次の図に示すように、GitHub で RBE(Ubuntu 16.04)pull リクエスト チェックの [詳細] をクリックします。このリンクは、pull リクエストが統合され、CI テストが実行された後に使用できるようになります。(結果の例をご覧ください)。

    検索結果の例

  3. (省略可)[bazel テスト(RBE(Ubuntu 16.04))] チェックを、ブランチ保護ルールでマージする前に合格する必要があるテストとして設定します。この設定は、次の図に示すように、GitHub の [設定] > [ブランチ] > [ブランチ保護ルール] にあります。

    ブランチ保護ルールの設定

失敗したビルドとテストのトラブルシューティング

ビルドまたはテストが失敗した場合は、次の原因が考えられます。

  • 必要なビルドツールまたはテストツールがデフォルトのコンテナにインストールされていない。rbe_ubuntu1604 構成を使用するビルドは、デフォルトで rbe-ubuntu16-04 コンテナ内で実行されます。このコンテナには、多くの Bazel ビルドに共通するツールが含まれています。ただし、ルールでデフォルト コンテナにないツールが必要な場合は、rbe-ubuntu16-04 コンテナに基づいてカスタム コンテナを作成し、後述するようにこれらのツールを含める必要があります。

  • ビルドまたはテストのターゲットで、リモート実行と互換性のないルールが使用されています。リモート実行との互換性の詳細については、リモート実行用に Bazel ルールを適応させるをご覧ください。

rbe_ubuntu1604 CI 構成でカスタム コンテナを使用する

rbe-ubuntu16-04 コンテナは、次の URL で一般公開されています。

http://gcr.io/cloud-marketplace/google/rbe-ubuntu16-04

Container Registry から直接 pull することも、ソースからビルドすることもできます。以降のセクションでは、両方のオプションについて説明します。

始める前に、gclouddockergit がインストールされていることを確認してください。ソースからコンテナをビルドする場合は、最新バージョンの Bazel もインストールする必要があります。

Container Registry から rbe-ubuntu16-04 を pull する

Container Registry から rbe-ubuntu16-04 コンテナを pull するには、次のコマンドを実行します。

gcloud docker -- pull gcr.io/cloud-marketplace/google/rbe-ubuntu16-04@sha256:sha256-checksum

sha256-checksum は、最新のコンテナの SHA256 チェックサム値に置き換えます。

ソースから rbe-ubuntu16-04 コンテナをビルドする

ソースから rbe-ubuntu16-04 コンテナをビルドする手順は次のとおりです。

  1. bazel-toolchains リポジトリのクローンを作成します。

    git clone https://github.com/bazelbuild/bazel-toolchains
  2. ツールチェーン コンテナの説明に沿って、ツールチェーン コンテナ ターゲットを設定し、コンテナをビルドします。

  3. 新しくビルドされたコンテナを pull します。

    gcloud docker -- pull gcr.io/project-id/custom-container-namesha256-checksum

カスタム コンテナの実行

カスタム コンテナを実行するには、次のいずれかを行います。

  • コンテナを Container Registry から pull した場合は、次のコマンドを実行します。

    docker run -it gcr.io/cloud-marketplace/google/rbe-ubuntu16-04@sha256:sha256-checksum/bin/bash

    sha256-checksum は、最新のコンテナの SHA256 チェックサム値に置き換えます。

  • ソースからコンテナをビルドした場合は、次のコマンドを実行します。

    docker run -it gcr.io/project-id/custom-container-name@sha256:sha256sum /bin/bash

カスタム コンテナへのリソースの追加

Dockerfile または rules_docker を使用して、元のリソースのリソースまたは代替バージョンを rbe-ubuntu16-04 コンテナに追加します。Docker を初めて使用する場合は、以下をご覧ください。

たとえば、次の Dockerfile スニペットは my_tool_package をインストールします。

FROM gcr.io/cloud-marketplace/google/rbe-ubuntu16-04@sha256:sha256-checksum
RUN apt-get update && yes | apt-get install -y my_tool_package

Container Registry にカスタム コンテナを push する

コンテナをカスタマイズしたら、次のようにコンテナ イメージをビルドして Container Registry に push します。

  1. コンテナ イメージをビルドします。

    docker build -t custom-container-name.
    docker tag custom-container-name gcr.io/project-id/custom-container-name
  2. コンテナ イメージを Container Registry に push します。

    gcloud docker -- push gcr.io/project-id/custom-container-name
  3. 次の URL に移動して、コンテナが push されたことを確認します。

    https://console.cloud.google.com/gcr/images/project-id/GLOBAL/custom-container-name

  4. カスタム コンテナの SHA256 チェックサムをメモします。これは、後でビルド プラットフォームの定義で指定する必要があります。

  5. イメージの公開で説明されているように、一般公開アクセス用にコンテナを構成します。

    詳細については、イメージの push と pull をご覧ください。

ビルド プラットフォームの定義を指定する

カスタム ツールチェーンの構成に Bazel プラットフォームの構成を含める必要があります。これにより、Bazel は目的のハードウェア / ソフトウェア プラットフォームに適したツールチェーンを選択できます。有効なプラットフォームを自動的に生成するには、WORKSPACEbuildkite_config という名前の rbe_autoconfig ターゲットを追加します。このターゲットには、カスタム コンテナを選択するための追加の属性が含まれています。この設定の詳細については、rbe_autoconfig の最新のドキュメントをご覧ください。