name: CD

on:
  push:
    branches: ["master"]

  workflow_dispatch:

jobs:
  validate:
    runs-on: ubuntu-latest

    steps:
      # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
      - uses: actions/checkout@v3

      - uses: actions/setup-go@v3
        with:
          go-version: "^1.19.1"

      - run: go version

      - name: golangci-lint
        uses: golangci/golangci-lint-action@v3
        with:
          args: --timeout=5m

      - name: go vet
        run: go vet ./...

      - name: test
        run: go test ./...

  release:
    needs: validate
    runs-on: ubuntu-latest
    outputs:
      version: ${{ steps.semrel.outputs.version }}

    steps:
      - name: go-semantic-release
        id: semrel
        uses: go-semantic-release/action@v1.17.0
        with:
          github-token: ${{ secrets.GITHUB_TOKEN }}

  build:
    needs: release
    runs-on: ubuntu-latest
    strategy:
      matrix:
        goos:
          - "darwin"
          - "linux"
          - "windows"
        goarch:
          - "amd64"
          - "arm64"

    steps:
      - uses: actions/checkout@v3

      - uses: actions/setup-go@v3
        with:
          go-version: "^1.19.1"

      - name: build
        run: GOOS=${{ matrix.goos }} GOARCH=${{ matrix.goarch }} go build -o ./build/${{ matrix.goos }}-${{ matrix.goarch }}

      - name: Upload binaries to release
        uses: svenstaro/upload-release-action@v2
        with:
          repo_token: ${{ secrets.GITHUB_TOKEN }}
          file: ./build/${{ matrix.goos }}-${{ matrix.goarch }}
          asset_name: ${{ matrix.goos }}-${{ matrix.goarch }}
          tag: ${{ github.ref }}

