# This pipeline aims at building Glances Docker images

name: build_docker

env:
  DEFAULT_DOCKER_IMAGE: nicolargo/glances
  PUSH_BRANCH: ${{ 'refs/heads/develop' == github.ref || 'refs/heads/master' == github.ref || startsWith(github.ref, 'refs/tags/v') }}
  # Alpine image platform: https://hub.docker.com/_/alpine
  # linux/arm/v6,linux/arm/v7 do not work (timeout during the build)
  DOCKER_PLATFORMS: linux/amd64,linux/arm64/v8
  # Ubuntu image platforms list: https://hub.docker.com/_/ubuntu
  # linux/arm/v7 do not work (Cargo/Rust not available)
  DOCKER_PLATFORMS_UBUNTU: linux/amd64,linux/arm64/v8

on:
  workflow_call:
    secrets:
      DOCKER_USERNAME:
        description: 'Docker Hub username'
        required: true
      DOCKER_TOKEN:
        description: 'Docker Hub token'
        required: true

jobs:

  create_docker_images_list:
    runs-on: ubuntu-latest
    outputs:
      tags: ${{ steps.config.outputs.tags }}
    steps:
      - name: Determine image tags
        id: config
        shell: bash
        run: |
          if [[ $GITHUB_REF == refs/tags/* ]]; then
            VERSION=${GITHUB_REF#refs/tags/v}
            TAG_ARRAY="[{ \"target\": \"minimal\", \"tag\": \"${VERSION}\" },"
            TAG_ARRAY="$TAG_ARRAY { \"target\": \"full\", \"tag\": \"${VERSION}-full\" }]"
          elif [[ $GITHUB_REF == refs/heads/develop ]]; then
            TAG_ARRAY="[{ \"target\": \"dev\", \"tag\": \"dev\" }]"
          elif [[ $GITHUB_REF == refs/heads/master ]]; then
            TAG_ARRAY="[{ \"target\": \"minimal\", \"tag\": \"latest\" },"
            TAG_ARRAY="$TAG_ARRAY { \"target\": \"full\", \"tag\": \"latest-full\" }]"
          elif [[ $GITHUB_REF == refs/heads/main ]]; then
            TAG_ARRAY="[{ \"target\": \"minimal\", \"tag\": \"latest\" },"
            TAG_ARRAY="$TAG_ARRAY { \"target\": \"full\", \"tag\": \"latest-full\" }]"
          else
            TAG_ARRAY="[]"
          fi

          echo "Tags to build: $TAG_ARRAY"
          echo "tags=$TAG_ARRAY" >> $GITHUB_OUTPUT

  build_docker_images:
    runs-on: ubuntu-latest
    needs:
      - create_docker_images_list
    strategy:
      fail-fast: false
      matrix:
        os: ['alpine', 'ubuntu']
        tag: ${{ fromJson(needs.create_docker_images_list.outputs.tags) }}
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Retrieve Repository Docker metadata
        id: docker_meta
        uses: docker/metadata-action@v5
        with:
          images: ${{ env.DEFAULT_DOCKER_IMAGE }}
          labels: |
            org.opencontainers.image.url=https://nicolargo.github.io/glances/

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

      - name: Set up Docker Buildx
        id: buildx
        uses: docker/setup-buildx-action@v3
        with:
          version: latest

      - name: Login to DockerHub
        uses: docker/login-action@v3
        if: ${{ env.PUSH_BRANCH == 'true' }}
        with:
          username: ${{ secrets.DOCKER_USERNAME }}
          password: ${{ secrets.DOCKER_TOKEN }}

      - name: Build and push image
        uses: docker/build-push-action@v5
        with:
          push: ${{ env.PUSH_BRANCH == 'true' }}
          tags: "${{ env.DEFAULT_DOCKER_IMAGE }}:${{ matrix.os != 'alpine' && format('{0}-', matrix.os) || '' }}${{ matrix.tag.tag }}"
          build-args: |
            CHANGING_ARG=${{ github.sha }}
          context: .
          file: "docker-files/${{ matrix.os }}.Dockerfile"
          platforms: ${{ matrix.os != 'ubuntu' && env.DOCKER_PLATFORMS || env.DOCKER_PLATFORMS_UBUNTU }}
          target: ${{ matrix.tag.target }}
          labels: ${{ steps.docker_meta.outputs.labels }}
          # GHA default behaviour overwrites last build cache. Causes alpine and ubuntu cache to overwrite each other.
          # Use `scope` with the os name to prevent that
          cache-from: 'type=gha,scope=${{ matrix.os }}'
          cache-to: 'type=gha,mode=max,scope=${{ matrix.os }}'
