name: Go
on:
  push:
    tags:
      - v*
    branches:
      - master
    paths:
      - '**.go'
      - ".goreleaser.yml"
      - ".golangci.yml"
      - ".dockerignore"
      - "Makefile"
      - "rules.mk"
      - "go.*"
      - ".github/workflows/go.yml"
  pull_request:
    paths:
      - '**.go'
      - ".goreleaser.yml"
      - ".golangci.yml"
      - ".dockerignore"
      - "Makefile"
      - "rules.mk"
      - "go.*"
      - ".github/workflows/go.yml"

jobs:
  golangci-lint:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: golangci-lint
        uses: golangci/golangci-lint-action@v3.1.0
        with:
          version: v1.38
          #github-token: ${{ secrets.GITHUB_TOKEN }}
          args: --timeout=2m
          only-new-issues: false
          working-directory: .
  tests-on-windows:
    needs: golangci-lint # run after golangci-lint action to not produce duplicated errors
    runs-on: windows-latest
    strategy:
      matrix:
        golang:
          - 1.16.x
    steps:
      - uses: actions/checkout@v3
      - name: Install Go
        uses: actions/setup-go@v2
        with:
          go-version: ${{ matrix.golang }}
      - name: Run tests on Windows
        run: make.exe unittest
        continue-on-error: true
  tests-on-mac:
    needs: golangci-lint # run after golangci-lint action to not produce duplicated errors
    runs-on: macos-latest
    strategy:
      matrix:
        golang:
          - 1.16.x
    env:
      OS: macos-latest
      GOLANG: ${{ matrix.golang }}
    steps:
      - uses: actions/checkout@v3
      - name: Install Go
        uses: actions/setup-go@v2
        with:
          go-version: ${{ matrix.golang }}
      - uses: actions/cache@v2.1.7
        with:
          path: ~/go/pkg/mod
          key: ${{ runner.os }}-go-${{ matrix.golang }}-${{ hashFiles('**/go.sum') }}
          restore-keys: |
            ${{ runner.os }}-go-${{ matrix.golang }}-
      - name: Run tests on Unix-like operating systems
        run: make unittest
      - name: Check go.mod and go.sum
        run: |
          go mod tidy -v
          git --no-pager diff go.mod go.sum
          git --no-pager diff --quiet go.mod go.sum
      - name: Upload coverage to Codecov
        uses: codecov/codecov-action@v2.1.0
        with:
          #token: ${{ secrets.CODECOV_TOKEN }}
          file: ./coverage.txt
          flags: unittests
          env_vars: OS,GOLANG
          name: codecov-umbrella
          fail_ci_if_error: false
  tests-on-linux:
    needs: golangci-lint # run after golangci-lint action to not produce duplicated errors
    runs-on: ubuntu-latest
    strategy:
      matrix:
        golang:
          - 1.14.x
          - 1.15.x
          - 1.16.x
    env:
      OS: ubuntu-latest
      GOLANG: ${{ matrix.golang }}
    steps:
      - uses: actions/checkout@v3
      - name: Install Go
        uses: actions/setup-go@v2
        with:
          go-version: ${{ matrix.golang }}
      - uses: actions/cache@v2.1.7
        with:
          path: ~/go/pkg/mod
          key: ${{ runner.os }}-go-${{ matrix.golang }}-${{ hashFiles('**/go.sum') }}
          restore-keys: |
            ${{ runner.os }}-go-${{ matrix.golang }}-
      - name: Check go.mod and go.sum
        run: |
          go mod tidy -v
          git --no-pager diff go.mod go.sum
          git --no-pager diff --quiet go.mod go.sum
      - name: Run tests on Unix-like operating systems
        run: make unittest
      - name: Upload coverage to Codecov
        uses: codecov/codecov-action@v2.1.0
        with:
          #token: ${{ secrets.CODECOV_TOKEN }}
          file: ./coverage.txt
          flags: unittests
          env_vars: OS,GOLANG
          name: codecov-umbrella
          fail_ci_if_error: false