mirror of
https://github.com/esphome/esphome.git
synced 2025-10-25 13:13:48 +01:00
[ci] Skip memory analysis when only Python/config files change in core (#11397)
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user