diff --git a/.github/workflows/re-release.yml b/.github/workflows/re-release.yml deleted file mode 100644 index bbf2929b5e4..00000000000 --- a/.github/workflows/re-release.yml +++ /dev/null @@ -1,54 +0,0 @@ -name: Re-release ScyllaDB Java Driver - -on: - workflow_dispatch: - inputs: - version_tag: - type: string - description: 'version or tag to release it again' - required: true - -jobs: - release: - name: Release - runs-on: ubuntu-latest - - permissions: - contents: write - - steps: - - name: Checkout Repository - uses: actions/checkout@v5 - - - name: Checkout Code One Commit Before ${{ inputs.version_tag }} - run: | - git fetch --prune --unshallow || true - git checkout ${{ inputs.version_tag }}~1 - git tag -d ${{ inputs.version_tag }} - - - name: Set up Java - uses: actions/setup-java@v5 - with: - java-version: '8' - distribution: 'temurin' - server-id: ossrh - gpg-private-key: ${{ secrets.GPG_PRIVATE_KEY }} - server-username: OSSRH_USERNAME - server-password: OSSRH_PASSWORD - - - name: Configure Git user - run: | - git config user.name "ScyllaDB Promoter" - git config user.email "github-promoter@scylladb.com" - - - name: Prepare release - env: - GPG_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: make release diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 49a964cbe81..6dddf2ae181 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -3,10 +3,20 @@ name: Release ScyllaDB Java Driver on: workflow_dispatch: inputs: - dryrun: + dry-run: type: boolean - description: 'dryrun: run without publishing the package' - default: true + description: 'dry-run: run without pushing SCM changes to upstream' + default: false + + skip-tests: + type: boolean + description: 'skip-tests: do not run tests while releasing' + default: false + + target-tag: + type: string + description: 'target-tag: tag or branch name to release. Use to re-release tagged releases' + default: scylla-4.x jobs: release: @@ -20,53 +30,64 @@ jobs: MVNCMD: mvn -B -X -ntp steps: - - name: Checkout Repository - uses: actions/checkout@v5 + - name: Checkout Repository + uses: actions/checkout@v4 - - name: Set up Java - uses: actions/setup-java@v5 - with: - java-version: '8' - distribution: 'temurin' - server-id: ossrh - gpg-private-key: ${{ secrets.GPG_PRIVATE_KEY }} - server-username: OSSRH_USERNAME - server-password: OSSRH_PASSWORD + - name: Checkout Code One Commit Before ${{ inputs.version_tag }} + if: inputs.target-tag != 'scylla-4.x' + env: + RELEASE_TARGET_TAG: ${{ inputs.version_tag }} + run: make checkout-one-commit-before - - name: Configure Git user - run: | - git config user.name "ScyllaDB Promoter" - git config user.email "github-promoter@scylladb.com" + - name: Set up Java + uses: actions/setup-java@v5 + with: + java-version: '11' + distribution: 'temurin' + server-id: central + gpg-private-key: ${{ secrets.GPG_PRIVATE_KEY }} + server-username: SONATYPE_TOKEN_USERNAME + server-password: SONATYPE_TOKEN_PASSWORD + cache: maven - - name: Clean project - run: $MVNCMD clean + - name: Configure Git user + run: | + git config user.name "ScyllaDB Promoter" + git config user.email "github-promoter@scylladb.com" - - name: Clean release - run: $MVNCMD release:clean + - name: Prepare release + env: + MAVEN_GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} + RELEASE_SKIP_TESTS: ${{ inputs.skip-tests }} + run: make release-prepare - - name: Prepare release - env: - GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} - run: make release-prepare + - name: Perform release + if: inputs.dry-run == false + env: + RELEASE_SKIP_TESTS: ${{ inputs.skip-tests }} + MAVEN_GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} + SONATYPE_TOKEN_USERNAME: ${{ secrets.SONATYPE_TOKEN_USERNAME }} + SONATYPE_TOKEN_PASSWORD: ${{ secrets.SONATYPE_TOKEN_PASSWORD }} + run: make release - - 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: make release + - name: Perform release dry-run + if: inputs.dry-run == true + env: + RELEASE_SKIP_TESTS: ${{ inputs.skip-tests }} + MAVEN_GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} + SONATYPE_TOKEN_USERNAME: ${{ secrets.SONATYPE_TOKEN_USERNAME }} + SONATYPE_TOKEN_PASSWORD: ${{ secrets.SONATYPE_TOKEN_PASSWORD }} + run: make release-dry-run - - 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: Upload release logs + if: failure() + uses: actions/upload-artifact@v4 + with: + name: maven-stdout + path: /tmp/java-driver-release-logs/*.log - - name: Push changes to SCM - if: ${{ github.event.inputs.dryrun == false }} - run: | - git status && git log -3 - git push origin --follow-tags -v + - name: Push changes to SCM + if: ${{ inputs.dry-run == false && inputs.target-tag == 'scylla-4.x' }} + run: | + git status && git log -3 + git push origin --follow-tags -v \ No newline at end of file diff --git a/.github/workflows/tests@v1.yml b/.github/workflows/tests@v1.yml index fafd4bab49c..55bf093a51e 100644 --- a/.github/workflows/tests@v1.yml +++ b/.github/workflows/tests@v1.yml @@ -7,7 +7,6 @@ on: - "docs/**" - .github/workflows/docs-pages.yml - .github/workflows/docs-pr.yml - - .github/workflows/re-release.yml - .github/workflows/release.yml - "*.md" - "*.sh" @@ -20,7 +19,6 @@ on: - "docs/**" - .github/workflows/docs-pages.yml - .github/workflows/docs-pr.yml - - .github/workflows/re-release.yml - .github/workflows/release.yml - "*.md" - "*.sh" diff --git a/Makefile b/Makefile index d97d58ce665..945297756a8 100644 --- a/Makefile +++ b/Makefile @@ -13,10 +13,15 @@ CCM_SCYLLA_VERSION ?= master SCYLLA_EXT_OPTS ?= --smp=2 --memory=4G MVNCMD ?= mvn -B -X -ntp -GPG_PASSPHRASE ?= -OSSRH_USERNAME ?= + +MAVEN_GPG_PASSPHRASE ?= +SONATYPE_TOKEN_USERNAME ?= +SONATYPE_TOKEN_PASSWORD ?= + MAVEN_OPTS ?= +RELEASE_SKIP_TESTS ?= + ifeq (${CCM_CONFIG_DIR},) CCM_CONFIG_DIR = ~/.ccm endif @@ -153,6 +158,14 @@ resolve-scylla-version: .prepare-get-version fi echo "$${SCYLLA_VERSION_RESOLVED}" >${SCYLLA_VERSION_FILE} +checkout-one-commit-before: + @if [[ "${RELEASE_TARGET_TAG}" == 3.* ]]; then + echo "Checking out one commit before ${RELEASE_TARGET_TAG}" + git fetch --prune --unshallow || git fetch --prune || true + git checkout ${RELEASE_TARGET_TAG}~1 + git tag -d ${RELEASE_TARGET_TAG} + fi + download-cassandra: .prepare-scylla-ccm resolve-cassandra-version @if [[ -z "$${CASSANDRA_VERSION_RESOLVED}" ]]; then CASSANDRA_VERSION_RESOLVED=$$(cat '${CASSANDRA_VERSION_FILE}') @@ -180,42 +193,44 @@ download-scylla: .prepare-scylla-ccm resolve-scylla-version rm -rf /tmp/download.ccm .require-release-prepare-env: - @if [[ -z "${GPG_PASSPHRASE}" ]]; then - echo "GPG_PASSPHRASE is empty" + @if [[ -z "${MAVEN_GPG_PASSPHRASE}" ]]; then + echo "MAVEN_GPG_PASSPHRASE is empty" exit 1 fi .require-release-env: - @if [[ -z "${GPG_PASSPHRASE}" ]]; then - echo "GPG_PASSPHRASE is empty" + @if [[ -z "${MAVEN_GPG_PASSPHRASE}" ]]; then + echo "MAVEN_GPG_PASSPHRASE is empty" exit 1 fi - if [[ -z "${OSSRH_USERNAME}" ]]; then - echo "OSSRH_USERNAME is empty" + if [[ -z "${SONATYPE_TOKEN_USERNAME}" ]]; then + echo "SONATYPE_TOKEN_USERNAME is empty" exit 1 fi - if [[ -z "${OSSRH_PASSWORD}" ]]; then - echo "OSSRH_PASSWORD is empty" + if [[ -z "${SONATYPE_TOKEN_PASSWORD}" ]]; then + echo "SONATYPE_TOKEN_PASSWORD is empty" exit 1 fi release-prepare: .require-release-prepare-env - @if [[ -n "${RELEASE_SKIP_TESTS}" ]]; then + @if [[ "${RELEASE_SKIP_TESTS}" == "true" ]] || [[ "${RELEASE_SKIP_TESTS}" == "1" ]]; then export MAVEN_OPTS="${MAVEN_OPTS} -DskipTests=true -DskipITs=true" fi - $(MVNCMD) release:prepare -DpushChanges=false -Dgpg.passphrase=${GPG_PASSPHRASE} + $(MVNCMD) release:prepare -DpushChanges=false -Dxml-format.skip=true release: .require-release-env - @if [[ -n "${RELEASE_SKIP_TESTS}" ]]; then + @if [[ "${RELEASE_SKIP_TESTS}" == "true" ]] || [[ "${RELEASE_SKIP_TESTS}" == "1" ]]; 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) + mkdir /tmp/java-driver-release-logs/ 2>/dev/null || true + $(MVNCMD) release:perform -Drelease.autopublish=true > >(tee /tmp/java-driver-release-logs/stdout.log) 2> >(tee /tmp/java-driver-release-logs/stderr.log) release-dry-run: .require-release-env - @if [[ -n "${RELEASE_SKIP_TESTS}" ]]; then + @if [[ "${RELEASE_SKIP_TESTS}" == "true" ]] || [[ "${RELEASE_SKIP_TESTS}" == "1" ]]; 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) + mkdir /tmp/java-driver-release-logs/ 2>/dev/null || true + $(MVNCMD) release:perform > >(tee /tmp/java-driver-release-logs/stdout.log) 2> >(tee /tmp/java-driver-release-logs/stderr.log) compile-all: .install-guava-shaded mvn -B compile test-compile -Dfmt.skip=true -Dclirr.skip=true -Danimal.sniffer.skip=true @@ -264,6 +279,7 @@ clean: find -name 'pom.xml.next' -delete find -name 'target' -exec rm -rf {} + find -name 'dependency-reduced-pom.xml' -exec rm -f {} + + rm -f release.properties 2>/dev/null 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/core/src/main/java/com/datastax/oss/driver/api/core/config/DriverExecutionProfile.java b/core/src/main/java/com/datastax/oss/driver/api/core/config/DriverExecutionProfile.java index 89c28f0f521..ce15b3b869b 100644 --- a/core/src/main/java/com/datastax/oss/driver/api/core/config/DriverExecutionProfile.java +++ b/core/src/main/java/com/datastax/oss/driver/api/core/config/DriverExecutionProfile.java @@ -147,9 +147,10 @@ default Map getStringMap( } /** - * @return a size in bytes. This is separate from {@link #getLong(DriverOption)}, in case - * implementations want to allow users to provide sizes in a more human-readable way, for - * example "256 MB". + * This is separate from {@link #getLong(DriverOption)}, in case implementations want to allow + * users to provide sizes in a more human-readable way, for example "256 MB". + * + * @return a size in bytes */ long getBytes(@NonNull DriverOption option); @@ -157,7 +158,12 @@ default long getBytes(@NonNull DriverOption option, long defaultValue) { return isDefined(option) ? getBytes(option) : defaultValue; } - /** @see #getBytes(DriverOption) */ + /** + * Returns a list of sizes in bytes. + * + * @see #getBytes(DriverOption) + * @return list of sizes + */ @NonNull List getBytesList(DriverOption option); diff --git a/core/src/main/java/com/datastax/oss/driver/api/core/context/DriverContext.java b/core/src/main/java/com/datastax/oss/driver/api/core/context/DriverContext.java index 5b32389e362..af23bbd896e 100644 --- a/core/src/main/java/com/datastax/oss/driver/api/core/context/DriverContext.java +++ b/core/src/main/java/com/datastax/oss/driver/api/core/context/DriverContext.java @@ -48,11 +48,19 @@ public interface DriverContext extends AttachmentPoint { @NonNull String getSessionName(); - /** @return The driver's configuration; never {@code null}. */ + /** + * Returns the driver's configuration. + * + * @return {@link DriverConfig}, never {@code null} + */ @NonNull DriverConfig getConfig(); - /** @return The driver's configuration loader; never {@code null}. */ + /** + * Returns the driver's configuration loader. + * + * @return {@link DriverConfigLoader}, never {@code null}. + */ @NonNull DriverConfigLoader getConfigLoader(); @@ -115,39 +123,75 @@ default SpeculativeExecutionPolicy getSpeculativeExecutionPolicy(@NonNull String : getSpeculativeExecutionPolicies().get(DriverExecutionProfile.DEFAULT_NAME); } - /** @return The driver's timestamp generator; never {@code null}. */ + /** + * Returns the driver's timestamp generator. + * + * @return {@link TimestampGenerator} never {@code null} + */ @NonNull TimestampGenerator getTimestampGenerator(); - /** @return The driver's reconnection policy; never {@code null}. */ + /** + * Returns the driver's reconnection policy. + * + * @return {@link ReconnectionPolicy} never {@code null} + */ @NonNull ReconnectionPolicy getReconnectionPolicy(); - /** @return The driver's address translator; never {@code null}. */ + /** + * Returns the driver's address translator. + * + * @return {@link AddressTranslator} never {@code null} + */ @NonNull AddressTranslator getAddressTranslator(); - /** @return The authentication provider, if authentication was configured. */ + /** + * Returns the authentication provider, if authentication was configured. + * + * @return optional {@link AuthProvider} + */ @NonNull Optional getAuthProvider(); - /** @return The SSL engine factory, if SSL was configured. */ + /** + * Returns the SSL engine factory, if SSL was configured. + * + * @return optional {@link SslEngineFactory} + */ @NonNull Optional getSslEngineFactory(); - /** @return The driver's request tracker; never {@code null}. */ + /** + * Returns the driver's request tracker. + * + * @return {@link RequestTracker}, never {@code null}. + */ @NonNull RequestTracker getRequestTracker(); - /** @return The driver's request throttler; never {@code null}. */ + /** + * Returns the driver's request throttler. + * + * @return {@link RequestThrottler}, never {@code null}. + */ @NonNull RequestThrottler getRequestThrottler(); - /** @return The driver's node state listener; never {@code null}. */ + /** + * Returns the driver's node state listener. + * + * @return {@link NodeStateListener}, never {@code null}. + */ @NonNull NodeStateListener getNodeStateListener(); - /** @return The driver's schema change listener; never {@code null}. */ + /** + * Returns the driver's schema change listener. + * + * @return {@link SchemaChangeListener}, never {@code null}. + */ @NonNull SchemaChangeListener getSchemaChangeListener(); } diff --git a/core/src/main/java/com/datastax/oss/driver/api/core/cql/ExecutionInfo.java b/core/src/main/java/com/datastax/oss/driver/api/core/cql/ExecutionInfo.java index 40cfca827d1..6c77f4f950e 100644 --- a/core/src/main/java/com/datastax/oss/driver/api/core/cql/ExecutionInfo.java +++ b/core/src/main/java/com/datastax/oss/driver/api/core/cql/ExecutionInfo.java @@ -50,7 +50,11 @@ */ public interface ExecutionInfo { - /** @return The {@link Request} that was executed. */ + /** + * Returns the {@link Request} that was executed. + * + * @return {@link Request}, never {@code null} + */ @NonNull default Request getRequest() { return getStatement(); diff --git a/core/src/main/java/com/datastax/oss/driver/api/core/session/Request.java b/core/src/main/java/com/datastax/oss/driver/api/core/session/Request.java index 92c25e146c7..eef6c646d06 100644 --- a/core/src/main/java/com/datastax/oss/driver/api/core/session/Request.java +++ b/core/src/main/java/com/datastax/oss/driver/api/core/session/Request.java @@ -101,7 +101,7 @@ public interface Request { * The table to use for tablet-aware routing. Infers the table from available ColumnDefinitions or * {@code null} if it is not possible. * - * @return + * @return {@link CqlIdentifier} of the table or {@code null} if request have no routing table */ @Nullable default CqlIdentifier getRoutingTable() { @@ -196,7 +196,13 @@ default Partitioner getPartitioner() { @Nullable Duration getTimeout(); - /** @return The node configured on this statement, or null if none is configured. */ + /** + * By default, Request is routed according to {@link + * com.datastax.oss.driver.api.core.loadbalancing.LoadBalancingPolicy} But there is a way to + * override it and get it routed to a particular Node. + * + * @return The node configured on this statement, or null if none is configured. + */ @Nullable Node getNode(); } diff --git a/distribution-source/pom.xml b/distribution-source/pom.xml index 3a26872a6f0..e2b070ada9d 100644 --- a/distribution-source/pom.xml +++ b/distribution-source/pom.xml @@ -71,13 +71,6 @@ true - - org.sonatype.plugins - nexus-staging-maven-plugin - - true - - diff --git a/distribution-tests/pom.xml b/distribution-tests/pom.xml index f830c38c157..5873d39bed1 100644 --- a/distribution-tests/pom.xml +++ b/distribution-tests/pom.xml @@ -115,13 +115,6 @@ true - - org.sonatype.plugins - nexus-staging-maven-plugin - - true - - diff --git a/distribution/pom.xml b/distribution/pom.xml index a6cc3c8f149..a478799fbe1 100644 --- a/distribution/pom.xml +++ b/distribution/pom.xml @@ -109,13 +109,6 @@ true - - org.sonatype.plugins - nexus-staging-maven-plugin - - true - - org.apache.maven.plugins maven-gpg-plugin diff --git a/examples/pom.xml b/examples/pom.xml index e9710bfabf7..7b0424f739a 100644 --- a/examples/pom.xml +++ b/examples/pom.xml @@ -155,20 +155,6 @@ - - maven-compiler-plugin - - 1.8 - 1.8 - - - com.scylladb - java-driver-mapper-processor - ${project.version} - - - - maven-jar-plugin @@ -210,13 +196,6 @@ true - - org.sonatype.plugins - nexus-staging-maven-plugin - - true - - diff --git a/integration-tests/pom.xml b/integration-tests/pom.xml index 234540d3bb6..f60a04ac25d 100644 --- a/integration-tests/pom.xml +++ b/integration-tests/pom.xml @@ -336,13 +336,6 @@ true - - org.sonatype.plugins - nexus-staging-maven-plugin - - true - - diff --git a/osgi-tests/pom.xml b/osgi-tests/pom.xml index 279b0a4635c..ad4f58a88ff 100644 --- a/osgi-tests/pom.xml +++ b/osgi-tests/pom.xml @@ -296,13 +296,6 @@ true - - org.sonatype.plugins - nexus-staging-maven-plugin - - true - - diff --git a/pom.xml b/pom.xml index d7f0f9ef8f2..c473465a00a 100644 --- a/pom.xml +++ b/pom.xml @@ -98,6 +98,7 @@ 22.0.0.2 false ${skipTests} + false false @@ -479,7 +480,7 @@ maven-compiler-plugin - 3.8.1 + 3.11.0 org.apache.maven.plugins @@ -537,11 +538,6 @@ maven-jar-plugin 3.4.2 - - org.sonatype.plugins - nexus-staging-maven-plugin - 1.7.0 - maven-gpg-plugin 3.2.8 @@ -624,33 +620,22 @@ maven-compiler-plugin - javac-with-errorprone - true - 1.8 - 1.8 + 8 - -Xep:FutureReturnValueIgnored:OFF - -Xep:PreferJavaTimeOverload:OFF - -Xep:AnnotateFormatMethod:OFF - -Xep:WildcardImport:WARN - -XepExcludedPaths:.*/target/(?:generated-sources|generated-test-sources)/.* + -XDcompilePolicy=simple + -Xplugin:ErrorProne -Xep:FutureReturnValueIgnored:OFF -Xep:PreferJavaTimeOverload:OFF -Xep:AnnotateFormatMethod:OFF -Xep:WildcardImport:WARN -Xep:InvalidBlockTag:OFF -XepExcludedPaths:.*/target/(?:generated-sources|generated-test-sources)/.* + + + com.google.errorprone + error_prone_core + 2.31.0 + + true true false - - - org.codehaus.plexus - plexus-compiler-javac-errorprone - 2.8.6 - - - com.google.errorprone - error_prone_core - 2.3.4 - - com.coveo @@ -727,14 +712,15 @@ - org.sonatype.plugins - nexus-staging-maven-plugin + org.sonatype.central + central-publishing-maven-plugin + 0.8.0 true - ossrh - https://oss.sonatype.org/ - true - + central + java-driver-distribution-source,java-driver-distribution-tests,java-driver-distribution,java-driver-examples,java-driver-integration-tests,java-driver-osgi-tests + ${release.autopublish} + validated @@ -761,19 +747,19 @@ true all,-missing com.datastax.*.driver.internal* + + -tag + leaks-private-api:a:Leaks private API + apiNote a API note: - - leaks - X + leaks-private-api + a @@ -874,9 +860,7 @@ height="0" width="0" style="display:none;visibility:hidden"> true ${pushChanges} forked-path - -Dgpg.passphrase=${gpg.passphrase} - - -DskipITs + -DskipITs -Drelease.autopublish=${release.autopublish} -Dxml-format.skip=true @@ -1053,12 +1037,12 @@ height="0" width="0" style="display:none;visibility:hidden"> - ossrh - https://oss.sonatype.org/content/repositories/snapshots + central + https://central.sonatype.com/repository/maven-snapshots - ossrh - https://oss.sonatype.org/service/local/staging/deploy/maven2/ + central + https://central.sonatype.com/repository/maven-releases