community/contributors/devel/bazel.md

3.3 KiB

Build with Bazel

Building with Bazel is currently experimental. Automanaged BUILD rules have the tag "automanaged" and are maintained by gazel. Instructions for installing Bazel can be found here.

Several make rules have been created for common operations:

  • make bazel-build: builds all binaries in tree
  • make bazel-test: runs all unit tests
  • make bazel-test-integration: runs all integration tests
  • make bazel-release: builds release tarballs, Docker images (for server components), and Debian images

You can also interact with Bazel directly; for example, to run all kubectl unit tests, run

$ bazel test //pkg/kubectl/...

Continuous Integration

The Bazel CI job runs make bazel-build, make bazel-test, and (transitively) make bazel-release. A similar job is run on all PRs.

Many steps are cached, so the Bazel job usually executes fairly quickly.

Known issues

Cross-compilation is not currently supported, so all binaries will be built for the host architecture running Bazel. Additionally, Go build tags are not supported. This means that builds on macOS may not work.

Binaries produced by Bazel are not statically linked, and they are not currently tagged with version information.

Bazel does not validate build environment, thus make sure that needed tools and development packages are installed in the system. Bazel builds require presense of make, gcc, g++, glibc and libstdc++ development headers and glibc static development libraries. Please check your distribution for exact names of the packages. Examples for some commonly used distributions are below:

Dependency Debian/Ubuntu CentOS OpenSuSE
Build essentials apt install build-essential yum groupinstall development zypper install -t pattern devel_C_C++
GCC C++ apt install g++ yum install gcc-c++ zypper install gcc-c++
GNU Libc static files apt install libc6-dev yum install glibc-static zypper install glibc-devel-static

Updating BUILD files

To update BUILD files, run:

$ ./hack/update-bazel.sh

NOTE: update-bazel.sh only works if check out directory of Kubernetes is $GOPATH/src/k8s.io/kubernetes.

Only rules which are automanaged will be updated, but all rules will be auto-formatted.

Updating the BUILD file for a package will be required when:

  • Files are added to or removed from a package
  • Import dependencies change for a package
  • A BUILD file has been updated and needs to be reformatted
  • A new BUILD file has been added (parent BUILD files will be updated)

Analytics