diff --git a/.github/workflows/e2e.yaml b/.github/workflows/e2e.yaml index 1ce0f9f66..dd688bfa4 100644 --- a/.github/workflows/e2e.yaml +++ b/.github/workflows/e2e.yaml @@ -12,6 +12,15 @@ jobs: steps: - name: Checkout uses: actions/checkout@v2 + - name: Setup QEMU + uses: docker/setup-qemu-action@v1 + with: + platforms: all + - name: Setup Docker Buildx + id: buildx + uses: docker/setup-buildx-action@v1 + with: + buildkitd-flags: "--debug" - name: Restore Go cache uses: actions/cache@v1 with: @@ -19,6 +28,14 @@ jobs: key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} restore-keys: | ${{ runner.os }}-go- + - name: Cache Docker layers + uses: actions/cache@v2 + id: cache + with: + path: /tmp/.buildx-cache + key: ${{ runner.os }}-buildx-ghcache-${{ github.sha }} + restore-keys: | + ${{ runner.os }}-buildx-ghcache- - name: Setup Go uses: actions/setup-go@v2 with: @@ -44,9 +61,18 @@ jobs: exit 1 fi - name: Build container image - run: make docker-build IMG=test/notification-controller:latest - env: - KUBEBUILDER_ASSETS: ${{ github.workspace }}/kubebuilder/bin + run: | + make docker-build IMG=test/notification-controller:latest \ + BUILD_PLATFORMS=linux/amd64 \ + BUILD_ARGS="--cache-from=type=local,src=/tmp/.buildx-cache \ + --cache-to=type=local,dest=/tmp/.buildx-cache-new,mode=max" + - # Temp fix + # https://github.com/docker/build-push-action/issues/252 + # https://github.com/moby/buildkit/issues/1896 + name: Move cache + run: | + rm -rf /tmp/.buildx-cache + mv /tmp/.buildx-cache-new /tmp/.buildx-cache - name: Load test image run: kind load docker-image test/notification-controller:latest - name: Install CRDs diff --git a/Dockerfile b/Dockerfile index 555bd56c9..8bfdfeae0 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,13 @@ -FROM golang:1.16-alpine as builder +ARG XX_VERSION=1.0.0-rc.2 + +FROM --platform=$BUILDPLATFORM tonistiigi/xx:${XX_VERSION} AS xx + +FROM --platform=$BUILDPLATFORM golang:1.16-alpine as builder + +# Copy the build utilities. +COPY --from=xx / / + +ARG TARGETPLATFORM WORKDIR /workspace @@ -18,7 +27,8 @@ COPY controllers/ controllers/ COPY internal/ internal/ # build -RUN CGO_ENABLED=0 go build -a -o notification-controller main.go +ENV CGO_ENABLED=0 +RUN xx-go build -a -o notification-controller main.go FROM alpine:3.13 diff --git a/Makefile b/Makefile index e665f4221..993c694ce 100644 --- a/Makefile +++ b/Makefile @@ -10,6 +10,11 @@ else GOBIN=$(shell go env GOBIN) endif +# Allows for defining additional Docker buildx arguments, e.g. '--push'. +BUILD_ARGS ?= +# Architectures to build images for. +BUILD_PLATFORMS ?= linux/amd64 + all: manager # Run tests @@ -81,8 +86,12 @@ generate: controller-gen cd api; $(CONTROLLER_GEN) object:headerFile="../hack/boilerplate.go.txt" paths="./..." # Build the docker image -docker-build: test - docker build . -t ${IMG} +docker-build: + docker buildx build \ + --platform=$(BUILD_PLATFORMS) \ + -t ${IMG} \ + --load \ + ${BUILD_ARGS} . # Push the docker image docker-push: