From 816485e41de2cb3bce515c95753231b94aa0d107 Mon Sep 17 00:00:00 2001 From: Max Isom Date: Mon, 17 Jan 2022 12:40:34 -0600 Subject: [PATCH] Use self-hosted runner for ARM builds (#477) --- .github/workflows/build.yml | 2 +- .github/workflows/pr.yml | 49 +++++++++--- .github/workflows/publish.yml | 142 ++++++++++++++++++++-------------- 3 files changed, 125 insertions(+), 68 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index ffea6a0..5eea299 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,6 +1,6 @@ name: Lint & build -on: [push, pull_request] +on: push jobs: build: diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 2a7a117..02eb197 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -3,23 +3,32 @@ name: PR Workflow on: pull_request_target jobs: - release: + release-snapshot: name: Release snapshot - runs-on: ubuntu-latest + strategy: + matrix: + runner-platform: + - ubuntu-latest + - self-hosted + include: + - runner-platform: ubuntu-latest + build-arch: linux/amd64 + tagged-platform: amd64 + - runner-platform: self-hosted + build-arch: linux/arm64 + tagged-platform: arm64 + runs-on: ${{ matrix.runner-platform }} steps: - name: Set up Buildx uses: docker/setup-buildx-action@v1 - - name: Set up QEMU - uses: docker/setup-qemu-action@v1 - - name: Cache Docker layers uses: actions/cache@v2 with: path: /tmp/.buildx-cache - key: ${{ runner.os }}-buildx-prs-${{ github.sha }} + key: ${{ runner.os }}-buildx-prs-${{ matrix.build-arch }}-${{ github.sha }} restore-keys: | - ${{ runner.os }}-buildx-prs- + ${{ runner.os }}-buildx-prs-${{ matrix.build-arch }} - name: Login to DockerHub uses: docker/login-action@v1 @@ -32,17 +41,37 @@ jobs: uses: docker/build-push-action@v2 with: push: true - tags: codetheweb/muse:${{ github.event.pull_request.head.sha }} + tags: codetheweb/muse:${{ github.event.pull_request.head.sha }}-${{ matrix.tagged-platform }} cache-from: type=local,src=/tmp/.buildx-cache cache-to: type=local,dest=/tmp/.buildx-cache,mode=max + platforms: ${{ matrix.build-arch }} + + combine-and-comment: + name: Combine platform tags and leave comment + runs-on: ubuntu-latest + needs: release-snapshot + steps: + - name: Set up Buildx + uses: docker/setup-buildx-action@v1 + + - name: Login to DockerHub + uses: docker/login-action@v1 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Combine tags + run: docker buildx imagetools create -t 'codetheweb/muse:pr-${{ github.event.number }}' -t 'codetheweb/muse:${{ github.event.pull_request.head.sha }}' 'codetheweb/muse:${{ github.event.pull_request.head.sha }}-arm64' 'codetheweb/muse:${{ github.event.pull_request.head.sha }}-amd64' - name: Create comment uses: marocchino/sticky-pull-request-comment@v2 with: header: "pr-release" message: | - #### :package: A new release has been made for this pull request + #### :package: A new release has been made for this pull request. - To play around with this PR, pull `codetheweb/muse:${{ github.event.pull_request.head.sha }}`. + To play around with this PR, pull `codetheweb/muse:pr-${{ github.event.number }}` or `codetheweb/muse:${{ github.event.pull_request.head.sha }}`. + + Images are available for x86_64 and ARM64. > Latest commit: ${{ github.event.pull_request.head.sha }} diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 9b8fd9e..821178e 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -6,8 +6,92 @@ on: - 'v*' jobs: - release: + publish: + strategy: + matrix: + runner-platform: + - ubuntu-latest + - self-hosted + include: + - runner-platform: ubuntu-latest + build-arch: linux/amd64 + tagged-platform: amd64 + - runner-platform: self-hosted + build-arch: linux/arm64 + tagged-platform: arm64 + runs-on: ${{ matrix.runner-platform }} + steps: + - name: Set up Buildx + uses: docker/setup-buildx-action@v1 + + - name: Cache Docker layers + uses: actions/cache@v2 + with: + path: /tmp/.buildx-cache + key: ${{ runner.os }}-buildx-prs-${{ matrix.build-arch }}-${{ github.sha }} + restore-keys: | + ${{ runner.os }}-buildx-prs-${{ matrix.build-arch }} + + - name: Login to DockerHub + uses: docker/login-action@v1 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Build and push + id: docker_build + uses: docker/build-push-action@v2 + with: + push: true + tags: codetheweb/muse:${{ github.event.pull_request.head.sha }}-${{ matrix.tagged-platform }} + platforms: ${{ matrix.build-arch }} + cache-from: type=local,src=/tmp/.buildx-cache + cache-to: type=local,dest=/tmp/.buildx-cache,mode=max + + combine: + name: Combine platform tags runs-on: ubuntu-latest + needs: publish + steps: + - uses: actions/checkout@v1 + + - name: Set up Buildx + uses: docker/setup-buildx-action@v1 + + - name: Login to DockerHub + uses: docker/login-action@v1 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Get tags + id: get-tags + uses: Surgo/docker-smart-tag-action@v1 + with: + docker_image: codetheweb/muse + + - name: Wait on lint & build + uses: lewagon/wait-on-check-action@v1.1.1 + with: + ref: ${{ github.sha }} + check-name: 'Lint & build' + repo-token: ${{ secrets.GITHUB_TOKEN }} + wait-interval: 10 + + - name: Combine tags + run: docker buildx imagetools create $(echo '${{ steps.get-tags.outputs.tag }}' | tr "," "\0" | xargs -0 printf -- '-t %s ') 'codetheweb/muse:${{ github.event.pull_request.head.sha }}-arm64' 'codetheweb/muse:${{ github.event.pull_request.head.sha }}-amd64' + + - name: Update Docker Hub description + uses: peter-evans/dockerhub-description@v2.4.3 + env: + DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }} + DOCKERHUB_PASSWORD: ${{ secrets.DOCKERHUB_PASSWORD }} + DOCKERHUB_REPOSITORY: codetheweb/muse + + release: + name: Create GitHub release + runs-on: ubuntu-latest + needs: combine steps: - uses: actions/checkout@v2 @@ -34,59 +118,3 @@ jobs: draft: ${{ steps.changelog_reader.outputs.status == 'unreleased' }} allowUpdates: true token: ${{ secrets.GITHUB_TOKEN }} - - publish: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v1 - - - name: Set up Buildx - uses: docker/setup-buildx-action@v1 - - - name: Set up QEMU - uses: docker/setup-qemu-action@v1 - - - name: Cache Docker layers - uses: actions/cache@v2 - with: - path: /tmp/.buildx-cache - key: ${{ runner.os }}-buildx-${{ github.sha }} - restore-keys: | - ${{ runner.os }}-buildx- - - - name: Login to DockerHub - uses: docker/login-action@v1 - with: - username: ${{ secrets.DOCKERHUB_USERNAME }} - password: ${{ secrets.DOCKERHUB_TOKEN }} - - - name: Get tags - id: get-tags - uses: Surgo/docker-smart-tag-action@v1 - with: - docker_image: codetheweb/muse - - - name: Wait on lint & build - uses: lewagon/wait-on-check-action@v1.1.1 - with: - ref: ${{ github.sha }} - check-name: 'Lint & build' - repo-token: ${{ secrets.GITHUB_TOKEN }} - wait-interval: 10 - - - name: Build and push - id: docker_build - uses: docker/build-push-action@v2 - with: - push: true - tags: ${{ steps.get-tags.outputs.tag }} - platforms: linux/amd64,linux/arm64 - cache-from: type=local,src=/tmp/.buildx-cache - cache-to: type=local,dest=/tmp/.buildx-cache,mode=max - - - name: Update Docker Hub description - uses: peter-evans/dockerhub-description@v2.4.3 - env: - DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }} - DOCKERHUB_PASSWORD: ${{ secrets.DOCKERHUB_PASSWORD }} - DOCKERHUB_REPOSITORY: codetheweb/muse