In 2020, I led the redesign and re-implementation of the object storage system behind RelativityOne.
As part of this project we reengineered the continuous delivery pipeline of the service to embrace the philosophy of a service-wide monorepo with a Bazel-based build system. We chose Bazel because we wanted a build system that could support many different languages (the service has code written in C, C#, Python, Go, Terraform, Packer, and other languages…) while remaining fast and correct.
During this project we wrote seven new Bazel rulesets and a huge amount of Bazel-based build code.
This post series is about the many tips and tricks that we learned along the way as we wrote hundreds of thousands of lines of code in multiple languages to support this storage service.
1 - General Tips and Tricks
- Practical Bazel: Start with Genrules
- Practical Bazel: Excluding Part of Tree
- Practical Bazel: Wrapping Run Targets to Provide Additional Context
- Practical Bazel: A Simpler Way to Wrap Run Targets
- Practical Bazel: Use Awesome Bazel to find rules
2 - Best Practices
- Practical Bazel: Use a Specific Version of Bazel
- Practical Bazel: Enable Bash Strict Mode
- Practical Bazel: Use ctx.actions.args() to Form Arguments Lists