name: 'action-docker-build-push'
description: 'Setup docker, build image and push'
branding:
  icon: package
  color: orange

inputs:
  registry:
    description: 'Server address of Docker registry. If not set then will default to Docker Hub'
    required: false
  username:
    description: 'Username used to log against the Docker registry'
    required: false
  password:
    description: 'Password or personal access token used to log against the Docker registry'
    required: false

  context:
    description: "Build's context is the set of files located in the specified PATH or URL"
    required: false
    default: '.'
  file:
    description: "Path to the Dockerfile"
    required: false
    default: 'Dockerfile'
  tags:
    description: "List/CSV of tags"
    required: false
  labels:
    description: "List of labels"
    required: false
  platforms:
    description: "List/CSV of target platforms for build"
    required: false
  push:
    description: "Push is a shorthand for --output=type=registry"
    required: false
    default: 'true'
  build-args:
    description: "Docker build args"
    required: false
    default: ''

runs:
  using: 'composite'
  steps:
    - name: Set up Proxy env
      shell: bash
      run: |
        echo "[$(date +'%Y-%m-%d %H:%M:%S')] ⚙️ Set up Proxy env"
        if [ -n "${{ env.HTTP_PROXY }}" ]; then
          echo "http_proxy=${{ env.HTTP_PROXY }}" >> $GITHUB_ENV
        fi
        if [ -n "${{ env.HTTPS_PROXY }}" ]; then
          echo "https_proxy=${{ env.HTTPS_PROXY }}" >> $GITHUB_ENV
        fi
        if [ -n "${{ env.NO_PROXY }}" ]; then
          echo "no_proxy=${{ env.NO_PROXY }}" >> $GITHUB_ENV
        fi
        echo "http_proxy=${{ env.http_proxy }}"
        echo "https_proxy=${{ env.https_proxy }}"
        echo "no_proxy=${{ env.no_proxy }}"

    - name: echo Set up QEMU
      shell: bash
      run: echo -e "\n[$(date +'%Y-%m-%d %H:%M:%S')] ⚙️ Set up QEMU"

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

    - name: echo Set up Docker BuildX
      shell: bash
      run: echo -e "\n[$(date +'%Y-%m-%d %H:%M:%S')] ⚙️ Set up Docker BuildX"

    - name: Set up Docker BuildX
      uses: docker/setup-buildx-action@v3
      with:
        driver-opts: |
          env.http_proxy=${{ env.http_proxy }}
          env.https_proxy=${{ env.https_proxy }}
          "env.no_proxy='${{ env.no_proxy }}'"

    - name: echo Login to DockerHub
      shell: bash
      run: echo -e "\n[$(date +'%Y-%m-%d %H:%M:%S')] ⚙️ Login to DockerHub"
      if: ${{ inputs.username != '' }}

    - name: Login to DockerHub
      uses: docker/login-action@v3
      if: ${{ inputs.password != '' }}
      with:
        registry: ${{ inputs.registry }}
        username: ${{ inputs.username }}
        password: ${{ inputs.password }}
      env:
        HTTP_PROXY: ${{ env.http_proxy }}
        HTTPS_PROXY: ${{ env.https_proxy }}
        NO_PROXY: ${{ env.no_proxy }}

    - name: echo Cache docker build
      shell: bash
      run: echo -e "\n[$(date +'%Y-%m-%d %H:%M:%S')] ⚙️ Cache docker build"

    - name: Cache docker build
      uses: actions/cache@v3
      with:
        path: /opt/docker-cache/.build-cache
        key: ${{ runner.os }}-docker-build-cache

    - name: echo Build and push
      shell: bash
      run: echo -e "\n[$(date +'%Y-%m-%d %H:%M:%S')] ⚙️ Build and push"

    - name: Get docker meta
      id: meta
      shell: bash
      run: |
        if [ -n "${{ inputs.tags }}" ]; then
          echo TAGS=$(echo "${{ inputs.tags }}" | tr '\n' ',' | sed 's/,$//') >> $GITHUB_OUTPUT
        else
          REPO_NAME=$(echo ${GITHUB_REPOSITORY} | awk -F"/" '{print $2}')
          REPO_VERSION=$(echo ${{ github.ref }} | awk -F"/" '{print $3}' | awk -F"v" '{print (NF>1) ? $2 : $1}')
          if [ -n "${{ inputs.registry }}" ]; then
            TAGS="${{ inputs.registry }}/${{ inputs.username }}/$REPO_NAME:latest"
            echo "TAGS=$TAGS,${{ inputs.registry }}/${{ inputs.username }}/$REPO_NAME:$REPO_VERSION" >> $GITHUB_OUTPUT
          else
            TAGS="${{ inputs.username }}/$REPO_NAME:latest"
            echo "TAGS=$TAGS,${{ inputs.username }}/$REPO_NAME:$REPO_VERSION" >> $GITHUB_OUTPUT
          fi
        fi

    - name: echo Get docker meta
      shell: bash
      run: |
        echo -e "\n[$(date +'%Y-%m-%d %H:%M:%S')] ⚙️ Get docker meta"
        echo TAGS=${{ steps.meta.outputs.TAGS }}

    - name: Build and push
      uses: docker/build-push-action@v4
      with:
        context: ${{ inputs.context }}
        file: ${{ inputs.file }}
        platforms: ${{ inputs.platforms }}
        push: ${{ inputs.push }}
        tags: ${{ steps.meta.outputs.TAGS }}
        labels: ${{ inputs.labels }}
        cache-from: type=local,src=/opt/docker-cache/.build-cache
        cache-to: type=local,dest=/opt/docker-cache/.build-cache,mode=max
        build-args: |
            "http_proxy='${{ env.http_proxy }}'"
            "https_proxy='${{ env.https_proxy }}'"
            ${{ inputs.build-args }}