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 <codeberg@crapstone.dev>
Co-authored-by: pat-s <patrick.schratz@gmail.com>
Co-committed-by: pat-s <patrick.schratz@gmail.com>
This commit is contained in:
pat-s 2024-04-29 12:46:00 +00:00 committed by Patrick Schratz
parent 8cba7f9c8a
commit d09c6e1218
2 changed files with 33 additions and 9 deletions

View file

@ -29,10 +29,11 @@ steps:
docker-dryrun: docker-dryrun:
depends_on: vendor depends_on: vendor
image: plugins/kaniko:1.8.8 image: woodpeckerci/plugin-docker-buildx:3.2.1
settings: settings:
dockerfile: Dockerfile dockerfile: Dockerfile
no_push: true platforms: linux/amd64
dry-run: true
tags: latest tags: latest
when: when:
- event: [push, pull_request] - event: [push, pull_request]
@ -98,10 +99,11 @@ steps:
docker-next: docker-next:
depends_on: vendor depends_on: vendor
image: plugins/kaniko:1.8.8 image: woodpeckerci/plugin-docker-buildx:3.2.1
settings: settings:
registry: codeberg.org registry: codeberg.org
dockerfile: Dockerfile dockerfile: Dockerfile
platforms: linux/amd64,arm64
repo: codeberg.org/codeberg/pages-server repo: codeberg.org/codeberg/pages-server
tags: next tags: next
username: username:
@ -114,10 +116,11 @@ steps:
docker-tag: docker-tag:
depends_on: vendor depends_on: vendor
image: plugins/kaniko:1.8.8 image: woodpeckerci/plugin-docker-buildx:3.2.1
settings: settings:
registry: codeberg.org registry: codeberg.org
dockerfile: Dockerfile dockerfile: Dockerfile
platforms: linux/amd64,arm64
repo: codeberg.org/codeberg/pages-server repo: codeberg.org/codeberg/pages-server
tags: [latest, '${CI_COMMIT_TAG}'] tags: [latest, '${CI_COMMIT_TAG}']
username: username:

View file

@ -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 . . # Set the working directory and copy the source code
RUN CGO_ENABLED=1 go build -tags 'sqlite sqlite_unlock_notify netgo' -ldflags '-s -w -extldflags "-static" -linkmode external' . 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 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 \ COPY --from=build \
/etc/ssl/certs/ca-certificates.crt \ /etc/ssl/certs/ca-certificates.crt \
/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"] ENTRYPOINT ["/pages"]