[3.14] gh-142278: Add granular change detection for platforms in CI (GH-142350) (#142537)

Co-authored-by: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com>
This commit is contained in:
Stan Ulbrych 2025-12-11 07:16:13 +00:00 committed by GitHub
parent 82ebdd207f
commit b317c60e04
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 137 additions and 52 deletions

View file

@ -45,12 +45,22 @@
SUFFIXES_C_OR_CPP = frozenset({".c", ".h", ".cpp"})
SUFFIXES_DOCUMENTATION = frozenset({".rst", ".md"})
ANDROID_DIRS = frozenset({"Android"})
IOS_DIRS = frozenset({"Apple", "iOS"})
MACOS_DIRS = frozenset({"Mac"})
WASI_DIRS = frozenset({Path("Tools", "wasm")})
@dataclass(kw_only=True, slots=True)
class Outputs:
run_android: bool = False
run_ci_fuzz: bool = False
run_docs: bool = False
run_ios: bool = False
run_macos: bool = False
run_tests: bool = False
run_ubuntu: bool = False
run_wasi: bool = False
run_windows_msi: bool = False
run_windows_tests: bool = False
@ -63,7 +73,15 @@ def compute_changes() -> None:
outputs = process_changed_files(files)
else:
# Otherwise, just run the tests
outputs = Outputs(run_tests=True, run_windows_tests=True)
outputs = Outputs(
run_android=True,
run_ios=True,
run_macos=True,
run_tests=True,
run_ubuntu=True,
run_wasi=True,
run_windows_tests=True,
)
outputs = process_target_branch(outputs, target_branch)
if outputs.run_tests:
@ -111,6 +129,21 @@ def get_changed_files(
return frozenset(map(Path, filter(None, map(str.strip, changed_files))))
def get_file_platform(file: Path) -> str | None:
if not file.parts:
return None
first_part = file.parts[0]
if first_part in MACOS_DIRS:
return "macos"
if first_part in IOS_DIRS:
return "ios"
if first_part in ANDROID_DIRS:
return "android"
if len(file.parts) >= 2 and Path(*file.parts[:2]) in WASI_DIRS: # Tools/wasm/
return "wasi"
return None
def process_changed_files(changed_files: Set[Path]) -> Outputs:
run_tests = False
run_ci_fuzz = False
@ -118,6 +151,9 @@ def process_changed_files(changed_files: Set[Path]) -> Outputs:
run_windows_tests = False
run_windows_msi = False
platforms_changed = set()
has_platform_specific_change = True
for file in changed_files:
# Documentation files
doc_or_misc = file.parts[0] in {"Doc", "Misc"}
@ -126,10 +162,15 @@ def process_changed_files(changed_files: Set[Path]) -> Outputs:
if file.parent == GITHUB_WORKFLOWS_PATH:
if file.name == "build.yml":
run_tests = run_ci_fuzz = True
has_platform_specific_change = False
if file.name == "reusable-docs.yml":
run_docs = True
if file.name == "reusable-windows-msi.yml":
run_windows_msi = True
if file.name == "reusable-macos.yml":
platforms_changed.add("macos")
if file.name == "reusable-wasi.yml":
platforms_changed.add("wasi")
if not (
doc_file
@ -138,8 +179,13 @@ def process_changed_files(changed_files: Set[Path]) -> Outputs:
):
run_tests = True
if file not in UNIX_BUILD_SYSTEM_FILE_NAMES:
run_windows_tests = True
platform = get_file_platform(file)
if platform is not None:
platforms_changed.add(platform)
else:
has_platform_specific_change = False
if file not in UNIX_BUILD_SYSTEM_FILE_NAMES:
run_windows_tests = True
# The fuzz tests are pretty slow so they are executed only for PRs
# changing relevant files.
@ -159,12 +205,38 @@ def process_changed_files(changed_files: Set[Path]) -> Outputs:
if file.parts[:2] == ("Tools", "msi"):
run_windows_msi = True
# Check which platform specific tests to run
if run_tests:
if not has_platform_specific_change or not platforms_changed:
run_android = True
run_ios = True
run_macos = True
run_ubuntu = True
run_wasi = True
else:
run_android = "android" in platforms_changed
run_ios = "ios" in platforms_changed
run_macos = "macos" in platforms_changed
run_ubuntu = False
run_wasi = "wasi" in platforms_changed
else:
run_android = False
run_ios = False
run_macos = False
run_ubuntu = False
run_wasi = False
return Outputs(
run_android=run_android,
run_ci_fuzz=run_ci_fuzz,
run_docs=run_docs,
run_ios=run_ios,
run_macos=run_macos,
run_tests=run_tests,
run_windows_tests=run_windows_tests,
run_ubuntu=run_ubuntu,
run_wasi=run_wasi,
run_windows_msi=run_windows_msi,
run_windows_tests=run_windows_tests,
)
@ -191,11 +263,16 @@ def write_github_output(outputs: Outputs) -> None:
return
with open(os.environ["GITHUB_OUTPUT"], "a", encoding="utf-8") as f:
f.write(f"run-android={bool_lower(outputs.run_android)}\n")
f.write(f"run-ci-fuzz={bool_lower(outputs.run_ci_fuzz)}\n")
f.write(f"run-docs={bool_lower(outputs.run_docs)}\n")
f.write(f"run-ios={bool_lower(outputs.run_ios)}\n")
f.write(f"run-macos={bool_lower(outputs.run_macos)}\n")
f.write(f"run-tests={bool_lower(outputs.run_tests)}\n")
f.write(f"run-windows-tests={bool_lower(outputs.run_windows_tests)}\n")
f.write(f"run-ubuntu={bool_lower(outputs.run_ubuntu)}\n")
f.write(f"run-wasi={bool_lower(outputs.run_wasi)}\n")
f.write(f"run-windows-msi={bool_lower(outputs.run_windows_msi)}\n")
f.write(f"run-windows-tests={bool_lower(outputs.run_windows_tests)}\n")
def bool_lower(value: bool, /) -> str: