Files
MyGoNavi/tools/resolve-driver-release-source.py
Syngnat ebdf7b5a6c 🐛 fix(ci): 修复 dev CI 漏掉驱动补偿构建
- dev 构建改为优先使用已发布 driver release 对应源码提交作为检测基线
- 避免驱动相关提交的 CI 失败后,后续仅修 workflow 时被误判为无需重建驱动
- 当已发布驱动基线无法解析时,保守回退为全量驱动构建
- 补充驱动变更检测补偿场景回归测试
- 新增 driver release source 解析测试,覆盖 release body 与 target_commitish 场景
2026-06-05 09:10:49 +08:00

104 lines
2.8 KiB
Python

#!/usr/bin/env python3
import argparse
import json
import os
import re
import sys
import urllib.error
import urllib.parse
import urllib.request
COMMIT_LINK_RE = re.compile(r"/commit/([0-9a-f]{40})(?:\b|/)")
FULL_SHA_RE = re.compile(r"\b([0-9a-f]{40})\b")
def github_headers():
headers = {
"Accept": "application/vnd.github+json",
"User-Agent": "GoNavi-CI",
}
token = os.environ.get("DRIVER_RELEASE_TOKEN") or os.environ.get("GITHUB_TOKEN")
if token:
headers["Authorization"] = f"Bearer {token}"
return headers
def fetch_json(url):
request = urllib.request.Request(url, headers=github_headers())
with urllib.request.urlopen(request, timeout=30) as response:
return json.loads(response.read().decode("utf-8"))
def load_release(repo, tag):
owner_repo = repo.strip()
if not owner_repo:
raise ValueError("repo is required")
if tag == "latest":
url = f"https://api.github.com/repos/{owner_repo}/releases/latest"
else:
url = (
f"https://api.github.com/repos/{owner_repo}/releases/tags/"
f"{urllib.parse.quote(tag, safe='')}"
)
try:
return fetch_json(url)
except urllib.error.HTTPError as exc:
if exc.code == 404:
print(f"warning: release {owner_repo}@{tag} not found", file=sys.stderr)
return None
print(
f"warning: failed to load release {owner_repo}@{tag}: HTTP {exc.code}",
file=sys.stderr,
)
return None
except Exception as exc: # pragma: no cover - defensive logging path
print(f"warning: failed to load release {owner_repo}@{tag}: {exc}", file=sys.stderr)
return None
def extract_source_commit(release):
if not isinstance(release, dict):
return None
body = str(release.get("body") or "")
for pattern in (COMMIT_LINK_RE, FULL_SHA_RE):
match = pattern.search(body)
if match:
return match.group(1)
target_commitish = str(release.get("target_commitish") or "").strip()
if FULL_SHA_RE.fullmatch(target_commitish):
return target_commitish
return None
def main():
parser = argparse.ArgumentParser()
parser.add_argument("--repo", default="Syngnat/GoNavi-DriverAgents")
parser.add_argument("--tag", required=True, help="release tag name such as dev-latest or v1.0.0")
args = parser.parse_args()
release = load_release(args.repo, args.tag)
if release is None:
return 0
source_commit = extract_source_commit(release)
if not source_commit:
print(
f"warning: release {args.repo}@{args.tag} does not expose source commit",
file=sys.stderr,
)
return 0
print(source_commit)
return 0
if __name__ == "__main__":
raise SystemExit(main())