Files
universe/scripts/ci/update-manifest.sh
Hanzo AI f518621f63 universe: full DX collapse — kill dead auth subnet, SQLite + Litestream, fix CI drift
Major collapses across 61 files (-2394 / +642, net -1752):

- Killed Zoo Auth Subnet: parallel auth chain contradicts hanzo.id Casdoor as canonical IAM
  (deleted k8s/zoo-auth/, compose.auth.yml, auth-gateway/, chain-configs/auth-subnet-genesis.json)
- Postgres StatefulSet → SQLite + Litestream + MinIO replication (per memory no_postgres_sqlite_only)
  Bridge becomes single-writer (replicas: 1) with restore init + replicate sidecar
- Plaintext Cloudflare API token in .env wiped; .env added to .gitignore
- 7× <your-domain> CI placeholders → kms.hanzo.ai
- 3 per-env manifests (3 × 130 lines, 90% dup) → 1 canonical manifests/services.yml (89 lines)
- 6 floating tags (:latest / :main) → :main-amd64 immutable per-arch
- Broken org refs ghcr.io/zoolabs/* + @zoolabs npm → ghcr.io/zooai/* + @zooai
- Workflow runner pool zoo-build-amd64 (wrong) → zoo-build-linux-amd64 (canonical)
- ENV var conflation ZOO_NETWORK_ID → LUX_NETWORK_ID + ZOO_EVM_CHAIN_ID
- Stale dev scripts (start/stop/status/setup.sh), convert-to-submodules.sh, Dockerfile.dev,
  .gitmodules, zoo.id/ static page, retired ARC values, k8s/patches/ all removed
- Duplicate deploy.yml workflow (shadows ci.yml) killed
- Makefile extended with remote-ops targets (deploy-{dev,test,main}, pods-{dev,test,main}, verify)

Tier-1 metrics all zero: plaintext secrets, Postgres in source, /api/ in own routes, brand contamination.

Zoo L2 EVM on Lux mainnet remains GREEN (chainId 0x30e08, balance 5e27 wei).
All 4 kustomize overlays render clean (system=35, devnet=36, testnet=36, mainnet=39).
2026-06-03 11:12:00 -07:00

88 lines
2.3 KiB
Bash
Executable File

#!/usr/bin/env bash
# Update a service entry in the canonical manifest.
#
# Usage:
# ./update-manifest.sh <service_key> <sha> <image>
#
# Example:
# ./update-manifest.sh zoo-ngo abc123def "ghcr.io/zooai/zoo-ngo:v1.2.3"
#
# Updates manifests/services.yml in-place. Python stdlib only — no yq /
# PyYAML dependency.
set -euo pipefail
SERVICE_KEY="${1:?Usage: update-manifest.sh <service_key> <sha> <image>}"
SHA="${2:?Missing sha}"
IMAGE="${3:?Missing image}"
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
ROOT_DIR="$(cd "${SCRIPT_DIR}/../.." && pwd)"
MANIFEST="${ROOT_DIR}/manifests/services.yml"
if [[ ! -f "${MANIFEST}" ]]; then
echo "::error::Manifest not found: ${MANIFEST}"
exit 1
fi
TIMESTAMP="$(date -u +%Y-%m-%dT%H:%M:%SZ)"
echo "Updating manifest: ${SERVICE_KEY}"
echo " SHA: ${SHA}"
echo " Image: ${IMAGE}"
echo " Time: ${TIMESTAMP}"
python3 - "${MANIFEST}" "${SERVICE_KEY}" "${SHA}" "${IMAGE}" "${TIMESTAMP}" <<'PYEOF'
import sys
manifest_path = sys.argv[1]
service_key = sys.argv[2]
sha = sys.argv[3]
image = sys.argv[4]
timestamp = sys.argv[5]
with open(manifest_path, 'r') as f:
lines = f.readlines()
in_target = False
indent_level = 0
result = []
for line in lines:
stripped = line.lstrip().rstrip('\n')
if stripped == f"{service_key}:" or stripped == f"{service_key}: ":
leading = len(line) - len(line.lstrip())
if leading >= 2:
in_target = True
indent_level = leading
result.append(line)
continue
if in_target:
leading = len(line) - len(line.lstrip())
if stripped and not stripped.startswith('#') and leading <= indent_level:
in_target = False
result.append(line)
continue
if stripped.startswith('image:'):
result.append(f"{' ' * (indent_level + 2)}image: {image}\n")
continue
if stripped.startswith('sha:'):
result.append(f"{' ' * (indent_level + 2)}sha: \"{sha}\"\n")
continue
if stripped.startswith('updatedAt:'):
result.append(f"{' ' * (indent_level + 2)}updatedAt: \"{timestamp}\"\n")
continue
result.append(line)
with open(manifest_path, 'w') as f:
f.writelines(result)
print(f"Updated {service_key} in {manifest_path}")
PYEOF
echo "Manifest updated."