Bazel builds

Overview

Building with bazel offers a deterministic, faster build, including creating smaller docker images.

While bazel works well for small projects, building with kubernetes still has a few challenges. We take the following approach:

  • We don't yet generate files in bazel - we use external scripts (for now)
  • We vendor our dependencies, rather than relying on gazelle (although actually gazelle works, the issue is when external dependencies like apimachinery include bazel files that confuse gazelle)
  • We strip bazel files from external dependencies, so we don't confuse gazelle

Bazel versions:

For building kops release branches 1.14 and older, you may need to run an older version of bazel such as 0.24.0. kops 1.15 and newer should be able to use more recent versions of bazel due to deprecation fixes that have not be backported.

How to run

make bazel-build
make bazel-build-cli

# To build end to end and upload to s3
make bazel-upload

Test:

make bazel-test

Regenerate bazel files using gazelle:

make gazelle

Other changes needed

  • By default the go_test command doesn't allow tests to use data. So we need to use data = glob(["testdata/**"]), or similar. We add # keep to stop gazelle from removing it. data doesn't make it easy to access files in a parent directory, so we'll have to clean up some of the test / package structure.