#
# Copyright Debezium Authors
#
# Licensed under the Apache Software License version 2.0, available at http://www.apache.org/licenses/LICENSE-2.0
#
# Cross CI workflow is triggered on a `pull_request` event.
# It builds the Debezium core before building the Debezium Server basing on either the `main` branch or the `pull_request` branch.
# If a `pull_request` with same branch name is present in the Debezium's upstream core repository, then the core build of this `pull_request`
# will be based on `pull_request` branch of user's Debezium core repository.
# Otherwise the core build of this `pull_request` will be based on the `main` branch of Debezium's upstream core repository.

name: Cross Maven CI

on:
  pull_request:
    branches:
      - main
      - 1.*
      - 2.*
    paths-ignore:
      - '*.md'

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout Debezium Server repository
        uses: actions/checkout@v4
        with:
          path: server
      - name: Check if pull request branch exists in debezium main repository
        id: branch
        env:
          branch_name: ${{ github.head_ref }}
        run: |
          curl --silent -X "GET" https://api.github.com/repos/debezium/debezium/pulls | jq '.[] | {branch: .head.ref}' | jq -r '.branch' >> SORTED_PULLS.txt

          while IFS=" " read -r BRANCH;
          do
            if grep -q "$branch_name" <<< "$BRANCH"; then
              echo "BRANCH_FOUND=true" >> $GITHUB_OUTPUT
            fi
          done < SORTED_PULLS.txt
      - name: Checkout core repository with pull request branch
        if: ${{ steps.branch.outputs.BRANCH_FOUND == 'true' }}
        uses: actions/checkout@v4
        with:
          repository: ${{ github.event.pull_request.user.login }}/debezium
          ref: ${{ github.head_ref }}
          path: core
      - name: Checkout core repository with default base branch
        if: ${{ steps.branch.outputs.BRANCH_FOUND != 'true' }}
        uses: actions/checkout@v4
        with:
          repository: debezium/debezium
          ref: ${{ github.base_ref }}
          path: core
      - name: Set up JDK
        uses: actions/setup-java@v4
        with:
          distribution: 'temurin'
          java-version: 21
      - name: Cache Maven packages
        uses: actions/cache@v4
        with:
          path: ~/.m2
          key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }}
          restore-keys: ${{ runner.os }}-m2
      - name: Maven build core
        run: ./server/mvnw clean install -f core/pom.xml -DskipTests -DskipITs -Dformat.formatter.goal=validate -Dformat.imports.goal=check -Dhttp.keepAlive=false -Dmaven.wagon.http.pool=false -Dmaven.wagon.httpconnectionManager.ttlSeconds=120
      - name: Maven build Debezium Server
        run: ./server/mvnw clean install -fae -f server/pom.xml -Passembly -Dformat.formatter.goal=validate -Dformat.imports.goal=check -Dhttp.keepAlive=false -Dmaven.wagon.http.pool=false -Dmaven.wagon.httpconnectionManager.ttlSeconds=120 -DskipNonCore
      - name: Archive Debezium distribution
        uses: actions/upload-artifact@v4
        with:
          name: debezium-dist-artifact
          path: ./server/debezium-server-dist/target/debezium-server-dist*.tar.gz

  validate-distribution:
    name: Verify debezium-server distribution
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        sink: [ redis ]
    needs: build
    steps:
      - name: Set up JDK
        uses: actions/setup-java@v4
        with:
          distribution: 'temurin'
          java-version: 21
      - name: Checkout Debezium Server repository
        uses: actions/checkout@v4
        with:
          path: server
      - name: Download Debezium distribution
        uses: actions/download-artifact@v4
        with:
          name: debezium-dist-artifact
      - name: Unzip Debezium distribution
        run: tar xf debezium-server-dist-*.tar.gz
      - name: Validate sink '${{matrix.sink}}'
        run: |
          # Creating the distribution archives
          DISTRIBUTION_FOLDER=./debezium-server
          SINK=${{matrix.sink}}
          CONFIG_FOLDER=./server/debezium-server-dist/src/test/resources/$SINK
          
          # Start Up dependant services
          docker compose -f $CONFIG_FOLDER/docker-compose.yml up -d
          
          # Copy configuration file
          cp $CONFIG_FOLDER/application.properties $DISTRIBUTION_FOLDER/config/application.properties
          
          # Run debezium server at background
          docker run --name server-$SINK -d -v $DISTRIBUTION_FOLDER:/opt:z -p 8080:8080 --network debezium-backend -w /opt registry.access.redhat.com/ubi8/openjdk-21 ./run.sh
          
          # Verify
          timeout 60 bash -c 'while [[ "$(curl -s -o /dev/null -w ''%{http_code}'' http://localhost:8080/q/health)" != "200" ]]; do sleep 5; done' || false
      - name: Print logs
        if: failure()
        run: |
          echo "Logs from dependant services:"
          docker compose -f ./server/debezium-server-dist/src/test/resources/${{matrix.sink}}/docker-compose.yml logs
          echo "Logs from Debezium server:"
          docker logs server-${{matrix.sink}}
      - name: Clean Up
        if: always()
        run: |
          docker rm -f server-${{matrix.sink}}
          docker compose -f ./server/debezium-server-dist/src/test/resources/${{matrix.sink}}/docker-compose.yml down
