name: Go

on:
  push:
    tags:
      - v*
    branches:
      - main
    paths:
      - ".golangci.yml"
      - ".goreleaser.yaml"
      - "**.go"
      - ".github/workflows/go.yml"
  pull_request:
    paths:
      - ".golangci.yml"
      - ".goreleaser.yaml"
      - "**.go"
      - ".github/workflows/go.yml"

  # Allows you to run this workflow manually from the Actions tab
  workflow_dispatch:

permissions:
  # Required to stop running workflows
  actions: write

jobs:
  # Check if there any dirty change for go mod tidy
  go-mod:
    name: "Check go modules declaration"
    runs-on: ubuntu-latest
    steps:
      -
        name: Cancel previous workflows
        uses: styfle/cancel-workflow-action@0.9.1
        with:
          access_token: ${{ secrets.GITHUB_TOKEN }}
      -
        name: Install Go
        uses: actions/setup-go@v3
        with:
          go-version: 1.17
      -
        name: Checkout code
        uses: actions/checkout@v3
      -
        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

  # Try compiple all binaries first
  compile-dryrun:
    name: "Compile"
    strategy:
      fail-fast: true
      matrix:
        go-version:
          - "1.17"
          - "1.18.0-rc.1"
    runs-on: ubuntu-latest
    needs: [golangci-lint, go-mod]
    steps:
      -
        name: Cancel previous workflows
        uses: styfle/cancel-workflow-action@0.9.1
        with:
          access_token: ${{ secrets.GITHUB_TOKEN }}
      -
        name: Checkout
        uses: actions/checkout@v3
      -
        name: Set up Go
        uses: actions/setup-go@v3
        with:
          go-version: ${{ matrix.go-version }}
          check-latest: true
      -
        name: Cache Go modules
        uses: actions/cache@v2.1.7
        with:
          path: ~/go/pkg/mod
          key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }}
          restore-keys: |
            ${{ runner.os }}-go-
      -
        name: Fetch dependencies
        run: go mod download
      -
        name: Build Harp
        run: |
          go mod vendor && go build -mod=vendor -o bin/harp github.com/elastic/harp/cmd/harp

  # Run golangci-lint
  golangci-lint:
    name: "GolangCI-lint"
    runs-on: ubuntu-latest
    steps:
      -
        name: Cancel previous workflows
        uses: styfle/cancel-workflow-action@0.9.1
        with:
          access_token: ${{ secrets.GITHUB_TOKEN }}
      -
        name: Install Go
        uses: actions/setup-go@v3
        with:
          go-version: 1.17
      -
        uses: actions/checkout@v3
      -
        name: Lint code
        uses: golangci/golangci-lint-action@v3
        with:
          version: latest
          args: --timeout=10m

  tests-on-linux:
    name: "Tests (linux)"
    needs: [go-mod, compile-dryrun, golangci-lint] # run after golangci-lint action to not produce duplicated errors
    runs-on: ubuntu-latest
    steps:
      -
        name: Cancel previous workflows
        uses: styfle/cancel-workflow-action@0.9.1
        with:
          access_token: ${{ secrets.GITHUB_TOKEN }}
      -
        name: Checkout
        uses: actions/checkout@v3
      -
        name: Install Go
        uses: actions/setup-go@v3
        with:
          go-version: 1.17 # test only the latest go version to speed up CI
      -
        name: Cache Go modules
        uses: actions/cache@v2.1.7
        with:
          path: ~/go/pkg/mod
          key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }}
          restore-keys: |
            ${{ runner.os }}-go-
      -
        name: Fetch dependencies
        run: go mod download
      -
        name: Setup gotestsum
        uses: autero1/action-gotestsum@v1.0.0
        with:
          gotestsum_version: 1.7.0
      -
        name: Run tests
        run: gotestsum --format short-verbose ./pkg/...

  tests-on-windows:
    name: "Tests (windows)"
    needs: [go-mod, compile-dryrun, golangci-lint] # run after golangci-lint action to not produce duplicated errors
    runs-on: windows-latest
    steps:
      -
        name: Cancel previous workflows
        uses: styfle/cancel-workflow-action@0.9.1
        with:
          access_token: ${{ secrets.GITHUB_TOKEN }}
      -
        name: Checkout
        uses: actions/checkout@v3
      -
        name: Install Go
        uses: actions/setup-go@v3
        with:
          go-version: 1.17 # test only the latest go version to speed up CI
      -
        name: Cache Go modules
        uses: actions/cache@v2.1.7
        with:
          path: ~/go/pkg/mod
          key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }}
          restore-keys: |
            ${{ runner.os }}-go-
      -
        name: Fetch dependencies
        run: go mod download
      -
        name: Setup gotestsum
        uses: autero1/action-gotestsum@v1.0.0
        with:
          gotestsum_version: 1.7.0
      -
        name: Run tests
        run: gotestsum --format short-verbose ./pkg/...

  tests-on-macos:
    name: "Tests (darwin)"
    needs: [go-mod, compile-dryrun, golangci-lint] # run after golangci-lint action to not produce duplicated errors
    runs-on: macos-latest
    steps:
      -
        name: Cancel previous workflows
        uses: styfle/cancel-workflow-action@0.9.1
        with:
          access_token: ${{ secrets.GITHUB_TOKEN }}
      -
        name: Checkout
        uses: actions/checkout@v3
      -
        name: Install Go
        uses: actions/setup-go@v3
        with:
          go-version: 1.17 # test only the latest go version to speed up CI
      -
        name: Cache Go modules
        uses: actions/cache@v2.1.7
        with:
          path: ~/go/pkg/mod
          key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }}
          restore-keys: |
            ${{ runner.os }}-go-
      -
        name: Fetch dependencies
        run: go mod download
      -
        name: Setup gotestsum
        uses: autero1/action-gotestsum@v1.0.0
        with:
          gotestsum_version: 1.7.0
      -
        name: Run tests
        run: gotestsum --format short-verbose ./pkg/...
