name: Build

on:
  pull_request:
    branches:
      - master
    types: [opened, synchronize]
    paths-ignore:
      - 'scripts/**'
      - '**/*.md'
  push:
    # Build for the master branch.
    branches:
      - master
  release:
    # Publish released commit as Docker `latest` and `git_revision` images.
    types:
      - published
  workflow_dispatch:
    inputs:
      ref:
        description: 'Ref to build CLI for Ubuntu and Windows Server Core [default: latest master; examples: v0.92.0, 0a4ff9d3e4a9ab432fd5812eb18c98e03b5a7432]'
        required: false
        default: ''
      push_image:
        description: 'Push images to DockerHub [default: false; examples: true, false]'
        required: false
        default: 'false'
      use_latest_tag:
        description: 'Use `latest` tag while pushing images to DockerHub (applied to Ubuntu image only) [default: false; examples: true, false]'
        required: false
        default: 'false'

jobs:
  build_cli:
    name: Build CLI
    runs-on: ${{matrix.os.name}}
    strategy:
      matrix:
        os: [{ name: ubuntu-20.04, bin-name: linux }, { name: windows-2022, bin-name: windows }, { name: macos-12, bin-name: darwin }]
        arch: [amd64, arm64]
        exclude:
          - os: { name: windows-2022, bin-name: windows }
            arch: 'arm64'
          - os: { name: macos-12, bin-name: darwin }
            arch: 'amd64'

    steps:
      - uses: actions/checkout@v3
        with:
          ref: ${{ github.event.inputs.ref }}
          # Allows to fetch all history for all branches and tags. Need this for proper versioning.
          fetch-depth: 0

      - name: Set up Go
        uses: actions/setup-go@v3
        with:
          go-version: 1.19
          cache: true

      - name: Update Go modules
        run: go mod download -json

      - name: Build CLI
        run: make build
        env:
          GOARCH: ${{ matrix.arch }}

      - name: Rename CLI binary
        run: mv ./bin/neo-go* ./bin/neo-go-${{ matrix.os.bin-name }}-${{ matrix.arch }}${{ (matrix.os.bin-name == 'windows' && '.exe') || '' }}

      - name: Upload artifact
        uses: actions/upload-artifact@v3
        with:
          name: neo-go-${{ matrix.os.bin-name }}-${{ matrix.arch }}
          path: ./bin/neo-go*
          if-no-files-found: error

  build_image:
    needs: build_cli
    name: Build and push docker image
    runs-on: ubuntu-20.04

    steps:
      - uses: actions/checkout@v3
        with:
          ref: ${{ github.event.inputs.ref }}
          fetch-depth: 0

      - name: Set up QEMU
        uses: docker/setup-qemu-action@v2

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v2

      - name: Login to DockerHub
        if: ${{ github.event_name == 'release' || (github.event_name == 'workflow_dispatch' && github.event.inputs.push_image == 'true') }}
        uses: docker/login-action@v2
        with:
          username: ${{ secrets.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKERHUB_PASSWORD }}

      - name: Set vars
        id: setvars
        run: make gh-docker-vars >> $GITHUB_OUTPUT

      - name: Set latest tag
        id: setlatest
        if: ${{ (github.event_name == 'release' && github.event.release.target_commitish == 'master') || (github.event_name == 'workflow_dispatch' && github.event.inputs.use_latest_tag == 'true') }}
        run: echo "latest=,${{ steps.setvars.outputs.repo }}:latest" >> $GITHUB_OUTPUT

      - name: Build and push
        uses: docker/build-push-action@v3
        with:
          context: .
          push: ${{ github.event_name == 'release' || (github.event_name == 'workflow_dispatch' && github.event.inputs.push_image == 'true') }}
          platforms: linux/amd64,linux/arm64
          build-args: |
            REPO=github.com/${{ github.repository }}
            VERSION=${{ steps.setvars.outputs.version }}
          tags: ${{ steps.setvars.outputs.repo }}:${{ steps.setvars.outputs.version }}${{ steps.setvars.outputs.suffix }}${{ steps.setlatest.outputs.latest }}

  build_image_wsc:
    needs: build_cli
    name: Build and push docker image (Windows Server Core)
    runs-on: windows-2022

    steps:
      - uses: actions/checkout@v3
        with:
          ref: ${{ github.event.inputs.ref }}
          fetch-depth: 0

      # For proper `deps` make target execution.
      - name: Set up Go
        uses: actions/setup-go@v3
        with:
          go-version: 1.19
          cache: true

      - name: Login to DockerHub
        if: ${{ github.event_name == 'release' || (github.event_name == 'workflow_dispatch' && github.event.inputs.push_image == 'true') }}
        uses: docker/login-action@v2
        with:
          username: ${{ secrets.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKERHUB_PASSWORD }}

      - name: Build Docker image
        run: make image

      - name: Push image to registry
        if: ${{ github.event_name == 'release' || (github.event_name == 'workflow_dispatch' && github.event.inputs.push_image == 'true') }}
        run: make image-push