diff --git a/.github/workflows/re-release.yml b/.github/workflows/re-release.yml index 598f84e3739..bbf2929b5e4 100644 --- a/.github/workflows/re-release.yml +++ b/.github/workflows/re-release.yml @@ -5,7 +5,7 @@ on: inputs: version_tag: type: string - description: '' + description: 'version or tag to release it again' required: true jobs: @@ -16,9 +16,6 @@ jobs: permissions: contents: write - env: - MVNCMD: mvn -B -X -ntp - steps: - name: Checkout Repository uses: actions/checkout@v5 @@ -44,20 +41,14 @@ jobs: git config user.name "ScyllaDB Promoter" git config user.email "github-promoter@scylladb.com" - - name: Clean project - run: $MVNCMD clean - - - name: Clean release - run: $MVNCMD release:clean - - name: Prepare release env: GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} - run: $MVNCMD release:prepare -DskipTests -Darguments="-DskipTests" -DpushChanges=false -Dgpg.passphrase=${{ secrets.GPG_PASSPHRASE }} + run: make release-prepare - name: Perform release env: GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} OSSRH_USERNAME: ${{ secrets.OSSRH_USERNAME }} OSSRH_PASSWORD: ${{ secrets.OSSRH_PASSWORD }} - run: $MVNCMD release:perform -DscmSkip=true -Dgpg.passphrase=${{ secrets.GPG_PASSPHRASE }} + run: make release diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 36076c9cfff..49a964cbe81 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -5,7 +5,7 @@ on: inputs: dryrun: type: boolean - description: 'dryrun: run without pushing SCM changes to upstream' + description: 'dryrun: run without publishing the package' default: true jobs: @@ -47,18 +47,26 @@ jobs: - name: Prepare release env: GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} - run: $MVNCMD release:prepare -DpushChanges=false -Dgpg.passphrase=${{ secrets.GPG_PASSPHRASE }} + run: make release-prepare - name: Perform release env: GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} OSSRH_USERNAME: ${{ secrets.OSSRH_USERNAME }} OSSRH_PASSWORD: ${{ secrets.OSSRH_PASSWORD }} - if: ${{ github.event.inputs.dryrun == 'false' }} - run: $MVNCMD release:perform -Dgpg.passphrase=${{ secrets.GPG_PASSPHRASE }} + if: ${{ github.event.inputs.dryrun == false }} + run: make release + + - name: Perform dry-run release + env: + GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} + OSSRH_USERNAME: ${{ secrets.OSSRH_USERNAME }} + OSSRH_PASSWORD: ${{ secrets.OSSRH_PASSWORD }} + if: ${{ github.event.inputs.dryrun == true }} + run: make release-dry-run - name: Push changes to SCM - if: ${{ github.event.inputs.dryrun == 'false' }} + if: ${{ github.event.inputs.dryrun == false }} run: | git status && git log -3 git push origin --follow-tags -v diff --git a/.github/workflows/tests@v1.yml b/.github/workflows/tests@v1.yml index 20f37acaa7d..fafd4bab49c 100644 --- a/.github/workflows/tests@v1.yml +++ b/.github/workflows/tests@v1.yml @@ -61,19 +61,12 @@ jobs: path: ~/.m2/repository key: ${{ runner.os }}-${{ matrix.java-version }}-maven-${{ steps.get-pom-hash.outputs.value }} - - name: Install guava-shaded - run: mvn install -pl guava-shaded - - name: Compile source and tests - run: mvn -B compile test-compile -Dfmt.skip=true -Dclirr.skip=true -Danimal.sniffer.skip=true + run: make compile-all - name: Download test dependencies if: steps.java-cache.outputs.cache-hit != 'true' - run: mvn -B test -Dtest=TestThatDoesNotExists -Dfmt.skip=true -Dclirr.skip=true -Danimal.sniffer.skip=true || true - - - name: Download verify dependencies - if: steps.java-cache.outputs.cache-hit != 'true' - run: mvn -B verify -DskipTests || true + run: make download-all-dependencies - name: Save maven repository cache uses: actions/cache/save@v4 @@ -109,8 +102,7 @@ jobs: key: ${{ runner.os }}-${{ matrix.java-version }}-maven-${{ hashFiles('**/pom.xml') }} - name: Full verify - run: mvn -B verify -DskipTests - + run: make check unit-tests: name: Unit tests @@ -138,11 +130,8 @@ jobs: path: ~/.m2/repository key: ${{ runner.os }}-${{ matrix.java-version }}-maven-${{ hashFiles('**/pom.xml') }} - - name: Install guava-shaded - run: mvn install -pl guava-shaded - - name: Run unit tests - run: mvn -B test -Dfmt.skip=true -Dclirr.skip=true -Danimal.sniffer.skip=true + run: make test-unit - name: Copy test results if: always() @@ -192,7 +181,7 @@ jobs: strategy: matrix: - cassandra-version: [RELEASE-3.X, RELEASE-4.X] + cassandra-version: [3-LATEST, 4-LATEST] java-version: [8] fail-fast: false @@ -218,19 +207,13 @@ jobs: python-version: '3.13' - name: Setup environment - run: | - pip3 install https://github.com/scylladb/scylla-ccm/archive/master.zip + run: make install-cassandra-ccm - name: Get cassandra version id: cassandra-version - run: | - if [[ "${{ matrix.cassandra-version }}" == "RELEASE-3.X" ]]; then - echo "value=$(python3 ci/version_fetch.py --version-index 1 cassandra3-stable:1 | tr -d '\"')" >> $GITHUB_OUTPUT - elif [[ "${{ matrix.cassandra-version }}" == "RELEASE-4.X" ]]; then - echo "value=$(python3 ci/version_fetch.py --version-index 1 cassandra4-stable:1 | tr -d '\"')" >> $GITHUB_OUTPUT - else - echo "Unknown cassandra version name `${{ matrix.cassandra-version }}`" - fi + env: + CASSANDRA_VERSION: ${{ matrix.cassandra-version }} + run: make resolve-cassandra-version - name: Pull CCM image from the cache uses: actions/cache/restore@v4 @@ -241,11 +224,9 @@ jobs: - name: Download Cassandra (${{ steps.cassandra-version.outputs.value }}) image if: steps.ccm-cache.outputs.cache-hit != 'true' - run: | - rm -rf /tmp/download.ccm || true - mkdir /tmp/download.ccm || true - ccm create ccm_1 -i 127.0.1. -n 3:0 -v "${{ steps.cassandra-version.outputs.value }}" --config-dir=/tmp/download.ccm - rm -rf /tmp/download.ccm + env: + CASSANDRA_VERSION_RESOLVED: ${{ steps.cassandra-version.outputs.value }} + run: make download-cassandra - name: Save CCM image into the cache if: steps.ccm-cache.outputs.cache-hit != 'true' @@ -256,7 +237,9 @@ jobs: - name: Run integration tests on Cassandra (${{ steps.cassandra-version.outputs.value }}) id: run-integration-tests - run: mvn -B -e verify -Dccm.version=${{ steps.cassandra-version.outputs.value }} -Dfmt.skip=true -Dclirr.skip=true -Danimal.sniffer.skip=true + env: + CASSANDRA_VERSION_RESOLVED: ${{ steps.cassandra-version.outputs.value }} + run: make test-integration-cassandra - name: Copy test results if: steps.run-integration-tests.outcome == 'failure' @@ -299,7 +282,7 @@ jobs: strategy: matrix: - scylla-version: [ENTERPRISE-RELEASE, ENTERPRISE-PRIOR-RELEASE, OSS-RELEASE, OSS-PRIOR-RELEASE] + scylla-version: [LTS-LATEST, LTS-PRIOR, LATEST] java-version: [8] fail-fast: false @@ -324,30 +307,12 @@ jobs: with: python-version: '3.13' - - name: Setup environment - run: | - pip3 install https://github.com/scylladb/scylla-ccm/archive/master.zip - sudo sh -c "echo 2097152 > /proc/sys/fs/aio-max-nr" + - name: Install CCM + run: make install-scylla-ccm - name: Get scylla version id: scylla-version - run: | - if [[ "${{ matrix.scylla-version }}" == "ENTERPRISE-RELEASE" ]]; then - echo "value=$(python3 ci/version_fetch.py --version-index 1 scylla-enterprise-stable:1 | tr -d '\"')" >> $GITHUB_OUTPUT - elif [[ "${{ matrix.scylla-version }}" == "ENTERPRISE-PRIOR-RELEASE" ]]; then - echo "value=$(python3 ci/version_fetch.py --version-index 2 scylla-enterprise-stable:2 | tr -d '\"')" >> $GITHUB_OUTPUT - elif [[ "${{ matrix.scylla-version }}" == "ENTERPRISE-RC" ]]; then - echo "value=$(python3 ci/version_fetch.py --version-index 1 scylla-enterprise-rc | tr -d '\"')" >> $GITHUB_OUTPUT - elif [[ "${{ matrix.scylla-version }}" == "OSS-RELEASE" ]]; then - echo "value=$(python3 ci/version_fetch.py --version-index 1 scylla-oss-stable:1 | tr -d '\"')" >> $GITHUB_OUTPUT - elif [[ "${{ matrix.scylla-version }}" == "OSS-PRIOR-RELEASE" ]]; then - echo "value=$(python3 ci/version_fetch.py --version-index 2 scylla-oss-stable:2 | tr -d '\"')" >> $GITHUB_OUTPUT - elif [[ "${{ matrix.scylla-version }}" == "OSS-RC" ]]; then - echo "value=$(python3 ci/version_fetch.py --version-index 1 scylla-oss-rc | tr -d '\"')" >> $GITHUB_OUTPUT - else - echo "Unknown scylla version name `${{ matrix.scylla-version }}`" - exit 1 - fi + run: make resolve-scylla-version - name: Pull CCM image from the cache uses: actions/cache/restore@v4 @@ -358,11 +323,9 @@ jobs: - name: Download Scylla (${{ steps.scylla-version.outputs.value }}) image if: steps.ccm-cache.outputs.cache-hit != 'true' - run: | - rm -rf /tmp/download.ccm || true - mkdir /tmp/download.ccm || true - ccm create ccm_1 -i 127.0.1. -n 3:0 -v "release:${{ steps.scylla-version.outputs.value }}" --scylla --config-dir=/tmp/download.ccm - rm -rf /tmp/download.ccm + env: + SCYLLA_VERSION_RESOLVED: ${{ steps.scylla-version.outputs.value }} + run: make download-scylla - name: Save CCM image into the cache uses: actions/cache/save@v4 @@ -373,7 +336,9 @@ jobs: - name: Run integration tests on Scylla (${{ steps.scylla-version.outputs.value }}) id: run-integration-tests - run: mvn -B verify -Dccm.version=${{ steps.scylla-version.outputs.value }} -Dccm.distribution=scylla -Dfmt.skip=true -Dclirr.skip=true -Danimal.sniffer.skip=true + env: + SCYLLA_VERSION_RESOLVED: ${{ steps.scylla-version.outputs.value }} + run: make test-integration-scylla - name: Copy test results if: steps.run-integration-tests.outcome == 'failure' diff --git a/.gitignore b/.gitignore index cabb55d5a44..4a090ef1a84 100644 --- a/.gitignore +++ b/.gitignore @@ -10,6 +10,7 @@ docs/_build docs/_source html latex +bin/ .java-version .flattened-pom.xml diff --git a/Makefile b/Makefile new file mode 100644 index 00000000000..d97d58ce665 --- /dev/null +++ b/Makefile @@ -0,0 +1,269 @@ +SHELL := bash +.ONESHELL: + +MAKEFILE_PATH := $(abspath $(dir $(abspath $(lastword $(MAKEFILE_LIST))))) +SCYLLA_VERSION ?= LATEST +CASSANDRA_VERSION ?= 4-LATEST + +CCM_CASSANDRA_REPO ?= github.com/apache/cassandra-ccm +CCM_CASSANDRA_VERSION ?= 3ef48de49e428e27653f5639f492a99851e2282d + +CCM_SCYLLA_REPO ?= github.com/scylladb/scylla-ccm +CCM_SCYLLA_VERSION ?= master + +SCYLLA_EXT_OPTS ?= --smp=2 --memory=4G +MVNCMD ?= mvn -B -X -ntp +GPG_PASSPHRASE ?= +OSSRH_USERNAME ?= +MAVEN_OPTS ?= + +ifeq (${CCM_CONFIG_DIR},) + CCM_CONFIG_DIR = ~/.ccm +endif +CCM_CONFIG_DIR := $(shell readlink --canonicalize ${CCM_CONFIG_DIR}) + +export SCYLLA_EXT_OPTS +export SCYLLA_VERSION +export PATH := $(MAKEFILE_PATH)/bin:$(PATH) + +.install-guava-shaded: + $(MVNCMD) install -pl guava-shaded + +.download-test-dependencies: + $(MVNCMD) test -Dtest=TestThatDoesNotExists -Dfmt.skip=true -Dclirr.skip=true -Danimal.sniffer.skip=true || true + +.download-verify-dependencies: + $(MVNCMD) verify -DskipTests || true + +.prepare-bin: + @[[ -d "$(MAKEFILE_PATH)/bin" ]] || mkdir "$(MAKEFILE_PATH)/bin" + +.prepare-get-version: .prepare-bin + @if [[ ! -f "$(MAKEFILE_PATH)/bin/get-version" ]]; then + echo "bin/get-version is not found, installing it" + curl -sSLo /tmp/get-version.zip https://github.com/scylladb-actions/get-version/releases/download/v0.3.0/get-version_0.3.0_linux_amd64v3.zip + unzip /tmp/get-version.zip get-version -d "$(MAKEFILE_PATH)/bin" >/dev/null + fi + +.prepare-scylla-ccm: + @ccm --help 2>/dev/null 1>&2 + if [[ $$? -lt 127 ]] \ + && grep SCYLLA ${CCM_CONFIG_DIR}/ccm-type 2>/dev/null 1>&2 \ + && grep ${CCM_SCYLLA_VERSION} ${CCM_CONFIG_DIR}/ccm-version 2>/dev/null 1>&2; then + echo "ScyllaDB CCM ${CCM_SCYLLA_VERSION} is already installed" + else \ + $(MAKE) install-scylla-ccm + fi + +.prepare-cassandra-ccm: + @ccm --help 2>/dev/null 1>&2 + if [[ $$? -lt 127 ]] \ + && grep CASSANDRA ${CCM_CONFIG_DIR}/ccm-type 2>/dev/null 1>&2 \ + && grep ${CCM_CASSANDRA_VERSION} ${CCM_CONFIG_DIR}/ccm-version 2>/dev/null 1>&2; then + echo "Cassandra CCM ${CCM_CASSANDRA_VERSION} is already installed" + else \ + $(MAKE) install-cassandra-ccm + fi + +.prepare-environment-update-aio-max-nr: + @if (( $$(< /proc/sys/fs/aio-max-nr) < 2097152 )); then + echo 2097152 | sudo tee /proc/sys/fs/aio-max-nr >/dev/null + fi + +install-cassandra-ccm: + @echo "Install CCM ${CCM_CASSANDRA_VERSION}" + pip install "git+https://${CCM_CASSANDRA_REPO}.git@${CCM_CASSANDRA_VERSION}" + mkdir ${CCM_CONFIG_DIR} 2>/dev/null || true + echo CASSANDRA > ${CCM_CONFIG_DIR}/ccm-type + echo ${CCM_CASSANDRA_VERSION} > ${CCM_CONFIG_DIR}/ccm-version + +install-scylla-ccm: + @echo "Installing ScyllaDB CCM ${CCM_SCYLLA_VERSION}" + pip install "git+https://${CCM_SCYLLA_REPO}.git@${CCM_SCYLLA_VERSION}" + mkdir ${CCM_CONFIG_DIR} 2>/dev/null || true + echo SCYLLA > ${CCM_CONFIG_DIR}/ccm-type + echo ${CCM_SCYLLA_VERSION} > ${CCM_CONFIG_DIR}/ccm-version + +download-all-dependencies: compile-all .download-test-dependencies .download-verify-dependencies + +CASSANDRA_VERSION_FILE=/tmp/cassandra-version-${CASSANDRA_VERSION}.resolved +resolve-cassandra-version: .prepare-get-version + @find "${CASSANDRA_VERSION_FILE}" -mtime +0 -delete 2>/dev/null 1>&1 + if [[ -f "${CASSANDRA_VERSION_FILE}" ]]; then + echo "Resolved Cassandra ${CASSANDRA_VERSION} to $$(cat ${CASSANDRA_VERSION_FILE})" + exit 0 + fi + + if [[ "${CASSANDRA_VERSION}" == "4-LATEST" ]]; then + CASSANDRA_VERSION_RESOLVED=$$(get-version -source github-tag -repo apache/cassandra -prefix "cassandra-" -out-no-prefix -filters "^[0-9]+$$.^[0-9]+$$.^[0-9]+$$ and 4.LAST.LAST" | tr -d '\"') + elif [[ "${CASSANDRA_VERSION}" == "3-LATEST" ]]; then + CASSANDRA_VERSION_RESOLVED=$$(get-version -source github-tag -repo apache/cassandra -prefix "cassandra-" -out-no-prefix -filters "^[0-9]+$$.^[0-9]+$$.^[0-9]+$$ and 3.LAST.LAST" | tr -d '\"') + elif echo "${CASSANDRA_VERSION}" | grep -P '^[0-9\.]+'; then + CASSANDRA_VERSION_RESOLVED=${CASSANDRA_VERSION} + else + echo "Unknown Cassandra version name '${CASSANDRA_VERSION}'" + exit 1 + fi + + if [[ -z "$${CASSANDRA_VERSION_RESOLVED}" ]]; then + echo "Failed to resolve Cassandra ${CASSANDRA_VERSION}" + exit 1 + fi + + echo "Resolved Cassandra ${CASSANDRA_VERSION} to $${CASSANDRA_VERSION_RESOLVED}" + if [[ -n "${GITHUB_OUTPUT}" ]]; then + echo "value=$${CASSANDRA_VERSION_RESOLVED}" >>$${GITHUB_OUTPUT} + fi + echo "$${CASSANDRA_VERSION_RESOLVED}" >${CASSANDRA_VERSION_FILE} + +SCYLLA_VERSION_FILE=/tmp/scylla-version-${SCYLLA_VERSION}.resolved +resolve-scylla-version: .prepare-get-version + @find "${SCYLLA_VERSION_FILE}" -mtime +0 -delete 2>/dev/null 1>&1 + if [[ -f "${SCYLLA_VERSION_FILE}" ]]; then + echo "Resolved ScyllaDB ${SCYLLA_VERSION} to $$(cat ${SCYLLA_VERSION_FILE})" + exit 0 + fi + + if [[ "${SCYLLA_VERSION}" == "LTS-LATEST" ]]; then + SCYLLA_VERSION_RESOLVED=$$(get-version --source dockerhub-imagetag --repo scylladb/scylla -filters "^[0-9]{4}$$.^[0-9]+$$.^[0-9]+$$ and LAST.1.LAST" | tr -d '\"') + elif [[ "${SCYLLA_VERSION}" == "LTS-PRIOR" ]]; then + SCYLLA_VERSION_RESOLVED=$$(get-version --source dockerhub-imagetag --repo scylladb/scylla -filters "^[0-9]{4}$$.^[0-9]+$$.^[0-9]+$$ and LAST-1.1.LAST" | tr -d '\"') + if [[ -z "$${SCYLLA_VERSION_RESOLVED}" ]]; then + SCYLLA_VERSION_RESOLVED=$$(get-version --source dockerhub-imagetag --repo scylladb/scylla-enterprise -filters "^[0-9]{4}$.^[0-9]+$.^[0-9]+$ and LAST-1.1.LAST" | tr -d '\"') + fi + elif [[ "${SCYLLA_VERSION}" == "LATEST" ]]; then + SCYLLA_VERSION_RESOLVED=$$(get-version --source dockerhub-imagetag --repo scylladb/scylla -filters "^[0-9]{4}$$.^[0-9]+$$.^[0-9]+$$ and LAST.LAST.LAST" | tr -d '\"') + elif [[ "${SCYLLA_VERSION}" == "PRIOR" ]]; then + SCYLLA_VERSION_RESOLVED=$$(get-version --source dockerhub-imagetag --repo scylladb/scylla -filters "^[0-9]{4}$$.^[0-9]+$$.^[0-9]+$$ and LAST.LAST.LAST-1" | tr -d '\"') + elif echo "${SCYLLA_VERSION}" | grep -P '^[0-9\.]+'; then + SCYLLA_VERSION_RESOLVED=${SCYLLA_VERSION} + else + echo "Unknown ScyllaDB version name '${SCYLLA_VERSION}'" + exit 1 + fi + + if [[ -z "$${SCYLLA_VERSION_RESOLVED}" ]]; then + echo "Failed to resolve ScyllaDB '${SCYLLA_VERSION}'" + exit 1 + fi + + echo "Resolved ScyllaDB ${SCYLLA_VERSION} to $${SCYLLA_VERSION_RESOLVED}" + if [[ -n "${GITHUB_OUTPUT}" ]]; then + echo "value=$${SCYLLA_VERSION_RESOLVED}" >>$${GITHUB_OUTPUT} + fi + echo "$${SCYLLA_VERSION_RESOLVED}" >${SCYLLA_VERSION_FILE} + +download-cassandra: .prepare-scylla-ccm resolve-cassandra-version + @if [[ -z "$${CASSANDRA_VERSION_RESOLVED}" ]]; then + CASSANDRA_VERSION_RESOLVED=$$(cat '${CASSANDRA_VERSION_FILE}') + fi + if [[ -z "$${CASSANDRA_VERSION_RESOLVED}" ]]; then + echo "Cassandra version ${CASSANDRA_VERSION} was not resolved" + exit 1 + fi + rm -rf /tmp/download.ccm || true + mkdir /tmp/download.ccm || true + ccm create ccm_1 -i 127.0.254. -n 1:0 -v "$${CASSANDRA_VERSION_RESOLVED}" --config-dir=/tmp/download.ccm + rm -rf /tmp/download.ccm + +download-scylla: .prepare-scylla-ccm resolve-scylla-version + @if [[ -z "$${SCYLLA_VERSION_RESOLVED}" ]]; then + SCYLLA_VERSION_RESOLVED=$$(cat '${SCYLLA_VERSION_FILE}') + fi + if [[ -z "$${SCYLLA_VERSION_RESOLVED}" ]]; then + echo "ScyllaDB version ${SCYLLA_VERSION} was not resolved" + exit 1 + fi + rm -rf /tmp/download.ccm || true + mkdir /tmp/download.ccm || true + ccm create ccm_1 -i 127.0.254. -n 1:0 -v "$${SCYLLA_VERSION_RESOLVED}" --scylla --config-dir=/tmp/download.ccm + rm -rf /tmp/download.ccm + +.require-release-prepare-env: + @if [[ -z "${GPG_PASSPHRASE}" ]]; then + echo "GPG_PASSPHRASE is empty" + exit 1 + fi + +.require-release-env: + @if [[ -z "${GPG_PASSPHRASE}" ]]; then + echo "GPG_PASSPHRASE is empty" + exit 1 + fi + if [[ -z "${OSSRH_USERNAME}" ]]; then + echo "OSSRH_USERNAME is empty" + exit 1 + fi + if [[ -z "${OSSRH_PASSWORD}" ]]; then + echo "OSSRH_PASSWORD is empty" + exit 1 + fi + +release-prepare: .require-release-prepare-env + @if [[ -n "${RELEASE_SKIP_TESTS}" ]]; then + export MAVEN_OPTS="${MAVEN_OPTS} -DskipTests=true -DskipITs=true" + fi + $(MVNCMD) release:prepare -DpushChanges=false -Dgpg.passphrase=${GPG_PASSPHRASE} + +release: .require-release-env + @if [[ -n "${RELEASE_SKIP_TESTS}" ]]; then + export MAVEN_OPTS="${MAVEN_OPTS} -DskipTests=true -DskipITs=true" + fi + $(MVNCMD) release:perform -Drelease.autopublish=true -Dgpg.passphrase=${GPG_PASSPHRASE} > >(tee /tmp/logs-stdout.log) 2> >(tee /tmp/logs-stderr.log) + +release-dry-run: .require-release-env + @if [[ -n "${RELEASE_SKIP_TESTS}" ]]; then + export MAVEN_OPTS="${MAVEN_OPTS} -DskipTests=true -DskipITs=true" + fi + $(MVNCMD) release:perform -Dgpg.passphrase=${GPG_PASSPHRASE} > >(tee /tmp/logs-stdout.log) 2> >(tee /tmp/logs-stderr.log) + +compile-all: .install-guava-shaded + mvn -B compile test-compile -Dfmt.skip=true -Dclirr.skip=true -Danimal.sniffer.skip=true + +check: + $(MVNCMD) verify -DskipTests + +fix: + $(MVNCMD) fmt:format + +test-unit: .install-guava-shaded + $(MVNCMD) test -Dfmt.skip=true -Dclirr.skip=true -Danimal.sniffer.skip=true + +test-integration-scylla: .install-guava-shaded .prepare-scylla-ccm resolve-scylla-version .prepare-environment-update-aio-max-nr + @if [[ -z "$${SCYLLA_VERSION_RESOLVED}" ]]; then + SCYLLA_VERSION_RESOLVED=`cat '${SCYLLA_VERSION_FILE}'` + fi + if [[ -z "$${SCYLLA_VERSION_RESOLVED}" ]]; then + echo "ScyllaDB version ${SCYLLA_VERSION} was not resolved" + exit 1 + fi + mvn -B -e verify -Dccm.version=$${SCYLLA_VERSION_RESOLVED} -Dccm.distribution=scylla -Dfmt.skip=true -Dclirr.skip=true -Danimal.sniffer.skip=true + +test-integration-cassandra: .install-guava-shaded .prepare-scylla-ccm resolve-cassandra-version + @if [[ -z "$${CASSANDRA_VERSION_RESOLVED}" ]]; then + CASSANDRA_VERSION_RESOLVED=`cat '${CASSANDRA_VERSION_FILE}'` + fi + if [[ -z "$${CASSANDRA_VERSION_RESOLVED}" ]]; then + echo "Cassandra version ${CASSANDRA_VERSION} was not resolved" + exit 1 + fi + mvn -B -e verify -Dccm.version=$${CASSANDRA_VERSION_RESOLVED} -Dfmt.skip=true -Dclirr.skip=true -Danimal.sniffer.skip=true + +check-no-compile-warnings: + @$(MAKE) compile-all | grep WARNING >/tmp/all-compile-warnings.log || true + if [ -s /tmp/all-compile-warnings.log ]; then + echo "Found warnings in while compiling code:" + cat /tmp/all-compile-warnings.log + exit 1 + fi + +clean: + @mvn clean + find -name 'pom.xml.releaseBackup' -delete + find -name 'pom.xml.tag' -delete + find -name 'pom.xml.next' -delete + find -name 'target' -exec rm -rf {} + + find -name 'dependency-reduced-pom.xml' -exec rm -f {} + + for dir in driver-core driver-examples driver-extras driver-mapping driver-tests driver-dist testing; do + rm -rf $$dir 2>/dev/null + done diff --git a/README-dev.md b/README-dev.md index 71234332fcf..5b8c85c6f92 100644 --- a/README-dev.md +++ b/README-dev.md @@ -14,3 +14,17 @@ Once you have installed the above software, you can build and preview the docume ## Custom commands To generate the reference documentation of the driver, run the command `make javadoc`. This command generates the reference documentation using the Javadoc tool in the `_build/dirhtml//api` directory. + +## Using the Makefile + +Most day-to-day tasks are wrapped in the top-level `Makefile` so you do not have to remember long Maven invocations. Common targets include: + +- `make download-all-dependencies` pre-fetches all Maven artifacts to warm local caches. +- `make compile-all` compiles main and test sources without running tests, skipping format, clirr, and animal-sniffer checks for speed. +- `make test-unit` runs the fast unit-test suite; use `MVNCMD` to tweak the underlying Maven command if needed. +- `make test-integration-scylla` and `make test-integration-cassandra` execute CCM-backed integration suites. Export `SCYLLA_VERSION` or `CASSANDRA_VERSION` to pin specific server versions before invoking. +- `make check` executes `mvn verify -DskipTests` for static analysis, while `make fix` applies code formatters via `mvn fmt:format`. +- `make fix` executes `mvn fmt:format` to format the code. +- `make clean` removes Maven targets, shaded artifacts, and release backups to reset the tree. + +The Makefile automatically installs the shaded Guava dependency and, for integration tests, bootstraps the appropriate CCM toolchain and raises kernel `aio-max-nr` when required. If a target fails because the toolchain is missing, rerun after installing the prerequisites highlighted in the target output.