refactor: use git-controlled dev ci runner

This commit is contained in:
Codex
2026-05-18 08:38:17 +00:00
parent e2c8daede7
commit f86a75791b
22 changed files with 529 additions and 1402 deletions
+215
View File
@@ -0,0 +1,215 @@
#!/usr/bin/env bash
set -euo pipefail
run_id=""
repo_url="https://github.com/pikasTech/unidesk"
desired_ref="master"
manifest_commit=""
environment="dev"
result_dir=""
timeout_ms="1800000"
keep_namespace="false"
usage() {
cat <<'EOF'
Usage:
dev-e2e.sh --run-id ID --manifest-commit COMMIT --result-dir DIR [--repo-url URL] [--desired-ref master] [--environment dev] [--timeout-ms MS] [--keep-namespace]
This script runs the D601 dev namespace e2e harness from a Git-controlled blob.
It must be launched by the CLI with a short command; do not paste this script
body through the maintenance channel.
EOF
}
while [ "$#" -gt 0 ]; do
case "$1" in
--run-id)
run_id="${2:-}"
shift 2
;;
--repo-url)
repo_url="${2:-}"
shift 2
;;
--desired-ref)
desired_ref="${2:-}"
shift 2
;;
--manifest-commit)
manifest_commit="${2:-}"
shift 2
;;
--environment)
environment="${2:-}"
shift 2
;;
--result-dir)
result_dir="${2:-}"
shift 2
;;
--timeout-ms)
timeout_ms="${2:-}"
shift 2
;;
--keep-namespace)
keep_namespace="true"
shift
;;
-h|--help)
usage
exit 0
;;
*)
echo "unknown argument: $1" >&2
usage >&2
exit 2
;;
esac
done
if ! [[ "$run_id" =~ ^[a-z0-9]([-a-z0-9]{0,46}[a-z0-9])?$ ]]; then
echo "invalid --run-id: $run_id" >&2
exit 2
fi
if ! [[ "$manifest_commit" =~ ^[0-9a-f]{40}$ ]]; then
echo "--manifest-commit must be a full 40 character SHA" >&2
exit 2
fi
if [ "$environment" != "dev" ]; then
echo "only --environment dev is supported" >&2
exit 2
fi
if ! [[ "$timeout_ms" =~ ^[0-9]+$ ]] || [ "$timeout_ms" -le 0 ]; then
echo "--timeout-ms must be a positive integer" >&2
exit 2
fi
if [ -z "$result_dir" ]; then
result_dir="/home/ubuntu/.unidesk/runs/$run_id"
fi
mkdir -p "$result_dir"
runner_log="$result_dir/runner.log"
result_json="$result_dir/result.json"
exec > >(tee -a "$runner_log") 2>&1
log_json() {
local event="$1"
shift || true
printf '{"at":"%s","event":"%s"' "$(date -Iseconds)" "$event"
while [ "$#" -gt 1 ]; do
printf ',"%s":%s' "$1" "$(printf '%s' "$2" | python3 -c 'import json,sys; print(json.dumps(sys.stdin.read()))')"
shift 2
done
printf '}\n'
}
write_result() {
local ok="$1"
local status="$2"
local detail="$3"
python3 - "$result_json" "$ok" "$status" "$detail" "$run_id" "$repo_url" "$desired_ref" "$manifest_commit" "$environment" "$pipeline_run" "$temporary_namespace" <<'PY'
import json
import sys
from datetime import datetime, timezone
path, ok, status, detail, run_id, repo, desired_ref, commit, environment, pipeline_run, temporary_namespace = sys.argv[1:]
record = {
"ok": ok == "true",
"status": status,
"detail": detail,
"runId": run_id,
"repoUrl": repo,
"desiredRef": desired_ref,
"manifestCommit": commit,
"environment": environment,
"pipelineRun": pipeline_run or None,
"temporaryNamespace": temporary_namespace or None,
"finishedAt": datetime.now(timezone.utc).isoformat(),
}
with open(path, "w", encoding="utf-8") as handle:
json.dump(record, handle, ensure_ascii=False, indent=2)
handle.write("\n")
print(json.dumps(record, ensure_ascii=False))
PY
}
pipeline_run=""
temporary_namespace="unidesk-ci-e2e-$run_id"
trap 'code=$?; if [ "$code" -ne 0 ] && [ ! -f "$result_json" ]; then write_result false failed "runner exited with code $code" || true; fi' EXIT
export KUBECONFIG=/etc/rancher/k3s/k3s.yaml
kubectl get nodes >/dev/null
log_json runner_started run_id "$run_id" manifest_commit "$manifest_commit"
kubectl get pipeline/unidesk-dev-namespace-e2e -n unidesk-ci >/dev/null
kubectl get pvc/unidesk-ci-cache -n unidesk-ci >/dev/null
pipeline_manifest="$result_dir/pipelinerun.yaml"
cat >"$pipeline_manifest" <<YAML
apiVersion: tekton.dev/v1
kind: PipelineRun
metadata:
generateName: unidesk-dev-e2e-$run_id-
namespace: unidesk-ci
labels:
app.kubernetes.io/name: unidesk-dev-namespace-e2e
app.kubernetes.io/part-of: unidesk
unidesk.ai/ci-kind: dev-namespace-e2e
unidesk.ai/deploy-ref: master-deploy-json-dev
unidesk.ai/deploy-commit: "$manifest_commit"
spec:
pipelineRef:
name: unidesk-dev-namespace-e2e
taskRunTemplate:
serviceAccountName: unidesk-ci-runner
params:
- name: repo-url
value: "$repo_url"
- name: desired-ref
value: "$desired_ref"
- name: deploy-commit
value: "$manifest_commit"
- name: environment
value: "$environment"
- name: run-id
value: "$run_id"
- name: keep-namespace
value: "$keep_namespace"
workspaces:
- name: shared-workspace
persistentVolumeClaim:
claimName: unidesk-ci-cache
YAML
pipeline_run="$(kubectl create -f "$pipeline_manifest" -o jsonpath='{.metadata.name}')"
printf '%s\n' "$pipeline_run" >"$result_dir/pipelinerun.txt"
log_json pipelinerun_created pipeline_run "$pipeline_run" namespace unidesk-ci
deadline=$((SECONDS + (timeout_ms + 999) / 1000))
condition=""
while [ "$SECONDS" -lt "$deadline" ]; do
condition="$(kubectl get "pipelinerun/$pipeline_run" -n unidesk-ci -o jsonpath='{range .status.conditions[?(@.type=="Succeeded")]}{.status}{"\t"}{.reason}{"\t"}{.message}{end}' 2>/dev/null || true)"
case "$condition" in
True*)
kubectl get "pipelinerun/$pipeline_run" -n unidesk-ci -o json >"$result_dir/pipelinerun.json"
kubectl get taskrun -n unidesk-ci -l "tekton.dev/pipelineRun=$pipeline_run" -o json >"$result_dir/taskruns.json" || true
kubectl logs -n unidesk-ci -l "tekton.dev/pipelineRun=$pipeline_run" --all-containers=true --tail=-1 >"$result_dir/pods.log" 2>&1 || true
write_result true succeeded "$condition"
exit 0
;;
False*)
kubectl get "pipelinerun/$pipeline_run" -n unidesk-ci -o json >"$result_dir/pipelinerun.json" || true
kubectl get taskrun -n unidesk-ci -l "tekton.dev/pipelineRun=$pipeline_run" -o json >"$result_dir/taskruns.json" || true
kubectl logs -n unidesk-ci -l "tekton.dev/pipelineRun=$pipeline_run" --all-containers=true --tail=-1 >"$result_dir/pods.log" 2>&1 || true
write_result false failed "$condition"
exit 1
;;
esac
sleep 2
done
kubectl get "pipelinerun/$pipeline_run" -n unidesk-ci -o json >"$result_dir/pipelinerun.json" || true
kubectl get taskrun -n unidesk-ci -l "tekton.dev/pipelineRun=$pipeline_run" -o json >"$result_dir/taskruns.json" || true
kubectl logs -n unidesk-ci -l "tekton.dev/pipelineRun=$pipeline_run" --all-containers=true --tail=-1 >"$result_dir/pods.log" 2>&1 || true
write_result false timeout "Timed out waiting for pipelinerun/$pipeline_run"
exit 124