name: Build Debezium (PR)

on:
  pull_request:
    branches:
      - main
      - 1.*
      - 2.*

env:
  MAVEN_FULL_BUILD_PROJECTS: "\\!debezium-microbenchmark-oracle"

# Pushes to each pull request will trigger a cancellation of any existing push jobs for that pull request,
# and will restart the build based on the latest push data for that specific pull request.
concurrency:
  group: ${{ github.workflow }}-${{ github.ref_name }}
  cancel-in-progress: true

jobs:
  # This job is responsible for inspecting the changes in the repository and setting specific output variables
  # that subsequent jobs can use to determine whether a particular job should be skipped or included.
  file_changes:
    name: "Detect repository changes"
    runs-on: ubuntu-latest
    outputs:
      common-changed: ${{ steps.changed-files-common.outputs.any_changed }}
      mongodb-changed: ${{ steps.changed-files-mongodb.outputs.any_changed }}
      mariadb-changed: ${{ steps.changed-files-mariadb.outputs.any_changed }}
      mysql-changed: ${{ steps.changed-files-mysql.outputs.any_changed }}
      postgresql-changed: ${{ steps.changed-files-postgresql.outputs.any_changed }}
      oracle-changed: ${{ steps.changed-files-oracle.outputs.any_changed }}
      sqlserver-changed: ${{ steps.changed-files-sqlserver.outputs.any_changed }}
      jdbc-changed: ${{ steps.changed-files-jdbc.outputs.any_changed }}
      outbox-changed: ${{ steps.changed-files-outbox.outputs.any_changed }}
      rest-extension-changed: ${{ steps.changed-files-rest-extension.outputs.any_changed }}
      schema-generator-changed: ${{ steps.changed-files-schema-generator.outputs.any_changed }}
      debezium-testing-changed: ${{ steps.changed-files-debezium-testing.outputs.any_changed }}
      debezium-testing-mongodb-changed: ${{ steps.changed-files-debezium-testing-mongodb.outputs.any_changed }}
      mysql-ddl-parser-changed: ${{ steps.changed-files-mysql-ddl-parser.outputs.any_changed }}
      oracle-ddl-parser-changed: ${{ steps.changed-files-oracle-ddl-parser.outputs.any_changed }}
      mariadb-ddl-parser-changed: ${{ steps.changed-files-mariadb-ddl-parser.outputs.any_changed }}
      documentation-only-changed: ${{ steps.changed-files-documentation.outputs.only_changed }}
      storage-only-changed: ${{ steps.changed-files-storage.outputs.only_changed }}
    steps:
      - name: Checkout Action
        uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Get modified files (Common)
        id: changed-files-common
        uses: tj-actions/changed-files@v45.0.5
        with:
          files: |
            support/checkstyle/**
            support/revapi/**
            debezium-api/**
            debezium-assembly-descriptors/**
            debezium-core/**
            debezium-embedded/**
            debezium-revapi/**
            debezium-ide-configs/**
            debezium-parent/pom.xml
            debezium-bom/pom.xml
            debezium-storage/** 
            debezium-scripting/**          
            pom.xml
            .mvn/**
            .github/actions/**
            .github/workflows/debezium-workflow-pr.yml

      - name: Get modified files (MongoDB)
        id: changed-files-mongodb
        uses: tj-actions/changed-files@v45.0.5
        with:
          files: |
            debezium-sink/**
            debezium-connector-mongodb/**

      - name: Get modified files (MySQL)
        id: changed-files-mysql
        uses: tj-actions/changed-files@v45.0.5
        with:
          files: |
            debezium-connector-mysql/**
            debezium-connector-binlog/**

      - name: Get modified files (MariaDB)
        id: changed-files-mariadb
        uses: tj-actions/changed-files@v45.0.5
        with:
          files: |
            debezium-connector-mariadb/**
            debezium-connector-binlog/**

      - name: Get modified files (PostgreSQL)
        id: changed-files-postgresql
        uses: tj-actions/changed-files@v45.0.5
        with:
          files: |
            debezium-connector-postgres/**

      - name: Get modified files (Oracle)
        id: changed-files-oracle
        uses: tj-actions/changed-files@v45.0.5
        with:
          files: |
            debezium-connector-oracle/**

      - name: Get modified files (SQL Server)
        id: changed-files-sqlserver
        uses: tj-actions/changed-files@v45.0.5
        with:
          files: |
            debezium-connector-sqlserver/**

      - name: Get modified files (JDBC)
        id: changed-files-jdbc
        uses: tj-actions/changed-files@v45.0.5
        with:
          files: |
            debezium-sink/**
            debezium-connector-jdbc/**

      - name: Get modified files (Quarkus Outbox)
        id: changed-files-outbox
        uses: tj-actions/changed-files@v45.0.5
        with:
          files: |
            debezium-quarkus-outbox/**
            debezium-quarkus-outbox-common/**
            debezium-quarkus-outbox-reactive/**

      - name: Get modified files (REST Extension)
        id: changed-files-rest-extension
        uses: tj-actions/changed-files@v45.0.5
        with:
          files: |
            debezium-connect-rest-extension/**

      - name: Get modified files (Schema Generator)
        id: changed-files-schema-generator
        uses: tj-actions/changed-files@v45.0.5
        with:
          files: |
            debezium-schema-generator/**

      - name: Get modified files (Debezium Testing)
        id: changed-files-debezium-testing
        uses: tj-actions/changed-files@v45.0.5
        with:
          files: |
            debezium-testing/**

      - name: Get modified files (Debezium Testing MongoDB)
        id: changed-files-debezium-testing-mongodb
        uses: tj-actions/changed-files@v45.0.5
        with:
          files: |
            debezium-testing/**/MongoDb*.java

      - name: Get modified files (MySQL DDL parser)
        id: changed-files-mysql-ddl-parser
        uses: tj-actions/changed-files@v45.0.5
        with:
          files: |
            debezium-ddl-parser/src/main/antlr4/io/debezium/ddl/parser/mysql/**
            debezium-ddl-parser/src/main/java/io/debezium/antlr/**
            debezium-ddl-parser/src/test/resources/mysql/examples/**

      - name: Get modified files (Oracle DDL parser)
        id: changed-files-oracle-ddl-parser
        uses: tj-actions/changed-files@v45.0.5
        with:
          files: |
            debezium-ddl-parser/src/main/antlr4/io/debezium/ddl/parser/oracle/**
            debezium-ddl-parser/src/main/java/io/debezium/antlr/**
            debezium-ddl-parser/src/main/java/io/debezium/ddl/parser/oracle/**
            debezium-ddl-parser/src/test/resources/oracle/examples/**

      - name: Get modified files (Documentation)
        id: changed-files-documentation
        uses: tj-actions/changed-files@v45.0.5
        with:
          files: |
            documentation/**

      - name: Get modified files (Storage)
        id: changed-files-storage
        uses: tj-actions/changed-files@v45.0.5
        with:
          files: |
            debezium-storage/**

  # Approx 1m
  build_cache:
    name: "Update Dependencies"
    needs: [ file_changes ]
    if: ${{ needs.file_changes.outputs.documentation-only-changed == 'false' }}
    runs-on: ubuntu-latest
    steps:
      - name: Checkout Action (Core)
        uses: actions/checkout@v4
        with:
          path: core

      - name: Checkout Action (Debezium Server)
        uses: actions/checkout@v4
        with:
          repository: debezium/debezium-server
          path: server
          ref: ${{ github.event.pull_request.base.ref }} 

      - uses: ./core/.github/actions/setup-java

      # GitHub actions seem to struggle returning actions/cache cache-hit
      # Directly use the cache action here to control whether to fetch dependencies
      - id: maven-cache-check
        uses: actions/cache@v4
        with:
          path: ~/.m2/repository
          key: maven-debezium-test-build-${{ hashFiles('core/**/pom.xml') }}
          # Caches should be restored based on a logical order to minimize the build and test
          # execution time. Here the logic is as follows:
          #   1. Restore this PR's cache if the PR has previously been built
          #   2. Restore the latest main cache if the core pom has not changed
          #   3. Restore the latest main cache available
          # This should minimize the download time required for updating dependencies
          restore-keys: |
            maven-debezium-test-build-${{ hashFiles('core/**/pom.xml') }}
            maven-debezium-test-push-build-${{ hashFiles('core/**/pom.xml') }}
            maven-debezium-test-push-build-

      # This step is responsible for pulling down artifacts
      # Unfortunately due to the nature of how some of the maven workflows work, the only reliable way
      # to guarantee fully seeding the maven cache is to run a full build. This step does not execute
      # tests, formatting, checkstyle, nor import sorts.
      #
      # This check is conditioned so that if the cache-key was not found, we will execute this step.
      # If the cache-key was found, this means we cannot update the cache and therefore we should
      # not need to explicitly run this step. This should improve response of format/checkstyle
      # errors to users faster.
      #
      # This job also explicitly excludes the "debezium-microbenchmark-oracle" module temporarily.
      # There is a dependency on xstream.jar for this module that should be fixed and made to not
      # be required so that the module can be built on GitHub Actions.
      - name: Download dependencies (Core)
        if: steps.maven-cache-check.outputs.cache-hit != 'true'
        run: >
          ./core/mvnw -B -ntp clean install -f core/pom.xml
          -pl ${{ env.MAVEN_FULL_BUILD_PROJECTS }}
          -Dformat.skip=true
          -Dcheckstyle.skip=true
          -Dorg.slf4j.simpleLogger.showDateTime=true
          -Dorg.slf4j.simpleLogger.dateTimeFormat="YYYY-MM-dd HH:mm:ss,SSS"
          -DskipTests=true
          -DskipITs=true

      - name: Download dependencies (Debezium Server)
        if: steps.maven-cache-check.outputs.cache-hit != 'true'
        # There are some corner cases where dependencies change and core no longer defines the
        # dependency; however Debezium Server due to checking out main, may still refer to it.
        # In this case, if the artifact fetch fails, we shouldn't fail the job.  Fixing the
        # dependency in the Debezium Server repository with the same Jira issue tag as the
        # main repository's PR will run the build based on the PR changes in main, and will
        # allow validating the Debezium Server build separately.
        continue-on-error: true
        run: >
          ./server/mvnw -B -ntp clean install -f server/pom.xml
          -Dformat.skip=true
          -Dcheckstyle.skip=true
          -Dorg.slf4j.simpleLogger.showDateTime=true
          -Dorg.slf4j.simpleLogger.dateTimeFormat="YYYY-MM-dd HH:mm:ss,SSS"
          -DskipTests=true
          -DskipITs=true

  # Approx 1m
  check_style:
    name: "Checkstyle and Formatting"
    needs: [ build_cache ]
    runs-on: ubuntu-latest
    steps:
      - name: Checkout Action
        uses: actions/checkout@v4

      - uses: ./.github/actions/checkstyle-format
        with:
          maven-cache-key: maven-debezium-test-build-${{ hashFiles('**/pom.xml') }}

  build_mongodb:
    strategy:
      # Runs each combination concurrently
      matrix:
        version-mongo-server: [ "5.0", "8.0" ]
      fail-fast: false
    name: "MongoDB ${{ matrix.version-mongo-server }}"
    needs: [ check_style, file_changes ]
    runs-on: ubuntu-latest
    if: ${{ needs.file_changes.outputs.common-changed == 'true' || needs.file_changes.outputs.mongodb-changed == 'true' || needs.file_changes.outputs.debezium-testing-mongodb-changed == 'true' || needs.file_changes.outputs.schema-generator-changed == 'true' }}
    steps:
      - name: Checkout Action
        uses: actions/checkout@v4

      - uses: ./.github/actions/build-debezium-mongodb
        with:
          maven-cache-key: maven-debezium-test-build-${{ hashFiles('**/pom.xml') }}
          version-mongo-server: ${{ matrix.version-mongo-server }}

  # Approx 40m each
  build_mysql:
    strategy:
      # Runs each combination concurrently
      matrix:
        profile: [ "mysql-ci", "mysql-ci-gtids", "mysql-ci-percona", "mysql-ci-ssl" ]
        version-mysql-server: [ "8.0", "8.4", "9.1" ]
      fail-fast: false
    name: "MySQL ${{ matrix.version-mysql-server }} - ${{ matrix.profile }}"
    needs: [ check_style, file_changes ]
    runs-on: ubuntu-latest
    if: ${{ needs.file_changes.outputs.common-changed == 'true' || needs.file_changes.outputs.mysql-changed == 'true' || needs.file_changes.outputs.mysql-ddl-parser-changed == 'true' || needs.file_changes.outputs.schema-generator-changed == 'true' || needs.file_changes.outputs.debezium-testing-changed == 'true' }}
    steps:
      - name: Checkout Action
        uses: actions/checkout@v4

      - uses: ./.github/actions/build-debezium-mysql
        with:
          maven-cache-key: maven-debezium-test-build-${{ hashFiles('**/pom.xml') }}
          version-mysql-server: ${{ matrix.version-mysql-server }}
          profile: ${{ matrix.profile }}

  # Approx 40m each
  build_mariadb:
    strategy:
      # Runs each combination concurrently
      matrix:
        profile: [ 'mariadb-ci', 'mariadb-ci-gtids', 'mariadb-ci-ssl']
      fail-fast: false
    name: "MariaDB - ${{ matrix.profile }}"
    needs: [ check_style, file_changes ]
    runs-on: ubuntu-latest
    if: ${{ needs.file_changes.outputs.common-changed == 'true' || needs.file_changes.outputs.mariadb-changed == 'true' || needs.file_changes.outputs.mariadb-ddl-parser-changed == 'true' || needs.file_changes.outputs.schema-generator-changed == 'true' || needs.file_changes.outputs.debezium-testing-changed == 'true' }}
    steps:
      - name: Checkout Action
        uses: actions/checkout@v4

      - uses: ./.github/actions/build-debezium-mariadb
        with:
          maven-cache-key: maven-debezium-test-build-${{ hashFiles('**/pom.xml') }}
          profile: ${{ matrix.profile }}

  # Approx 40m each
  build_postgresql:
    strategy:
      # Runs each combination concurrently
      matrix:
        profile: [ "assembly,postgres-12", "assembly,postgres-17,pgoutput-decoder" ]
      fail-fast: false
    name: "PostgreSQL - ${{ matrix.profile }}"
    needs: [ check_style, file_changes ]
    runs-on: ubuntu-latest
    if: ${{ needs.file_changes.outputs.common-changed == 'true' || needs.file_changes.outputs.postgresql-changed == 'true' || needs.file_changes.outputs.schema-generator-changed == 'true' }}
    steps:
      - name: Checkout Action
        uses: actions/checkout@v4

      - uses: ./.github/actions/build-debezium-postgres
        with:
          maven-cache-key: maven-debezium-test-build-${{ hashFiles('**/pom.xml') }}
          profile: ${{ matrix.profile }}

  # Approx 1h 45m
  build_sqlserver:
    name: "SQL Server"
    needs: [ check_style, file_changes ]
    runs-on: ubuntu-latest
    if: ${{ needs.file_changes.outputs.common-changed == 'true' || needs.file_changes.outputs.sqlserver-changed == 'true' || needs.file_changes.outputs.schema-generator-changed == 'true' }}
    steps:
      - name: Checkout Action
        uses: actions/checkout@v4

      - uses: ./.github/actions/build-debezium-sqlserver
        with:
          maven-cache-key: maven-debezium-test-build-${{ hashFiles('**/pom.xml') }}

  # Approx 6m
  build_oracle:
    name: "Oracle"
    needs: [ check_style, file_changes ]
    runs-on: ubuntu-latest
    if: ${{ needs.file_changes.outputs.common-changed == 'true' || needs.file_changes.outputs.oracle-changed == 'true' || needs.file_changes.outputs.oracle-ddl-parser-changed == 'true' || needs.file_changes.outputs.schema-generator-changed == 'true' || needs.file_changes.outputs.debezium-testing-changed == 'true' }}
    steps:
      - name: Checkout Action
        uses: actions/checkout@v4

      - uses: ./.github/actions/build-debezium-oracle
        with:
          maven-cache-key: maven-debezium-test-build-${{ hashFiles('**/pom.xml') }}

  # Approx 2m
  build_outbox:
    name: "Quarkus Outbox Extension"
    needs: [ check_style, file_changes ]
    runs-on: ubuntu-latest
    if: ${{ needs.file_changes.outputs.common-changed == 'true' || needs.file_changes.outputs.outbox-changed == 'true' }}
    steps:
      - name: Checkout Action
        uses: actions/checkout@v4

      - uses: ./.github/actions/build-debezium-outbox
        with:
          maven-cache-key: maven-debezium-test-build-${{ hashFiles('**/pom.xml') }}

  # Approx 5m
  build_rest_extension:
    name: "REST Extension"
    needs: [ check_style, file_changes ]
    runs-on: ubuntu-latest
    if: ${{ needs.file_changes.outputs.common-changed == 'true' || needs.file_changes.outputs.rest-extension-changed == 'true' || needs.file_changes.outputs.debezium-testing-changed == 'true' }}
    steps:
      - name: Checkout Action
        uses: actions/checkout@v4

      - uses: ./.github/actions/build-debezium-rest-extension
        with:
          maven-cache-key: maven-debezium-test-build-${{ hashFiles('**/pom.xml') }}

  # Approx 2m
  build_schema_generator:
    name: "Schema Generator"
    needs: [ check_style, file_changes ]
    runs-on: ubuntu-latest
    if: ${{ needs.file_changes.outputs.common-changed == 'true' || needs.file_changes.outputs.schema-generator-changed == 'true' }}
    steps:
      - name: Checkout Action
        uses: actions/checkout@v4

      - uses: ./.github/actions/build-debezium-schema-generator
        with:
          maven-cache-key: maven-debezium-test-build-${{ hashFiles('**/pom.xml') }}

  # Approx 5m
  build_debezium_testing:
    name: "Testing Module"
    needs: [ check_style, file_changes ]
    runs-on: ubuntu-latest
    if: ${{ needs.file_changes.outputs.common-changed == 'true' || needs.file_changes.outputs.debezium-testing-changed == 'true' }}
    steps:
      - name: Checkout Action
        uses: actions/checkout@v4

      - uses: ./.github/actions/build-debezium-testing
        with:
          maven-cache-key: maven-debezium-test-build-${{ hashFiles('**/pom.xml') }}

  # Approx 3m
  build_storage:
    name: "Storage Module"
    needs: [ check_style, file_changes ]
    runs-on: ubuntu-latest
    if: ${{ needs.file_changes.outputs.common-changed == 'true' || needs.file_changes.outputs.mysql-changed == 'true' || needs.file_changes.outputs.mysql-ddl-parser-changed == 'true' || needs.file_changes.outputs.storage-only-changed == 'true' }}
    steps:
      - name: Checkout Action
        uses: actions/checkout@v4

      - uses: ./.github/actions/build-debezium-storage
        with:
          maven-cache-key: maven-debezium-test-build-${{ hashFiles('**/pom.xml') }}

  # Approx 25m
  build_cassandra:
    name: "Cassandra"
    needs: [ check_style, file_changes ]
    runs-on: ubuntu-latest
    if: ${{ needs.file_changes.outputs.common-changed == 'true' || needs.file_changes.outputs.debezium-testing-changed == 'true' }}
    steps:
      - name: Checkout Action (Debezium Core)
        uses: actions/checkout@v4
        with:
          path: core

      - name: Checkout Action (Cassandra)
        uses: actions/checkout@v4
        with:
          repository: debezium/debezium-connector-cassandra
          path: cassandra
          ref: ${{ github.event.pull_request.base.ref }} 

      - uses: ./core/.github/actions/setup-java

      - uses: ./core/.github/actions/maven-cache
        with:
          # We specifically only use the hash of the pom files from the core repository
          key: maven-debezium-test-build-${{ hashFiles('core/**/pom.xml') }}

      - uses: ./core/.github/actions/build-debezium-cassandra
        with:
          path-core: core
          path-cassandra: cassandra

  # Approx 1h
  build_db2:
    name: "Db2"
    needs: [ check_style, file_changes ]
    runs-on: ubuntu-latest
    if: ${{ needs.file_changes.outputs.common-changed == 'true' || needs.file_changes.outputs.debezium-testing-changed == 'true' }}
    steps:
      - name: Checkout Action (Debezium Core)
        uses: actions/checkout@v4
        with:
          path: core

      - name: Checkout Action (Db2)
        uses: actions/checkout@v4
        with:
          repository: debezium/debezium-connector-db2
          path: db2
          ref: ${{ github.event.pull_request.base.ref }} 

      - uses: ./core/.github/actions/setup-java

      - uses: ./core/.github/actions/maven-cache
        with:
          # We specifically only use the hash of the pom files from the core repository
          key: maven-debezium-test-build-${{ hashFiles('core/**/pom.xml') }}

      - uses: ./core/.github/actions/build-debezium-db2
        with:
          path-core: core
          path-db2: db2

  build_ibmi:
    name: "IBMi"
    needs: [ check_style, file_changes ]
    runs-on: ubuntu-latest
    if: ${{ needs.file_changes.outputs.common-changed == 'true' || needs.file_changes.outputs.debezium-testing-changed == 'true' }}
    steps:
      - name: Checkout Action (Debezium Core)
        uses: actions/checkout@v4
        with:
          path: core

      - name: Checkout Action (IBMi)
        uses: actions/checkout@v4
        with:
          repository: debezium/debezium-connector-ibmi
          path: ibmi
          ref: ${{ github.event.pull_request.base.ref }} 

      - uses: ./core/.github/actions/setup-java

      - uses: ./core/.github/actions/maven-cache
        with:
          # We specifically only use the hash of the pom files from the core repository
          key: maven-debezium-test-build-${{ hashFiles('core/**/pom.xml') }}

      - uses: ./core/.github/actions/build-debezium-ibmi
        with:
          path-core: core
          path-ibmi: ibmi

  # Approx 45m each
  build_informix:
    strategy:
      # Runs each combination concurrently
      matrix:
        profile: [ "assembly,informix12", "assembly,informix14" ]
      fail-fast: false
    name: "Informix - ${{ matrix.profile }}"
    needs: [ check_style, file_changes ]
    runs-on: ubuntu-latest
    if: ${{ needs.file_changes.outputs.common-changed == 'true' || needs.file_changes.outputs.debezium-testing-changed == 'true' }}
    steps:
      - name: Checkout Action (Debezium Core)
        uses: actions/checkout@v4
        with:
          path: core

      - name: Checkout Action (Informix)
        uses: actions/checkout@v4
        with:
          repository: debezium/debezium-connector-informix
          path: informix
          ref: ${{ github.event.pull_request.base.ref }} 

      - uses: ./core/.github/actions/setup-java

      - uses: ./core/.github/actions/maven-cache
        with:
          # We specifically only use the hash of the pom files from the core repository
          key: maven-debezium-test-build-${{ hashFiles('core/**/pom.xml') }}

      - uses: ./core/.github/actions/build-debezium-informix
        with:
          path-core: core
          path-informix: informix
          profile: ${{ matrix.profile }}

  # Approx 20m
  build_vitess:
    name: "Vitess"
    needs: [ check_style, file_changes ]
    runs-on: ubuntu-latest
    if: ${{ needs.file_changes.outputs.common-changed == 'true' || needs.file_changes.outputs.debezium-testing-changed == 'true' }}
    steps:
      - name: Checkout Action (Debezium Core)
        uses: actions/checkout@v4
        with:
          path: core

      - name: Checkout Action (Vitess)
        uses: actions/checkout@v4
        with:
          repository: debezium/debezium-connector-vitess
          path: vitess
          ref: ${{ github.event.pull_request.base.ref }} 

      - uses: ./core/.github/actions/setup-java

      - uses: ./core/.github/actions/maven-cache
        with:
          # We specifically only use the hash of the pom files from the core repository
          key: maven-debezium-test-build-${{ hashFiles('core/**/pom.xml') }}

      - uses: ./core/.github/actions/build-debezium-vitess
        with:
          path-core: core
          path-vitess: vitess

  # Approx 7m
  build_spanner:
    name: "Spanner"
    needs: [ check_style, file_changes ]
    runs-on: ubuntu-latest
    if: ${{ needs.file_changes.outputs.common-changed == 'true' || needs.file_changes.outputs.debezium-testing-changed == 'true' }}
    steps:
      - name: Checkout Action (Debezium Core)
        uses: actions/checkout@v4
        with:
          path: core

      - name: Checkout Action (Spanner)
        uses: actions/checkout@v4
        with:
          repository: debezium/debezium-connector-spanner
          path: spanner
          ref: ${{ github.event.pull_request.base.ref }} 

      - uses: ./core/.github/actions/setup-java

      - uses: ./core/.github/actions/maven-cache
        with:
          # We specifically only use the hash of the pom files from the core repository
          key: maven-debezium-test-build-${{ hashFiles('core/**/pom.xml') }}

      - uses: ./core/.github/actions/build-debezium-spanner
        with:
          path-core: core
          path-spanner: spanner

  # Approx 1m
  build_jdbc:
    name: "JDBC"
    needs: [ check_style, file_changes ]
    runs-on: ubuntu-latest
    if: ${{ needs.file_changes.outputs.common-changed == 'true' || needs.file_changes.outputs.mysql-changed == 'true' || needs.file_changes.outputs.mysql-ddl-parser-changed == 'true' || needs.file_changes.outputs.mariadb-changed == 'true' || needs.file_changes.outputs.postgresql-changed == 'true' || needs.file_changes.outputs.sqlserver-changed == 'true' || needs.file_changes.outputs.sqlserver-changed == 'true' || needs.file_changes.outputs.db2-changed == 'true' || needs.file_changes.outputs.jdbc-changed == 'true' || needs.file_changes.outputs.debezium-testing-changed == 'true' }}
    steps:
      - name: Checkout Action
        uses: actions/checkout@v4

      - uses: ./.github/actions/build-debezium-jdbc
        with:
          maven-cache-key: maven-debezium-test-build-${{ hashFiles('**/pom.xml') }}

  build_debezium_server:
    name: "Debezium Server"
    needs: [ check_style, file_changes ]
    runs-on: ubuntu-latest
    if: ${{ needs.file_changes.outputs.common-changed == 'true' || needs.file_changes.outputs.debezium-testing-changed == 'true' || needs.file_changes.outputs.mysql-ddl-parser-changed == 'true' }}
    steps:
      - name: Checkout Action (Debezium Core)
        uses: actions/checkout@v4
        with:
          path: core

      - name: Checkout Action (Debezium Server)
        uses: actions/checkout@v4
        with:
          repository: debezium/debezium-server
          path: server
          ref: ${{ github.event.pull_request.base.ref }} 

      - uses: ./core/.github/actions/setup-java

      - uses: ./core/.github/actions/maven-cache
        with:
          # We specifically only use the hash of the pom files from the core repository
          key: maven-debezium-test-build-${{ hashFiles('core/**/pom.xml') }}

      - uses: ./core/.github/actions/build-debezium-server
        with:
          path-core: core
          path-server: server
