forked from CopilotKit/CopilotKit
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcmd-aimock-rebuild.sh
More file actions
153 lines (128 loc) · 5.37 KB
/
Copy pathcmd-aimock-rebuild.sh
File metadata and controls
153 lines (128 loc) · 5.37 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
#!/usr/bin/env bash
# showcase aimock-rebuild — rebuild local aimock from source checkout
# Sourced by the main dispatcher; do not execute directly.
CMD_AIMOCK_REBUILD_DESC="Rebuild local aimock from source checkout"
usage_aimock_rebuild() {
cat <<'HELP'
Usage: showcase aimock-rebuild [--from <path>]
Rebuild aimock from a local source checkout and redeploy the container.
Options:
--from <path> Path to local aimock checkout
Default: $AIMOCK_SRC or ../aimock (sibling repo)
Steps performed:
1. npm run build (in aimock source)
2. Docker build (DEPOT_DISABLE=1, local --load)
3. Force-recreate aimock container
4. Wait for healthy
Environment:
AIMOCK_SRC Default aimock source directory
HELP
}
cmd_aimock_rebuild() {
local aimock_src=""
# ── Parse arguments ──────────────────────────────────────────────
while [[ $# -gt 0 ]]; do
case "$1" in
--from)
[[ -z "${2:-}" ]] && die "--from requires a path argument"
aimock_src="$2"
shift 2
;;
-h|--help)
usage_aimock_rebuild
return 0
;;
*)
die "Unknown argument: $1 (see showcase aimock-rebuild --help)"
;;
esac
done
# ── Resolve aimock source directory ──────────────────────────────
if [[ -z "$aimock_src" ]]; then
if [[ -n "${AIMOCK_SRC:-}" && -d "$AIMOCK_SRC" ]]; then
aimock_src="$AIMOCK_SRC"
elif [[ -d "$SHOWCASE_ROOT/../../aimock" ]]; then
aimock_src="$SHOWCASE_ROOT/../../aimock"
elif [[ -d "$SHOWCASE_ROOT/../aimock" ]]; then
aimock_src="$SHOWCASE_ROOT/../aimock"
else
die "Cannot find aimock source. Set AIMOCK_SRC or use --from <path>"
fi
fi
# Canonicalise and validate
aimock_src="$(cd "$aimock_src" 2>/dev/null && pwd)" \
|| die "Cannot resolve aimock source path"
[[ -f "$aimock_src/package.json" ]] \
|| die "No package.json in $aimock_src — is this an aimock checkout?"
info "aimock source: $aimock_src"
local step_start total_start
total_start=$(date +%s.%N 2>/dev/null || date +%s)
# ── Step 1: npm build ───────────────────────────────────────────
info "Step 1/4: npm run build"
step_start=$(date +%s.%N 2>/dev/null || date +%s)
(cd "$aimock_src" && npm run build) || die "npm run build failed in $aimock_src"
local build_elapsed
build_elapsed=$(awk "BEGIN{printf \"%.1f\", $(date +%s.%N 2>/dev/null || date +%s) - $step_start}")
success "npm build (${build_elapsed}s)"
# ── Step 2: Docker build ────────────────────────────────────────
info "Step 2/4: Docker build"
step_start=$(date +%s.%N 2>/dev/null || date +%s)
# Detect available builder
local builder
if docker buildx ls 2>/dev/null | grep -q desktop-linux; then
builder="desktop-linux"
else
builder="default"
fi
info "Using builder: $builder"
DEPOT_DISABLE=1 docker buildx build \
--builder "$builder" \
--load \
-t aimock:local \
"$aimock_src" \
|| die "Docker build failed"
local docker_elapsed
docker_elapsed=$(awk "BEGIN{printf \"%.1f\", $(date +%s.%N 2>/dev/null || date +%s) - $step_start}")
success "Docker build (${docker_elapsed}s)"
# ── Step 3: Force-recreate container ────────────────────────────
info "Step 3/4: Force-recreate aimock container"
step_start=$(date +%s.%N 2>/dev/null || date +%s)
docker compose -f "$AIMOCK_COMPOSE" up -d --force-recreate aimock \
|| die "Failed to recreate aimock container"
local recreate_elapsed
recreate_elapsed=$(awk "BEGIN{printf \"%.1f\", $(date +%s.%N 2>/dev/null || date +%s) - $step_start}")
success "Force-recreate (${recreate_elapsed}s)"
# ── Step 4: Wait for healthy ────────────────────────────────────
info "Step 4/4: Waiting for aimock to become healthy"
step_start=$(date +%s.%N 2>/dev/null || date +%s)
local container_name="showcase-aimock"
local timeout_secs=30
local deadline=$((SECONDS + timeout_secs))
local status=""
while [[ $SECONDS -lt $deadline ]]; do
status=$(docker inspect --format='{{.State.Health.Status}}' "$container_name" 2>/dev/null || echo "missing")
case "$status" in
healthy)
local health_elapsed
health_elapsed=$(awk "BEGIN{printf \"%.1f\", $(date +%s.%N 2>/dev/null || date +%s) - $step_start}")
success "Healthy (${health_elapsed}s)"
local total_elapsed
total_elapsed=$(awk "BEGIN{printf \"%.1f\", $(date +%s.%N 2>/dev/null || date +%s) - $total_start}")
success "aimock rebuilt and healthy (total ${total_elapsed}s)"
return 0
;;
unhealthy)
warn "Container reports unhealthy — retrying..."
;;
esac
printf "."
sleep 1
done
# Timed out
printf "\n"
local total_elapsed
total_elapsed=$(awk "BEGIN{printf \"%.1f\", $(date +%s.%N 2>/dev/null || date +%s) - $total_start}")
warn "aimock rebuilt but health check timed out after ${timeout_secs}s (container may still be starting)"
warn "Last status: $status (total ${total_elapsed}s)"
return 1
}