ci: add description to ci helper script

This commit is contained in:
David 2024-10-04 11:11:55 +02:00
parent 9288ad2a9c
commit d03900c0e8
No known key found for this signature in database
GPG key ID: AB15A6AF1101390D

68
.github/helper/ci.py vendored
View file

@ -1,9 +1,29 @@
"""
Code Coverage and Parallel Test Runner Script
This script is designed to run parallel tests for Frappe applications with optional code coverage.
It sets up the test environment, handles code coverage configuration, and executes tests using
either a local parallel test runner or an orchestrator-based runner.
Key features:
- Configurable code coverage for specific apps
- Support for local parallel testing and orchestrator-based testing
- Customizable inclusion and exclusion patterns for coverage
- Environment variable based configuration
Usage:
This script is typically run as part of a CI/CD pipeline or for local development testing.
It can be configured using environment variables such as SITE, ORCHESTRATOR_URL, WITH_COVERAGE, etc.
"""
# Copyright (c) 2022, Frappe Technologies Pvt. Ltd. and Contributors
# MIT License. See LICENSE
import json
import os
from pathlib import Path
# Define standard patterns for file inclusions and exclusions in coverage
STANDARD_INCLUSIONS = ["*.py"]
STANDARD_EXCLUSIONS = [
@ -22,7 +42,7 @@ STANDARD_EXCLUSIONS = [
".github/*",
]
# tested via commands' test suite
# Files that are tested via command line interface
TESTED_VIA_CLI = [
"*/frappe/installer.py",
"*/frappe/utils/install.py",
@ -34,14 +54,36 @@ TESTED_VIA_CLI = [
"*/frappe/database/**/setup_db.py",
]
FRAPPE_EXCLUSIONS = ["*/tests/*", "*/commands/*", "*/frappe/change_log/*", "*/frappe/exceptions*", "*/frappe/desk/page/setup_wizard/setup_wizard.py", "*/frappe/coverage.py", "*frappe/setup.py", "*/frappe/hooks.py", "*/doctype/*/*_dashboard.py", "*/patches/*", "*/.github/helper/ci.py", *TESTED_VIA_CLI]
# Additional exclusions specific to the Frappe app
FRAPPE_EXCLUSIONS = [
"*/tests/*",
"*/commands/*",
"*/frappe/change_log/*",
"*/frappe/exceptions*",
"*/frappe/desk/page/setup_wizard/setup_wizard.py",
"*/frappe/coverage.py",
"*frappe/setup.py",
"*/frappe/hooks.py",
"*/doctype/*/*_dashboard.py",
"*/patches/*",
"*/.github/helper/ci.py",
*TESTED_VIA_CLI,
]
def get_bench_path():
"""Get the path to the bench directory."""
return Path(__file__).resolve().parents[4]
class CodeCoverage:
"""
Context manager for handling code coverage.
This class sets up code coverage measurement for a specific app,
applying the appropriate inclusion and exclusion patterns.
"""
def __init__(self, with_coverage, app):
self.with_coverage = with_coverage
self.app = app or "frappe"
@ -49,10 +91,9 @@ class CodeCoverage:
def __enter__(self):
if self.with_coverage:
import os
from coverage import Coverage
# Generate coverage report only for app that is being tested
# Set up coverage for the specific app
source_path = os.path.join(get_bench_path(), "apps", self.app)
print(f"Source path: {source_path}")
omit = STANDARD_EXCLUSIONS[:]
@ -71,6 +112,7 @@ class CodeCoverage:
if __name__ == "__main__":
# Configuration
app = "frappe"
site = os.environ.get("SITE") or "test_site"
use_orchestrator = bool(os.environ.get("ORCHESTRATOR_URL"))
@ -78,6 +120,7 @@ if __name__ == "__main__":
build_number = 1
total_builds = 1
# Parse build information from environment variables
try:
build_number = int(os.environ.get("BUILD_NUMBER"))
except Exception:
@ -88,7 +131,24 @@ if __name__ == "__main__":
except Exception:
pass
# Run tests with code coverage
with CodeCoverage(with_coverage=with_coverage, app=app):
# Add ASCII banner at the end
mode = "Orchestrator" if use_orchestrator else "Parallel"
banner = f"""
{'' * 50}
{' ' * 50}
CI Helper Script Execution Summary
{' ' * 50}
{'' * 50}
Mode: {mode:<29}
App: {app:<29}
Site: {site:<29}
Build Number: {build_number:<29}
Total Builds: {total_builds:<29}
{'' * 50}
"""
print(banner)
if use_orchestrator:
from frappe.parallel_test_runner import ParallelTestWithOrchestrator