diff --git a/.github/actions/setup-ccm/action.yml b/.github/actions/setup-ccm/action.yml new file mode 100644 index 00000000000..b04d03c82bd --- /dev/null +++ b/.github/actions/setup-ccm/action.yml @@ -0,0 +1,139 @@ +name: Set up CCM for integration tests +description: > + Install ccm and its Python toolchain, the Zulu JDKs Cassandra needs, + SSL certificates, Simulacron, and pre-download the Cassandra distribution. + +inputs: + server-version: + description: 'Cassandra minor version (e.g. "4.1"); resolved to the latest patch release.' + required: true + +runs: + using: composite + steps: + # ---- Python for ccm ---- + - name: Set up Python 3.9.16 + uses: actions/setup-python@v5 + with: + python-version: "3.9.16" + + - name: Install ccm + shell: bash + run: | + python -m pip install --upgrade pip + git clone --depth 1 --single-branch -b cassandra-test https://github.com/apache/cassandra-ccm.git + cd cassandra-ccm + pip install -r requirements.txt + ./setup.py install + + # ---- Install required Zulu JDKs (8/11/17) and capture their homes ---- + - name: Install Zulu 11 + id: z11 + uses: actions/setup-java@v5 + with: + distribution: zulu + java-version: "11" + + - name: Install Zulu 17 + id: z17 + uses: actions/setup-java@v5 + with: + distribution: zulu + java-version: "17" + + - name: Install Zulu 8 + id: z8 + uses: actions/setup-java@v5 + with: + distribution: zulu + java-version: "8" + + - name: Export JAVA*_HOME variables + shell: bash + run: | + echo "JAVA8_HOME=${{ steps.z8.outputs.path }}" >> "$GITHUB_ENV" + echo "JAVA11_HOME=${{ steps.z11.outputs.path }}" >> "$GITHUB_ENV" + echo "JAVA17_HOME=${{ steps.z17.outputs.path }}" >> "$GITHUB_ENV" + echo "JAVA_HOME=${{ steps.z8.outputs.path }}" >> "$GITHUB_ENV" + echo "CCM_UPDATE_PID_DEFAULT_TIMEOUT=120" >> "$GITHUB_ENV" + # "-" tells bin/cassandra not to use jemalloc, skipping its unbounded `find` over the + # library dirs, which can exceed the pid timeout on a cold cache under parallel tests. + echo "CASSANDRA_LIBJEMALLOC=-" >> "$GITHUB_ENV" + + - name: Generate SSL certificates + shell: bash + run: | + mkdir -p /home/runner/workspace/tools/ccm/ssl/ + cd /home/runner/workspace/tools/ccm/ssl/ + keytool -genkey \ + -keyalg RSA \ + -alias cassandra \ + -keystore keystore.jks \ + -storepass cassandra \ + -keypass cassandra \ + -validity 364635 \ + -dname "CN=Jane He, OU=TE, O=ASF, L=Santa Clara, ST=CA, C=TE" + keytool -export \ + -alias cassandra \ + -file cassandra.crt \ + -keystore keystore.jks \ + -storepass cassandra + openssl x509 \ + -inform der \ + -in cassandra.crt \ + -out cassandra.pem + keytool -genkeypair \ + -keyalg RSA \ + -alias client \ + -keystore truststore.jks \ + -storepass cassandra \ + -keypass cassandra \ + -validity 364635 \ + -dname "CN=Philip Thompson, OU=TE, O=DataStax, L=Santa Clara, ST=CA, C=TE" + keytool -importkeystore \ + -srckeystore truststore.jks \ + -destkeystore client.p12 \ + -srcstorepass cassandra \ + -deststorepass cassandra \ + -deststoretype PKCS12 + openssl pkcs12 \ + -in client.p12 \ + -passin pass:cassandra \ + -nokeys \ + -out client_cert.pem -legacy + openssl pkcs12 \ + -in client.p12 \ + -passin pass:cassandra \ + -nodes \ + -nocerts \ + -out client_key.pem -legacy + + - name: Install Simulacron + shell: bash + run: | + wget https://github.com/datastax/simulacron/releases/download/0.12.0/simulacron-standalone-0.12.0.jar -O /home/runner/simulacron.jar + + - name: Resolve Cassandra latest patch version + shell: bash + env: + SERVER_VERSION: ${{ inputs.server-version }} + run: | + PATCH_SERVER_VERSION=$( + curl -s https://downloads.apache.org/cassandra/ \ + | grep -oP '(?<=href=")[0-9]+\.[0-9]+\.[0-9]+(?=)' \ + | sort -rV \ + | uniq -w 3 \ + | grep "^${SERVER_VERSION}\." + ) + echo "Resolved Cassandra ${SERVER_VERSION}.x -> ${PATCH_SERVER_VERSION}" + echo "CCM_VERSION=$PATCH_SERVER_VERSION" >> "$GITHUB_ENV" + + - name: Print environment + shell: bash + run: printenv | sort + + - name: Pre-download Cassandra distribution + shell: bash + run: | + ccm create predownload -v $CCM_VERSION + ccm remove diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 00000000000..9b95cceeb26 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,116 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +name: Unit and Integration Tests + +on: + push: + pull_request: + workflow_dispatch: # allow manual trigger from the Actions page + +permissions: + contents: read + actions: read + checks: write + +jobs: + unit-integration-tests: + name: Unit and Integration Tests (JDK ${{ matrix.TEST_JAVA_VERSION }}, C* ${{ matrix.SERVER_VERSION }}) + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + TEST_JAVA_VERSION: ["17", "21"] + SERVER_VERSION: ["3.11", "4.0", "4.1", "5.0"] # Cassandra minor versions + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Set up CCM + uses: ./.github/actions/setup-ccm + with: + server-version: ${{ matrix.SERVER_VERSION }} + + - name: Set up JDK 17 + uses: actions/setup-java@v5 + with: + distribution: zulu + java-version: 17 + cache: maven + + - name: Build (skip tests) + run: mvn -B -V install -DskipTests -Dmaven.javadoc.skip=true + + - name: Set up JDK ${{ matrix.TEST_JAVA_VERSION }} + uses: actions/setup-java@v5 + with: + distribution: zulu + java-version: ${{ matrix.TEST_JAVA_VERSION }} + cache: maven + + - name: Run unit and integration tests + run: | + mvn -B -V verify -T 1 \ + -DtestJavaHome="$JAVA_HOME" \ + -Dccm.version="$CCM_VERSION" \ + -Dccm.dse=false \ + -Dmaven.test.failure.ignore=true \ + -Dmaven.javadoc.skip=true + + - name: Check test results + run: | + failed=$(grep -lE ']* (failures|errors)="[1-9]' \ + $(find . -path '*/target/*-reports/TEST-*.xml') /dev/null || true) + if [ -n "$failed" ]; then + echo "Test failures or errors in:" + echo "$failed" + exit 1 + fi + + - name: Upload test results + if: ${{ !cancelled() }} + uses: actions/upload-artifact@v4 + with: + name: it-results-jdk${{ matrix.TEST_JAVA_VERSION }}-cassandra${{ matrix.SERVER_VERSION }} + path: | + **/target/surefire-reports/TEST-*.xml + **/target/failsafe-reports/TEST-*.xml + **/hs_err_pid*.log + if-no-files-found: ignore + + publish-test-results: + name: Publish test results + needs: [unit-integration-tests] + runs-on: ubuntu-latest + permissions: + checks: write + pull-requests: write + if: ${{ !cancelled() }} + + steps: + - name: Download artifacts + uses: actions/download-artifact@v4 + with: + path: artifacts + + - name: Publish test results + uses: EnricoMi/publish-unit-test-result-action@v2 + with: + files: artifacts/**/TEST-*.xml diff --git a/.github/workflows/publish-docs-gp-pages.yml b/.github/workflows/publish-docs-gp-pages.yml index 57851d517c0..8273f09fcb0 100644 --- a/.github/workflows/publish-docs-gp-pages.yml +++ b/.github/workflows/publish-docs-gp-pages.yml @@ -16,12 +16,12 @@ jobs: with: path: java-driver - # 2. Java 8 - - name: Set up Java 8 + # 2. Java 17 + - name: Set up Java 17 uses: actions/setup-java@v4 with: distribution: temurin - java-version: "8" + java-version: "17" cache: maven # 3. Python 3.10.19 + MkDocs + plugins diff --git a/Jenkinsfile-asf b/Jenkinsfile-asf deleted file mode 100644 index 0abeb4388ea..00000000000 --- a/Jenkinsfile-asf +++ /dev/null @@ -1,85 +0,0 @@ -#!groovy - -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -pipeline { - agent { - label 'cassandra-small' - } - - triggers { - // schedules only run against release branches (i.e. 3.x, 4.x, 4.5.x, etc.) - cron(branchPatternCron().matcher(env.BRANCH_NAME).matches() ? '@weekly' : '') - } - - options { - buildDiscarder(logRotator(daysToKeepStr: '60', numToKeepStr: '30')) - } - - stages { - stage('Matrix') { - matrix { - axes { - axis { - name 'TEST_JAVA_VERSION' - values 'openjdk@1.8.0-292', 'openjdk@1.11.0-9', 'openjdk@1.17.0', 'openjdk@1.21.0' - } - axis { - name 'SERVER_VERSION' - values '3.11', - '4.0', - '4.1', - '5.0' - } - } - stages { - stage('Tests') { - agent { - label 'cassandra-medium' - } - steps { - script { - executeTests() - junit testResults: '**/target/surefire-reports/TEST-*.xml', allowEmptyResults: true - junit testResults: '**/target/failsafe-reports/TEST-*.xml', allowEmptyResults: true - } - } - } - } - } - } - } -} - -def executeTests() { - def testJavaMajorVersion = (TEST_JAVA_VERSION =~ /@(?:1\.)?(\d+)/)[0][1] - sh """ - container_id=\$(docker run -td -e TEST_JAVA_VERSION=${TEST_JAVA_VERSION} -e SERVER_VERSION=${SERVER_VERSION} -e TEST_JAVA_MAJOR_VERSION=${testJavaMajorVersion} -v \$(pwd):/home/docker/cassandra-java-driver apache.jfrog.io/cassan-docker/apache/cassandra-java-driver-testing-ubuntu2204 'sleep 2h') - docker exec --user root \$container_id bash -c \"sudo bash /home/docker/cassandra-java-driver/ci/create-user.sh docker \$(id -u) \$(id -g) /home/docker/cassandra-java-driver\" - docker exec --user docker \$container_id './cassandra-java-driver/ci/run-tests.sh' - ( nohup docker stop \$container_id >/dev/null 2>/dev/null & ) - """ -} - -// branch pattern for cron -// should match 3.x, 4.x, 4.5.x, etc -def branchPatternCron() { - ~'((\\d+(\\.[\\dx]+)+))' -} diff --git a/ci/create-user.sh b/ci/create-user.sh deleted file mode 100644 index fb193df9a00..00000000000 --- a/ci/create-user.sh +++ /dev/null @@ -1,60 +0,0 @@ -#!/bin/bash -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -################################ -# -# Prep -# -################################ - -if [ "$1" == "-h" ]; then - echo "$0 [-h] " - echo " this script is used internally by other scripts in the same directory to create a user with the running host user's same uid and gid" - exit 1 -fi - -# arguments -username=$1 -uid=$2 -gid=$3 -BUILD_HOME=$4 - -################################ -# -# Main -# -################################ - -# disable git directory ownership checks -su ${username} -c "git config --global safe.directory '*'" - -if grep "^ID=" /etc/os-release | grep -q 'debian\|ubuntu' ; then - deluser docker - adduser --quiet --disabled-login --no-create-home --uid $uid --gecos ${username} ${username} - groupmod --non-unique -g $gid $username - gpasswd -a ${username} sudo >/dev/null -else - adduser --no-create-home --uid $uid ${username} -fi - -# sudo priviledges -echo "${username} ALL=(root) NOPASSWD:ALL" > /etc/sudoers.d/${username} -chmod 0440 /etc/sudoers.d/${username} - -# proper permissions -chown -R ${username}:${username} /home/docker -chmod og+wx ${BUILD_HOME} \ No newline at end of file diff --git a/ci/install-jdk.sh b/ci/install-jdk.sh deleted file mode 100644 index 674961c2daf..00000000000 --- a/ci/install-jdk.sh +++ /dev/null @@ -1,318 +0,0 @@ -#!/usr/bin/env bash - -# -# Install JDK for Linux and Mac OS -# -# This script determines the most recent early-access build number, -# downloads the JDK archive to the user home directory and extracts -# it there. -# -# Exported environment variables (when sourcing this script) -# -# JAVA_HOME is set to the extracted JDK directory -# PATH is prepended with ${JAVA_HOME}/bin -# -# (C) 2018 Christian Stein -# -# https://github.com/sormuras/bach/blob/master/install-jdk.sh -# - -set -o errexit -#set -o nounset # https://github.com/travis-ci/travis-ci/issues/5434 -#set -o xtrace - -function initialize() { - readonly script_name="$(basename "${BASH_SOURCE[0]}")" - readonly script_version='2018-10-17' - - dry=false - silent=false - verbose=false - emit_java_home=false - - feature='ea' - license='GPL' - os='?' - url='?' - workspace="${HOME}" - target='?' - cacerts=false -} - -function usage() { -cat << EOF -Usage: ${script_name} [OPTION]... -Download and extract the latest-and-greatest JDK from java.net or Oracle. - -Version: ${script_version} -Options: - -h|--help Displays this help - -d|--dry-run Activates dry-run mode - -s|--silent Displays no output - -e|--emit-java-home Print value of "JAVA_HOME" to stdout (ignores silent mode) - -v|--verbose Displays verbose output - - -f|--feature 9|10|...|ea JDK feature release number, defaults to "ea" - -l|--license GPL|BCL License defaults to "GPL", BCL also indicates OTN-LA for Oracle Java SE - -o|--os linux-x64|osx-x64 Operating system identifier (works best with GPL license) - -u|--url "https://..." Use custom JDK archive (provided as .tar.gz file) - -w|--workspace PATH Working directory defaults to \${HOME} [${HOME}] - -t|--target PATH Target directory, defaults to first component of the tarball - -c|--cacerts Link system CA certificates (currently only Debian/Ubuntu is supported) -EOF -} - -function script_exit() { - if [[ $# -eq 1 ]]; then - printf '%s\n' "$1" - exit 0 - fi - - if [[ $# -eq 2 && $2 =~ ^[0-9]+$ ]]; then - printf '%b\n' "$1" - exit "$2" - fi - - script_exit 'Invalid arguments passed to script_exit()!' 2 -} - -function say() { - if [[ ${silent} != true ]]; then - echo "$@" - fi -} - -function verbose() { - if [[ ${verbose} == true ]]; then - echo "$@" - fi -} - -function parse_options() { - local option - while [[ $# -gt 0 ]]; do - option="$1" - shift - case ${option} in - -h|-H|--help) - usage - exit 0 - ;; - -v|-V|--verbose) - verbose=true - ;; - -s|-S|--silent) - silent=true - verbose "Silent mode activated" - ;; - -d|-D|--dry-run) - dry=true - verbose "Dry-run mode activated" - ;; - -e|-E|--emit-java-home) - emit_java_home=true - verbose "Emitting JAVA_HOME" - ;; - -f|-F|--feature) - feature="$1" - verbose "feature=${feature}" - shift - ;; - -l|-L|--license) - license="$1" - verbose "license=${license}" - shift - ;; - -o|-O|--os) - os="$1" - verbose "os=${os}" - shift - ;; - -u|-U|--url) - url="$1" - verbose "url=${url}" - shift - ;; - -w|-W|--workspace) - workspace="$1" - verbose "workspace=${workspace}" - shift - ;; - -t|-T|--target) - target="$1" - verbose "target=${target}" - shift - ;; - -c|-C|--cacerts) - cacerts=true - verbose "Linking system CA certificates" - ;; - *) - script_exit "Invalid argument was provided: ${option}" 2 - ;; - esac - done -} - -function determine_latest_jdk() { - local number - local curl_result - local url - - verbose "Determine latest JDK feature release number" - number=9 - while [[ ${number} != 99 ]] - do - url=http://jdk.java.net/${number} - curl_result=$(curl -o /dev/null --silent --head --write-out %{http_code} ${url}) - if [[ ${curl_result} -ge 400 ]]; then - break - fi - verbose " Found ${url} [${curl_result}]" - latest_jdk=${number} - number=$[$number +1] - done - - verbose "Latest JDK feature release number is: ${latest_jdk}" -} - -function perform_sanity_checks() { - if [[ ${feature} == '?' ]] || [[ ${feature} == 'ea' ]]; then - feature=${latest_jdk} - fi - if [[ ${feature} -lt 9 ]] || [[ ${feature} -gt ${latest_jdk} ]]; then - script_exit "Expected feature release number in range of 9 to ${latest_jdk}, but got: ${feature}" 3 - fi - if [[ -d "$target" ]]; then - script_exit "Target directory must not exist, but it does: $(du -hs '${target}')" 3 - fi -} - -function determine_url() { - local DOWNLOAD='https://download.java.net/java' - local ORACLE='http://download.oracle.com/otn-pub/java/jdk' - - # Archived feature or official GA build? - case "${feature}-${license}" in - 9-GPL) url="${DOWNLOAD}/GA/jdk9/9.0.4/binaries/openjdk-9.0.4_${os}_bin.tar.gz"; return;; - 9-BCL) url="${ORACLE}/9.0.4+11/c2514751926b4512b076cc82f959763f/jdk-9.0.4_${os}_bin.tar.gz"; return;; - 10-GPL) url="${DOWNLOAD}/GA/jdk10/10.0.2/19aef61b38124481863b1413dce1855f/13/openjdk-10.0.2_${os}_bin.tar.gz"; return;; - 10-BCL) url="${ORACLE}/10.0.2+13/19aef61b38124481863b1413dce1855f/jdk-10.0.2_${os}_bin.tar.gz"; return;; - 11-GPL) url="${DOWNLOAD}/GA/jdk11/13/GPL/openjdk-11.0.1_${os}_bin.tar.gz"; return;; - 11-BCL) url="${ORACLE}/11.0.1+13/90cf5d8f270a4347a95050320eef3fb7/jdk-11.0.1_${os}_bin.tar.gz"; return;; - esac - - # EA or RC build? - local JAVA_NET="http://jdk.java.net/${feature}" - local candidates=$(wget --quiet --output-document - ${JAVA_NET} | grep -Eo 'href[[:space:]]*=[[:space:]]*"[^\"]+"' | grep -Eo '(http|https)://[^"]+') - url=$(echo "${candidates}" | grep -Eo "${DOWNLOAD}/.+/jdk${feature}/.+/${license}/.*jdk-${feature}.+${os}_bin.tar.gz$" || true) - - if [[ -z ${url} ]]; then - script_exit "Couldn't determine a download url for ${feature}-${license} on ${os}" 1 - fi -} - -function prepare_variables() { - if [[ ${os} == '?' ]]; then - if [[ "$OSTYPE" == "darwin"* ]]; then - os='osx-x64' - else - os='linux-x64' - fi - fi - if [[ ${url} == '?' ]]; then - determine_latest_jdk - perform_sanity_checks - determine_url - else - feature='' - license='' - os='' - fi - archive="${workspace}/$(basename ${url})" - status=$(curl -o /dev/null --silent --head --write-out %{http_code} ${url}) -} - -function print_variables() { -cat << EOF -Variables: - feature = ${feature} - license = ${license} - os = ${os} - url = ${url} - status = ${status} - archive = ${archive} -EOF -} - -function download_and_extract_and_set_target() { - local quiet='--quiet'; if [[ ${verbose} == true ]]; then quiet=''; fi - local local="--directory-prefix ${workspace}" - local remote='--timestamping --continue' - local wget_options="${quiet} ${local} ${remote}" - local tar_options="--file ${archive}" - - say "Downloading JDK from ${url}..." - verbose "Using wget options: ${wget_options}" - if [[ ${license} == 'GPL' ]]; then - wget ${wget_options} ${url} - else - wget ${wget_options} --header "Cookie: oraclelicense=accept-securebackup-cookie" ${url} - fi - - verbose "Using tar options: ${tar_options}" - if [[ ${target} == '?' ]]; then - tar --extract ${tar_options} -C "${workspace}" - if [[ "$OSTYPE" != "darwin"* ]]; then - target="${workspace}"/$(tar --list ${tar_options} | grep 'bin/javac' | tr '/' '\n' | tail -3 | head -1) - else - target="${workspace}"/$(tar --list ${tar_options} | head -2 | tail -1 | cut -f 2 -d '/' -)/Contents/Home - fi - else - if [[ "$OSTYPE" != "darwin"* ]]; then - mkdir --parents "${target}" - tar --extract ${tar_options} -C "${target}" --strip-components=1 - else - mkdir -p "${target}" - tar --extract ${tar_options} -C "${target}" --strip-components=4 # . / / Contents / Home - fi - fi - - if [[ ${verbose} == true ]]; then - echo "Set target to: ${target}" - echo "Content of target directory:" - ls "${target}" - echo "Content of release file:" - [[ ! -f "${target}/release" ]] || cat "${target}/release" - fi - - # Link to system certificates - # http://openjdk.java.net/jeps/319 - # https://bugs.openjdk.java.net/browse/JDK-8196141 - # TODO: Provide support for other distributions than Debian/Ubuntu - if [[ ${cacerts} == true ]]; then - mv "${target}/lib/security/cacerts" "${target}/lib/security/cacerts.jdk" - ln -s /etc/ssl/certs/java/cacerts "${target}/lib/security/cacerts" - fi -} - -function main() { - initialize - say "$script_name $script_version" - - parse_options "$@" - prepare_variables - - if [[ ${silent} == false ]]; then print_variables; fi - if [[ ${dry} == true ]]; then exit 0; fi - - download_and_extract_and_set_target - - export JAVA_HOME=$(cd "${target}"; pwd) - export PATH=${JAVA_HOME}/bin:$PATH - - if [[ ${silent} == false ]]; then java -version; fi - if [[ ${emit_java_home} == true ]]; then echo "${JAVA_HOME}"; fi -} - -main "$@" \ No newline at end of file diff --git a/ci/run-tests.sh b/ci/run-tests.sh deleted file mode 100755 index 5268bdd7113..00000000000 --- a/ci/run-tests.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash -x - -. ~/.jabba/jabba.sh -. ~/env.txt -cd $(dirname "$(readlink -f "$0")")/.. -printenv | sort -mvn -B -V install -DskipTests -Dmaven.javadoc.skip=true -jabba use ${TEST_JAVA_VERSION} -# Find out the latest patch version of Cassandra -PATCH_SERVER_VERSION=$(curl -s https://downloads.apache.org/cassandra/ | grep -oP '(?<=href=\")[0-9]+\.[0-9]+\.[0-9]+(?=)' | sort -rV | uniq -w 3 | grep $SERVER_VERSION) -printenv | sort -mvn -B -V verify -T 1 -Ptest-jdk-${TEST_JAVA_MAJOR_VERSION} -DtestJavaHome=$(jabba which ${TEST_JAVA_VERSION}) -Dccm.version=${PATCH_SERVER_VERSION} -Dccm.dse=false -Dmaven.test.failure.ignore=true -Dmaven.javadoc.skip=true