diff --git a/.github/actions/build-and-tag-locally/action.yml b/.github/actions/build-and-tag-locally/action.yml index f67023fd5..35f234b2f 100644 --- a/.github/actions/build-and-tag-locally/action.yml +++ b/.github/actions/build-and-tag-locally/action.yml @@ -112,25 +112,25 @@ runs: - name: Run container shell: bash - if: ${{ contains(fromJSON('["amd64", "i386"]'), steps.platform.outputs.display_name) }} + if: ${{ contains(fromJSON('["amd64", "i386", "arm64"]'), steps.platform.outputs.display_name) }} run: | docker run -d --name sanity-test-${{ steps.platform.outputs.display_name }} ${{ github.sha }}:${{ steps.platform.outputs.display_name }} - name: Container Logs - if: ${{ contains(fromJSON('["amd64", "i386"]'), steps.platform.outputs.display_name) }} + if: ${{ contains(fromJSON('["amd64", "i386", "arm64"]'), steps.platform.outputs.display_name) }} shell: bash run: | docker logs sanity-test-${{ steps.platform.outputs.display_name }} - name: Sanity Tests - if: ${{ contains(fromJSON('["amd64", "i386"]'), steps.platform.outputs.display_name) }} + if: ${{ contains(fromJSON('["amd64", "i386", "arm64"]'), steps.platform.outputs.display_name) }} shell: bash run: | docker exec sanity-test-${{ steps.platform.outputs.display_name }} redis-cli ping docker exec sanity-test-${{ steps.platform.outputs.display_name }} redis-cli info server - name: Verify installed modules - if: ${{ contains(fromJSON('["amd64"]'), steps.platform.outputs.display_name) }} + if: ${{ contains(fromJSON('["amd64", "arm64"]'), steps.platform.outputs.display_name) }} shell: bash run: | modules=$(docker exec sanity-test-${{ steps.platform.outputs.display_name }} redis-cli module list) @@ -150,7 +150,7 @@ runs: fi - name: Test RedisBloom - if: ${{ contains(fromJSON('["amd64"]'), steps.platform.outputs.display_name) }} + if: ${{ contains(fromJSON('["amd64", "arm64"]'), steps.platform.outputs.display_name) }} shell: bash run: | docker exec sanity-test-${{ steps.platform.outputs.display_name }} redis-cli BF.ADD popular_keys "redis:hash" @@ -160,7 +160,7 @@ runs: echo "RedisBloom test passed successfully" - name: Test RediSearch - if: ${{ contains(fromJSON('["amd64"]'), steps.platform.outputs.display_name) }} + if: ${{ contains(fromJSON('["amd64", "arm64"]'), steps.platform.outputs.display_name) }} shell: bash run: | docker exec sanity-test-${{ steps.platform.outputs.display_name }} redis-cli FT.CREATE redis_commands ON HASH PREFIX 1 cmd: SCHEMA name TEXT SORTABLE description TEXT @@ -175,7 +175,7 @@ runs: fi - name: Test RedisTimeSeries - if: ${{ contains(fromJSON('["amd64"]'), steps.platform.outputs.display_name) }} + if: ${{ contains(fromJSON('["amd64", "arm64"]'), steps.platform.outputs.display_name) }} shell: bash run: | docker exec sanity-test-${{ steps.platform.outputs.display_name }} redis-cli TS.CREATE redis:cpu:usage RETENTION 86400 @@ -191,7 +191,7 @@ runs: fi - name: Test ReJSON - if: ${{ contains(fromJSON('["amd64"]'), steps.platform.outputs.display_name) }} + if: ${{ contains(fromJSON('["amd64", "arm64"]'), steps.platform.outputs.display_name) }} shell: bash run: | docker exec sanity-test-${{ steps.platform.outputs.display_name }} redis-cli JSON.SET redis:config $ '{"maxmemory":"2gb","maxmemory-policy":"allkeys-lru"}' @@ -206,7 +206,7 @@ runs: - name: Test the entrypoint id: test_entrypoint - if: ${{ contains(fromJSON('["amd64", "i386"]'), steps.platform.outputs.display_name) }} + if: ${{ contains(fromJSON('["amd64", "i386", "arm64"]'), steps.platform.outputs.display_name) }} shell: bash run: > cd test && env @@ -226,7 +226,7 @@ runs: - name: Push image uses: docker/build-push-action@v6 - if: ${{ inputs.publish_image == 'true' && contains(fromJSON('["amd64"]'), steps.platform.outputs.display_name) }} + if: ${{ inputs.publish_image == 'true' && contains(fromJSON('["amd64", "arm64"]'), steps.platform.outputs.display_name) }} with: context: ${{ inputs.distribution }} push: true diff --git a/.github/workflows/pre-merge.yml b/.github/workflows/pre-merge.yml index 87585b26a..79ce49c67 100644 --- a/.github/workflows/pre-merge.yml +++ b/.github/workflows/pre-merge.yml @@ -9,6 +9,7 @@ jobs: build-and-test: runs-on: ${{ contains(matrix.platform, 'arm64') && 'ubuntu24-arm64-2-8' || 'ubuntu-latest' }} strategy: + fail-fast: false matrix: distribution: - debian diff --git a/alpine/Dockerfile b/alpine/Dockerfile index 92649b72a..b3f639727 100644 --- a/alpine/Dockerfile +++ b/alpine/Dockerfile @@ -1,4 +1,4 @@ -FROM alpine:3.21 +FROM alpine:3.22 # add our user and group first to make sure their IDs get assigned consistently, regardless of whatever dependencies get added RUN set -eux; \ @@ -14,8 +14,8 @@ RUN set -eux; \ # we need setpriv package as busybox provides very limited functionality setpriv \ ; -ENV REDIS_DOWNLOAD_URL=https://github.com/redis/redis/archive/refs/tags/8.0.2.tar.gz -ENV REDIS_DOWNLOAD_SHA=caf3c0069f06fc84c5153bd2a348b204c578de80490c73857bee01d9b5d7401f +ENV REDIS_DOWNLOAD_URL=https://github.com/redis/redis/archive/refs/tags/8.2-m01.tar.gz +ENV REDIS_DOWNLOAD_SHA=0a1d5a27dd9cb13d51bcaba6546dd54b529774ede5d8993fce5c3ac2bace0f72 RUN set -eux; \ \ apk add --no-cache --virtual .build-deps \ @@ -43,7 +43,8 @@ RUN set -eux; \ build-base \ cargo \ clang \ - clang18-libclang \ + clang-static \ + clang-libclang \ cmake \ curl \ g++ \ @@ -51,6 +52,8 @@ RUN set -eux; \ libffi-dev \ libgcc \ libtool \ + llvm-dev \ + ncurses-dev \ openssh \ openssl \ py-virtualenv \ @@ -100,6 +103,8 @@ RUN set -eux; \ sed -ri 's!cd jemalloc && ./configure !&'"$extraJemallocConfigureFlags"' !' /usr/src/redis/deps/Makefile; \ grep -F "cd jemalloc && ./configure $extraJemallocConfigureFlags " /usr/src/redis/deps/Makefile; \ \ +# Disable static linking the C runtime for RediSearch's rust submodule + export RUST_DYN_CRT=1; \ export BUILD_TLS=yes; \ if [ "$BUILD_WITH_MODULES" = "yes" ]; then \ make -C /usr/src/redis/modules/redisjson get_source; \ diff --git a/alpine/docker-entrypoint.sh b/alpine/docker-entrypoint.sh index 476913d93..ddbd1247e 100755 --- a/alpine/docker-entrypoint.sh +++ b/alpine/docker-entrypoint.sh @@ -1,7 +1,7 @@ #!/bin/sh set -e -SETPRIV="/usr/bin/setpriv --reuid redis --regid redis --clear-groups" +SETPRIV="/bin/setpriv --reuid redis --regid redis --clear-groups" IS_REDIS_SENTINEL="" IS_REDIS_SERVER="" CONFIG="" @@ -10,7 +10,7 @@ SKIP_FIX_PERMS_NOTICE="Use SKIP_FIX_PERMS=1 to skip permission changes." # functions has_cap() { - /usr/bin/setpriv -d | grep -q 'Capability bounding set:.*\b'"$1"'\b' + /bin/setpriv -d | grep -q 'Capability bounding set:.*\b'"$1"'\b' } check_for_sentinel() { diff --git a/debian/Dockerfile b/debian/Dockerfile index 1c081b9c6..ab55b7642 100644 --- a/debian/Dockerfile +++ b/debian/Dockerfile @@ -14,8 +14,8 @@ RUN set -eux; \ ; \ rm -rf /var/lib/apt/lists/* -ENV REDIS_DOWNLOAD_URL=https://github.com/redis/redis/archive/refs/tags/8.0.2.tar.gz -ENV REDIS_DOWNLOAD_SHA=caf3c0069f06fc84c5153bd2a348b204c578de80490c73857bee01d9b5d7401f +ENV REDIS_DOWNLOAD_URL=https://github.com/redis/redis/archive/refs/tags/8.2-m01.tar.gz +ENV REDIS_DOWNLOAD_SHA=0a1d5a27dd9cb13d51bcaba6546dd54b529774ede5d8993fce5c3ac2bace0f72 RUN set -eux; \ \ savedAptMark="$(apt-mark showmanual)"; \ diff --git a/test/run-entrypoint-tests.sh b/test/run-entrypoint-tests.sh index 500fc3cec..28d138ae0 100755 --- a/test/run-entrypoint-tests.sh +++ b/test/run-entrypoint-tests.sh @@ -20,6 +20,9 @@ # ## +# Container initialization wait time in seconds +CONTAINER_INIT_WAIT=3 + if [ -z "$REDIS_IMG" ]; then echo "REDIS_IMG may not be empty" exit 1 @@ -38,6 +41,7 @@ get_container_user_uid_gid_on_the_host() { container_user="$1" dir=$(mktemp -d -p .) docker run --rm -v "$(pwd)/$dir":/w -w /w --entrypoint=/bin/sh "$REDIS_IMG" -c "chown $container_user ." + sleep $CONTAINER_INIT_WAIT # Wait for container to fully initialize stat -c "%u %g" "$dir" sudo rm -rf "$dir" } @@ -177,6 +181,7 @@ run_docker_and_test_ownership() { fi docker_output=$($docker_run 2>&1) + sleep $CONTAINER_INIT_WAIT # Wait for container to fully initialize if [ "$TEST_VERBOSE" ]; then echo "After:" @@ -265,6 +270,7 @@ run_redis_docker_and_check_uid_gid() { docker_cmd="$*" # shellcheck disable=SC2086 container=$(docker run $docker_flags -d "$REDIS_IMG" $docker_cmd) + sleep $CONTAINER_INIT_WAIT # Wait for container to fully initialize ret=$? assertTrue "Container '$docker_flags $REDIS_IMG $docker_cmd' created" "[ $ret -eq 0 ]" @@ -296,6 +302,7 @@ run_redis_docker_and_check_modules() { docker_cmd="$1" # shellcheck disable=SC2086 container=$(docker run --rm -d "$REDIS_IMG" $docker_cmd) + sleep $CONTAINER_INIT_WAIT # Wait for container to fully initialize info=$(docker exec "$container" redis-cli info) [ "$PLATFORM" ] && [ "$PLATFORM" != "amd64" ] && startSkipping @@ -322,6 +329,7 @@ assert_redis_v8() { test_redis_version() { ret=$(docker run --rm "$REDIS_IMG" -v|tail -n 1) + sleep $CONTAINER_INIT_WAIT # Wait for container to fully initialize assert_redis_v8 "$ret" } @@ -545,6 +553,7 @@ test_redis_server_persistence_with_bind_mount() { chmod 0444 "$dir" container=$(docker run --rm -d -v "$(pwd)/$dir":/data "$REDIS_IMG" --appendonly yes) + sleep $CONTAINER_INIT_WAIT # Wait for container to fully initialize result=$(echo save | docker exec -i "$container" redis-cli) assertEquals "OK" "$result" @@ -559,6 +568,7 @@ test_redis_server_persistence_with_bind_mount() { sudo chown -R "$HOST_OWNER" "$dir" container2=$(docker run --rm -d -v "$(pwd)/$dir":/data "$REDIS_IMG") + sleep $CONTAINER_INIT_WAIT # Wait for container to fully initialize value=$(echo "GET FOO" | docker exec -i "$container2" redis-cli) assertEquals "$container" "$value" @@ -576,6 +586,7 @@ test_redis_server_persistence_with_volume() { docker run --rm -v test_redis:/data --entrypoint=/bin/sh "$REDIS_IMG" -c 'chown -R 0:0 /data' container=$(docker run --rm -d -v test_redis:/data "$REDIS_IMG" --appendonly yes) + sleep $CONTAINER_INIT_WAIT # Wait for container to fully initialize result=$(echo save | docker exec -i "$container" redis-cli) assertEquals "OK" "$result" @@ -590,6 +601,7 @@ test_redis_server_persistence_with_volume() { docker run --rm -v test_redis:/data --entrypoint=/bin/sh "$REDIS_IMG" -c 'chown -R 0:0 /data && chmod 0000 -R /data' container2=$(docker run --rm -d -v test_redis:/data "$REDIS_IMG") + sleep $CONTAINER_INIT_WAIT # Wait for container to fully initialize value=$(echo "GET FOO" | docker exec -i "$container2" redis-cli) assertEquals "$container" "$value"