| # Hermetic build |
| |
| Hafnium build is not hermetic as it uses some system tools and libraries, e.g. |
| `bison` and `libssl`. To ensure consistency and repeatability, the team |
| maintains and periodically publishes a container image as the reference build |
| environment. The image is hosted on Google Cloud Platform as |
| `eu.gcr.io/hafnium-build/hafnium_ci`. |
| |
| Building inside a container is always enabled only for Kokoro pre-submit tests |
| but can be enabled for local builds too. It is disabled by default as it |
| requires the use of Docker which currently supports rootless containers only in |
| nightly builds. As rootless container tools mature, Hafnium may change the |
| default settings. For now, running the hermetic build locally is intended |
| primarily to reproduce issues in pre-submit tests. |
| |
| [TOC] |
| |
| ## Installing Docker |
| |
| ### Stable |
| |
| If you don't mind running a Docker daemon with root privileges on your system, |
| you can follow the [official guide](https://docs.docker.com/install/) to install |
| Docker, or [go/installdocker](https://goto.google.com/installdocker) if you are |
| a Googler. |
| |
| Because the daemon runs as root, files generated by the container are owned by |
| root as well. To work around this, the build will automatically derive a local |
| container image from the base container, adding user `hafnium` with the same |
| UID/GID as the local user. |
| |
| ### Nightly with rootless |
| |
| The latest nightly version of Docker has support for running containers with |
| user namespaces, thus eliminating the need for a daemon with root privileges. It |
| can be installed into the local user's `bin` directory with a script: |
| |
| ```shell |
| curl -fsSL https://get.docker.com/rootless -o get-docker.sh |
| sh get-docker.sh |
| ``` |
| |
| The script will also walk you through the installation of dependencies, changes |
| to system configuration files and environment variable values needed by the |
| client to discover the rootless daemon. |
| |
| ## Enabling for local builds |
| |
| Hermetic builds are controlled by the `HAFNIUM_HERMETIC_BUILD` environment |
| variable. Setting it to `true` instructs the build to run commands inside the |
| container. Any other value disables the feature. |
| |
| To always enable hermetic builds, put this line in your `~/.bashrc`: |
| |
| ```shell |
| export HAFNIUM_HERMETIC_BUILD=true |
| ``` |
| |
| When you now run `make`, you should see the following line: |
| |
| ```shell |
| $ make |
| Running in container: make all |
| ... |
| ``` |
| |
| ## Running commands inside the container |
| |
| An arbitrary command can be executed inside the container with |
| `build/run_in_container.sh [-i] <command> ...`. This is done automatically |
| inside `Makefile` and `kokoro/build.sh` which detect whether they are already |
| running inside the container and respawn themselves using `run_in_container.sh` |
| if not. |
| |
| For example, you can spawn a shell with: |
| |
| ```shell |
| ./build/run_in_container.sh -i bash |
| ``` |
| |
| ## Building container image |
| |
| The container image is defined in `build/docker/Dockerfile` and can be built |
| locally: |
| |
| ```shell |
| ./build/docker/build.sh |
| ``` |
| |
| Owners of the `hafnium-build` GCP repository can publish the new image (requires |
| [go/cloud-sdk](https://goto.google.com/cloud-sdk) installed and authenticated): |
| |
| ```shell |
| ./build/docker/publish.sh |
| ``` |