name: merge

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

on:
  push:
    branches:
      - 'main'
    tags:
      - 'v*'

permissions:
  contents: read # to fetch code (actions/checkout)

env:
  REPO_SLUG: "docker/compose-bin"

jobs:
  e2e:
    name: Build and test
    runs-on: ${{ matrix.os }}
    timeout-minutes: 15
    strategy:
      fail-fast: false
      matrix:
        os: [desktop-windows, desktop-macos, desktop-m1]
        # mode: [plugin, standalone]
        mode: [plugin]
    env:
      GO111MODULE: "on"
    steps:
      - uses: actions/checkout@v4

      - uses: actions/setup-go@v5
        with:
          go-version-file: go.mod
          cache: true
          check-latest: true

      - name: List Docker resources on machine
        run: |
          docker ps --all
          docker volume ls
          docker network ls
          docker image ls
      - name: Remove Docker resources on machine
        continue-on-error: true
        run: |
          docker kill $(docker ps -q)
          docker rm -f $(docker ps -aq)
          docker volume rm -f $(docker volume ls -q)
          docker ps --all

      - name: Unit tests
        run: make test

      - name: Build binaries
        run: |
          make
      - name: Check arch of go compose binary
        run: |
          file ./bin/build/docker-compose
        if: ${{ !contains(matrix.os, 'desktop-windows') }}
      -
        name: Test plugin mode
        if: ${{ matrix.mode == 'plugin' }}
        run: |
          make e2e-compose
      -
        name: Test standalone mode
        if: ${{ matrix.mode == 'standalone' }}
        run: |
          make e2e-compose-standalone

  bin-image:
    runs-on: ubuntu-22.04
    outputs:
      digest: ${{ fromJSON(steps.bake.outputs.metadata).image-cross['containerimage.digest'] }}
    steps:
      -
        name: Free disk space
        uses: jlumbroso/free-disk-space@54081f138730dfa15788a46383842cd2f914a1be # v1.3.1
        with:
          android: true
          dotnet: true
          haskell: true
          large-packages: true
          swap-storage: true
      -
        name: Checkout
        uses: actions/checkout@v4
      -
        name: Login to DockerHub
        if: github.event_name != 'pull_request'
        uses: docker/login-action@v3
        with:
          username: ${{ secrets.DOCKERPUBLICBOT_USERNAME }}
          password: ${{ secrets.DOCKERPUBLICBOT_WRITE_PAT }}
      -
        name: Set up QEMU
        uses: docker/setup-qemu-action@v3
      -
        name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3
      -
        name: Docker meta
        id: meta
        uses: docker/metadata-action@v5
        with:
          images: |
            ${{ env.REPO_SLUG }}
          tags: |
            type=ref,event=tag
            type=edge
          bake-target: meta-helper
      -
        name: Build and push image
        uses: docker/bake-action@v6
        id: bake
        with:
          source: .
          files: |
            ./docker-bake.hcl
            ${{ steps.meta.outputs.bake-file }}
          targets: image-cross
          push: ${{ github.event_name != 'pull_request' }}
          sbom: true
          provenance: mode=max
          set: |
            *.cache-from=type=gha,scope=bin-image
            *.cache-to=type=gha,scope=bin-image,mode=max

  desktop-edge-test:
    runs-on: ubuntu-latest
    needs: bin-image
    steps:
      -
        name: Generate Token
        id: generate_token
        uses: actions/create-github-app-token@v1
        with:
          app-id: ${{ vars.DOCKERDESKTOP_APP_ID }}
          private-key: ${{ secrets.DOCKERDESKTOP_APP_PRIVATEKEY }}
          owner: docker
          repositories: |
            ${{ secrets.DOCKERDESKTOP_REPO }}
      -
        name: Trigger Docker Desktop e2e with edge version
        uses: actions/github-script@v7
        with:
          github-token: ${{ steps.generate_token.outputs.token }}
          script: |
            await github.rest.actions.createWorkflowDispatch({
              owner: 'docker',
              repo: '${{ secrets.DOCKERDESKTOP_REPO }}',
              workflow_id: 'compose-edge-integration.yml',
              ref: 'main',
              inputs: {
                "image-tag": "${{ needs.bin-image.outputs.digest }}"
              }
            })
