Files
ewoooc/scripts/check_observability_deploy_gate.py
OoO a6100a3d01
All checks were successful
CD Pipeline / deploy (push) Successful in 3m2s
ci(observability): centralize deploy gate detection
2026-05-05 23:47:34 +08:00

93 lines
2.7 KiB
Python

#!/usr/bin/env python3
"""Decide whether AI observability deploy QA should run.
Input is a list of changed files via argv or stdin. The script prints matched
files and can write `needed=true|false` to a GitHub/Gitea Actions output file.
It exits 0 for both true and false so workflow control stays explicit.
"""
from __future__ import annotations
import argparse
import os
import re
from pathlib import Path
TRIGGER_PATTERNS = (
r"^templates/admin/.*",
r"^templates/ewoooc_base\.html$",
r"^templates/components/_ewoooc_shell\.html$",
r"^static/css/observability-system\.css$",
r"^web/static/css/observability-system\.css$",
r"^routes/admin_observability_routes\.py$",
r"^scripts/check_observability_.*",
r"^scripts/check_observability_suite\.sh$",
r"^scripts/observability_contract\.py$",
r"^scripts/quick_review\.sh$",
r"^scripts/sync_observability_css\.py$",
r"^docs/guides/observability_ui_governance\.md$",
r"^docs/guides/deployment_sop\.md$",
)
def normalize_paths(raw_paths: list[str]) -> list[str]:
paths: list[str] = []
for raw in raw_paths:
for line in raw.splitlines():
path = line.strip()
if path:
paths.append(path)
return paths
def match_paths(paths: list[str]) -> list[str]:
regexes = [re.compile(pattern) for pattern in TRIGGER_PATTERNS]
return [path for path in paths if any(regex.search(path) for regex in regexes)]
def write_output(output_path: str | None, needed: bool) -> None:
if not output_path:
return
path = Path(output_path)
with path.open("a", encoding="utf-8") as handle:
handle.write(f"needed={'true' if needed else 'false'}\n")
def main() -> int:
parser = argparse.ArgumentParser(description="Check observability deploy QA trigger")
parser.add_argument("paths", nargs="*", help="Changed file paths")
parser.add_argument("--stdin", action="store_true", help="Read changed paths from stdin")
parser.add_argument(
"--github-output",
default=os.environ.get("GITHUB_OUTPUT"),
help="Actions output file to append needed=true|false.",
)
args = parser.parse_args()
raw_paths = list(args.paths)
if args.stdin:
import sys
raw_paths.append(sys.stdin.read())
paths = normalize_paths(raw_paths)
matches = match_paths(paths)
needed = bool(matches)
write_output(args.github_output, needed)
print(f"observability_qa_needed={'true' if needed else 'false'}")
if matches:
print("matched_files:")
for path in matches:
print(f"- {path}")
else:
print("matched_files: none")
return 0
if __name__ == "__main__":
raise SystemExit(main())