RBE Executor Pools

By default, all BuildBuddy executors are placed in a single pool - and any task can run on any executor (running the same operating system and cpu architecture).

Platforms can be used to specify custom Docker images in which to run your actions, but sometimes you want control over more properties of the executor machine - like available memory, access to GPUs, or physical location.

To support these use cases, BuildBuddy allows executors to be registered in different pools - and for Bazel to select from these pools at either the Platform level or the target level, depending on your needs.

Deploying executors in a pool

When creating an executor deployment, you can specify the name of the pool its executors should be registered to with the MY_POOL environment variable. This can be set to any string value.

If using the buildbuddy/buildbuddy-executor Helm charts, you can set this using the poolName value.

Setting the app's default pool name

By default, both executors and the BuildBuddy app do not set a pool name and any RBE request that comes in without a Pool property set will be sent to the default pool. If you'd like requests without a Pool property to be sent to a different default pool, you can set the app's default_pool_name in the remote_execution block of its config.yaml.

remote_execution:
    enable_remote_exec: true
    default_pool_name: my-default-pool

Selecting a pool to run your builds on

Now that you've deployed multiple executor pools, you can select which pool you'd like your builds to run on - either at the platform level or the target level.

Platform level

You can configure BuildBuddy RBE to use a custom executor pool at the platform level, by adding the following rule to a BUILD file:

platform(
    name = "gpu_platform",
    exec_properties = {
        "OSFamily": "Linux",
        "Pool": "my-gpu-pool",
    },
)

Make sure to replace my-gpu-pool with your docker image url.

You can then pass this configuration to BuildBuddy RBE with the following flag:

--host_platform=//:gpu_platform

This assumes you've placed this rule in your root BUILD file. If you place it elsewhere, make sure to update the path accordingly.

Target level

If you want different targets to run in different RBE environments, you can specify exec_properties at the target level. For example if you want to run one set of tests in a high-memory pool, or another set of targets on executors with GPUs.

go_test(
    name = "memory_hogging_test",
    srcs = ["memory_hogging_test.go"],
    embed = [":go_default_library"],
    exec_properties = {
        "Pool": "high-memory-pool",
    },
)
Need more help?
Get in touch