From 2a14cea7d0bf7a6aa09635dc3bbdc42c8386621f Mon Sep 17 00:00:00 2001 From: Slava <20563034+veaceslavdoina@users.noreply.github.com> Date: Thu, 11 May 2023 20:44:38 +0300 Subject: [PATCH] Build x86-64 and arm and push a multi-architecture image Signed-off-by: Slava <20563034+veaceslavdoina@users.noreply.github.com> --- .github/workflows/docker.yml | 142 ++++++++++++++++++++++++++--------- 1 file changed, 108 insertions(+), 34 deletions(-) diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index ad31c3c6..5bdc80bc 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -1,125 +1,199 @@ -name: docker +name: Docker + on: push: branches: - - "main" + - main tags: - "v*.*.*" workflow_dispatch: + +env: + DOCKER_FILE: docker/codex.Dockerfile + DOCKER_REPO: codexstorage/nim-codex + + jobs: - docker-amd64: + # Linux amd64 + linux-amd64: + name: Linux amd64 runs-on: ubuntu-latest + outputs: + tags: ${{ steps.tags.outputs.tags }} + env: + PLATFORM: linux/amd64 + SUFFIX: linux-amd64 steps: - name: Checkout uses: actions/checkout@v3 - - name: Docker meta + - name: Docker - Meta id: meta uses: docker/metadata-action@v4 with: - images: thatbenbierens/nim-codex-amd64 + images: ${{ env.DOCKER_REPO }} + flavor: | + latest=false tags: | - type=semver,pattern={{version}} - type=sha + type=semver,pattern={{version}},suffix=-${{ env.SUFFIX }} + type=sha,suffix=-${{ env.SUFFIX }},enable=${{ !startsWith(github.ref, 'refs/tags/') }} - - name: Login to Docker Hub + - name: Docker - Set tags output + if: github.event_name != 'pull_request' + id: tags + run: echo "tags=${{ steps.meta.outputs.tags }}" >> "$GITHUB_OUTPUT" + + - name: Docker - Login to Docker Hub if: github.event_name != 'pull_request' uses: docker/login-action@v2 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - - name: Build and export to Docker + - name: Docker - Build and export to Docker id: build uses: docker/build-push-action@v4 with: context: . - file: docker/codex.Dockerfile - platforms: linux/amd64 + file: ${{ env.DOCKER_FILE }} + platforms: ${{ env.PLATFORM }} load: true tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} - - name: Minify docker image + - name: Docker - Minify image uses: kitabisa/docker-slim-action@v1 + id: slim env: DSLIM_HTTP_PROBE: false with: target: ${{ steps.meta.outputs.tags }} overwrite: true - - name: Show slim report - run: echo "${{ steps.slim.outputs.report }}" + - name: Docker - Show slim report + run: echo "${REPORT}" | jq -r + env: + REPORT: ${{ steps.slim.outputs.report }} - - name: Push to Docker registry + - name: Docker - Push to Docker registry if: github.event_name != 'pull_request' id: push uses: docker/build-push-action@v4 with: context: . - file: docker/codex.Dockerfile - platforms: linux/amd64 + file: ${{ env.DOCKER_FILE }} + platforms: ${{ env.PLATFORM }} push: true tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} - docker-arm64: + # Linux arm64 + linux-arm64: + name: Linux arm64 runs-on: buildjet-4vcpu-ubuntu-2204-arm + outputs: + tags: ${{ steps.tags.outputs.tags }} + env: + PLATFORM: linux/arm64 + SUFFIX: linux-arm64 steps: - name: Checkout uses: actions/checkout@v3 - - name: Docker meta + - name: Docker - Meta id: meta uses: docker/metadata-action@v4 with: - images: thatbenbierens/nim-codex-arm64 + images: ${{ env.DOCKER_REPO }} + flavor: | + latest=false tags: | - type=semver,pattern={{version}} - type=sha + type=semver,pattern={{version}},suffix=-${{ env.SUFFIX }} + type=sha,suffix=-${{ env.SUFFIX }},enable=${{ !startsWith(github.ref, 'refs/tags/') }} - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v2 + - name: Docker - Set tags output + if: github.event_name != 'pull_request' + id: tags + run: echo "tags=${{ steps.meta.outputs.tags }}" >> "$GITHUB_OUTPUT" - - name: Login to Docker Hub + - name: Docker - Login to Docker Hub if: github.event_name != 'pull_request' uses: docker/login-action@v2 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - - name: Build and export to Docker + - name: Docker - Build and export to Docker id: build uses: docker/build-push-action@v4 with: context: . - file: docker/codex.Dockerfile - platforms: linux/arm64 + file: ${{ env.DOCKER_FILE }} + platforms: ${{ env.PLATFORM }} load: true tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} - - name: Minify docker image + - name: Docker - Minify image uses: kitabisa/docker-slim-action@v1 + id: slim env: DSLIM_HTTP_PROBE: false with: target: ${{ steps.meta.outputs.tags }} overwrite: true - - name: Show slim report - run: echo "${{ steps.slim.outputs.report }}" + - name: Docker - Show slim report + run: echo "${REPORT}" | jq -r + env: + REPORT: ${{ steps.slim.outputs.report }} - - name: Push to Docker registry + - name: Docker - Push to Docker registry if: github.event_name != 'pull_request' id: push uses: docker/build-push-action@v4 with: context: . - file: docker/codex.Dockerfile - platforms: linux/arm64 + file: ${{ env.DOCKER_FILE }} + platforms: ${{ env.PLATFORM }} push: true tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} + + # Push single image + publish: + name: Push single image + if: github.event_name != 'pull_request' + runs-on: ubuntu-latest + needs: [linux-amd64, linux-arm64] + steps: + - name: Docker - Meta + id: meta + uses: docker/metadata-action@v4 + with: + images: ${{ env.DOCKER_REPO }} + tags: | + type=semver,pattern={{version}} + type=sha,enable=${{ !startsWith(github.ref, 'refs/tags/') }} + + - name: Docker - Set tags + run: | + # Transform multi-line tags in to the comma-seperated + TAGS=$(echo "${{ steps.meta.outputs.tags }}" | tr '\n' ',' | awk '{gsub(/,$/,"");}1') + echo "TAGS=${TAGS}" >>$GITHUB_ENV + echo "${TAGS}" + + - name: Docker - Login to Docker Hub + uses: docker/login-action@v2 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Docker - Create and push manifest images + uses: Noelware/docker-manifest-action@master + with: + inputs: ${{ env.TAGS }} + images: ${{ needs.linux-amd64.outputs.tags }},${{ needs.linux-arm64.outputs.tags }} + push: true