#!/usr/bin/env bash set -euo pipefail # Query GitLab CI for an exact SHA via glab. Output STATUS= keys. sha= while (($#)); do case "$1" in --sha) sha=$2; shift 2 ;; *) echo "Usage: ci-status.sh --sha SHA" >&2; exit 2 ;; esac done [[ -n "$sha" ]] || { echo "Usage: ci-status.sh --sha SHA" >&2; exit 2; } if ! command -v glab >/dev/null 2>&1; then echo "Error: glab is required" >&2 exit 3 fi root=${BUILDER_PROJECT_ROOT:-$(git rev-parse --show-toplevel)} origin=$(git -C "$root" remote get-url origin 2>/dev/null || true) [[ -n "$origin" ]] || { echo "Error: no origin remote" >&2; exit 3; } path=$(WAIT_CI_ORIGIN=$origin python3 -c ' import os, re url = os.environ["WAIT_CI_ORIGIN"].strip() url = re.sub(r"^git@([^:]+):", r"ssh://git@\1/", url) url = re.sub(r"^ssh://git@([^/]+):", r"ssh://git@\1/", url) if re.match(r"^https?://", url): m = re.match(r"^https?://[^/]+(?:/(.*))?$", url) path = m.group(1) if m else "" else: m = re.match(r"^ssh://git@[^/]+/(.+)$", url) path = m.group(1) if m else "" print(re.sub(r"\.git$", "", path or "")) ') encoded=$(WAIT_CI_PATH=$path python3 -c 'import os,urllib.parse; print(urllib.parse.quote(os.environ["WAIT_CI_PATH"], safe=""))') set +e raw=$(glab api "projects/${encoded}/pipelines?sha=${sha}&per_page=20") rc=$? set -e if [[ $rc -ne 0 ]]; then echo "Error: glab cannot list pipelines for $path" >&2 exit 3 fi python3 -c ' import json, sys try: data = json.loads(sys.stdin.read()) except json.JSONDecodeError: print("STATUS=error") raise SystemExit(0) if isinstance(data, dict) and data.get("message"): print("STATUS=error") raise SystemExit(0) if not isinstance(data, list) or not data: print("STATUS=empty") raise SystemExit(0) p = data[0] st = str(p.get("status") or "").lower() if st in ("success", "passed"): state = "success" elif st in ("failed", "canceled", "cancelled", "skipped"): state = "failed" elif st in ("",): state = "empty" else: state = "running" print("STATUS=%s ID=%s PIPELINE=%s" % (state, p.get("id") or "-", p.get("web_url") or "-")) ' <<<"$raw"