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 {