Update Bazel versions in CI: drop Bazel 6, add Bazel 9 (#613)

* Update Bazel versions in CI: drop Bazel 6, add Bazel 9

* fix analysis_test_e2e_test test

* fix buildifier
diff --git a/.bazelci/presubmit.yml b/.bazelci/presubmit.yml
index b30d9a0..0afe3e1 100644
--- a/.bazelci/presubmit.yml
+++ b/.bazelci/presubmit.yml
@@ -29,14 +29,6 @@
   ? "@bazel_skylib_gazelle_plugin//..."
 
 tasks:
-  run_presubmit_bazel_6:
-    name: "Bazel 6 (WORKSPACE)"
-    platform: ${{ platform }}
-    bazel: 6.x
-    build_flags: *reusable_build_flags
-    test_flags: *reusable_test_flags
-    build_targets: *workspace_targets
-
   run_presubmit_bazel_7_workspace:
     name: "Bazel 7 (WORKSPACE)"
     platform: ${{ platform }}
@@ -50,6 +42,7 @@
       ? "--enable_workspace"
       ? "--noenable_bzlmod"
     build_targets: *workspace_targets
+    skip_in_bazel_downstream_pipeline: "Only Bazel 9 is relevant for the Downstream pipeline"
 
   run_presubmit_bazel_7_bzlmod:
     name: "Bazel 7 (Bzlmod)"
@@ -65,6 +58,7 @@
     test_targets:
       <<: *bzlmod_targets
       ? "-//docs/..."
+    skip_in_bazel_downstream_pipeline: "Only Bazel 9 is relevant for the Downstream pipeline"
 
   run_presubmit_bazel_8:
     name: "Bazel 8 (Bzlmod)"
@@ -74,5 +68,15 @@
     test_flags: *reusable_test_flags
     build_targets: *bzlmod_targets
     test_targets: *bzlmod_targets
+    skip_in_bazel_downstream_pipeline: "Only Bazel 9 is relevant for the Downstream pipeline"
+
+  run_presubmit_bazel_9:
+    name: "Bazel 9 (Bzlmod)"
+    platform: ${{ platform }}
+    bazel: 9.x
+    build_flags: *reusable_build_flags
+    test_flags: *reusable_test_flags
+    build_targets: *bzlmod_targets
+    test_targets: *bzlmod_targets
 
 buildifier: latest
diff --git a/rules/common_settings.bzl b/rules/common_settings.bzl
index 4e9bcaa..f61358a 100644
--- a/rules/common_settings.bzl
+++ b/rules/common_settings.bzl
@@ -140,6 +140,8 @@
 def _no_at_str(label):
     """Strips any leading '@'s for labels in the main repo, so that the error string is more friendly."""
     s = str(label)
+
+    # buildifier: disable=canonical-repository
     if s.startswith("@@//"):
         return s[2:]
     if s.startswith("@//"):
diff --git a/tests/analysis_test_test.sh b/tests/analysis_test_test.sh
index 5d5d7de..3e264ad 100755
--- a/tests/analysis_test_test.sh
+++ b/tests/analysis_test_test.sh
@@ -53,6 +53,12 @@
 workspace(name = 'bazel_skylib')
 EOF
 
+  cat > MODULE.bazel <<EOF
+module(name = "my_test_workspace")
+
+bazel_dep(name = "rules_cc", version = "0.2.14", dev_dependency = True)
+EOF
+
   mkdir -p rules
   cat > rules/BUILD <<EOF
 exports_files(["*.bzl"])
@@ -107,6 +113,7 @@
   cat > testdir/BUILD <<EOF
 load("//rules:analysis_test.bzl", "analysis_test")
 load("//fakerules:rules.bzl", "fake_rule", "fake_depending_rule")
+load("@rules_cc//cc:cc_library.bzl", "cc_library")
 
 fake_rule(name = "target_fails")
 
diff --git a/tests/modules_test.bzl b/tests/modules_test.bzl
index 0887463..f48d5b3 100644
--- a/tests/modules_test.bzl
+++ b/tests/modules_test.bzl
@@ -49,6 +49,7 @@
 def modules_test_suite():
     """Creates the tests for modules.bzl if Bzlmod is enabled."""
 
+    # buildifier: disable=canonical-repository
     is_bzlmod_enabled = str(Label("//tests:module_tests.bzl")).startswith("@@")
     if not is_bzlmod_enabled:
         return