name: Build and test
# TODO: do not trigger action for some document file update

# This workflow is triggered on pushes or pull request to the repository.
on:
  push:
    # file paths to consider in the event. Optional; defaults to all.
    paths:
      - 'scripts/**'
      - 'internal/**'
      - 'cmd/**'
      - 'build/**'
      - '.github/workflows/main.yaml'
      - '.env'
      - docker-compose.yml
      - Makefile
      - go.mod
      - '!**.md'
      - '!build/ci/jenkins/**'
  pull_request:
    # file paths to consider in the event. Optional; defaults to all.
    paths:
      - 'scripts/**'
      - 'internal/**'
      - 'cmd/**'
      - 'build/**'
      - '.github/workflows/main.yaml'
      - '.env'
      - docker-compose.yml
      - Makefile
      - go.mod
      - '!**.md'
      - '!build/ci/jenkins/**'

jobs:
  ubuntu:
    name: Build and test AMD64 Ubuntu ${{ matrix.ubuntu }}
    runs-on: ubuntu-${{ matrix.ubuntu }}
    timeout-minutes: 90
    strategy:
      fail-fast: false
      matrix:
        ubuntu: [20.04]
    env:
      UBUNTU: ${{ matrix.ubuntu }}
    steps:
      - name: Checkout
        uses: actions/checkout@v2
      - name: "Generate CCache Hash"
        env:
          CORE_HASH: ${{ hashFiles( 'internal/core/**/*.cpp', 'internal/core/**/*.cc', 'internal/core/**/*.c', 'internal/core/**/*.h', 'internal/core/**/*.hpp', 'internal/core/**/CMakeLists.txt') }}
        run: |
          echo "corehash=${CORE_HASH}" >> $GITHUB_ENV
          echo "Set CCache hash to ${CORE_HASH}"
      - name: Cache CCache Volumes
        uses: actions/cache@v3
        with:
          path: .docker/amd64-ubuntu${{ matrix.ubuntu }}-ccache
          key: ubuntu${{ matrix.ubuntu }}-ccache-${{ env.corehash }}
          restore-keys: ubuntu${{ matrix.ubuntu }}-ccache-
      - name: Cache Go Mod Volumes
        uses: actions/cache@v3
        with:
          path: .docker/amd64-ubuntu${{ matrix.ubuntu }}-go-mod
          key: ubuntu${{ matrix.ubuntu }}-go-mod-${{ hashFiles('**/go.sum') }}
          restore-keys: ubuntu${{ matrix.ubuntu }}-go-mod-
      - name: Start Service
        shell: bash
        run: |
          docker-compose up -d pulsar etcd minio
      - name: Build and UnitTest
        env:
          CHECK_BUILDER: "1"
        run: |
          ./build/builder.sh /bin/bash -c "make check-proto-product && make codecov"
      - name: Get the status & restart count for containers when ut failed
        if: ${{ failure() }}
        run: |  
          echo "----show current status for each container---"
          docker ps --format "table {{.Names}}\t\t{{.Image}}\t\t{{.Status}}"
          for container in $(docker ps --format "table {{.Names}}" | grep -v "NAMES"); do
              echo "restart count for ${container} is $(docker inspect ${container} --format '{{json .RestartCount}}')"
          done
      - name: Upload coverage to Codecov
        if: "github.repository == 'milvus-io/milvus'"
        uses: codecov/codecov-action@v3.1.0
        id: upload_cov
        with:
          token: ${{ secrets.CODECOV_TOKEN }}
          files: ./go_coverage.txt,./lcov_output.info
          name: ubuntu-${{ matrix.ubuntu }}-unittests
          fail_ci_if_error: true
      - name: Retry Upload coverage to Codecov
        if: "steps.upload_cov.outcome=='failure' && github.repository == 'milvus-io/milvus'"
        uses: codecov/codecov-action@v3.1.0
        id: retry_upload_cov
        with:
          token: ${{ secrets.CODECOV_TOKEN }}
          files: ./go_coverage.txt,./lcov_output.info
          name: ubuntu-${{ matrix.ubuntu }}-unittests
          fail_ci_if_error: true