From e42f8207ca0dda81b0ef963a83fd27c30f1c0812 Mon Sep 17 00:00:00 2001 From: Vishal Bala Date: Thu, 10 Sep 2026 13:23:11 +0200 Subject: [PATCH 1/2] ci: make the redis:latest matrix legs advisory `redis:latest` is a floating tag, so a third of the test matrix ran against an image whose contents change with no commit to this repository. A failure on those legs could not be reproduced from a SHA, which makes `git bisect` over CI results meaningless, and it blocked merges on server-side changes nobody here had made. It has already cost us twice: the Redis 8.8 RediSearch worker default that opened an FT.SEARCH nil-field race, pinned away with `--search-workers 0` in tests/docker-compose.yml, and the Redis 8.10 FT.CURSOR abort in the aggregate-cursor path under bulk-op load, which has no client-side workaround. Keep the leg, because early warning of a server regression is worth having, but mark it advisory so it informs without gating. Blocking coverage now comes from the pinned tags only. The matrix still expands to 45 jobs. The `include` entry matches the existing `redis-image` value rather than introducing a new combination, so it adds `experimental: true` to the 15 `redis:latest` legs and leaves the 30 pinned legs blocking. If blocking coverage of a newer server is wanted, add a concrete pinned tag as a fourth value; that is a coverage decision rather than part of this fix. --- .github/workflows/test.yml | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 071e8a09..83c78a18 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -64,6 +64,8 @@ jobs: name: Python ${{ matrix.python-version }} - redis-py ${{ matrix.redis-py-version }} [${{ matrix.redis-image }}] runs-on: ubuntu-latest needs: service-tests + # `redis:latest` legs are advisory. See the `experimental` include below. + continue-on-error: ${{ matrix.experimental || false }} env: HF_HOME: ${{ github.workspace }}/hf_cache REDIS_IMAGE: ${{ matrix.redis-image }} @@ -76,7 +78,21 @@ jobs: matrix: python-version: ["3.10", "3.11", "3.12", "3.13", "3.14"] redis-py-version: ["6.x", "7.x", "8.x"] + # `redis:latest` is a floating tag: its contents change with no commit + # to this repository, so a failure on it cannot be reproduced from a + # SHA and `git bisect` over CI results is meaningless. It has already + # cost us twice -- the Redis 8.8 RediSearch worker default that opened + # an FT.SEARCH nil-field race (see tests/docker-compose.yml), and the + # Redis 8.10 FT.CURSOR abort in the aggregate-cursor path under bulk-op + # load, which no client-side workaround addresses. + # + # Keep the leg for early warning of server regressions, but mark it + # advisory via the include below so it informs without blocking merges. + # Blocking coverage comes from the pinned tags only. redis-image: ["redis:8.2", "redis:8.4", "redis:latest"] + include: + - redis-image: "redis:latest" + experimental: true steps: - name: Check out repository uses: actions/checkout@v6 From 0bd84e826da182c37068db2add253dd6c08d72b5 Mon Sep 17 00:00:00 2001 From: Vishal Bala Date: Thu, 10 Sep 2026 13:50:30 +0200 Subject: [PATCH 2/2] ci: trim the matrix comment to what the code does not say --- .github/workflows/test.yml | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 83c78a18..ded18210 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -64,7 +64,6 @@ jobs: name: Python ${{ matrix.python-version }} - redis-py ${{ matrix.redis-py-version }} [${{ matrix.redis-image }}] runs-on: ubuntu-latest needs: service-tests - # `redis:latest` legs are advisory. See the `experimental` include below. continue-on-error: ${{ matrix.experimental || false }} env: HF_HOME: ${{ github.workspace }}/hf_cache @@ -78,17 +77,8 @@ jobs: matrix: python-version: ["3.10", "3.11", "3.12", "3.13", "3.14"] redis-py-version: ["6.x", "7.x", "8.x"] - # `redis:latest` is a floating tag: its contents change with no commit - # to this repository, so a failure on it cannot be reproduced from a - # SHA and `git bisect` over CI results is meaningless. It has already - # cost us twice -- the Redis 8.8 RediSearch worker default that opened - # an FT.SEARCH nil-field race (see tests/docker-compose.yml), and the - # Redis 8.10 FT.CURSOR abort in the aggregate-cursor path under bulk-op - # load, which no client-side workaround addresses. - # - # Keep the leg for early warning of server regressions, but mark it - # advisory via the include below so it informs without blocking merges. - # Blocking coverage comes from the pinned tags only. + # `redis:latest` floats, so a failure on it is not reproducible from a + # SHA; it is advisory below. Pinned tags carry the blocking coverage. redis-image: ["redis:8.2", "redis:8.4", "redis:latest"] include: - redis-image: "redis:latest"