diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index b950895c..63c02015 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -12,6 +12,13 @@ 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 - name: Restore go cache uses: actions/cache@v1 with: @@ -19,6 +26,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: Set up Go uses: actions/setup-go@v2 with: @@ -28,4 +43,15 @@ jobs: - name: Run tests run: make test - name: Build container image - run: make docker-build IMG=ghcr.io/fluxcd/${{ github.event.repository.name }}:latest + run: | + make docker-build IMG=ghcr.io/fluxcd/${{ github.event.repository.name }}: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 diff --git a/Dockerfile b/Dockerfile index 8f260127..da59d14d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,16 @@ +ARG XX_VERSION=1.0.0-rc.2 + +FROM --platform=$BUILDPLATFORM tonistiigi/xx:${XX_VERSION} AS xx + # Build the manager binary -FROM golang:1.16-alpine as builder +FROM --platform=$BUILDPLATFORM golang:1.16-alpine AS builder + +# Copy the build utilities. +COPY --from=xx / / + +ARG TARGETPLATFORM +# Configure workspace. WORKDIR /workspace # copy modules manifests @@ -20,7 +30,8 @@ COPY controllers/ controllers/ COPY internal/ internal/ # build without giving the arch, so that it gets it from the machine -RUN CGO_ENABLED=0 go build -a -o image-reflector-controller main.go +ENV CGO_ENABLED=0 +RUN xx-go build -a -o image-reflector-controller main.go FROM alpine:3.13 diff --git a/Makefile b/Makefile index 2fb806ea..3952478b 100644 --- a/Makefile +++ b/Makefile @@ -6,6 +6,11 @@ CRD_OPTIONS ?= crd:crdVersions=v1 ENVTEST_BIN_VERSION?=1.22.0 KUBEBUILDER_ASSETS?=$(shell $(SETUP_ENVTEST) use -i $(ENVTEST_BIN_VERSION) -p path) +# Allows for defining additional Docker buildx arguments, e.g. '--push'. +BUILD_ARGS ?= +# Architectures to build images for. +BUILD_PLATFORMS ?= linux/amd64 + # Get the currently used golang install path (in GOPATH/bin, unless GOBIN is set) ifeq (,$(shell go env GOBIN)) GOBIN=$(shell go env GOPATH)/bin @@ -76,8 +81,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: