name: Build container images

on:
  push:
    branches:
      - "master"
    tags:
      - "*"

jobs:
  build-image:
    runs-on: ubuntu-22.04
    steps:
      - uses: actions/checkout@v3

      # set environment
      - name: Set BUILD_TIME env
        run: echo "BUILD_TIME=$(date)" >> $GITHUB_ENV

      - name: Set GIT_COMMIT env
        run: echo "GIT_COMMIT=$(git rev-parse --short HEAD)" >> $GITHUB_ENV

      - name: Environment printer
        uses: managedkaos/print-env@v1.0

      - name: Prepare image tags
        id: image-tags
        run: |
          base=ngoduykhanh/wireguard-ui
          app_version=dev

          ## Set git tag as image tag
          ##
          if [[ '${{ github.ref }}' == *"refs/tags/"* ]]; then
            github_tag="${GITHUB_REF#refs/*/}"

            SEMVER_REGEX="^v(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)(\\-[0-9A-Za-z-]+(\\.[0-9A-Za-z-]+)*)?(\\+[0-9A-Za-z-]+(\\.[0-9A-Za-z-]+)*)?$"
            if [[ "$github_tag" =~ $SEMVER_REGEX ]]; then
              github_tag=$(echo "${github_tag}" | sed 's/^v//')
            fi

            app_version=${github_tag}

            container_images=$(cat <<END_HEREDOC
          ${base}:${github_tag}
          END_HEREDOC
          )
          
          ## Set 'latest' image tag if 'main' or 'master'
          ## branch is pushed
          ##
          elif [[ '${{ github.ref }}' == 'refs/heads/master' || '${{ github.ref }}' == 'refs/heads/main' ]]; then
            container_images=$(cat <<END_HEREDOC
          ${base}:latest
          END_HEREDOC
            )
          fi

          ## Print tags for debugging purpose
          ##
          echo "[INFO] container_images: ${container_images}"
          
          ## Set container_images output
          ##
          echo "container_images<<EOF" >> $GITHUB_OUTPUT
          echo "$container_images" >> $GITHUB_OUTPUT
          echo "EOF" >> $GITHUB_OUTPUT
          
          ## Set APP_VERSION env
          #
          echo "APP_VERSION=${app_version}" >> $GITHUB_ENV

      # set up docker and build images
      - name: Set up QEMU
        uses: docker/setup-qemu-action@v2

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

      - name: Login to Docker Hub
        uses: docker/login-action@v2
        with:
          username: ${{ secrets.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKERHUB_TOKEN }}

      - name: Build and push
        uses: docker/build-push-action@v4
        with:
          push: true
          context: .
          platforms: linux/amd64,linux/arm/v7,linux/arm64
          tags: ${{ steps.image-tags.outputs.container_images }}
          build-args: |
            APP_VERSION=${{ env.APP_VERSION }}
            BUILD_TIME=${{ env.BUILD_TIME }}
            GIT_COMMIT=${{ env.GIT_COMMIT }}
          cache-from: type=gha
          cache-to: type=gha,mode=max