Batch Changes design
Why is the Batch Changes feature designed the way it is?
Principles
-
Declarative API (not imperative). You declare your intent, such as "lint files in all repositories with a
package.jsonfile" -
Define a batch change in a file (not some online API). The source of truth of a batch change's definition is a file that can be stored in version control, reviewed in code review, and re-applied by CI. This is in the same spirit as IaaC (infrastructure as code; e.g., storing your Terraform/Kubernetes/etc. files in Git). We prefer this approach over a (worse) alternative where you define a batch change in a UI with a bunch of text fields, checkboxes, buttons, etc., and need to write a custom API client to import/export the batch change definition.
-
Shareable and portable. You can share your batch specs, and it's easy for other people to use them. A batch spec expresses an intent that's high-level enough to (usually) not be specific to your own particular repositories. You declare and inject configuration and secrets to customize it instead of hard-coding those values.
-
Large-scale. You can run batch changes across 10,000s of repositories. It might take a while to compute and push everything, and the current implementation might cap out lower than that, but the fundamental design scales well.
-
Accommodates a variety of code hosts and review/merge processes. Specifically, we don't want Batch Changes to only work for GitHub pull requests. (See current support list.)
Comparison to other distributed systems
Kubernetes is a distributed system with an API that many people are familiar with. Batch Changes is also a distributed system. All APIs for distributed systems need to handle a similar set of concerns around robustness, consistency, etc. Here's a comparison showing how these concerns are handled for a Kubernetes Deployment and a batch change. In some cases, we've found Kubernetes to be a good source of inspiration for the Batch Changes API, but resembling Kubernetes is not an explicit goal.
These docs explain more about Kubernetes' design:


