blob: 74a9be59c80eb6a0b1f3049d44c12f5b1ee75ad5 [file] [view]
# 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.