Skip to content

Bazel rules for running multiple commands in parallel in a single bazel invocation

License

Notifications You must be signed in to change notification settings

keith/rules_multirun

Folders and files

NameName
Last commit message
Last commit date

Latest commit

dc16a92 · Feb 25, 2025

History

51 Commits
Feb 28, 2024
Feb 25, 2025
Nov 27, 2024
Nov 27, 2024
Feb 10, 2025
Feb 26, 2024
Nov 7, 2023
Feb 23, 2024
Feb 23, 2024
May 10, 2022
Oct 21, 2024
Feb 23, 2024
Oct 21, 2024
Jan 13, 2023
Nov 27, 2024
Feb 23, 2024
Feb 10, 2025

Repository files navigation

rules_multirun

These rules provide a simple interface for running multiple commands in parallel with a single bazel run invocation. This is especially useful for running multiple linters or formatters with a single command.

Usage

Setup the tools you want to run:

load("@rules_multirun//:defs.bzl", "command", "multirun")
load("@rules_python//python:defs.bzl", "py_binary")

sh_binary(
    name = "some_linter",
    ...
)

py_binary(
    name = "some_other_linter",
    ...
)

command(
    name = "lint-something",
    command = ":some_linter",
    arguments = ["check"], # Optional arguments passed directly to the tool
)

command(
    name = "lint-something-else",
    command = ":some_other_linter",
    environment = {"CHECK": "true"}, # Optional environment variables set when invoking the command
    data = ["..."] # Optional runtime data dependencies
)

multirun(
    name = "lint",
    commands = [
        "lint-something",
        "lint-something-else",
    ],
    jobs = 0, # Set to 0 to run in parallel, defaults to sequential
)

Run the multirun target with bazel:

$ bazel run //:lint

See the full API docs for more info.

Usage with platform transitions

In case if the multirun rule requires a transition to other configuration than target then a new multirun-like rule can be defined as in the following example

load("@rules_multirun//:defs.bzl", "multirun_with_transition")

def _aws_deploy_platforms_impl(settings, attr):
    return {"//command_line_option:platforms": [":aws_lambda"]}

aws_deploy_transition = transition(
    implementation = _aws_deploy_platforms_impl,
    inputs = [],
    outputs = ["//command_line_option:platforms"],
)

aws_deploy = multirun_with_transition(
    aws_deploy_transition,
    "@bazel_tools//tools/allowlists/function_transition_allowlist"
)

and used in a BUILD file

aws_deploy(
    name = "staging",
    commands = [
       ...
    ]
)

Installation

Go to the releases page to grab the WORKSPACE snippet for the latest release.

Acknowledgements

This is a fork of the original multirun rules. Those rules have a dependency on golang to run, which may not be desired, these rules use a python script instead.

About

Bazel rules for running multiple commands in parallel in a single bazel invocation

Resources

License

Stars

Watchers

Forks

Packages

No packages published