name: build

env:
  GO_VERSION: 1.14
  NODE_VERSION: 13

on:
  push:
    branches:
      - '*'
    tags:
      - v*
  pull_request:

jobs:

  test:
    runs-on: ${{ matrix.os }}
    env:
      GO111MODULE: on
      GOPROXY: https://goproxy.io
    strategy:
      fail-fast: false
      matrix:
        os:
          - ubuntu-latest
          - macOS-latest
          - windows-latest
    steps:
      -
        name: Checkout
        uses: actions/checkout@v2
        with:
          fetch-depth: 0
      -
        name: Set up Go
        uses: actions/setup-go@v2
        with:
          go-version: ${{ env.GO_VERSION }}

      -
        name: Set up Node
        uses: actions/setup-node@v1
        with:
          node-version: ${{ env.NODE_VERSION }}
      -
        name: Set up Go modules cache
        uses: actions/cache@v2
        with:
          path: ~/go/pkg/mod
          key: ${{ runner.os }}-go-${{ hashFiles('go.sum') }}
          restore-keys: |
            ${{ runner.os }}-go-
      -
        name: Get npm cache directory
        id: npm-cache
        run: |
          echo "::set-output name=dir::$(npm config get cache)"
      -
        name: Set up npm cache
        uses: actions/cache@v2
        with:
          path: ${{ steps.npm-cache.outputs.dir }}
          key: ${{ runner.os }}-node-${{ hashFiles('client/package-lock.json') }}
          restore-keys: |
            ${{ runner.os }}-node-
      -
        name: Run make ci
        shell: bash
        run: |
          make ci
      -
        name: Upload coverage
        uses: codecov/codecov-action@v1
        if: success() && matrix.os == 'ubuntu-latest'
        with:
          token: ${{ secrets.CODECOV_TOKEN }}
          file: ./coverage.txt

  app:
    runs-on: ubuntu-latest
    needs: test
    steps:
      -
        name: Checkout
        uses: actions/checkout@v2
        with:
          fetch-depth: 0
      -
        name: Set up Go
        uses: actions/setup-go@v2
        with:
          go-version: ${{ env.GO_VERSION }}
      -
        name: Set up Node
        uses: actions/setup-node@v1
        with:
          node-version: ${{ env.NODE_VERSION }}
      -
        name: Set up Go modules cache
        uses: actions/cache@v2
        with:
          path: ~/go/pkg/mod
          key: ${{ runner.os }}-go-${{ hashFiles('go.sum') }}
          restore-keys: |
            ${{ runner.os }}-go-
      -
        name: Get npm cache directory
        id: npm-cache
        run: |
          echo "::set-output name=dir::$(npm config get cache)"
      -
        name: Set up node_modules cache
        uses: actions/cache@v2
        with:
          path: ${{ steps.npm-cache.outputs.dir }}
          key: ${{ runner.os }}-node-${{ hashFiles('client/package-lock.json') }}
          restore-keys: |
            ${{ runner.os }}-node-
      -
        name: Set up Snapcraft
        run: |
          sudo apt-get -yq --no-install-suggests --no-install-recommends install snapcraft
      -
        name: Set up GoReleaser
        run: |
          curl -sfL https://install.goreleaser.com/github.com/goreleaser/goreleaser.sh | BINDIR="$(go env GOPATH)/bin" sh
      -
        name: Run snapshot build
        run: |
          make release

  docker:
    runs-on: ubuntu-latest
    needs: test
    steps:
      -
        name: Set up Docker Buildx
        uses: crazy-max/ghaction-docker-buildx@v1
      -
        name: Checkout
        uses: actions/checkout@v2
        with:
          fetch-depth: 0
      -
        name: Docker Buildx (build)
        run: |
          make docker-multi-arch
      -
        name: Clear
        if: always() && startsWith(github.ref, 'refs/tags/v')
        run: |
          rm -f ${HOME}/.docker/config.json

  notify:
    needs: [app, docker]
    # Secrets are not passed to workflows that are triggered by a pull request from a fork
    if: ${{ github.event_name == 'push' || github.event.pull_request.head.repo.full_name == github.repository }}
    runs-on: ubuntu-latest
    steps:
      -
        name: Conclusion
        uses: technote-space/workflow-conclusion-action@v1
      -
        name: Send Slack notif
        uses: 8398a7/action-slack@v3
        with:
          status: ${{ env.WORKFLOW_CONCLUSION }}
          fields: repo,message,commit,author
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}