feat: upadte
This commit is contained in:
@@ -41,7 +41,13 @@ SECRET_PATTERNS = (
|
||||
)
|
||||
FLOATING_TAGS = (":latest", ":stable")
|
||||
DEB_SHAPE = re.compile(r"^[^_\s]+_[^_\s]+_[^_\s]+\.deb$")
|
||||
VALID_SCRIPT_NAMES = ("upload_deb.sh", "publish_docker.sh", "copy_artifact.sh")
|
||||
VALID_SCRIPT_NAMES = (
|
||||
"upload_deb.sh",
|
||||
"publish_docker.sh",
|
||||
"copy_artifact.sh",
|
||||
"obtain.sh",
|
||||
"wait_ci.sh",
|
||||
)
|
||||
BUILDER_MAKEFILE = "makefile.builder"
|
||||
BUILDER_ENV = ".env.builder"
|
||||
|
||||
@@ -354,6 +360,9 @@ SCRIPT_RESOLVE_SNIPPETS = tuple(
|
||||
"$$HOME/.skills/skills/builder/scripts",
|
||||
"$HOME/.skills/skills/builder/scripts",
|
||||
"~/.skills/skills/builder/scripts",
|
||||
"$$HOME/.agents/skills/builder/scripts",
|
||||
"$HOME/.agents/skills/builder/scripts",
|
||||
"~/.agents/skills/builder/scripts",
|
||||
)
|
||||
for name in VALID_SCRIPT_NAMES
|
||||
)
|
||||
@@ -379,7 +388,12 @@ def check_push_delegates(
|
||||
missing = []
|
||||
inline = []
|
||||
thin = []
|
||||
builder_names = ("upload_deb.sh", "publish_docker.sh", "copy_artifact.sh")
|
||||
builder_names = (
|
||||
"upload_deb.sh",
|
||||
"publish_docker.sh",
|
||||
"copy_artifact.sh",
|
||||
"obtain.sh",
|
||||
)
|
||||
for target in targets:
|
||||
dry = run_make(project, target)
|
||||
if has_no_rule(dry):
|
||||
@@ -576,12 +590,68 @@ def check_copy_script(
|
||||
)
|
||||
|
||||
|
||||
def read_venue(project: Path) -> str:
|
||||
result = run_make(project, "venue")
|
||||
if not has_no_rule(result):
|
||||
echoed = parse_dry_echo(result)
|
||||
if echoed in ("local", "ci"):
|
||||
return echoed
|
||||
cleaned = "\n".join(clean_make_output(result)).strip()
|
||||
if cleaned in ("local", "ci"):
|
||||
return cleaned
|
||||
raw = makefile_values(project).get("BUILD_VENUE", "local")
|
||||
raw = re.split(r"\s+#", raw, maxsplit=1)[0].strip()
|
||||
return raw or "local"
|
||||
|
||||
|
||||
def origin_forge(project: Path) -> str:
|
||||
result = subprocess.run(
|
||||
["git", "-C", str(project), "remote", "get-url", "origin"],
|
||||
capture_output=True,
|
||||
text=True,
|
||||
check=False,
|
||||
)
|
||||
url = (result.stdout or "").strip()
|
||||
if "github.com" in url:
|
||||
return "github"
|
||||
if url:
|
||||
return "gitlab"
|
||||
return ""
|
||||
|
||||
|
||||
def check_ready_toolchain(
|
||||
report: Report, *, deb_project: bool, docker_project: bool, copy_project: bool = False
|
||||
report: Report,
|
||||
project: Path | None = None,
|
||||
*,
|
||||
deb_project: bool,
|
||||
docker_project: bool,
|
||||
copy_project: bool = False,
|
||||
) -> None:
|
||||
lines = [f"make: {'found' if shutil.which('make') else 'MISSING'}"]
|
||||
venue = read_venue(project) if project is not None else "local"
|
||||
lines = [
|
||||
f"make: {'found' if shutil.which('make') else 'MISSING'}",
|
||||
f"BUILD_VENUE: {venue}",
|
||||
]
|
||||
problems = []
|
||||
if docker_project:
|
||||
if venue not in ("local", "ci"):
|
||||
problems.append("BUILD_VENUE must be local or ci")
|
||||
if docker_project and venue == "ci":
|
||||
docker_ok = shutil.which("docker") is not None
|
||||
lines.append(
|
||||
f"docker: {'found' if docker_ok else 'optional for inspect; obtain fails without it'}"
|
||||
)
|
||||
forge = origin_forge(project) if project is not None else ""
|
||||
if forge == "github":
|
||||
gh_ok = shutil.which("gh") is not None
|
||||
lines.append(f"gh: {'found' if gh_ok else 'MISSING (blocks ci venue)'}")
|
||||
if not gh_ok:
|
||||
problems.append("install gh and authenticate for this GitHub repo")
|
||||
else:
|
||||
glab_ok = shutil.which("glab") is not None
|
||||
lines.append(f"glab: {'found' if glab_ok else 'MISSING (blocks ci venue)'}")
|
||||
if not glab_ok:
|
||||
problems.append("install glab and authenticate for this GitLab project")
|
||||
elif docker_project:
|
||||
docker_ok = shutil.which("docker") is not None
|
||||
lines.append(f"docker: {'found' if docker_ok else 'MISSING (blocks docker track)'}")
|
||||
if not docker_ok:
|
||||
@@ -682,6 +752,7 @@ def check_script_paths(report: Report) -> None:
|
||||
home = Path(os.environ.get("HOME", ""))
|
||||
candidates.append(home / ".pouch" / "skills" / "builder" / "scripts")
|
||||
candidates.append(home / ".skills" / "skills" / "builder" / "scripts")
|
||||
candidates.append(home / ".agents" / "skills" / "builder" / "scripts")
|
||||
found = next((c for c in candidates if c.is_dir() and any((c / n).is_file() for n in VALID_SCRIPT_NAMES)), None)
|
||||
if found:
|
||||
report.add(PASS, 9, "builder 脚本路径可达", str(found))
|
||||
@@ -761,7 +832,12 @@ def main(argv: list[str] | None = None) -> int:
|
||||
report.add(SKIP, number, title, detail)
|
||||
docker_project = detect_docker_project(project)
|
||||
deb_project = any(project.glob("debian/*"))
|
||||
check_ready_toolchain(report, deb_project=deb_project, docker_project=docker_project)
|
||||
check_ready_toolchain(
|
||||
report,
|
||||
project,
|
||||
deb_project=deb_project,
|
||||
docker_project=docker_project,
|
||||
)
|
||||
check_ready_env_keys(
|
||||
report, project, deb_project=deb_project, docker_project=docker_project
|
||||
)
|
||||
@@ -786,6 +862,8 @@ def main(argv: list[str] | None = None) -> int:
|
||||
"push-deb",
|
||||
"push-docker",
|
||||
"push-copy",
|
||||
"obtain",
|
||||
"venue",
|
||||
):
|
||||
result = run_make(project, target)
|
||||
if result.returncode == 0:
|
||||
@@ -847,6 +925,7 @@ def main(argv: list[str] | None = None) -> int:
|
||||
if args.ready:
|
||||
check_ready_toolchain(
|
||||
report,
|
||||
project,
|
||||
deb_project=deb_project,
|
||||
docker_project=docker_project,
|
||||
copy_project=copy_project,
|
||||
|
||||
Reference in New Issue
Block a user