From d09c6e12180467d5811e5ec929e57f633861cd17 Mon Sep 17 00:00:00 2001 From: pat-s Date: Mon, 29 Apr 2024 12:46:00 +0000 Subject: [PATCH] Multiarch images (#324) taken from #214 Configured to only build multiarch when also publishing (when running in `main` or for a release) ## Build time - amd64 & arm64: 07:42 - amd64 only: 04:26 Build time via kaniko building only amd64: ~ 6/7 min Reviewed-on: https://codeberg.org/Codeberg/pages-server/pulls/324 Reviewed-by: crapStone Co-authored-by: pat-s Co-committed-by: pat-s --- .woodpecker/build.yml | 11 +++++++---- Dockerfile | 31 ++++++++++++++++++++++++++----- 2 files changed, 33 insertions(+), 9 deletions(-) diff --git a/.woodpecker/build.yml b/.woodpecker/build.yml index a5ff820..1be4885 100644 --- a/.woodpecker/build.yml +++ b/.woodpecker/build.yml @@ -29,10 +29,11 @@ steps: docker-dryrun: depends_on: vendor - image: plugins/kaniko:1.8.8 + image: woodpeckerci/plugin-docker-buildx:3.2.1 settings: dockerfile: Dockerfile - no_push: true + platforms: linux/amd64 + dry-run: true tags: latest when: - event: [push, pull_request] @@ -98,10 +99,11 @@ steps: docker-next: depends_on: vendor - image: plugins/kaniko:1.8.8 + image: woodpeckerci/plugin-docker-buildx:3.2.1 settings: registry: codeberg.org dockerfile: Dockerfile + platforms: linux/amd64,arm64 repo: codeberg.org/codeberg/pages-server tags: next username: @@ -114,10 +116,11 @@ steps: docker-tag: depends_on: vendor - image: plugins/kaniko:1.8.8 + image: woodpeckerci/plugin-docker-buildx:3.2.1 settings: registry: codeberg.org dockerfile: Dockerfile + platforms: linux/amd64,arm64 repo: codeberg.org/codeberg/pages-server tags: [latest, '${CI_COMMIT_TAG}'] username: diff --git a/Dockerfile b/Dockerfile index eec97de..9c05cda 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,14 +1,35 @@ -FROM techknowlogick/xgo as build +# Set the default Go version as a build argument +ARG XGO="go-1.21.x" -WORKDIR /workspace +# Use xgo (a Go cross-compiler tool) as build image +FROM --platform=$BUILDPLATFORM techknowlogick/xgo:${XGO} as build -COPY . . -RUN CGO_ENABLED=1 go build -tags 'sqlite sqlite_unlock_notify netgo' -ldflags '-s -w -extldflags "-static" -linkmode external' . +# Set the working directory and copy the source code +WORKDIR /go/src/codeberg.org/codeberg/pages +COPY . /go/src/codeberg.org/codeberg/pages +# Set the target architecture (can be set using --build-arg), buildx set it automatically +ARG TARGETOS TARGETARCH + +# Build the binary using xgo +RUN --mount=type=cache,target=/root/.cache/go-build \ + --mount=type=cache,target=/go/pkg \ + GOOS=${TARGETOS} GOARCH=${TARGETARCH} CGO_ENABLED=1 \ + xgo -x -v --targets=${TARGETOS}/${TARGETARCH} -tags='sqlite sqlite_unlock_notify netgo' -ldflags='-s -w -extldflags "-static" -linkmode external' -out pages . + +# Use a scratch image as the base image for the final container, +# which will contain only the built binary and the CA certificates FROM scratch -COPY --from=build /workspace/pages /pages + +# Copy the built binary and the CA certificates from the build container to the final container +COPY --from=build /go/src/codeberg.org/codeberg/pages/ /pages COPY --from=build \ /etc/ssl/certs/ca-certificates.crt \ /etc/ssl/certs/ca-certificates.crt +# Expose ports 80 and 443 for the built binary to listen on +EXPOSE 80/tcp +EXPOSE 443/tcp + +# Set the entrypoint for the container to the built binary ENTRYPOINT ["/pages"]