From a6e214b654f28836cc8b93683dbfd5999282d11c Mon Sep 17 00:00:00 2001 From: kolaente Date: Sat, 12 Nov 2022 14:29:57 +0100 Subject: [PATCH] feat: use docker buildx to build multiarch images --- .dockerignore | 3 + .drone.yml | 194 +++++----------------------------- Dockerfile | 12 ++- Dockerfile.arm32 | 48 --------- docker-manifest-unstable.tmpl | 17 --- docker-manifest.tmpl | 23 ---- magefile.go | 14 +++ 7 files changed, 51 insertions(+), 260 deletions(-) delete mode 100644 Dockerfile.arm32 delete mode 100644 docker-manifest-unstable.tmpl delete mode 100644 docker-manifest.tmpl diff --git a/.dockerignore b/.dockerignore index 6c0b062b7..7c3e21f74 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,4 +1,7 @@ files/ +dist/ +logs/ + Dockerfile docker-manifest.tmpl docker-manifest-unstable.tmpl diff --git a/.drone.yml b/.drone.yml index 0cf56b4b1..bf628d0b9 100644 --- a/.drone.yml +++ b/.drone.yml @@ -627,102 +627,11 @@ steps: --- kind: pipeline type: docker -name: docker-arm-release +name: docker-release depends_on: - testing -platform: - os: linux - arch: arm64 - -trigger: - ref: - - refs/heads/main - - "refs/tags/**" - -steps: - - name: fetch-tags - image: docker:git - commands: - - git fetch --tags - - - name: docker-arm-unstable - image: plugins/docker:linux-arm - pull: true - settings: - username: - from_secret: docker_username - password: - from_secret: docker_password - repo: vikunja/api - tags: unstable-linux-arm - dockerfile: Dockerfile.arm32 - depends_on: [ fetch-tags ] - when: - ref: - - refs/heads/main - - - name: docker-arm - image: plugins/docker:linux-arm - pull: true - settings: - username: - from_secret: docker_username - password: - from_secret: docker_password - repo: vikunja/api - auto_tag: true - auto_tag_suffix: linux-arm - dockerfile: Dockerfile.arm32 - depends_on: [ fetch-tags ] - when: - ref: - - "refs/tags/**" - - - name: docker-arm64-unstable - image: plugins/docker:linux-arm64 - pull: true - settings: - username: - from_secret: docker_username - password: - from_secret: docker_password - repo: vikunja/api - tags: unstable-linux-arm64 - depends_on: [ fetch-tags ] - when: - ref: - - refs/heads/main - - - name: docker-arm64 - image: plugins/docker:linux-arm64 - pull: true - settings: - username: - from_secret: docker_username - password: - from_secret: docker_password - repo: vikunja/api - auto_tag: true - auto_tag_suffix: linux-arm64 - depends_on: [ fetch-tags ] - when: - ref: - - "refs/tags/**" - ---- -kind: pipeline -type: docker -name: docker-amd64-release - -depends_on: - - testing - -platform: - os: linux - arch: amd64 - trigger: ref: - refs/heads/main @@ -735,7 +644,8 @@ steps: - git fetch --tags - name: docker-unstable - image: plugins/docker:linux-amd64 + image: thegeeklab/drone-docker-buildx + privileged: true pull: true settings: username: @@ -743,86 +653,36 @@ steps: password: from_secret: docker_password repo: vikunja/api - tags: unstable-linux-amd64 - depends_on: [ fetch-tags ] - when: - ref: - - refs/heads/main - - - name: docker - image: plugins/docker:linux-amd64 - pull: true - settings: - username: - from_secret: docker_username - password: - from_secret: docker_password - repo: vikunja/api - auto_tag: true - auto_tag_suffix: linux-amd64 - depends_on: [ fetch-tags ] - when: - ref: - - "refs/tags/**" - ---- -kind: pipeline -type: docker -name: docker-manifest - -trigger: - ref: - - refs/heads/main - - "refs/tags/**" - -depends_on: - - docker-amd64-release - - docker-arm-release - -steps: - - name: manifest-unstable - pull: always - image: plugins/manifest - settings: tags: unstable - ignore_missing: true - spec: docker-manifest-unstable.tmpl - password: - from_secret: docker_password - username: - from_secret: docker_username + platforms: + - linux/386 + - linux/amd64 + - linux/arm/v6 + - linux/arm/v7 + - linux/arm64/v8 + depends_on: [ fetch-tags ] when: ref: - refs/heads/main - - name: manifest-release - pull: always - image: plugins/manifest + - name: docker-release + image: thegeeklab/drone-docker-buildx + privileged: true + pull: true settings: + username: + from_secret: docker_username + password: + from_secret: docker_password + repo: vikunja/api auto_tag: true - ignore_missing: true - spec: docker-manifest.tmpl - password: - from_secret: docker_password - username: - from_secret: docker_username - when: - ref: - - "refs/tags/**" - - - name: manifest-release-latest - pull: always - image: plugins/manifest - depends_on: - - clone - settings: - tags: latest - ignore_missing: true - spec: docker-manifest.tmpl - password: - from_secret: docker_password - username: - from_secret: docker_username + platforms: + - linux/386 + - linux/amd64 + - linux/arm/v6 + - linux/arm/v7 + - linux/arm64/v8 + depends_on: [ fetch-tags ] when: ref: - "refs/tags/**" @@ -861,6 +721,6 @@ steps: - failure --- kind: signature -hmac: 5500acb776acae4975592637767035c45af277f1f56c8d10ffd99f38761cd5c8 +hmac: 9af6de023ca9e78e0b485948b58764007cb169ee3cbcdd9e909c2049f5d20740 ... diff --git a/Dockerfile b/Dockerfile index 3c1bfd10f..f1094d3a2 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,9 +1,9 @@ ############## # Build stage -FROM golang:1.19-alpine AS build-env +FROM --platform=$BUILDPLATFORM techknowlogick/xgo:latest AS build-env -RUN apk --no-cache add build-base git && \ +RUN \ go install github.com/magefile/mage@latest && \ mv /go/bin/mage /usr/local/go/bin @@ -13,9 +13,11 @@ ARG VIKUNJA_VERSION COPY . /go/src/code.vikunja.io/api WORKDIR /go/src/code.vikunja.io/api +ARG TARGETOS TARGETARCH TARGETVARIANT # Checkout version if set -RUN if [ -n "${VIKUNJA_VERSION}" ]; then git checkout "${VIKUNJA_VERSION}"; fi \ - && mage build:clean build +RUN if [ -n "${VIKUNJA_VERSION}" ]; then git checkout "${VIKUNJA_VERSION}"; fi && \ + mage build:clean && \ + mage release:xgo $TARGETOS/$TARGETARCH/$TARGETVARIANT ################### # The actual image @@ -25,7 +27,7 @@ FROM alpine:3.16 LABEL maintainer="maintainers@vikunja.io" WORKDIR /app/vikunja/ -COPY --from=build-env /go/src/code.vikunja.io/api/vikunja . +COPY --from=build-env /build/vikunja-* vikunja ENV VIKUNJA_SERVICE_ROOTPATH=/app/vikunja/ # Dynamic permission changing stuff diff --git a/Dockerfile.arm32 b/Dockerfile.arm32 deleted file mode 100644 index 005799aa8..000000000 --- a/Dockerfile.arm32 +++ /dev/null @@ -1,48 +0,0 @@ - -############## -# Build stage -FROM golang:1.19-buster AS build-env - -RUN go install github.com/magefile/mage@latest && \ - mv /go/bin/mage /usr/local/go/bin - -ARG VIKUNJA_VERSION - -# Setup repo -COPY . /go/src/code.vikunja.io/api -WORKDIR /go/src/code.vikunja.io/api - -# Checkout version if set -RUN if [ -n "${VIKUNJA_VERSION}" ]; then git checkout "${VIKUNJA_VERSION}"; fi \ - && mage build:clean build - -################### -# The actual image -# Note: I wanted to use the scratch image here, but unfortunatly the go-sqlite bindings require cgo and -# because of this, the container would not start when I compiled the image without cgo. -# We're using debian as a base image here because the latest alpine image does not work with arm. -FROM debian:buster-slim -LABEL maintainer="maintainers@vikunja.io" - -WORKDIR /app/vikunja/ -COPY --from=build-env /go/src/code.vikunja.io/api/vikunja . -ENV VIKUNJA_SERVICE_ROOTPATH=/app/vikunja/ - -# Dynamic permission changing stuff -ENV PUID 1000 -ENV PGID 1000 -RUN addgroup --gid ${PGID} vikunja && \ - chown ${PUID} -R /app/vikunja && \ - useradd --shell /bin/sh --gid vikunja --uid ${PUID} --home-dir /app/vikunja vikunja -COPY run.sh /run.sh - -# Fix time zone settings not working -RUN apt-get update && apt-get install -y tzdata && apt-get clean - -# Files permissions -RUN mkdir /app/vikunja/files && \ - chown -R vikunja /app/vikunja/files -VOLUME /app/vikunja/files - -CMD ["/run.sh"] -EXPOSE 3456 diff --git a/docker-manifest-unstable.tmpl b/docker-manifest-unstable.tmpl deleted file mode 100644 index d06b47536..000000000 --- a/docker-manifest-unstable.tmpl +++ /dev/null @@ -1,17 +0,0 @@ -image: vikunja/api:unstable -manifests: - - - image: vikunja/api:unstable-linux-amd64 - platform: - architecture: amd64 - os: linux - - - image: vikunja/api:unstable-linux-arm64 - platform: - architecture: arm64 - os: linux - - - image: vikunja/api:unstable-linux-arm - platform: - architecture: arm - os: linux diff --git a/docker-manifest.tmpl b/docker-manifest.tmpl deleted file mode 100644 index 4561c5f03..000000000 --- a/docker-manifest.tmpl +++ /dev/null @@ -1,23 +0,0 @@ -image: vikunja/api:{{#if build.tag}}{{trimPrefix "v" build.tag}}{{else}}latest{{/if}} -{{#if build.tags}} -tags: -{{#each build.tags}} - - {{this}} -{{/each}} -{{/if}} -manifests: - - - image: vikunja/api:{{#if build.tag}}{{trimPrefix "v" build.tag}}-{{/if}}linux-amd64 - platform: - architecture: amd64 - os: linux - - - image: vikunja/api:{{#if build.tag}}{{trimPrefix "v" build.tag}}-{{/if}}linux-arm64 - platform: - architecture: arm64 - os: linux - - - image: vikunja/api:{{#if build.tag}}{{trimPrefix "v" build.tag}}-{{/if}}linux-arm - platform: - architecture: arm - os: linux diff --git a/magefile.go b/magefile.go index 4ba5e1479..9cce8eaca 100644 --- a/magefile.go +++ b/magefile.go @@ -546,6 +546,20 @@ func (Release) Darwin() error { return runXgo("darwin-10.15/*") } +func (Release) Xgo(target string) error { + parts := strings.Split(target, "/") + if len(parts) < 2 { + return fmt.Errorf("invalid target") + } + + variant := "" + if len(parts) > 2 && parts[2] != "" { + variant = "-" + strings.ReplaceAll(parts[2], "v", "") + } + + return runXgo(parts[0] + "/" + parts[1] + variant) +} + // Compresses the built binaries in dist/binaries/ to reduce their filesize func (Release) Compress(ctx context.Context) error { // $(foreach file,$(filter-out $(wildcard $(wildcard $(DIST)/binaries/$(EXECUTABLE)-*mips*)),$(wildcard $(DIST)/binaries/$(EXECUTABLE)-*)), upx -9 $(file);)