#!/usr/bin/env bash # scripts/ship_phase.sh — internal CIAgent per-phase ship helper (v1.16) # Usage: bash scripts/ship_phase.sh set -euo pipefail PHASE="$1"; REQ="$2"; SLUG="$3"; BODY="$4" MS="milestone/v1.16-nova-simplification" BR="phase/$(printf '%02d' "$PHASE")-${SLUG}" cd "$(git rev-parse --show-toplevel)" git checkout "$MS" 2>/dev/null git merge --squash "$BR" 2>&1 | tail -2 MSG="verify(P${PHASE}): ${SLUG} — 4-layer verify PASS + ship ${BODY} ---ci--- project: acdl phase: ${PHASE} milestone: v1.16 status: complete phase_role: execution requirements: covered: [${REQ}] partial: [] ---/ci---" git commit -q -m "$MSG" PREV=$(git tag -l "v1.15.*" --sort=-version:refname | head -1) PATCH=$(($(echo "$PREV" | sed 's/v1.15.//'))) NEWPATCH=$((PATCH + 1)) TAG="v1.15.${NEWPATCH}" git tag -a "$TAG" -m "${TAG}: v1.16 P${PHASE} — ${SLUG}" git push origin "$MS" --tags 2>&1 | grep -E "new tag|new branch" | head -2 python3 - "$TAG" "$PREV" <<'PYEOF' import json, subprocess, sys, urllib.request, urllib.error tag, prev = sys.argv[1], sys.argv[2] tok = [l.split("=",1)[1].strip() for l in open(".env.secrets") if l.startswith("NOVA_GITEA_TOKEN=")][0] body = subprocess.check_output(["git","log",f"{prev}..{tag}","--oneline"]).decode() payload = {"tag_name":tag,"name":f"Nova {tag} — v1.16 P{tag.split('.')[-1]}","body":body} req = urllib.request.Request("https://git.cloudinit.dev/api/v1/repos/continuous-intelligence/acdl/releases", data=json.dumps(payload).encode(), headers={"Authorization":f"token {tok}","Content-Type":"application/json"}, method="POST") try: r = urllib.request.urlopen(req, timeout=30); d = json.loads(r.read()); print(f"release_id: {d.get('id')} tag: {tag}") except urllib.error.HTTPError as e: if e.code == 409: print(f"release exists for {tag}") else: print(f"HTTP {e.code}: {e.read().decode()[:120]}") except Exception as e: print(f"ERROR: {e}") PYEOF echo "SHIPPED ${TAG}"