From a85213b1777df8f07ffda1932f472e6762223ce2 Mon Sep 17 00:00:00 2001 From: Robert Kaussow Date: Sun, 15 Jan 2023 16:33:26 +0100 Subject: [PATCH] refactor: use buildx for multiarch container builds --- .drone.jsonnet | 195 --------------------- .drone.yml | 209 +++-------------------- .prettierignore | 3 - Dockerfile.arm | 42 ----- Dockerfile.arm64 | 42 ----- Dockerfile.amd64 => Dockerfile.multiarch | 8 +- manifest-quay.tmpl | 24 --- manifest.tmpl | 24 --- 8 files changed, 29 insertions(+), 518 deletions(-) delete mode 100644 .drone.jsonnet delete mode 100644 .prettierignore delete mode 100644 Dockerfile.arm delete mode 100644 Dockerfile.arm64 rename Dockerfile.amd64 => Dockerfile.multiarch (91%) delete mode 100644 manifest-quay.tmpl delete mode 100644 manifest.tmpl diff --git a/.drone.jsonnet b/.drone.jsonnet deleted file mode 100644 index a665cb8..0000000 --- a/.drone.jsonnet +++ /dev/null @@ -1,195 +0,0 @@ -local PipelineTest = { - kind: 'pipeline', - name: 'test', - platform: { - os: 'linux', - arch: 'amd64', - }, - steps: [ - { - name: 'markdownlint', - image: 'thegeeklab/markdownlint-cli', - commands: [ - "markdownlint 'README.md'", - ], - }, - ], - trigger: { - ref: ['refs/heads/main', 'refs/tags/**', 'refs/pull/**'], - }, -}; - -local PipelineBuildContainer(arch='amd64') = { - kind: 'pipeline', - name: 'build-container-' + std.split(arch, '_')[0], - platform: { - os: 'linux', - arch: 'amd64', - }, - steps: [ - { - name: 'tags', - image: 'thegeeklab/docker-autotag', - environment: { - DOCKER_AUTOTAG_FORCE_LATEST: 'True', - DOCKER_AUTOTAG_IGNORE_PRERELEASE: 'True', - DOCKER_AUTOTAG_OUTPUT_FILE: '.tags', - DOCKER_AUTOTAG_VERSION: '${DRONE_TAG}', - DOCKER_AUTOTAG_SUFFIX: std.split(arch, '_')[0], - }, - }, - { - name: 'dryrun', - image: 'thegeeklab/drone-docker-buildx:20', - settings: { - dry_run: true, - dockerfile: 'Dockerfile.' + std.split(arch, '_')[0], - platforms: [ - 'linux/' + std.strReplace(arch, '_', '/'), - ], - repo: 'thegeeklab/${DRONE_REPO_NAME}', - }, - depends_on: ['tags'], - when: { - ref: ['refs/pull/**'], - }, - }, - { - name: 'publish-dockerhub', - image: 'thegeeklab/drone-docker-buildx:20', - settings: { - dockerfile: 'Dockerfile.' + std.split(arch, '_')[0], - repo: 'thegeeklab/${DRONE_REPO_NAME}', - username: { from_secret: 'docker_username' }, - password: { from_secret: 'docker_password' }, - }, - when: { - ref: ['refs/heads/main', 'refs/tags/**'], - }, - depends_on: ['tags'], - }, - { - name: 'publish-quay', - image: 'thegeeklab/drone-docker-buildx:20', - settings: { - dockerfile: 'Dockerfile.' + std.split(arch, '_')[0], - registry: 'quay.io', - repo: 'quay.io/thegeeklab/${DRONE_REPO_NAME}', - username: { from_secret: 'quay_username' }, - password: { from_secret: 'quay_password' }, - }, - when: { - ref: ['refs/heads/main', 'refs/tags/**'], - }, - depends_on: ['tags'], - }, - ], - depends_on: [ - 'test', - ], - trigger: { - ref: ['refs/heads/main', 'refs/tags/**', 'refs/pull/**'], - }, -}; - -local PipelineNotifications = { - kind: 'pipeline', - name: 'notifications', - platform: { - os: 'linux', - arch: 'amd64', - }, - steps: [ - { - image: 'plugins/manifest', - name: 'manifest-dockerhub', - settings: { - ignore_missing: true, - username: { from_secret: 'docker_username' }, - password: { from_secret: 'docker_password' }, - spec: 'manifest.tmpl', - }, - when: { - status: ['success'], - }, - }, - { - image: 'plugins/manifest', - name: 'manifest-quay', - settings: { - ignore_missing: true, - username: { from_secret: 'quay_username' }, - password: { from_secret: 'quay_password' }, - spec: 'manifest-quay.tmpl', - }, - when: { - status: ['success'], - }, - }, - { - name: 'pushrm-dockerhub', - pull: 'always', - image: 'chko/docker-pushrm:1', - environment: { - DOCKER_PASS: { - from_secret: 'docker_password', - }, - DOCKER_USER: { - from_secret: 'docker_username', - }, - PUSHRM_FILE: 'README.md', - PUSHRM_SHORT: 'Custom Alpine image including a common toolset', - PUSHRM_TARGET: 'thegeeklab/${DRONE_REPO_NAME}', - }, - when: { - status: ['success'], - }, - }, - { - name: 'pushrm-quay', - pull: 'always', - image: 'chko/docker-pushrm:1', - environment: { - APIKEY__QUAY_IO: { - from_secret: 'quay_token', - }, - PUSHRM_FILE: 'README.md', - PUSHRM_TARGET: 'quay.io/thegeeklab/${DRONE_REPO_NAME}', - }, - when: { - status: ['success'], - }, - }, - { - name: 'matrix', - image: 'thegeeklab/drone-matrix', - settings: { - homeserver: { from_secret: 'matrix_homeserver' }, - roomid: { from_secret: 'matrix_roomid' }, - template: 'Status: **{{ build.Status }}**
Build: [{{ repo.Owner }}/{{ repo.Name }}]({{ build.Link }}){{#if build.Branch}} ({{ build.Branch }}){{/if}} by {{ commit.Author }}
Message: {{ commit.Message.Title }}', - username: { from_secret: 'matrix_username' }, - password: { from_secret: 'matrix_password' }, - }, - when: { - status: ['success', 'failure'], - }, - }, - ], - depends_on: [ - 'build-container-amd64', - 'build-container-arm64', - 'build-container-arm', - ], - trigger: { - ref: ['refs/heads/main', 'refs/tags/**'], - status: ['success', 'failure'], - }, -}; - -[ - PipelineTest, - PipelineBuildContainer(arch='amd64'), - PipelineBuildContainer(arch='arm64_v8'), - PipelineBuildContainer(arch='arm_v7'), - PipelineNotifications, -] diff --git a/.drone.yml b/.drone.yml index b4e3156..5305401 100644 --- a/.drone.yml +++ b/.drone.yml @@ -20,7 +20,7 @@ trigger: --- kind: pipeline -name: build-container-amd64 +name: build-container platform: os: linux @@ -33,164 +33,19 @@ steps: DOCKER_AUTOTAG_FORCE_LATEST: True DOCKER_AUTOTAG_IGNORE_PRERELEASE: True DOCKER_AUTOTAG_OUTPUT_FILE: .tags - DOCKER_AUTOTAG_SUFFIX: amd64 DOCKER_AUTOTAG_VERSION: ${DRONE_TAG} - name: dryrun image: thegeeklab/drone-docker-buildx:20 settings: - dockerfile: Dockerfile.amd64 + dockerfile: Dockerfile.multiarch dry_run: true platforms: - linux/amd64 - repo: thegeeklab/${DRONE_REPO_NAME} - when: - ref: - - refs/pull/** - depends_on: - - tags - - - name: publish-dockerhub - image: thegeeklab/drone-docker-buildx:20 - settings: - dockerfile: Dockerfile.amd64 - password: - from_secret: docker_password - repo: thegeeklab/${DRONE_REPO_NAME} - username: - from_secret: docker_username - when: - ref: - - refs/heads/main - - refs/tags/** - depends_on: - - tags - - - name: publish-quay - image: thegeeklab/drone-docker-buildx:20 - settings: - dockerfile: Dockerfile.amd64 - password: - from_secret: quay_password - registry: quay.io - repo: quay.io/thegeeklab/${DRONE_REPO_NAME} - username: - from_secret: quay_username - when: - ref: - - refs/heads/main - - refs/tags/** - depends_on: - - tags - -trigger: - ref: - - refs/heads/main - - refs/tags/** - - refs/pull/** - -depends_on: - - test - ---- -kind: pipeline -name: build-container-arm64 - -platform: - os: linux - arch: amd64 - -steps: - - name: tags - image: thegeeklab/docker-autotag - environment: - DOCKER_AUTOTAG_FORCE_LATEST: True - DOCKER_AUTOTAG_IGNORE_PRERELEASE: True - DOCKER_AUTOTAG_OUTPUT_FILE: .tags - DOCKER_AUTOTAG_SUFFIX: arm64 - DOCKER_AUTOTAG_VERSION: ${DRONE_TAG} - - - name: dryrun - image: thegeeklab/drone-docker-buildx:20 - settings: - dockerfile: Dockerfile.arm64 - dry_run: true - platforms: - - linux/arm64/v8 - repo: thegeeklab/${DRONE_REPO_NAME} - when: - ref: - - refs/pull/** - depends_on: - - tags - - - name: publish-dockerhub - image: thegeeklab/drone-docker-buildx:20 - settings: - dockerfile: Dockerfile.arm64 - password: - from_secret: docker_password - repo: thegeeklab/${DRONE_REPO_NAME} - username: - from_secret: docker_username - when: - ref: - - refs/heads/main - - refs/tags/** - depends_on: - - tags - - - name: publish-quay - image: thegeeklab/drone-docker-buildx:20 - settings: - dockerfile: Dockerfile.arm64 - password: - from_secret: quay_password - registry: quay.io - repo: quay.io/thegeeklab/${DRONE_REPO_NAME} - username: - from_secret: quay_username - when: - ref: - - refs/heads/main - - refs/tags/** - depends_on: - - tags - -trigger: - ref: - - refs/heads/main - - refs/tags/** - - refs/pull/** - -depends_on: - - test - ---- -kind: pipeline -name: build-container-arm - -platform: - os: linux - arch: amd64 - -steps: - - name: tags - image: thegeeklab/docker-autotag - environment: - DOCKER_AUTOTAG_FORCE_LATEST: True - DOCKER_AUTOTAG_IGNORE_PRERELEASE: True - DOCKER_AUTOTAG_OUTPUT_FILE: .tags - DOCKER_AUTOTAG_SUFFIX: arm - DOCKER_AUTOTAG_VERSION: ${DRONE_TAG} - - - name: dryrun - image: thegeeklab/drone-docker-buildx:20 - settings: - dockerfile: Dockerfile.arm - dry_run: true - platforms: + - linux/arm64 - linux/arm/v7 + - linux/arm/v6 + provenance: false repo: thegeeklab/${DRONE_REPO_NAME} when: ref: @@ -201,9 +56,15 @@ steps: - name: publish-dockerhub image: thegeeklab/drone-docker-buildx:20 settings: - dockerfile: Dockerfile.arm + dockerfile: Dockerfile.multiarch password: from_secret: docker_password + platforms: + - linux/amd64 + - linux/arm64 + - linux/arm/v7 + - linux/arm/v6 + provenance: false repo: thegeeklab/${DRONE_REPO_NAME} username: from_secret: docker_username @@ -212,14 +73,20 @@ steps: - refs/heads/main - refs/tags/** depends_on: - - tags + - dryrun - name: publish-quay image: thegeeklab/drone-docker-buildx:20 settings: - dockerfile: Dockerfile.arm + dockerfile: Dockerfile.multiarch password: from_secret: quay_password + platforms: + - linux/amd64 + - linux/arm64 + - linux/arm/v7 + - linux/arm/v6 + provenance: false registry: quay.io repo: quay.io/thegeeklab/${DRONE_REPO_NAME} username: @@ -229,7 +96,7 @@ steps: - refs/heads/main - refs/tags/** depends_on: - - tags + - dryrun trigger: ref: @@ -249,34 +116,7 @@ platform: arch: amd64 steps: - - name: manifest-dockerhub - image: plugins/manifest - settings: - ignore_missing: true - password: - from_secret: docker_password - spec: manifest.tmpl - username: - from_secret: docker_username - when: - status: - - success - - - name: manifest-quay - image: plugins/manifest - settings: - ignore_missing: true - password: - from_secret: quay_password - spec: manifest-quay.tmpl - username: - from_secret: quay_username - when: - status: - - success - - name: pushrm-dockerhub - pull: always image: chko/docker-pushrm:1 environment: DOCKER_PASS: @@ -291,7 +131,6 @@ steps: - success - name: pushrm-quay - pull: always image: chko/docker-pushrm:1 environment: APIKEY__QUAY_IO: @@ -328,12 +167,10 @@ trigger: - failure depends_on: - - build-container-amd64 - - build-container-arm64 - - build-container-arm + - build-container --- kind: signature -hmac: d1a3479b9d0af5764dc58fa592e576b7936952f74ad7df10bf56034dfd07b4e8 +hmac: 41c358f249f44673f4b1967fc7891c56a872d82e983de4f6be3543ea6307c3a8 ... diff --git a/.prettierignore b/.prettierignore deleted file mode 100644 index 23a4f05..0000000 --- a/.prettierignore +++ /dev/null @@ -1,3 +0,0 @@ -.drone.yml -*.tpl.md -LICENSE diff --git a/Dockerfile.arm b/Dockerfile.arm deleted file mode 100644 index eb501a0..0000000 --- a/Dockerfile.arm +++ /dev/null @@ -1,42 +0,0 @@ -FROM arm32v7/node:lts-alpine3.16@sha256:6f0824b1c1b5f4265c94c16c9db09286bcb1dd4b717c441b312fd102764132fb - -LABEL maintainer="Robert Kaussow " -LABEL org.opencontainers.image.authors="Robert Kaussow " -LABEL org.opencontainers.image.title="alpine-tools" -LABEL org.opencontainers.image.url="https://gitea.rknet.org/docker/alpine-tools" -LABEL org.opencontainers.image.source="https://gitea.rknet.org/docker/alpine-tools" -LABEL org.opencontainers.image.documentation="https://gitea.rknet.org/docker/alpine-tools" - -ARG GOMPLATE_VERSION -ARG SUPERCRONIC_VERSION -ARG URL_PARSER_VERSION -ARG PRETTIER_VERSION - -# renovate: datasource=github-releases depName=hairyhenderson/gomplate -ENV GOMPLATE_VERSION="${GOMPLATE_VERSION:-v3.11.3}" -# renovate: datasource=github-releases depName=thegeeklab/url-parser -ENV URL_PARSER_VERSION="${URL_PARSER_VERSION:-v1.0.1}" -# renovate: datasource=npm depName=prettier -ENV PRETTIER_VERSION="${PRETTIER_VERSION:-2.8.3}" -# renovate: datasource=npm depName=spellchecker-cli -ENV SPELLCHECKER_VERSION="${SPELLCHECKER_VERSION:-6.1.1}" -# renovate: datasource=npm depName=js-beautify -ENV JSBEAUTIFY_VERSION="${JSBEAUTIFY_VERSION:-1.14.7}" - -RUN apk --update add curl make tar git && \ - curl -SsfL -o /usr/local/bin/gomplate "https://github.com/hairyhenderson/gomplate/releases/download/${GOMPLATE_VERSION}/gomplate_linux-armv7" && \ - curl -SsfL -o /usr/local/bin/url-parser "https://github.com/thegeeklab/url-parser/releases/download/${URL_PARSER_VERSION}/url-parser-linux-arm-7" && \ - chmod 755 /usr/local/bin/gomplate && \ - chmod 755 /usr/local/bin/url-parser && \ - npm install -q --location=global \ - "prettier@$PRETTIER_VERSION" \ - "spellchecker-cli@$SPELLCHECKER_VERSION" \ - "js-beautify@$JSBEAUTIFY_VERSION" && \ - rm -rf /var/cache/apk/* && \ - rm -rf /tmp/* - -ADD overlay/ / - -STOPSIGNAL SIGTERM - -CMD [] diff --git a/Dockerfile.arm64 b/Dockerfile.arm64 deleted file mode 100644 index 7e6eeb5..0000000 --- a/Dockerfile.arm64 +++ /dev/null @@ -1,42 +0,0 @@ -FROM arm64v8/node:lts-alpine3.16@sha256:f9ac855807f80666ae83b4d1eeb3a842d62ff89ddb42b37b591e63f915d0708c - -LABEL maintainer="Robert Kaussow " -LABEL org.opencontainers.image.authors="Robert Kaussow " -LABEL org.opencontainers.image.title="alpine-tools" -LABEL org.opencontainers.image.url="https://gitea.rknet.org/docker/alpine-tools" -LABEL org.opencontainers.image.source="https://gitea.rknet.org/docker/alpine-tools" -LABEL org.opencontainers.image.documentation="https://gitea.rknet.org/docker/alpine-tools" - -ARG GOMPLATE_VERSION -ARG SUPERCRONIC_VERSION -ARG URL_PARSER_VERSION -ARG PRETTIER_VERSION - -# renovate: datasource=github-releases depName=hairyhenderson/gomplate -ENV GOMPLATE_VERSION="${GOMPLATE_VERSION:-v3.11.3}" -# renovate: datasource=github-releases depName=thegeeklab/url-parser -ENV URL_PARSER_VERSION="${URL_PARSER_VERSION:-v1.0.1}" -# renovate: datasource=npm depName=prettier -ENV PRETTIER_VERSION="${PRETTIER_VERSION:-2.8.3}" -# renovate: datasource=npm depName=spellchecker-cli -ENV SPELLCHECKER_VERSION="${SPELLCHECKER_VERSION:-6.1.1}" -# renovate: datasource=npm depName=js-beautify -ENV JSBEAUTIFY_VERSION="${JSBEAUTIFY_VERSION:-1.14.7}" - -RUN apk --update add curl make tar git && \ - curl -SsfL -o /usr/local/bin/gomplate "https://github.com/hairyhenderson/gomplate/releases/download/${GOMPLATE_VERSION}/gomplate_linux-arm64" && \ - curl -SsfL -o /usr/local/bin/url-parser "https://github.com/thegeeklab/url-parser/releases/download/${URL_PARSER_VERSION}/url-parser-linux-arm64" && \ - chmod 755 /usr/local/bin/gomplate && \ - chmod 755 /usr/local/bin/url-parser && \ - npm install -q --location=global \ - "prettier@$PRETTIER_VERSION" \ - "spellchecker-cli@$SPELLCHECKER_VERSION" \ - "js-beautify@$JSBEAUTIFY_VERSION" && \ - rm -rf /var/cache/apk/* && \ - rm -rf /tmp/* - -ADD overlay/ / - -STOPSIGNAL SIGTERM - -CMD [] diff --git a/Dockerfile.amd64 b/Dockerfile.multiarch similarity index 91% rename from Dockerfile.amd64 rename to Dockerfile.multiarch index 40e4cab..5ba9c86 100644 --- a/Dockerfile.amd64 +++ b/Dockerfile.multiarch @@ -7,6 +7,10 @@ LABEL org.opencontainers.image.url="https://gitea.rknet.org/docker/alpine-tools" LABEL org.opencontainers.image.source="https://gitea.rknet.org/docker/alpine-tools" LABEL org.opencontainers.image.documentation="https://gitea.rknet.org/docker/alpine-tools" +ARG TARGETOS +ARG TARGETARCH +ARG TARGETVARIANT + ARG GOMPLATE_VERSION ARG SUPERCRONIC_VERSION ARG URL_PARSER_VERSION @@ -24,8 +28,8 @@ ENV SPELLCHECKER_VERSION="${SPELLCHECKER_VERSION:-6.1.1}" ENV JSBEAUTIFY_VERSION="${JSBEAUTIFY_VERSION:-1.14.7}" RUN apk --update add curl make tar git && \ - curl -SsfL -o /usr/local/bin/gomplate "https://github.com/hairyhenderson/gomplate/releases/download/${GOMPLATE_VERSION}/gomplate_linux-amd64" && \ - curl -SsfL -o /usr/local/bin/url-parser "https://github.com/thegeeklab/url-parser/releases/download/${URL_PARSER_VERSION}/url-parser-linux-amd64" && \ + curl -SsfL -o /usr/local/bin/gomplate "https://github.com/hairyhenderson/gomplate/releases/download/${GOMPLATE_VERSION}/gomplate_${TARGETOS}-${TARGETARCH}${TARGETVARIANT}" && \ + curl -SsfL -o /usr/local/bin/url-parser "https://github.com/thegeeklab/url-parser/releases/download/${URL_PARSER_VERSION}/url-parser-${TARGETOS}-${TARGETARCH}${TARGETVARIANT//v/-}" && \ chmod 755 /usr/local/bin/gomplate && \ chmod 755 /usr/local/bin/url-parser && \ npm install -q --location=global \ diff --git a/manifest-quay.tmpl b/manifest-quay.tmpl deleted file mode 100644 index 270f69e..0000000 --- a/manifest-quay.tmpl +++ /dev/null @@ -1,24 +0,0 @@ -image: quay.io/thegeeklab/alpine-tools:{{#if build.tag}}{{trimPrefix "v" build.tag}}{{else}}latest{{/if}} -{{#if build.tags}} -tags: -{{#each build.tags}} - - {{this}} -{{/each}} -{{/if}} -manifests: - - image: quay.io/thegeeklab/alpine-tools:{{#if build.tag}}{{trimPrefix "v" build.tag}}-{{/if}}amd64 - platform: - architecture: amd64 - os: linux - - - image: quay.io/thegeeklab/alpine-tools:{{#if build.tag}}{{trimPrefix "v" build.tag}}-{{/if}}arm64 - platform: - architecture: arm64 - os: linux - variant: v8 - - - image: quay.io/thegeeklab/alpine-tools:{{#if build.tag}}{{trimPrefix "v" build.tag}}-{{/if}}arm - platform: - architecture: arm - os: linux - variant: v7 diff --git a/manifest.tmpl b/manifest.tmpl deleted file mode 100644 index 927d354..0000000 --- a/manifest.tmpl +++ /dev/null @@ -1,24 +0,0 @@ -image: thegeeklab/alpine-tools:{{#if build.tag}}{{trimPrefix "v" build.tag}}{{else}}latest{{/if}} -{{#if build.tags}} -tags: -{{#each build.tags}} - - {{this}} -{{/each}} -{{/if}} -manifests: - - image: thegeeklab/alpine-tools:{{#if build.tag}}{{trimPrefix "v" build.tag}}-{{/if}}amd64 - platform: - architecture: amd64 - os: linux - - - image: thegeeklab/alpine-tools:{{#if build.tag}}{{trimPrefix "v" build.tag}}-{{/if}}arm64 - platform: - architecture: arm64 - os: linux - variant: v8 - - - image: thegeeklab/alpine-tools:{{#if build.tag}}{{trimPrefix "v" build.tag}}-{{/if}}arm - platform: - architecture: arm - os: linux - variant: v7