fix(ci): use --enable_workspace for bazel-in-bazel tests (#2237)

The CI on `main` started failing and is affecting all PRs.

Most likely a fixup to #2184.
diff --git a/.bazelversion b/.bazelversion
index 66ce77b..a3fcc71 100644
--- a/.bazelversion
+++ b/.bazelversion
@@ -1 +1 @@
-7.0.0
+7.1.0
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 0300824..1d8632f 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -35,6 +35,7 @@
 * (toolchains) {obj}`py_cc_toolchain.libs` and {obj}`PyCcToolchainInfo.libs` is
   optional. This is to support situations where only the Python headers are
   available.
+* (bazel) Minimum bazel 7 version that we test against has been bumped to `7.1`.
 
 ### Fixed
 * (whl_library): Remove `--no-index` and add `--no-build-isolation` to the
diff --git a/MODULE.bazel b/MODULE.bazel
index 9ac3e7a..424b4f8 100644
--- a/MODULE.bazel
+++ b/MODULE.bazel
@@ -116,6 +116,7 @@
     path = "tests/integration/bazel_from_env",
 )
 bazel_binaries.download(version = "6.4.0")
+bazel_binaries.download(version = "7.3.1")
 bazel_binaries.download(version = "rolling")
 use_repo(
     bazel_binaries,
@@ -124,6 +125,7 @@
     # that should be use_repo()'d, so we add them as requested
     "bazel_binaries_bazelisk",
     "build_bazel_bazel_6_4_0",
+    "build_bazel_bazel_7_3_1",
     "build_bazel_bazel_rolling",
     "build_bazel_bazel_self",
 )
diff --git a/tests/integration/BUILD.bazel b/tests/integration/BUILD.bazel
index 8724b25..289c85d 100644
--- a/tests/integration/BUILD.bazel
+++ b/tests/integration/BUILD.bazel
@@ -19,10 +19,14 @@
 
 licenses(["notice"])
 
-_WORKSPACE_FLAGS = [
+_LEGACY_WORKSPACE_FLAGS = [
     "--noenable_bzlmod",
 ]
 
+_WORKSPACE_FLAGS = _LEGACY_WORKSPACE_FLAGS + [
+    "--enable_workspace",
+]
+
 _WORKSPACE_GAZELLE_PLUGIN_FLAGS = [
     "--override_repository=rules_python_gazelle_plugin=../../../rules_python_gazelle_plugin",
 ]
@@ -32,6 +36,24 @@
 ]
 
 default_test_runner(
+    name = "bazel_6_4_workspace_test_runner",
+    bazel_cmds = [
+        "info {}".format(" ".join(_LEGACY_WORKSPACE_FLAGS)),
+        "test {} //...".format(" ".join(_LEGACY_WORKSPACE_FLAGS)),
+    ],
+    visibility = ["//visibility:public"],
+)
+
+default_test_runner(
+    name = "bazel_6_4_workspace_test_runner_gazelle_plugin",
+    bazel_cmds = [
+        "info {}".format(" ".join(_LEGACY_WORKSPACE_FLAGS + _WORKSPACE_GAZELLE_PLUGIN_FLAGS)),
+        "test {} //...".format(" ".join(_LEGACY_WORKSPACE_FLAGS + _WORKSPACE_GAZELLE_PLUGIN_FLAGS)),
+    ],
+    visibility = ["//visibility:public"],
+)
+
+default_test_runner(
     name = "workspace_test_runner",
     bazel_cmds = [
         "info {}".format(" ".join(_WORKSPACE_FLAGS)),
diff --git a/tests/integration/integration_test.bzl b/tests/integration/integration_test.bzl
index 8606f66..c437953 100644
--- a/tests/integration/integration_test.bzl
+++ b/tests/integration/integration_test.bzl
@@ -16,11 +16,40 @@
 load("@bazel_binaries//:defs.bzl", "bazel_binaries")
 load(
     "@rules_bazel_integration_test//bazel_integration_test:defs.bzl",
-    "bazel_integration_tests",
+    "bazel_integration_test",
     "integration_test_utils",
 )
 load("//python:py_test.bzl", "py_test")
 
+def _test_runner(*, name, bazel_version, py_main, bzlmod, gazelle_plugin):
+    if py_main:
+        test_runner = "{}_bazel_{}_py_runner".format(name, bazel_version)
+        py_test(
+            name = test_runner,
+            srcs = [py_main],
+            main = py_main,
+            deps = [":runner_lib"],
+            # Hide from ... patterns; should only be run as part
+            # of the bazel integration test
+            tags = ["manual"],
+        )
+        return test_runner
+
+    if bazel_version.startswith("6") and not bzlmod:
+        if gazelle_plugin:
+            return "//tests/integration:bazel_6_4_workspace_test_runner_gazelle_plugin"
+        else:
+            return "//tests/integration:bazel_6_4_workspace_test_runner"
+
+    if bzlmod and gazelle_plugin:
+        return "//tests/integration:test_runner_gazelle_plugin"
+    elif bzlmod:
+        return "//tests/integration:test_runner"
+    elif gazelle_plugin:
+        return "//tests/integration:workspace_test_runner_gazelle_plugin"
+    else:
+        return "//tests/integration:workspace_test_runner"
+
 def rules_python_integration_test(
         name,
         workspace_path = None,
@@ -48,26 +77,6 @@
         **kwargs: Passed to the upstream `bazel_integration_tests` rule.
     """
     workspace_path = workspace_path or name.removesuffix("_test")
-    if py_main:
-        test_runner = name + "_py_runner"
-        py_test(
-            name = test_runner,
-            srcs = [py_main],
-            main = py_main,
-            deps = [":runner_lib"],
-            # Hide from ... patterns; should only be run as part
-            # of the bazel integration test
-            tags = ["manual"],
-        )
-    elif bzlmod:
-        if gazelle_plugin:
-            test_runner = "//tests/integration:test_runner_gazelle_plugin"
-        else:
-            test_runner = "//tests/integration:test_runner"
-    elif gazelle_plugin:
-        test_runner = "//tests/integration:workspace_test_runner_gazelle_plugin"
-    else:
-        test_runner = "//tests/integration:workspace_test_runner"
 
     # Because glob expansion happens at loading time, the bazel-* symlinks
     # in the workspaces can recursively expand to tens-of-thousands of entries,
@@ -89,27 +98,35 @@
         ],
     )
     kwargs.setdefault("size", "enormous")
-    bazel_integration_tests(
-        name = name,
-        workspace_path = workspace_path,
-        test_runner = test_runner,
-        bazel_versions = bazel_versions or bazel_binaries.versions.all,
-        workspace_files = [name + "_workspace_files"],
-        # Override the tags so that the `manual` tag isn't applied.
-        tags = (tags or []) + [
-            # These tests are very heavy weight, so much so that only a couple
-            # can be run in parallel without harming their reliability,
-            # overall runtime, and the system's stability. Unfortunately,
-            # there doesn't appear to be a way to tell Bazel to limit their
-            # concurrency, only disable it entirely with exclusive.
-            "exclusive",
-            # The default_test_runner() assumes it can write to the user's home
-            # directory for caching purposes. Give it access.
-            "no-sandbox",
-            # The CI RBE setup can't successfully run these tests remotely.
-            "no-remote-exec",
-            # A special tag is used so CI can run them as a separate job.
-            "integration-test",
-        ],
-        **kwargs
-    )
+    for bazel_version in bazel_versions or bazel_binaries.versions.all:
+        test_runner = _test_runner(
+            name = name,
+            bazel_version = bazel_version,
+            py_main = py_main,
+            bzlmod = bzlmod,
+            gazelle_plugin = gazelle_plugin,
+        )
+        bazel_integration_test(
+            name = "{}_bazel_{}".format(name, bazel_version),
+            workspace_path = workspace_path,
+            test_runner = test_runner,
+            bazel_version = bazel_version,
+            workspace_files = [name + "_workspace_files"],
+            # Override the tags so that the `manual` tag isn't applied.
+            tags = (tags or []) + [
+                # These tests are very heavy weight, so much so that only a couple
+                # can be run in parallel without harming their reliability,
+                # overall runtime, and the system's stability. Unfortunately,
+                # there doesn't appear to be a way to tell Bazel to limit their
+                # concurrency, only disable it entirely with exclusive.
+                "exclusive",
+                # The default_test_runner() assumes it can write to the user's home
+                # directory for caching purposes. Give it access.
+                "no-sandbox",
+                # The CI RBE setup can't successfully run these tests remotely.
+                "no-remote-exec",
+                # A special tag is used so CI can run them as a separate job.
+                "integration-test",
+            ],
+            **kwargs
+        )
diff --git a/version.bzl b/version.bzl
index 2e8fc0b..5194f30 100644
--- a/version.bzl
+++ b/version.bzl
@@ -17,7 +17,7 @@
 # against.
 # This version should be updated together with the version of Bazel
 # in .bazelversion.
-BAZEL_VERSION = "7.0.0"
+BAZEL_VERSION = "7.1.0"
 
 # NOTE: Keep in sync with .bazelci/presubmit.yml
 # This is the minimum supported bazel version, that we have some tests for.