name: Push images to DockerHub

# Controls when the action will run.
on:
  push:
    # Publish `master` as Docker `latest` and `git_revision` images.
    branches:
      - master
  release:
    # Publish released commit as Docker `latest` and `git_revision` images.
    types:
      - published

  # Allows to run this workflow manually from the Actions tab.
  workflow_dispatch:
    inputs:
      ref:
        description: 'Ref to build Docker images 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'

# Environment variables.
env:
  GO111MODULE: "on"

# A workflow run.
jobs:
  tests_ubuntu:
    name: Run Ubuntu-based tests before publishing
    runs-on: ubuntu-20.04

    steps:
      - uses: actions/checkout@v2
        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: Sync VM submodule
        run: |
          git submodule sync
          git submodule update --init

      - name: Set up Go
        uses: actions/setup-go@v2
        with:
          go-version: 1.18

      - name: Restore go modules from cache
        uses: actions/cache@v2
        with:
          path: /home/runner/go/pkg/mod
          key: deps-${{ hashFiles('go.sum') }}

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

      - name: Run tests
        run: make test
  publish_ubuntu:
    # Ensure test job passes before pushing image.
    needs: tests_ubuntu
    name: Publish Ubuntu-based image to DockerHub
    runs-on: ubuntu-20.04
    steps:
      - uses: actions/checkout@v2
        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@v2
        with:
          go-version: 1.18

      - name: Build image
        run: make image

      - name: Build image with 'latest' tag
        if: ${{ (github.event_name == 'release' && github.event.release.target_commitish == 'master') || (github.event_name == 'workflow_dispatch' && github.event.inputs.push_image == 'true' && github.event.inputs.use_latest_tag == 'true') }}
        run: make image-latest

      - name: Login to DockerHub
        uses: docker/login-action@v1
        with:
          username: ${{ secrets.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKERHUB_PASSWORD }}

      - 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

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

  tests_wsc:
    name: Run WindowsServerCore-based tests before publishing
    runs-on: windows-2022

    steps:
      - uses: actions/checkout@v2
        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: Sync VM submodule
        run: |
          git submodule sync
          git submodule update --init

      - name: Set up Go
        uses: actions/setup-go@v2
        with:
          go-version: 1.18

      - name: Restore go modules from cache
        uses: actions/cache@v2
        with:
          path: /home/runner/go/pkg/mod
          key: deps-${{ hashFiles('go.sum') }}

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

      - name: Run tests
        run: make test
  publish_wsc:
    # Ensure test job passes before pushing image.
    needs: tests_wsc
    name: Publish WindowsServerCore-based image to DockerHub
    runs-on: windows-2022
    steps:
      - uses: actions/checkout@v2
        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: Show docker images
        run: docker images

      - name: Set up Go
        uses: actions/setup-go@v2
        with:
          go-version: 1.18

      - name: Build image
        run: make image

      - name: Login to DockerHub
        uses: docker/login-action@v1
        with:
          username: ${{ secrets.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKERHUB_PASSWORD }}

      - 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