tree: ea3124c837a71b9953d67928bd5bd160b057249f [path history] [tgz]
  1. .bazelrc
  2. BUILD.bazel
  3. foo.js
  4. package.json
  5. README.md
  6. tool.js
  7. uses_workers.bzl
  8. WORKSPACE
  9. yarn.lock
examples/worker/README.md

Worker example

This shows how to keep a tool running a persistent worker. This is like a daemon process that Bazel will start and manage as needed to perform actions.

Bazel's protocol for workers is:

  • start a pool of processes
  • when an action needs to be run, it encodes the request as a protocol buffer and writes it to the worker's stdin
  • the @bazel/worker package provides a utility to speak this protocol, and dispatches to a function you provide that performs the work of the tool. See /packages/worker/README.md for a description of that utility.
  • the tool returns a response written as another protocol buffer to stdout (note this means you cannot log to stdout)

Files in the example

foo.js is some arbitrary input to the rule. You can run ibazel build :do_work and then make edits to this JS input to observe how every change triggers the action to run, and it's quite fast because the worker process stays running.

The tool.js file shows how to use the @bazel/worker package to implement the worker protocol. Note that the main method first checks whether the tool is being run under the worker mode, or should just do the work once and exit.

uses_workers.bzl shows how the tool is wrapped in a Bazel rule. When the action is declared, we mark it with attribute execution_requirements = {"supports-workers": "1"} which informs Bazel that it speaks the worker protocol. Bazel will decide whether to actually keep the process running as a persistent worker.

By also providing mnemonic attribute to the action, users will be able to control the scheduling if desired. Note the --strategy=DoWork=standalone flag passed to Bazel in the integration test in the /examples directory. This tells Bazel not to use workers. Similarly the user could set some other strategy like --strategy=DoWork=worker to explicitly opt-in.

BUILD.bazel defines the binary for the tool, then shows how it would be used by calling work(). Note that the usage site just calls the rule without knowing whether it uses workers for performance.