---
name: CI

# yamllint disable-line rule:truthy
on:
  pull_request:
    branches:
      - '*'
  push:
    branches:
      - 'master'

concurrency:
  group: build-${{ github.event.pull_request.number || github.ref }}
  cancel-in-progress: true

env:
  INSTALL_DOCKER_REPO: 1

jobs:
  check-commit:
    runs-on: ubuntu-20.04
    outputs:
      skip: ${{ steps.check-commit.outputs.skip }}

    steps:
      - uses: actions/checkout@v4
        with:
          ref: ${{ github.event.pull_request.head.sha }}

      - name: check if message contain keywords ace scopeid
        id: check-commit
        run: |
          # checking for "docs" or "[ci skip]" messages
          message=$(git log -1 --pretty=format:'%s')
          if [[ "$message" =~ "\[(ci skip)\]" ]]; then
            echo "Skipping tests due to [ci skip] message"
            echo "skip=true" >> $GITHUB_OUTPUT
          elif [[ "$message" =~ "^docs:" ]]; then
            echo "Skipping tests due to "docs:" prefix on message"
            echo "skip=true" >> $GITHUB_OUTPUT
          fi

  build:
    name: build
    runs-on: ubuntu-20.04
    needs: check-commit
    if: ${{ needs.check-commit.outputs.skip != 'true' }}
    outputs:
      matrix: ${{ steps.set-matrix.outputs.matrix }}
    strategy:
      fail-fast: true
    timeout-minutes: 45

    steps:
      - uses: actions/checkout@v4

      - name: set up qemu
        uses: docker/setup-qemu-action@v3

      - name: set up docker buildx
        id: buildx
        uses: docker/setup-buildx-action@v3

      - name: build package
        run: ./tests/ci/setup.sh build
        env:
          SKIP_IMAGE_BUILD: true

      - name: set matrix for build
        id: set-matrix
        run: |
          json=$(python .github/commands/matrix)
          echo $json
          echo "matrix=$json" >> $GITHUB_OUTPUT

      - name: upload packages
        uses: actions/upload-artifact@v3
        with:
          name: build
          path: build

  build-image-amd64:
    name: build-image.linux/amd64
    needs: build
    runs-on: ubuntu-20.04
    timeout-minutes: 20

    steps:
      - uses: actions/checkout@v4

      - name: build-image
        uses: ./.github/actions/build-image
        with:
          architecture: linux/amd64

  build-image-arm:
    name: build-image.linux/arm
    needs: build
    runs-on: buildjet-4vcpu-ubuntu-2204-arm
    timeout-minutes: 20

    steps:
      - uses: actions/checkout@v4

      - name: set up qemu
        uses: docker/setup-qemu-action@v3

      - name: build-image
        uses: ./.github/actions/build-image
        with:
          architecture: linux/arm

  build-image-arm64:
    name: build-image.linux/arm64
    needs: build
    runs-on: buildjet-4vcpu-ubuntu-2204-arm
    timeout-minutes: 20

    steps:
      - uses: actions/checkout@v4

      - name: build-image
        uses: ./.github/actions/build-image
        with:
          architecture: linux/arm64

  unit-tests:
    name: unit.${{ matrix.index }}
    needs: build
    runs-on: ubuntu-20.04
    strategy:
      fail-fast: false
      matrix: ${{fromJson(needs.build.outputs.matrix)}}

    steps:
      - uses: actions/checkout@v4

      - name: download packages
        uses: actions/download-artifact@v3
        with:
          name: build
          path: build

      - name: ci-setup
        run: ./.github/commands/ci-setup

      # - name: start ssh session
      #   uses: luchihoratiu/debug-via-ssh@main
      #   with:
      #     NGROK_AUTH_TOKEN: ${{ secrets.NGROK_AUTH_TOKEN }}
      #     SSH_PASS: ${{ secrets.NGROK_SSH_PASS }}

      - name: run ci
        timeout-minutes: 30
        run: sudo -E ./.github/commands/ci-run ${{ matrix.index }}
        env:
          DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }}
          DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }}
          SYNC_GITHUB_PASSWORD: ${{ secrets.SYNC_GITHUB_PASSWORD }}
          SYNC_GITHUB_USERNAME: ${{ secrets.SYNC_GITHUB_USERNAME }}

      - uses: actions/upload-artifact@v3
        with:
          name: test-results-${{ matrix.index }}
          path: test-results

  docker-deploy-tests:
    name: docker
    needs: build
    runs-on: ubuntu-20.04
    strategy:
      fail-fast: false

    steps:
      - uses: actions/checkout@v4

      - name: download packages
        uses: actions/download-artifact@v3
        with:
          name: build
          path: build

      - name: ci-setup
        run: ./.github/commands/ci-setup

      - name: test docker deploys
        shell: bash
        timeout-minutes: 20
        run: |
          ./tests/ci/setup.sh docker
          DOKKU_SSH_PORT=3022 sudo -E make -e test-ci-docker

  go-tests:
    name: go.${{ matrix.index }}
    needs: build
    runs-on: ubuntu-20.04
    strategy:
      fail-fast: false
      matrix:
        index: [0, 1, 2, 3]
    env:
      GITHUB_NODE_INDEX: ${{ matrix.index }}

    steps:
      - uses: actions/checkout@v4

      - name: download packages
        uses: actions/download-artifact@v3
        with:
          name: build
          path: build

      - name: ci-setup
        run: ./.github/commands/ci-setup

      - name: run go tests
        run: |
          export CIRCLE_SHA1=$GITHUB_SHA
          echo "CODACY_TOKEN=$CODACY_TOKEN"
          if [ "$CODACY_TOKEN" != "" ]; then
            echo "Detected value for CODACY_TOKEN"
          fi
          case $GITHUB_NODE_INDEX in
            0) sudo -E make -e lint-ci go-tests ci-go-coverage ;;
            1) sudo -E make -e deploy-test-checks-root deploy-test-config ;;
            2) sudo -E make -e deploy-test-multi ;;
            3) sudo -E make -e deploy-test-go-fail-predeploy deploy-test-go-fail-postdeploy ;;
          esac
      - uses: actions/upload-artifact@v3
        with:
          name: coverage.${{ matrix.index }}
          path: test-results/coverage

  publish-test-results:
    name: publish-test-results
    needs: unit-tests
    runs-on: ubuntu-20.04
    permissions:
      checks: write
    # the build-and-test job might be skipped, we don't need to run this job then
    if: success() || failure()

    steps:
      - name: download test-results
        uses: actions/download-artifact@v3
        with:
          path: test-results

      - name: Publish Unit Test Results
        uses: EnricoMi/publish-unit-test-result-action@v2
        with:
          check_name: Unit Test Results
          github_token: ${{ secrets.GITHUB_TOKEN }}
          junit_files: test-results/**/*.xml
          comment_mode: "off"
