1
0
mirror of https://github.com/esphome/esphome.git synced 2025-10-25 05:03:52 +01:00

[ci] Skip memory analysis when only Python/config files change in core (#11397)

This commit is contained in:
J. Nick Koston
2025-10-19 17:13:08 -10:00
committed by GitHub
parent dd732dd155
commit 255b5a3abd
2 changed files with 43 additions and 10 deletions

View File

@@ -273,6 +273,9 @@ def detect_memory_impact_config(
building a merged configuration with all changed components (like building a merged configuration with all changed components (like
test_build_components.py does) to get comprehensive memory analysis. test_build_components.py does) to get comprehensive memory analysis.
For core C++ file changes without component changes, runs a fallback
analysis using a representative component to measure the impact.
Args: Args:
branch: Branch to compare against branch: Branch to compare against
@@ -289,7 +292,7 @@ def detect_memory_impact_config(
# Find all changed components (excluding core and base bus components) # Find all changed components (excluding core and base bus components)
changed_component_set: set[str] = set() changed_component_set: set[str] = set()
has_core_changes = False has_core_cpp_changes = False
for file in files: for file in files:
component = get_component_from_path(file) component = get_component_from_path(file)
@@ -297,22 +300,23 @@ def detect_memory_impact_config(
# Skip base bus components as they're used across many builds # Skip base bus components as they're used across many builds
if component not in BASE_BUS_COMPONENTS: if component not in BASE_BUS_COMPONENTS:
changed_component_set.add(component) changed_component_set.add(component)
elif file.startswith("esphome/"): elif file.startswith("esphome/") and file.endswith(CPP_FILE_EXTENSIONS):
# Core ESPHome files changed (not component-specific) # Core ESPHome C++ files changed (not component-specific)
has_core_changes = True # Only C++ files affect memory usage
has_core_cpp_changes = True
# If no components changed but core changed, test representative component # If no components changed but core C++ changed, test representative component
force_fallback_platform = False force_fallback_platform = False
if not changed_component_set and has_core_changes: if not changed_component_set and has_core_cpp_changes:
print( print(
f"Memory impact: No components changed, but core files changed. " f"Memory impact: No components changed, but core C++ files changed. "
f"Testing {MEMORY_IMPACT_FALLBACK_COMPONENT} component on {MEMORY_IMPACT_FALLBACK_PLATFORM}.", f"Testing {MEMORY_IMPACT_FALLBACK_COMPONENT} component on {MEMORY_IMPACT_FALLBACK_PLATFORM}.",
file=sys.stderr, file=sys.stderr,
) )
changed_component_set.add(MEMORY_IMPACT_FALLBACK_COMPONENT) changed_component_set.add(MEMORY_IMPACT_FALLBACK_COMPONENT)
force_fallback_platform = True # Use fallback platform (most representative) force_fallback_platform = True # Use fallback platform (most representative)
elif not changed_component_set: elif not changed_component_set:
# No components and no core changes # No components and no core C++ changes
return {"should_run": "false"} return {"should_run": "false"}
# Find components that have tests and collect their supported platforms # Find components that have tests and collect their supported platforms

View File

@@ -545,7 +545,7 @@ def test_detect_memory_impact_config_with_common_platform(tmp_path: Path) -> Non
def test_detect_memory_impact_config_core_only_changes(tmp_path: Path) -> None: def test_detect_memory_impact_config_core_only_changes(tmp_path: Path) -> None:
"""Test memory impact detection with core-only changes (no component changes).""" """Test memory impact detection with core C++ changes (no component changes)."""
# Create test directory structure with fallback component # Create test directory structure with fallback component
tests_dir = tmp_path / "tests" / "components" tests_dir = tmp_path / "tests" / "components"
@@ -554,7 +554,7 @@ def test_detect_memory_impact_config_core_only_changes(tmp_path: Path) -> None:
api_dir.mkdir(parents=True) api_dir.mkdir(parents=True)
(api_dir / "test.esp32-idf.yaml").write_text("test: api") (api_dir / "test.esp32-idf.yaml").write_text("test: api")
# Mock changed_files to return only core files (no component files) # Mock changed_files to return only core C++ files (no component files)
with ( with (
patch.object(determine_jobs, "root_path", str(tmp_path)), patch.object(determine_jobs, "root_path", str(tmp_path)),
patch.object(helpers, "root_path", str(tmp_path)), patch.object(helpers, "root_path", str(tmp_path)),
@@ -574,6 +574,35 @@ def test_detect_memory_impact_config_core_only_changes(tmp_path: Path) -> None:
assert result["use_merged_config"] == "true" assert result["use_merged_config"] == "true"
def test_detect_memory_impact_config_core_python_only_changes(tmp_path: Path) -> None:
"""Test that Python-only core changes don't trigger memory impact analysis."""
# Create test directory structure with fallback component
tests_dir = tmp_path / "tests" / "components"
# api component (fallback component) with esp32-idf test
api_dir = tests_dir / "api"
api_dir.mkdir(parents=True)
(api_dir / "test.esp32-idf.yaml").write_text("test: api")
# Mock changed_files to return only core Python files (no C++ files)
with (
patch.object(determine_jobs, "root_path", str(tmp_path)),
patch.object(helpers, "root_path", str(tmp_path)),
patch.object(determine_jobs, "changed_files") as mock_changed_files,
):
mock_changed_files.return_value = [
"esphome/__main__.py",
"esphome/config.py",
"esphome/core/config.py",
]
determine_jobs._component_has_tests.cache_clear()
result = determine_jobs.detect_memory_impact_config()
# Python-only changes should NOT trigger memory impact analysis
assert result["should_run"] == "false"
def test_detect_memory_impact_config_no_common_platform(tmp_path: Path) -> None: def test_detect_memory_impact_config_no_common_platform(tmp_path: Path) -> None:
"""Test memory impact detection when components have no common platform.""" """Test memory impact detection when components have no common platform."""
# Create test directory structure # Create test directory structure