From 637cebb043771a72d9b9f2cf3d54c78286cf8088 Mon Sep 17 00:00:00 2001 From: Gareth Latty Date: Tue, 1 Jun 2021 01:23:06 +0100 Subject: [PATCH] Move to docker buildx bake for builds, build for arm64. --- .github/workflows/build.yml | 99 +++++++++++++------------------------ client/Dockerfile | 2 +- docker-bake.hcl | 64 ++++++++++++++++++++++++ server/Dockerfile | 4 +- 4 files changed, 101 insertions(+), 68 deletions(-) create mode 100644 docker-bake.hcl diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 20a6e43..2c39aab 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -7,81 +7,50 @@ on: tags: - v*.*.* -env: - COMMIT_VERSION: "${{ github.sha }}-dev" - jobs: build: name: Build docker images. runs-on: ubuntu-latest - strategy: - matrix: - component: ["server", "client"] - env: - COMPONENT: ${{ matrix.component }} + + permissions: + contents: read + packages: write + steps: - name: Checkout repository. uses: actions/checkout@v2 + - name: Get version from tag. uses: little-core-labs/get-git-tag@v3.0.2 - continue-on-error: true - - name: Build image. - run: - cd "${COMPONENT}" && - docker build -t "${COMPONENT}:${COMMIT_VERSION}" - --build-arg VCS_REF="${GITHUB_SHA}" - --build-arg BUILD_DATE="$(date --rfc-3339=seconds)" - --build-arg VERSION="${GITHUB_TAG_NAME:-${COMMIT_VERSION}}" - . - - name: Save image. - run: docker save "${COMPONENT}:${COMMIT_VERSION}" | gzip > "image.tar.gz" - - name: Store image for publish job. - uses: actions/upload-artifact@v2 - with: - name: ${{ matrix.component }} - path: image.tar.gz - publish: - name: Publish docker images. - needs: build - runs-on: ubuntu-latest - strategy: - matrix: - component: ["server", "client"] - registry: [ - { - server: "registry.hub.docker.com", - user: "latty", - token-secret: "DOCKER_HUB_TOKEN", - path: "massivedecks", - image-prefix: "" - }, - { - server: "ghcr.io", - user: "lattyware", - token-secret: "GHCR_TOKEN", - path: "lattyware/massivedecks", - image-prefix: "" - } - ] - steps: - - name: Retrieve image from build job. - uses: actions/download-artifact@v2 + - name: Set up QEMU. + id: qemu + uses: docker/setup-qemu-action@v1 with: - name: ${{ matrix.component }} - - name: Load image. - run: docker load < "image.tar.gz" - - name: Get version from tag. - uses: little-core-labs/get-git-tag@v3.0.2 - - name: Publish image. - uses: lattyware/push-docker-image-to-version-tags@v2 + platforms: arm64 + + - name: Set up Docker Buildx. + uses: docker/setup-buildx-action@v1 + + - name: Login to GHCR. + uses: docker/login-action@v1 with: - source: "${{ matrix.component }}:${{ env.COMMIT_VERSION }}" - image: "${{ matrix.registry.image-prefix }}${{ matrix.component }}" - hash: "${{ env.COMMIT_VERSION }}" - version: "${{ env.GIT_TAG_NAME }}" - server: "${{ matrix.registry.server }}" - server_path: "${{ matrix.registry.path }}" - user: "${{ matrix.registry.user }}" - token: "${{ secrets[matrix.registry.token-secret] }}" + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Login to DockerHub. + uses: docker/login-action@v1 + with: + username: latty + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Build and push + uses: docker/bake-action@v1.6.0 + with: + files: "docker-bake.hcl" + env: + VCS_REF: "${GITHUB_SHA}" + VERSION: "${GITHUB_TAG_NAME}" + BUILD_DATE: "$(date --rfc-3339=seconds)" diff --git a/client/Dockerfile b/client/Dockerfile index c144526..5645f51 100644 --- a/client/Dockerfile +++ b/client/Dockerfile @@ -1,4 +1,4 @@ -FROM node:14-alpine AS build +FROM --platform=linux/amd64 node:16-alpine AS build WORKDIR /md diff --git a/docker-bake.hcl b/docker-bake.hcl new file mode 100644 index 0000000..06540bb --- /dev/null +++ b/docker-bake.hcl @@ -0,0 +1,64 @@ +variable "VERSION" { + default = "" +} + +variable "VCS_REF" { + default = "dev" +} + +function "splitSemVer" { + params = [version] + result = regex("^(?P0|[1-9]\\d*)\\.(?P0|[1-9]\\d*)\\.(?P0|[1-9]\\d*)(?:-(?P(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+(?P[0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$", version) +} + +function "generateVersionTags" { + params = [semVer] + result = concat( + ["latest-prerelease"], semVer.prerelease != null ? + [ "${semVer.major}.${semVer.minor}.${semVer.patch}-${semVer.prerelease}" ] : + [ + "latest-release", + "${semVer.major}", + "${semVer.major}.${semVer.minor}", + "${semVer.major}.${semVer.minor}.${semVer.patch}", + ] + ) +} + +function "repos" { + params = [] + result = [ + "ghcr.io/lattyware/massivedecks/", + "registry.hub.docker.com/lattyware/massivedecks/" + ] +} + +function "generateTags" { + params = [repos, versionTags, commitHash, component] + result = flatten([ + for repo in repos: [ for tag in flatten(["latest", versionTags, commitHash]) : "${repo}${component}:${tag}" ] + ]) +} + +target "build" { + dockerfile = "./Dockerfile" + platforms = ["linux/amd64", "linux/arm64"] + output = ["type=registry"] + pull = true +} + +target "server" { + context = "./server" + inherits = ["build"] + tags = generateTags(repos(), VERSION == "" ? [] : generateVersionTags(splitSemVer(VERSION)), VCS_REF, "server") +} + +target "client" { + context = "./client" + inherits = ["build"] + tags = generateTags(repos(), VERSION == "" ? [] : generateVersionTags(splitSemVer(VERSION)), VCS_REF, "client") +} + +group "default" { + targets = [ "server", "client" ] +} diff --git a/server/Dockerfile b/server/Dockerfile index 9160852..67e11af 100644 --- a/server/Dockerfile +++ b/server/Dockerfile @@ -1,4 +1,4 @@ -FROM node:14-alpine AS build +FROM --platform=linux/amd64 node:16-alpine AS build WORKDIR /md @@ -9,7 +9,7 @@ COPY ["./src", "./src"] COPY ["./tsconfig.json", "./config.json5", "./"] RUN ["npm", "run", "build"] -FROM node:14-alpine +FROM node:16-alpine ARG BUILD_DATE ARG VCS_REF