diff --git a/.github/workflows/jvm-compatibility.yml b/.github/workflows/jvm-compatibility.yml new file mode 100644 index 000000000..3917f5b13 --- /dev/null +++ b/.github/workflows/jvm-compatibility.yml @@ -0,0 +1,207 @@ +name: JVM Compatibility + +on: + push: + branches: + - main + paths-ignore: + - "**.md" + - "**/docs/**" + - "**/LICENSE" + - "**/NOTICE" + + pull_request: + types: + - opened + - synchronize + - reopened + paths-ignore: + - "**.md" + - "**/docs/**" + - "**/LICENSE" + - "**/NOTICE" + + workflow_dispatch: + inputs: + pr: + description: "Pull request#" + required: false + +concurrency: + group: ${{ github.workflow }}-${{ github.event_name == 'pull_request' && github.event.number || github.sha }} + cancel-in-progress: true + +permissions: + contents: read + +env: + PREFERRED_LTS_VERSION: "25.8" + +jobs: + build: + name: Build + runs-on: ubuntu-latest + timeout-minutes: 45 + outputs: + project_version: ${{ steps.build.outputs.project_version }} + steps: + - name: Check out repository + uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4 + - name: Check out PR + run: | + git fetch --no-tags --prune --progress --no-recurse-submodules --depth=1 \ + origin pull/${{ github.event.inputs.pr }}/merge:merged-pr && git checkout merged-pr + if: github.event.inputs.pr != '' + - name: Install build toolchains + uses: actions/setup-java@a42a52cfb590b0682db41c911da5dc7798ba620e # main + with: + distribution: "temurin" + java-version: | + 8 + 11 + 17 + cache: "maven" + - name: Build all modules + id: build + run: | + mvn --batch-mode --no-transfer-progress --show-version --strict-checksums --threads 2 \ + -Dmaven.wagon.rto=30000 -DskipTests \ + -Dj8 -Pcompile-java11,compile-java17 install + PROJECT_VERSION=$(mvn --batch-mode --no-transfer-progress help:evaluate \ + -Dexpression=project.version -q -DforceStdout) + echo "project_version=$PROJECT_VERSION" >> "$GITHUB_OUTPUT" + - name: Resolve test providers + run: | + mvn --batch-mode --no-transfer-progress \ + org.apache.maven.plugins:maven-dependency-plugin:3.8.1:get \ + -Dartifact=org.apache.maven.surefire:surefire-testng:3.5.3 + mvn --batch-mode --no-transfer-progress \ + org.apache.maven.plugins:maven-dependency-plugin:3.8.1:get \ + -Dartifact=org.apache.maven.surefire:surefire-testng:3.1.2 + - name: Package Maven artifacts + run: | + tar -C "$HOME/.m2/repository" -czf \ + "$RUNNER_TEMP/clickhouse-maven-repository.tar.gz" \ + com/clickhouse org/apache/maven/surefire + shopt -s globstar nullglob + TARGET_DIRS=(**/target) + tar -czf "$RUNNER_TEMP/compiled-tests.tar.gz" "${TARGET_DIRS[@]}" + - name: Upload Maven artifacts + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 + with: + name: clickhouse-maven-repository + path: | + ${{ runner.temp }}/clickhouse-maven-repository.tar.gz + ${{ runner.temp }}/compiled-tests.tar.gz + retention-days: 1 + + compatibility: + name: ${{ matrix.vendor }} JDK ${{ matrix.java }} + needs: build + runs-on: ubuntu-latest + timeout-minutes: 45 + env: + PROJECT_VERSION: ${{ needs.build.outputs.project_version }} + strategy: + fail-fast: false + matrix: + java: ["8", "11", "17", "21", "25"] + vendor: ["openjdk", "temurin", "amazon"] + exclude: + # Oracle's OpenJDK archive exposed by setup-java starts at JDK 9. + - java: "8" + vendor: "openjdk" + steps: + - name: Check out repository + uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4 + - name: Check out PR + run: | + git fetch --no-tags --prune --progress --no-recurse-submodules --depth=1 \ + origin pull/${{ github.event.inputs.pr }}/merge:merged-pr && git checkout merged-pr + if: github.event.inputs.pr != '' + - name: Activate test JVM + uses: actions/setup-java@a42a52cfb590b0682db41c911da5dc7798ba620e # main + with: + distribution: ${{ (matrix.java == '8' || matrix.java == '11') && 'temurin' || matrix.vendor == 'openjdk' && 'oracle-openjdk' || matrix.vendor == 'amazon' && 'corretto' || 'temurin' }} + java-version: ${{ (matrix.java == '8' || matrix.java == '11') && '17' || matrix.java }} + cache: "maven" + - name: Download Maven artifacts + uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4 + with: + name: clickhouse-maven-repository + path: ${{ runner.temp }}/clickhouse-maven-repository + - name: Restore Maven artifacts + run: | + mkdir -p "$HOME/.m2/repository" + tar -C "$HOME/.m2/repository" -xzf \ + "$RUNNER_TEMP/clickhouse-maven-repository/clickhouse-maven-repository.tar.gz" + tar -xzf \ + "$RUNNER_TEMP/clickhouse-maven-repository/compiled-tests.tar.gz" + - name: Test all modules + run: | + mvn --batch-mode --no-transfer-progress --show-version --strict-checksums --threads 2 \ + -Dmaven.wagon.rto=30000 -DclickhouseVersion=$PREFERRED_LTS_VERSION -Dj8 \ + -Pcompile-java11,compile-java17 \ + org.apache.maven.plugins:maven-surefire-plugin:3.5.3:test \ + org.apache.maven.plugins:maven-failsafe-plugin:3.1.2:integration-test \ + org.apache.maven.plugins:maven-failsafe-plugin:3.1.2:verify + - name: Activate legacy example JVM + if: matrix.java == '8' || matrix.java == '11' + uses: actions/setup-java@a42a52cfb590b0682db41c911da5dc7798ba620e # main + with: + distribution: ${{ matrix.vendor == 'openjdk' && 'oracle-openjdk' || matrix.vendor == 'amazon' && 'corretto' || 'temurin' }} + java-version: ${{ matrix.java }} + - name: Compile examples + run: | + EXAMPLES=( + examples/client/pom.xml + examples/client-v2/pom.xml + examples/jdbc/pom.xml + examples/r2dbc/pom.xml + ) + if [[ "${{ matrix.java }}" != "8" && "${{ matrix.java }}" != "11" ]]; then + EXAMPLES+=( + examples/client-v2-apache-arrow/pom.xml + examples/client-v2-json-processors/pom.xml + examples/demo-kotlin-service/pom.xml + examples/demo-service/pom.xml + examples/jdbc-v2-json-processors/pom.xml + ) + fi + for pom in "${EXAMPLES[@]}"; do + mvn --batch-mode --no-transfer-progress -f "$pom" \ + -Dclickhouse-java.version="$PROJECT_VERSION" clean compile + done + - name: Run client example smoke test + run: | + CLICKHOUSE_PASSWORD=$(openssl rand -hex 32) + docker run --detach --rm --name clickhouse-example --publish 8123:8123 \ + --env CLICKHOUSE_USER=default \ + --env CLICKHOUSE_PASSWORD="$CLICKHOUSE_PASSWORD" \ + --env CLICKHOUSE_DEFAULT_ACCESS_MANAGEMENT=1 \ + "clickhouse/clickhouse-server:$PREFERRED_LTS_VERSION" + trap 'docker rm --force clickhouse-example >/dev/null 2>&1 || true' EXIT + for attempt in {1..30}; do + if curl --fail --silent http://localhost:8123/ping >/dev/null; then + break + fi + sleep 2 + done + curl --fail --silent http://localhost:8123/ping >/dev/null + OUTPUT=$(mvn --batch-mode --no-transfer-progress -f examples/client/pom.xml \ + -Dclickhouse-java.version="$PROJECT_VERSION" \ + -DchPassword="$CLICKHOUSE_PASSWORD" \ + org.codehaus.mojo:exec-maven-plugin:3.5.0:java \ + -Dexec.mainClass=com.clickhouse.examples.jdbc.Main) + printf '%s\n' "$OUTPUT" + [[ "$OUTPUT" == *"Inserted 10 records"* ]] + [[ "$OUTPUT" == *"Query returned 10 records"* ]] + - name: Upload test results + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 + if: failure() + with: + name: test-results-${{ matrix.vendor }}-jdk-${{ matrix.java }} + path: | + **/target/failsafe-reports + **/target/surefire-reports + retention-days: 5 diff --git a/examples/demo-kotlin-service/pom.xml b/examples/demo-kotlin-service/pom.xml index 2556b5927..085db3cca 100644 --- a/examples/demo-kotlin-service/pom.xml +++ b/examples/demo-kotlin-service/pom.xml @@ -58,7 +58,7 @@ 0.10.0-rc1-SNAPSHOT all - 2.0.20 + 2.4.10 17 2.3.12 1.4.14 diff --git a/examples/demo-service/pom.xml b/examples/demo-service/pom.xml index 280077896..bec0ee0f4 100644 --- a/examples/demo-service/pom.xml +++ b/examples/demo-service/pom.xml @@ -62,6 +62,7 @@ 0.10.0-rc1-SNAPSHOT all + 1.18.42 1.14.3 @@ -115,6 +116,19 @@ + + org.apache.maven.plugins + maven-compiler-plugin + + + + org.projectlombok + lombok + ${lombok.version} + + + + org.springframework.boot spring-boot-maven-plugin