name: Publish Servlet images for smoke tests

on:
  push:
    paths:
      - "smoke-tests/images/servlet/**"
      - ".github/workflows/publish-smoke-test-servlet-images.yml"
    branches:
      - main
  workflow_dispatch:

jobs:
  prepare:
    runs-on: ubuntu-latest
    outputs:
      tag: ${{ steps.set-tag.outputs.TAG }}
    steps:
      - id: set-tag
        name: Set tag
        run: echo "TAG=$(date '+%Y%m%d').$GITHUB_RUN_ID" >> $GITHUB_OUTPUT

  publish:
    needs: prepare
    runs-on: ${{ matrix.os }}
    defaults:
      run:
        shell: bash # this is needed for TAG construction below on Windows
    strategy:
      matrix:
        os:
          - windows-latest
          - ubuntu-latest
        smoke-test-server:
          - jetty
          - liberty
          - payara
          - tomcat
          - tomee
          - websphere
          - wildfly
        exclude:
          - os: windows-latest
            smoke-test-server: websphere
      fail-fast: false
    steps:
      - name: Support long paths
        run: git config --system core.longpaths true
        if: matrix.os == 'windows-latest'

      - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4

      - name: Free disk space
        if: matrix.os != 'windows-latest'
        run: .github/scripts/gha-free-disk-space.sh

      - name: Set up JDK for running Gradle
        uses: actions/setup-java@99b8673ff64fbf99d8d325f52d9a5bdedb8483e9 # v4.2.1
        with:
          distribution: temurin
          java-version: 21

      - name: Login to GitHub package registry
        uses: docker/login-action@e92390c5fb421da1463c202d546fed0ec5c39f20 # v3.1.0
        with:
          registry: ghcr.io
          username: ${{ github.repository_owner }}
          password: ${{ secrets.GITHUB_TOKEN }}

      - name: Set up Gradle cache
        uses: gradle/actions/setup-gradle@db19848a5fa7950289d3668fb053140cf3028d43 # v3.3.2
        with:
          # only push cache for one matrix option per OS since github action cache space is limited
          cache-read-only: ${{ matrix.smoke-test-suite != 'tomcat' }}

      - name: Build Linux docker images
        if: matrix.os != 'windows-latest'
        run: ./gradlew :smoke-tests:images:servlet:buildLinuxTestImages pushMatrix -PextraTag=${{ needs.prepare.outputs.tag }} -PsmokeTestServer=${{ matrix.smoke-test-server }}

      - name: Build Windows docker images
        if: matrix.os == 'windows-latest'
        run: ./gradlew :smoke-tests:images:servlet:buildWindowsTestImages pushMatrix -PextraTag=${{ needs.prepare.outputs.tag }} -PsmokeTestServer=${{ matrix.smoke-test-server }}

  workflow-notification:
    needs:
      - publish
    if: always()
    uses: ./.github/workflows/reusable-workflow-notification.yml
    with:
      success: ${{ needs.publish.result == 'success' }}
