blob: aee1444c3baa0e3c4cd12e69ffadc321d0a9c626 [file] [log] [blame] [view]
# 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
```