diff --git a/scripts/publish_quality_metrics.py b/scripts/publish_quality_metrics.py index fed09cd..f6348eb 100755 --- a/scripts/publish_quality_metrics.py +++ b/scripts/publish_quality_metrics.py @@ -18,6 +18,7 @@ DEFAULT_PUSHGATEWAY_URL = "http://platform-quality-gateway.monitoring.svc.cluste SOURCE_SCAN_ROOTS = ("cmd", "internal", "scripts", "testing") SOURCE_EXTENSIONS = {".go", ".py", ".sh"} QUALITY_SUCCESS_STATES = {"ok", "pass", "passed", "success", "compliant"} +COVERAGE_GATE_PERCENT = 95.0 def _escape_label(value: str) -> str: @@ -208,6 +209,20 @@ def _supply_chain_check_status(build_dir: Path) -> str: return "failed" +def _parse_check_overrides(raw_checks: list[str]) -> dict[str, str]: + overrides: dict[str, str] = {} + for entry in raw_checks: + if ":" not in entry: + continue + check_name, check_status = entry.split(":", 1) + check_name = check_name.strip() + check_status = check_status.strip().lower() + if not check_name or not check_status: + continue + overrides[check_name] = check_status + return overrides + + def parse_args(argv: list[str]) -> argparse.Namespace: parser = argparse.ArgumentParser(description=__doc__) parser.add_argument( @@ -226,6 +241,13 @@ def parse_args(argv: list[str]) -> argparse.Namespace: "--coverage-percent-file", default=os.getenv("ANANKE_QUALITY_COVERAGE_PERCENT_FILE", "build/coverage-percent.txt"), ) + parser.add_argument("--tests-passed", type=int, default=None) + parser.add_argument("--tests-failed", type=int, default=None) + parser.add_argument("--tests-error", type=int, default=None) + parser.add_argument("--tests-skipped", type=int, default=None) + parser.add_argument("--coverage-percent", type=float, default=None) + parser.add_argument("--source-lines-over-500", type=int, default=None) + parser.add_argument("--check", action="append", default=[]) parser.add_argument( "--timeout-seconds", type=float, @@ -275,20 +297,36 @@ def main(argv: list[str] | None = None) -> int: resolved_ok = max(args.local_ok, remote_ok) resolved_failed = max(args.local_failed, remote_failed) - coverage_percent = _read_coverage_percent(args.coverage_percent_file) - source_lines_over_500 = _count_source_files_over_limit(repo_root, max_lines=500) tests = _parse_go_test_counts(Path(os.getenv("ANANKE_QUALITY_OUTPUT_FILE", str(build_dir / "quality-gate.out")))) + if args.tests_passed is not None: + tests["passed"] = args.tests_passed + if args.tests_failed is not None: + tests["failed"] = args.tests_failed + if args.tests_error is not None: + tests["errors"] = args.tests_error + if args.tests_skipped is not None: + tests["skipped"] = args.tests_skipped + + coverage_percent = _read_coverage_percent(args.coverage_percent_file) + if args.coverage_percent is not None: + coverage_percent = args.coverage_percent + + source_lines_over_500 = _count_source_files_over_limit(repo_root, max_lines=500) + if args.source_lines_over_500 is not None: + source_lines_over_500 = args.source_lines_over_500 + gate_rc = _read_exit_code(Path(os.getenv("ANANKE_QUALITY_EXIT_CODE_PATH", str(build_dir / "quality-gate.rc")))) gate_failed = gate_rc != 0 checks = { "tests": "failed" if gate_failed or tests["failed"] > 0 else "ok", - "coverage": "ok" if coverage_percent >= 95.0 else "failed", + "coverage": "ok" if coverage_percent >= COVERAGE_GATE_PERCENT else "failed", "loc": "ok" if source_lines_over_500 == 0 else "failed", "docs_naming": "not_applicable", "gate_glue": "ok", "sonarqube": _sonarqube_check_status(build_dir), "supply_chain": _supply_chain_check_status(build_dir), } + checks.update(_parse_check_overrides(args.check)) payload = _build_payload( args.suite, args.trigger,