| --- |
| layout: documentation |
| title: Configuring Bazel CI for Testing Rules Against Remote Execution |
| --- |
| |
| # Configuring Bazel CI to Test Bazel Rules for Remote Execution |
| |
| * [Overview](#overview) |
| * [Prerequisites](#prerequisites) |
| * [Setting up the Bazel CI for testing](#setting-up-the-bazel-ci-for-testing) |
| * [Troubleshooting failed builds and tests](#troubleshooting-failed-builds-and-tests) |
| * [Using a custom container in the `rbe_ubuntu1604` CI config](#using-a-custom-container-in-the-rbe_ubuntu1604-ci-config) |
| * [Pulling the `rbe-ubuntu16-04` from Container Registry](#pulling-the-rbe-ubuntu16-04-from-container-registry) |
| * [Building the `rbe-ubuntu16-04` container from source](#building-the-rbe-ubuntu16-04-container-from-source) |
| * [Running the custom container](#running-the-custom-container) |
| * [Adding resources to the custom container](#adding-resources-to-the-custom-container) |
| * [Specifying the build platform definition](#specifying-the-build-platform-definition) |
| * [Configuring Buildkite](#configuring-buildkite) |
| |
| ## Overview |
| |
| This document is for owners and maintainers of Bazel rule repositories. It |
| describes how to configure the Bazel Continuous Integration (CI) system for your |
| repository to test your rules for compatibility against a remote execution |
| scenario. The instructions in this document apply to projects stored in GitHub |
| repositories. |
| |
| ## Prerequisites |
| |
| Before completing the steps in this document, ensure the following: |
| |
| * Your GitHub repository is part of the |
| [Bazel GitHub organization](https://github.com/bazelbuild). |
| * You have configured Buildkite for your repository as described in |
| [Bazel Continuous Integration](https://github.com/bazelbuild/continuous-integration/tree/master/buildkite). |
| |
| ## Setting up the Bazel CI for testing |
| |
| 1. In your `.bazelci/presubmit.yml` file, do the following: |
| |
| a. Add a config named `rbe_ubuntu1604`. |
| |
| b. In the `rbe_ubuntu1604` config, add the build and test targets you want to test against remote execution. |
| |
| 2. Add the[`bazel-toolchains`](https://github.com/bazelbuild/bazel-toolchains) |
| GitHub repository to your `WORKSPACE` file, pinned to the |
| [latest release](https://releases.bazel.build/bazel-toolchains.html). |
| |
| 3. Send a pull request with your changes to the `presubmit.yml` file. (See |
| [example pull request](https://github.com/bazelbuild/rules_rust/commit/db141526d89d00748404856524cedd7db8939c35).) |
| |
| 4. To view build results, click **Details** for the RBE (Ubuntu |
| 16.04) pull request check in GItHub, as shown in the figure below. This link |
| becomes available after the pull request has been merged and the CI tests |
| have run. (See |
| [example results](https://source.cloud.google.com/results/invocations/375e325c-0a05-47af-87bd-fed1363e0333).) |
| |
|  |
| |
| 5. (Optional) Set the **bazel test (RBE (Ubuntu 16.04))** check as a test |
| required to pass before merging in your branch protection rule. The setting |
| is located in GitHub in **Settings > Branches > Branch protection rules**, |
| as shown in the following figure. |
| |
|  |
| |
| ## Troubleshooting failed builds and tests |
| |
| If your build or tests fail, it's likely due to the following: |
| |
| * **Required build or test tools are not installed in the default container.** |
| Builds using the `rbe_ubuntu1604` config run by default inside an |
| [`rbe-ubuntu16-04`](https://pantheon.corp.google.com/marketplace/details/google/rbe-ubuntu16-04) |
| container, which includes tools common to many Bazel builds. However, if |
| your rules require tools not present in the default container, you must |
| create a custom container based on the |
| [`rbe-ubuntu16-04`](https://pantheon.corp.google.com/marketplace/details/google/rbe-ubuntu16-04) |
| container and include those tools as described later in this document. |
| |
| * **Build or test targets are using rules that are incompatible with remote |
| execution.** See |
| [Adapting Bazel Rules for Remote Execution](remote-execution-rules.html) for |
| details about compatibility with remote execution. |
| |
| ## Using a custom container in the `rbe_ubuntu1604` CI config |
| |
| The `rbe-ubuntu16-04` container is publicly available at the following URL: |
| |
| ``` |
| http://gcr.io/cloud-marketplace/google/rbe-ubuntu16-04 |
| ``` |
| |
| You can pull it directly from Container Registry or build it from source. The |
| next sections describe both options. |
| |
| Before you begin, make sure you have installed `gcloud`, `docker`, and `git`. |
| If you are building the container from source, you must also install the latest |
| version of Bazel. |
| |
| ### Pulling the `rbe-ubuntu16-04` from Container Registry |
| |
| To pull the <span style="color:#212121;">Pull the `rbe-ubuntu16-04` container |
| from Container Registry, run the following command:</span> |
| |
| ``` |
| gcloud docker -- pull gcr.io/cloud-marketplace/google/rbe-ubuntu16-04@sha256:<sha256-checksum> |
| ``` |
| |
| Replace `<sha256-checksum>` with the SHA256 checksum value for |
| [the latest container](https://pantheon.corp.google.com/gcr/images/cloud-marketplace/GLOBAL/google/rbe-ubuntu16-04). |
| |
| ### Building the `rbe-ubuntu16-04` container from source |
| |
| To build the `rbe-ubuntu16-04` container from source, do the following: |
| |
| 1. Clone the `bazel-toolchains` repository: |
| |
| ``` |
| git clone https://github.com/bazelbuild/bazel-toolchains |
| ``` |
| |
| 2. Set up toolchain container targets and build the container as explained in |
| [Toolchain Containers](https://github.com/bazelbuild/bazel-toolchains/tree/master/container). |
| |
| 3. Pull the freshly built container: |
| |
| ``` |
| gcloud docker -- pull gcr.io/<project-id>/<custom-container-name>@sha256:<sha256-checksum> |
| ``` |
| |
| ### Running the custom container |
| |
| To run the custom container, do one of the following: |
| |
| * If you pulled the container from Container Registry, run the following |
| command: |
| |
| ``` |
| docker run -it gcr.io/cloud-marketplace/google/rbe-ubuntu16-04@sha256:<sha256-checksum> /bin/bash |
| ``` |
| |
| Replace `sha256-checksum` with the SHA256 checksum value for the |
| [latest container](https://pantheon.corp.google.com/gcr/images/cloud-marketplace/GLOBAL/google/rbe-ubuntu16-04). |
| |
| * If you built the container from source, run the following command: |
| |
| ``` |
| docker run -it gcr.io/<project-id>/<custom-container-name>@sha256:<sha256sum> /bin/bash |
| ``` |
| |
| ### Adding resources to the custom container |
| |
| Use a [`Dockerfile`](https://docs.docker.com/engine/reference/builder/) or |
| [`rules_docker`](https://github.com/bazelbuild/rules_docker) to add resources or |
| alternate versions of the original resources to the `rbe-ubuntu16-04` container. |
| If you are new to Docker, read the following: |
| |
| * [Docker for beginners](https://github.com/docker/labs/tree/master/beginner) |
| * [Docker Samples](https://docs.docker.com/samples/) |
| |
| For example, the following `Dockerfile` snippet installs `<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> |
| ``` |
| |
| ### Pushing the custom container to Container Registry |
| |
| Once you have customized the container, build the container image and push it to |
| Container Registry as follows: |
| |
| 1. Build the container image: |
| |
| ``` |
| docker build -t <custom-container-name> .docker tag <custom-container-name> gcr.io/<project-id>/<custom-container-name> |
| ``` |
| |
| 2. Push the container image to Container Registry: |
| |
| ``` |
| gcloud docker -- push gcr.io/<project-id>/<custom-container-name> |
| ``` |
| |
| 3. Navigate to the following URL to verify the container has been pushed: |
| |
| ``` |
| https://console.cloud.google.com/gcr/images/<project-id>/GLOBAL/<custom-container-name> |
| ```` |
| |
| 4. Take note of the SHA256 checksum of your custom container. You will need to |
| provide it in your build platform definition later in this document. |
| |
| 5. Configure the container for public access as described in publicly |
| accessible as explained in |
| [Serving images publicly](https://cloud.google.com/container-registry/docs/access-control#serving_images_publicly). |
| |
| For more information, see |
| [Pushing and Pulling Images](https://cloud.google.com/container-registry/docs/pushing-and-pulling). |
| |
| |
| ### Specifying the build platform definition |
| |
| You must include a [Bazel platform](platforms.html) configuration in your |
| custom toolchain configuration, which allows Bazel to select a toolchain |
| appropriate to the desired hardware/software platform. See this |
| [example platform configuration](https://github.com/tensorflow/tensorflow/blob/master/third_party/toolchains/BUILD) |
| for the TensorFlow `ubuntu16-04` container. |
| |
| Create a similar configuration (that is, using the same constraints) but replace |
| the value of the `container-image` property with the name of your custom |
| container, as well as your GCR project ID and container image checksum. For |
| example: |
| |
| ``` |
| docker://gcr.io/<project-id>/<custom-container-name> @sha256:<sha256sum> |
| ``` |
| |
| Once you have created a `BUILD` file with the platform rule, place it within |
| your project tree. For example, `/platforms/BUILD`. |
| |
| ### Configuring Buildkite |
| |
| Add the appropriate `build_flag` and `test_flag` entries to the |
| `.bazelci/presubmit.yml` file in your `rbe_ubuntu1604 `config to switch your |
| builds to using your custom container. |
| See [example](https://github.com/bazelbuild/rules_docker/pull/484). |
| |
| **Note:** The example linked above uses a platform definition from the |
| `@bazel_toolchains` repo. If your platform rule is in `/platforms/BUILD`, the |
| entries would look as follows: |
| |
| ``` |
| "--extra_execution_platforms=//platforms:<your_platform_target>" |
| "--host_platform=//platforms:<your_platform_target>" |
| "--platforms=//platforms:<your_platform_target>" |
| ``` |