name: ci

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

on:
  schedule:
    - cron: '0 10 * * *'
  push:
    branches:
      - 'master'
      - 'releases/v*'
    tags:
      - 'v*.*.*'
  pull_request:

env:
  DOCKER_IMAGE: localhost:5000/name/app

jobs:
  multi-images:
    runs-on: ubuntu-latest
    steps:
      -
        name: Checkout
        uses: actions/checkout@v4
      -
        name: Docker meta
        uses: ./
        with:
          images: |
            ${{ env.DOCKER_IMAGE }}
            ghcr.io/name/app
          tags: |
            type=schedule
            type=ref,event=branch
            type=ref,event=tag
            type=ref,event=pr
            type=sha
      -
        name: Print envs
        run: env|sort

  tag-schedule:
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        tag-schedule:
          - ""
          - "cron-{{date 'YYYYMMDD'}}"
          - "{{date 'YYYYMMDD-HHmmss'}}"
          - "schedule"
    steps:
      -
        name: Checkout
        uses: actions/checkout@v4
      -
        name: Docker meta
        uses: ./
        with:
          images: |
            ${{ env.DOCKER_IMAGE }}
            ghcr.io/name/app
          tags: |
            type=schedule,pattern=${{ matrix.tag-schedule }}
            type=ref,event=branch
            type=ref,event=tag
            type=ref,event=pr
            type=sha

  tag-match:
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        include:
          - tag-match: '\d.\d.\d'
            tag-match-group: '0'
          - tag-match: '\d.\d'
            tag-match-group: '0'
          - tag-match: 'v(.*)'
            tag-match-group: '1'
    steps:
      -
        name: Checkout
        uses: actions/checkout@v4
      -
        name: Docker meta
        uses: ./
        with:
          images: |
            ${{ env.DOCKER_IMAGE }}
            ghcr.io/name/app
          tags: |
            type=schedule
            type=ref,event=branch
            type=ref,event=tag
            type=ref,event=pr
            type=match,"pattern=${{ matrix.tag-match }}",group=${{ matrix.tag-match-group }}
            type=sha

  tag-semver:
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        flavor-latest:
          - "auto"
          - "true"
          - "false"
    steps:
      -
        name: Checkout
        uses: actions/checkout@v4
      -
        name: Docker meta
        uses: ./
        with:
          images: |
            ${{ env.DOCKER_IMAGE }}
            ghcr.io/name/app
          tags: |
            type=schedule
            type=ref,event=branch
            type=ref,event=tag
            type=ref,event=pr
            type=semver,pattern={{raw}}
            type=semver,pattern={{version}}
            type=semver,pattern={{major}}.{{minor}}.{{patch}}
            type=sha
          flavor: |
            latest=${{ matrix.flavor-latest }}

  flavor:
    runs-on: ubuntu-latest
    steps:
      -
        name: Checkout
        uses: actions/checkout@v4
      -
        name: Docker meta
        uses: ./
        with:
          images: |
            ${{ env.DOCKER_IMAGE }}
            ghcr.io/name/app
          flavor: |
            prefix=foo-
            suffix=-bar

  images:
    runs-on: ubuntu-latest
    steps:
      -
        name: Checkout
        uses: actions/checkout@v4
      -
        name: Docker meta
        uses: ./
        with:
          images: |
            name=${{ env.DOCKER_IMAGE }}
            name=ghcr.io/name/app,enable=${{ github.event_name == 'pull_request' }}
            name=ghcr.io/name/release,enable=${{ startsWith(github.ref, 'refs/tags/') }}

  custom-labels-annotations:
    runs-on: ubuntu-latest
    steps:
      -
        name: Checkout
        uses: actions/checkout@v4
      -
        name: Docker meta
        uses: ./
        with:
          images: |
            ${{ env.DOCKER_IMAGE }}
            ghcr.io/name/app
          labels: |
            maintainer=CrazyMax
            org.opencontainers.image.title=MyCustomTitle
            org.opencontainers.image.description=this is a "good" example
            org.opencontainers.image.vendor=MyCompany
          annotations: |
            maintainer=Foo
            org.opencontainers.image.title=MyFooTitle
            org.opencontainers.image.description=this is a "foo" example
            org.opencontainers.image.vendor=MyFooCompany

  global-exps:
    runs-on: ubuntu-latest
    steps:
      -
        name: Checkout
        uses: actions/checkout@v4
      -
        name: Docker meta
        uses: ./
        with:
          images: |
            ${{ env.DOCKER_IMAGE }}
            ghcr.io/name/app
          tags: |
            type=sha
            type=raw,value=gexp-branch-{{branch}}
            type=raw,value=gexp-date-{{date 'YYYYMMDD'}}
            type=raw,value=gexp-tag-{{tag}}
            type=raw,value=gexp-baseref-{{base_ref}}
            type=raw,value=gexp-defbranch,enable={{is_default_branch}}

  json:
    runs-on: ubuntu-latest
    steps:
      -
        name: Checkout
        uses: actions/checkout@v4
      -
        name: Docker meta
        id: meta
        uses: ./
        with:
          images: |
            ${{ env.DOCKER_IMAGE }}
            ghcr.io/name/app
          labels: |
            maintainer=CrazyMax
      -
        name: JSON output
        run: |
          echo "maintainer=${{ fromJSON(steps.meta.outputs.json).labels['maintainer'] }}"
          echo "version=${{ fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.version'] }}"
          echo "revision=${{ fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.revision'] }}"
          echo "created=${{ fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.created'] }}"

  docker-push:
    runs-on: ubuntu-latest
    services:
      registry:
        image: registry:2
        ports:
          - 5000:5000
    steps:
      -
        name: Checkout
        uses: actions/checkout@v4
      -
        name: Docker meta
        id: docker_meta
        uses: ./
        with:
          images: |
            ${{ env.DOCKER_IMAGE }}
          tags: |
            type=schedule
            type=ref,event=branch
            type=ref,event=tag
            type=ref,event=pr
            type=semver,pattern=v{{version}}
            type=semver,pattern=v{{major}}.{{minor}}
            type=semver,pattern=v{{major}}
            type=sha
      -
        name: Set up QEMU
        uses: docker/setup-qemu-action@v3
      -
        name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3
        with:
          driver-opts: network=host
      -
        name: Build and push to local registry
        uses: docker/build-push-action@v5
        with:
          context: ./test
          file: ./test/Dockerfile
          platforms: linux/amd64,linux/arm64,linux/386
          push: true
          tags: ${{ steps.docker_meta.outputs.tags }}
          labels: ${{ steps.docker_meta.outputs.labels }}
      -
        name: Inspect image
        run: |
          docker pull ${{ env.DOCKER_IMAGE }}:${{ steps.docker_meta.outputs.version }}
          docker image inspect ${{ env.DOCKER_IMAGE }}:${{ steps.docker_meta.outputs.version }}
      -
        name: Check manifest
        run: |
          docker buildx imagetools inspect ${{ env.DOCKER_IMAGE }}:${{ steps.docker_meta.outputs.version }}
      -
        name: Dump context
        if: always()
        uses: crazy-max/ghaction-dump-context@v2

  bake:
    runs-on: ubuntu-latest
    steps:
      -
        name: Checkout
        uses: actions/checkout@v4
      -
        name: Docker meta
        id: docker_meta
        uses: ./
        with:
          images: |
            ${{ env.DOCKER_IMAGE }}
            ghcr.io/name/app
          tags: |
            type=schedule
            type=ref,event=branch
            type=ref,event=tag
            type=ref,event=pr
            type=semver,pattern={{version}}
            type=semver,pattern={{major}}.{{minor}}
            type=semver,pattern={{major}}
            type=sha
      -
        name: Set up QEMU
        uses: docker/setup-qemu-action@v3
      -
        name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3
      -
        name: Build
        uses: docker/bake-action@v4
        with:
          files: |
            ./test/docker-bake.hcl
            ${{ steps.docker_meta.outputs.bake-file-tags }}
            ${{ steps.docker_meta.outputs.bake-file-labels }}
          targets: |
            release

  sep-tags:
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        sep:
          - " "
          - ","
    steps:
      -
        name: Checkout
        uses: actions/checkout@v4
      -
        name: Docker meta
        id: meta
        uses: ./
        with:
          images: |
            ${{ env.DOCKER_IMAGE }}
            ghcr.io/name/app
          sep-tags: ${{ matrix.sep }}
      -
        name: Tags
        uses: actions/github-script@v7
        with:
          script: |
            console.log(`${{ steps.meta.outputs.tags }}`);

  output-env:
    runs-on: ubuntu-latest
    steps:
      -
        name: Checkout
        uses: actions/checkout@v4
      -
        name: Docker meta
        id: meta
        uses: ./
        with:
          images: |
            ${{ env.DOCKER_IMAGE }}
            ghcr.io/name/app
          labels: |
            maintainer=CrazyMax
          annotations: |
            maintainer=Foo
      -
        name: Build
        uses: docker/build-push-action@v5
        with:
          context: ./test
          file: ./test/output.Dockerfile
          build-args: |
            DOCKER_METADATA_OUTPUT_VERSION
            DOCKER_METADATA_OUTPUT_TAGS
            DOCKER_METADATA_OUTPUT_LABELS
            DOCKER_METADATA_OUTPUT_ANNOTATIONS
            DOCKER_METADATA_OUTPUT_JSON

  bake-annotations:
    runs-on: ubuntu-latest
    steps:
      -
        name: Checkout
        uses: actions/checkout@v4
      -
        name: Docker meta
        id: docker_meta
        uses: ./
        with:
          images: |
            ${{ env.DOCKER_IMAGE }}
            ghcr.io/name/app
          tags: |
            type=schedule
            type=ref,event=branch
            type=ref,event=tag
            type=ref,event=pr
            type=semver,pattern={{version}}
            type=semver,pattern={{major}}.{{minor}}
            type=semver,pattern={{major}}
            type=sha
        env:
          DOCKER_METADATA_ANNOTATIONS_LEVELS: manifest,index
      -
        name: Set up QEMU
        uses: docker/setup-qemu-action@v3
      -
        name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3
        with:
          version: latest
      -
        name: Build
        uses: docker/bake-action@v4
        with:
          files: |
            ./test/docker-bake.hcl
            ${{ steps.docker_meta.outputs.bake-file-tags }}
            ${{ steps.docker_meta.outputs.bake-file-annotations }}
          targets: |
            release

  no-images:
    runs-on: ubuntu-latest
    steps:
      -
        name: Checkout
        uses: actions/checkout@v4
      -
        name: Docker meta
        uses: ./
        with:
          tags: |
            type=schedule
            type=ref,event=branch
            type=ref,event=tag
            type=ref,event=pr
            type=sha
      -
        name: Print envs
        run: env|sort