name: Publish Docker Image
on: [push]

concurrency:
  group: ${{ github.ref }}-${{ github.workflow }}
  cancel-in-progress: true

jobs:
  docker_build:
    name: Build ${{ matrix.arch }} Image
    runs-on: ubuntu-latest

    strategy:
      matrix:
        include:
          - arch: amd64
            name: amd64
        #   - arch: arm64
        #     name: arm64

    steps:
      - name: Free up disk spaces
        run: |
          sudo rm -rf /usr/share/dotnet || true
          sudo rm -rf /opt/ghc || true
          sudo rm -rf "/usr/local/share/boost" || true
          sudo rm -rf "$AGENT_TOOLSDIRECTORY" || true

      - name: Get lowercase string for the repository name
        id: lowercase-repo-name
        uses: ASzc/change-string-case-action@v2
        with:
          string: ${{ github.event.repository.name }}

      - name: Checkout base
        uses: actions/checkout@v2
        with:
          fetch-depth: 0

      - name: Cache Docker layers
        uses: actions/cache@v2
        with:
          path: /tmp/.buildx-cache
          key: ${{ github.ref }}-${{ matrix.arch }}
          restore-keys: |
            ${{ github.ref }}-${{ matrix.arch }}

      - name: Set up QEMU
        uses: docker/setup-qemu-action@v2
        with:
          platforms: linux/${{ matrix.arch }}

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v2

      - name: Docker login
        uses: docker/login-action@v2
        with:
          username: ${{ secrets.DOCKER_USERNAME }}
          password: ${{ secrets.DOCKER_PASSWORD }}

      - name: Get commit SHA
        id: vars
        run: echo "::set-output name=sha_short::$(git rev-parse --short HEAD)"

      - name: Build and export
        id: build
        if: github.ref == 'refs/heads/master'
        uses: docker/build-push-action@v3
        with:
          push: true
          platforms: linux/${{ matrix.arch }}
          tags: ${{ secrets.DOCKER_USERNAME }}/${{ steps.lowercase-repo-name.outputs.lowercase }}:${{ matrix.name }}-latest
          build-args: |
            SHA=${{ steps.vars.outputs.sha_short }}
          outputs: type=image,push=true
          cache-from: type=local,src=/tmp/.buildx-cache
          cache-to: type=local,dest=/tmp/.buildx-cache

      - name: Replace tag without `v`
        if: startsWith(github.ref, 'refs/tags/')
        uses: actions/github-script@v1
        id: version
        with:
          script: |
            return context.payload.ref.replace(/\/?refs\/tags\/v/, '')
          result-encoding: string

      - name: Build release and export
        id: build_rel
        if: startsWith(github.ref, 'refs/tags/')
        uses: docker/build-push-action@v3
        with:
          push: true
          platforms: linux/${{ matrix.arch }}
          tags: ${{ secrets.DOCKER_USERNAME }}/${{ steps.lowercase-repo-name.outputs.lowercase }}:${{ matrix.name }}-${{steps.version.outputs.result}}
          build-args: |
            SHA=${{ steps.version.outputs.result }}
          outputs: type=image,push=true
          cache-from: type=local,src=/tmp/.buildx-cache
          cache-to: type=local,dest=/tmp/.buildx-cache

      - name: Save digest
        if: github.ref == 'refs/heads/master'
        run: echo ${{ steps.build.outputs.digest }} > /tmp/digest.txt

      - name: Save release digest
        if: startsWith(github.ref, 'refs/tags/')
        run: echo ${{ steps.build_rel.outputs.digest }} > /tmp/digest.txt

      - name: Upload artifact
        uses: actions/upload-artifact@v3
        with:
          name: digest_${{ matrix.name }}
          path: /tmp/digest.txt

  manifests:
    name: Build manifests
    needs: [docker_build]
    runs-on: ubuntu-latest
    steps:
      - name: Get lowercase string for the repository name
        id: lowercase-repo-name
        uses: ASzc/change-string-case-action@v2
        with:
          string: ${{ github.event.repository.name }}

      - name: Checkout base
        uses: actions/checkout@v2
        with:
          fetch-depth: 0

      # https://github.com/docker/setup-qemu-action
      - name: Set up QEMU
        uses: docker/setup-qemu-action@v2

      # https://github.com/docker/setup-buildx-action
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v2
        with:
          config-inline: |
            [worker.oci]
              max-parallelism = 1

      - name: Download artifact
        uses: actions/download-artifact@v3
        with:
          path: /tmp/images/

      - name: Docker login
        uses: docker/login-action@v2
        with:
          username: ${{ secrets.DOCKER_USERNAME }}
          password: ${{ secrets.DOCKER_PASSWORD }}

      - name: Replace tag without `v`
        if: startsWith(github.ref, 'refs/tags/')
        uses: actions/github-script@v1
        id: version
        with:
          script: |
            return context.payload.ref.replace(/\/?refs\/tags\/v/, '')
          result-encoding: string

      - name: Merge and push manifest on master branch
        if: github.ref == 'refs/heads/master'
        run: python scripts/merge_manifest.py "${{ secrets.DOCKER_USERNAME }}/${{ steps.lowercase-repo-name.outputs.lowercase }}"

      - name: Merge and push manifest on release
        if: startsWith(github.ref, 'refs/tags/')
        run: python scripts/merge_manifest.py "${{ secrets.DOCKER_USERNAME }}/${{ steps.lowercase-repo-name.outputs.lowercase }}" ${{steps.version.outputs.result}}
