diff --git a/Jenkinsfile b/Jenkinsfile
index 2d0384c80..4ce7abdfe 100644
--- a/Jenkinsfile
+++ b/Jenkinsfile
@@ -40,6 +40,26 @@ pipeline {
}
}
}
+ stage('Publish JDK 17 + Redis 7.2 Docker Image') {
+ when {
+ anyOf {
+ changeset "ci/openjdk17-redis-7.2/Dockerfile"
+ changeset "Makefile"
+ changeset "ci/pipeline.properties"
+ }
+ }
+ agent { label 'data' }
+ options { timeout(time: 20, unit: 'MINUTES') }
+
+ steps {
+ script {
+ def image = docker.build("springci/spring-data-with-redis-7.2:${p['java.main.tag']}", "--build-arg BASE=${p['docker.java.main.image']} --build-arg REDIS=${p['docker.redis.7.version']} -f ci/openjdk17-redis-7.2/Dockerfile .")
+ docker.withRegistry(p['docker.registry'], p['docker.credentials']) {
+ image.push()
+ }
+ }
+ }
+ }
stage('Publish JDK 21 + Redis 6.2 Docker Image') {
when {
anyOf {
@@ -134,6 +154,24 @@ pipeline {
}
}
}
+ stage("test: Redis 7") {
+ agent {
+ label 'data'
+ }
+ options { timeout(time: 30, unit: 'MINUTES') }
+ environment {
+ ARTIFACTORY = credentials("${p['artifactory.credentials']}")
+ DEVELOCITY_CACHE = credentials("${p['develocity.cache.credentials']}")
+ DEVELOCITY_ACCESS_KEY = credentials("${p['develocity.access-key']}")
+ }
+ steps {
+ script {
+ docker.image("harbor-repo.vmware.com/dockerhub-proxy-cache/springci/spring-data-with-redis-7.2:${p['java.main.tag']}").inside('-v $HOME:/tmp/jenkins-home') {
+ sh "PROFILE=none LONG_TESTS=true JENKINS_USER_NAME=${p['jenkins.user.name']} ci/test.sh"
+ }
+ }
+ }
+ }
}
}
diff --git a/Makefile b/Makefile
index c2e53085f..35334f506 100644
--- a/Makefile
+++ b/Makefile
@@ -12,7 +12,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-REDIS_VERSION:=6.2.6
+REDIS_VERSION:=7.2.4
SPRING_PROFILE?=ci
SHELL=/bin/bash -euo pipefail
@@ -175,7 +175,7 @@ clobber:
work/redis/bin/redis-cli work/redis/bin/redis-server:
@mkdir -p work/redis
- curl -sSL https://github.com/antirez/redis/archive/$(REDIS_VERSION).tar.gz | tar xzf - -C work
+ curl -sSL https://github.com/redis/redis/archive/$(REDIS_VERSION).tar.gz | tar xzf - -C work
$(MAKE) -C work/redis-$(REDIS_VERSION) -j
$(MAKE) -C work/redis-$(REDIS_VERSION) PREFIX=$(shell pwd)/work/redis install
rm -rf work/redis-$(REDIS_VERSION)
@@ -196,14 +196,14 @@ stop: redis-stop sentinel-stop cluster-stop
test:
$(MAKE) start
sleep 1
- ./mvnw clean test -U -P$(SPRING_PROFILE) || (echo "maven failed $$?"; exit 1)
+ ./mvnw clean test -U -P$(SPRING_PROFILE) -Dredis.server.version=$(REDIS_VERSION) || (echo "maven failed $$?"; exit 1)
$(MAKE) stop
$(MAKE) clean
all-tests:
$(MAKE) start
sleep 1
- ./mvnw clean test -U -DrunLongTests=true -P$(SPRING_PROFILE) || (echo "maven failed $$?"; exit 1)
+ ./mvnw clean test -U -DrunLongTests=true -P$(SPRING_PROFILE) -Dredis.server.version=$(REDIS_VERSION) || (echo "maven failed $$?"; exit 1)
$(MAKE) stop
$(MAKE) clean
diff --git a/ci/openjdk17-redis-7.2/Dockerfile b/ci/openjdk17-redis-7.2/Dockerfile
new file mode 100644
index 000000000..625177218
--- /dev/null
+++ b/ci/openjdk17-redis-7.2/Dockerfile
@@ -0,0 +1,17 @@
+ARG BASE
+FROM ${BASE}
+# Any ARG statements before FROM are cleared.
+ARG REDIS
+ENV REDIS_VERSION=${REDIS}
+
+# Copy Spring Data Redis's Makefile into the container
+COPY ./Makefile /
+
+RUN set -eux; \
+# sed -i -e 's/http/https/g' /etc/apt/sources.list ; \
+ apt-get update ; \
+ apt-get install -y build-essential ; \
+ make work/redis/bin/redis-cli work/redis/bin/redis-server REDIS_VERSION=${REDIS}; \
+ chmod -R o+rw work; \
+ apt-get clean; \
+ rm -rf /var/lib/apt/lists/*;
diff --git a/ci/pipeline.properties b/ci/pipeline.properties
index 60057f265..6ff93899b 100644
--- a/ci/pipeline.properties
+++ b/ci/pipeline.properties
@@ -14,6 +14,7 @@ docker.mongodb.7.0.version=7.0.2
# Supported versions of Redis
docker.redis.6.version=6.2.13
+docker.redis.7.version=7.2.4
# Supported versions of Cassandra
docker.cassandra.3.version=3.11.16
diff --git a/ci/test.sh b/ci/test.sh
index 995c7593e..06db99ec5 100755
--- a/ci/test.sh
+++ b/ci/test.sh
@@ -18,7 +18,7 @@ export JENKINS_USER=${JENKINS_USER_NAME}
export GRADLE_ENTERPRISE_ACCESS_KEY=${DEVELOCITY_ACCESS_KEY}
# Execute maven test
-MAVEN_OPTS="-Duser.name=${JENKINS_USER} -Duser.home=/tmp/jenkins-home" ./mvnw -s settings.xml clean test -P${PROFILE} -DrunLongTests=${LONG_TESTS:-false} -U -B
+MAVEN_OPTS="-Duser.name=${JENKINS_USER} -Duser.home=/tmp/jenkins-home" ./mvnw -s settings.xml clean test -P${PROFILE} -DrunLongTests=${LONG_TESTS:-false} -Dredis.server.version=${REDIS_VERSION:-unknown} -U -B
# Capture resulting exit code from maven (pass/fail)
RESULT=$?
diff --git a/pom.xml b/pom.xml
index c42dd305b..f07ed8723 100644
--- a/pom.xml
+++ b/pom.xml
@@ -297,6 +297,11 @@
org.apache.maven.plugins
maven-surefire-plugin
+
+ ${redis.server.version}
+ ${lettuce}
+ ${jedis}
+
-XX:-OmitStackTraceInFastThrow
false
diff --git a/src/test/java/org/springframework/data/redis/connection/AbstractConnectionIntegrationTests.java b/src/test/java/org/springframework/data/redis/connection/AbstractConnectionIntegrationTests.java
index d3382dafb..1d96b83a2 100644
--- a/src/test/java/org/springframework/data/redis/connection/AbstractConnectionIntegrationTests.java
+++ b/src/test/java/org/springframework/data/redis/connection/AbstractConnectionIntegrationTests.java
@@ -28,6 +28,7 @@ import static org.springframework.data.redis.connection.RedisGeoCommands.GeoRadi
import static org.springframework.data.redis.connection.RedisGeoCommands.GeoSearchStoreCommandArgs.*;
import static org.springframework.data.redis.core.ScanOptions.*;
+import java.nio.charset.StandardCharsets;
import java.time.Duration;
import java.time.Instant;
import java.time.temporal.ChronoUnit;
@@ -35,6 +36,7 @@ import java.util.*;
import java.util.concurrent.BlockingDeque;
import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.TimeUnit;
+import java.util.stream.IntStream;
import org.assertj.core.data.Offset;
import org.junit.AssumptionViolatedException;
@@ -2661,10 +2663,11 @@ public abstract class AbstractConnectionIntegrationTests {
}
@Test // DATAREDIS-417
- @DisabledOnOs(value = MAC, architectures = "aarch64")
- public void scanShouldReadEntireValueRangeWhenIdividualScanIterationsReturnEmptyCollection() {
+ public void scanShouldReadEntireValueRangeWhenIndividualScanIterationsReturnEmptyCollection() {
- connection.execute("DEBUG", "POPULATE".getBytes(), "100".getBytes());
+ byteConnection.openPipeline();
+ IntStream.range(0, 100).forEach(it -> byteConnection.stringCommands().set("key:%s".formatted(it).getBytes(StandardCharsets.UTF_8), "data".getBytes(StandardCharsets.UTF_8)));
+ byteConnection.closePipeline();
Cursor cursor = connection.scan(ScanOptions.scanOptions().match("key*9").count(10).build());
diff --git a/src/test/java/org/springframework/data/redis/connection/AbstractConnectionPipelineIntegrationTests.java b/src/test/java/org/springframework/data/redis/connection/AbstractConnectionPipelineIntegrationTests.java
index 695a687a5..f30dc5f10 100644
--- a/src/test/java/org/springframework/data/redis/connection/AbstractConnectionPipelineIntegrationTests.java
+++ b/src/test/java/org/springframework/data/redis/connection/AbstractConnectionPipelineIntegrationTests.java
@@ -149,8 +149,8 @@ abstract public class AbstractConnectionPipelineIntegrationTests extends Abstrac
@Test // DATAREDIS-417
@Disabled
@Override
- public void scanShouldReadEntireValueRangeWhenIdividualScanIterationsReturnEmptyCollection() {
- super.scanShouldReadEntireValueRangeWhenIdividualScanIterationsReturnEmptyCollection();
+ public void scanShouldReadEntireValueRangeWhenIndividualScanIterationsReturnEmptyCollection() {
+ super.scanShouldReadEntireValueRangeWhenIndividualScanIterationsReturnEmptyCollection();
}
@Override
diff --git a/src/test/java/org/springframework/data/redis/connection/AbstractConnectionTransactionIntegrationTests.java b/src/test/java/org/springframework/data/redis/connection/AbstractConnectionTransactionIntegrationTests.java
index 65f639be6..1b5c4672f 100644
--- a/src/test/java/org/springframework/data/redis/connection/AbstractConnectionTransactionIntegrationTests.java
+++ b/src/test/java/org/springframework/data/redis/connection/AbstractConnectionTransactionIntegrationTests.java
@@ -144,8 +144,8 @@ abstract public class AbstractConnectionTransactionIntegrationTests extends Abst
@Test // DATAREDIS-417
@Disabled
@Override
- public void scanShouldReadEntireValueRangeWhenIdividualScanIterationsReturnEmptyCollection() {
- super.scanShouldReadEntireValueRangeWhenIdividualScanIterationsReturnEmptyCollection();
+ public void scanShouldReadEntireValueRangeWhenIndividualScanIterationsReturnEmptyCollection() {
+ super.scanShouldReadEntireValueRangeWhenIndividualScanIterationsReturnEmptyCollection();
}
@Override
diff --git a/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceReactiveClusterServerCommandsIntegrationTests.java b/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceReactiveClusterServerCommandsIntegrationTests.java
index bebe4581c..197a2b53a 100644
--- a/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceReactiveClusterServerCommandsIntegrationTests.java
+++ b/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceReactiveClusterServerCommandsIntegrationTests.java
@@ -195,7 +195,7 @@ class LettuceReactiveClusterServerCommandsIntegrationTests extends LettuceReacti
connection.serverCommands().getConfig(NODE1, "*").as(StepVerifier::create) //
.consumeNextWith(properties -> {
- assertThat(properties).containsEntry("databases", "16");
+ assertThat(properties).containsEntry("port", NODE1.getPort().toString());
}) //
.verifyComplete();
}
diff --git a/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceReactiveServerCommandsIntegrationTests.java b/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceReactiveServerCommandsIntegrationTests.java
index 53f4ee831..09be137a6 100644
--- a/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceReactiveServerCommandsIntegrationTests.java
+++ b/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceReactiveServerCommandsIntegrationTests.java
@@ -201,8 +201,7 @@ public class LettuceReactiveServerCommandsIntegrationTests extends LettuceReacti
connection.serverCommands().getConfig("*").as(StepVerifier::create) //
.consumeNextWith(properties -> {
- assertThat(properties).containsEntry("127.0.0.1:7379.databases", "16");
-
+ assertThat(properties).containsEntry("127.0.0.1:7379.port", "7379");
}) //
.verifyComplete();
} else {