# ------------------------------------------------------------
# Copyright 2021 The Dapr Authors
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#     http://www.apache.org/licenses/LICENSE-2.0
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# ------------------------------------------------------------

name: components-contrib

on:
  push:
    branches:
      - master
      - release-*
      - feature/*
    tags:
      - v*
  pull_request:
    branches:
      - master
      - release-*
      - feature/*
jobs:
  build:
    name: Build ${{ matrix.target_os }}_${{ matrix.target_arch }} binaries
    runs-on: ${{ matrix.os }}
    env:
      GOVER: "1.19"
      GOOS: ${{ matrix.target_os }}
      GOARCH: ${{ matrix.target_arch }}
      GOPROXY: https://proxy.golang.org
      GOLANGCI_LINT_VER: "v1.48.0"
    strategy:
      matrix:
        os: [ubuntu-latest, windows-latest, macOS-latest]
        target_arch: [arm, amd64]
        include:
          - os: ubuntu-latest
            target_os: linux
          - os: windows-latest
            target_os: windows
          - os: macOS-latest
            target_os: darwin
        exclude:
          - os: windows-latest
            target_arch: arm
          - os: macOS-latest
            target_arch: arm
    steps:
      - name: Set up Go ${{ env.GOVER }}
        if: ${{ steps.skip_check.outputs.should_skip != 'true' }}
        uses: actions/setup-go@v3
        with:
          go-version: ${{ env.GOVER }}
      - name: Check out code into the Go module directory
        if: ${{ steps.skip_check.outputs.should_skip != 'true' }}
        uses: actions/checkout@v3
      - name: Cache Go modules (Linux)
        if: matrix.target_os == 'linux'
        uses: actions/cache@v3
        with:
          path: |
            ~/.cache/go-build
            ~/go/pkg/mod
          key: ${{ matrix.target_os }}-${{ matrix.target_arch }}-go-${{ env.GOVER }}-${{ hashFiles('**/go.sum') }}
          restore-keys: |
            ${{ matrix.target_os }}-${{ matrix.target_arch }}-go-${{ env.GOVER }}-
      - name: Cache Go modules (Windows)
        if: matrix.target_os == 'windows'
        uses: actions/cache@v3
        with:
          path: |
            ~\AppData\Local\go-build
            ~\go\pkg\mod
          key: ${{ matrix.target_os }}-${{ matrix.target_arch }}-go-${{ env.GOVER }}-${{ hashFiles('**/go.sum') }}
          restore-keys: |
            ${{ matrix.target_os }}-${{ matrix.target_arch }}-go-${{ env.GOVER }}-
      - name: Cache Go modules (macOS)
        if: matrix.target_os == 'darwin'
        uses: actions/cache@v3
        with:
          path: |
            ~/Library/Caches/go-build
            ~/go/pkg/mod
          key: ${{ matrix.target_os }}-${{ matrix.target_arch }}-go-${{ env.GOVER }}-${{ hashFiles('**/go.sum') }}
          restore-keys: |
            ${{ matrix.target_os }}-${{ matrix.target_arch }}-go-${{ env.GOVER }}-
      - name: Check components-schema
        if: matrix.target_arch == 'amd64' && matrix.target_os == 'linux' && steps.skip_check.outputs.should_skip != 'true'
        run: make check-component-metadata-schema-diff
      - name: Run golangci-lint
        if: matrix.target_arch == 'amd64' && matrix.target_os == 'linux' && steps.skip_check.outputs.should_skip != 'true'
        uses: golangci/golangci-lint-action@v3.2.0
        with:
          version: ${{ env.GOLANGCI_LINT_VER }}
          skip-cache: true
          args: --timeout 15m
      - name: Run go mod tidy check diff
        if: matrix.target_arch == 'amd64' && matrix.target_os == 'linux' && steps.skip_check.outputs.should_skip != 'true'
        run: make modtidy-all check-mod-diff
#       - name: Run Go Vulnerability Check
#         if: matrix.target_arch == 'amd64' && matrix.target_os == 'linux' && steps.skip_check.outputs.should_skip != 'true'
#         run: |
#           go install golang.org/x/vuln/cmd/govulncheck@latest
#           govulncheck ./...
      - name: Run make test
        env:
          COVERAGE_OPTS: "-coverprofile=coverage.txt -covermode=atomic"
          IPFS_TEST: "1"
        if: matrix.target_arch != 'arm' && steps.skip_check.outputs.should_skip != 'true'
        run: make test
      - name: Codecov
        if: matrix.target_arch == 'amd64' && matrix.target_os == 'linux'
        uses: codecov/codecov-action@v3
