-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathTaskfile.yml
More file actions
253 lines (224 loc) · 9.13 KB
/
Taskfile.yml
File metadata and controls
253 lines (224 loc) · 9.13 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
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
version: '3'
vars:
KIND_CLUSTER: browsergrid-dev
KUBECONFIG: "{{.ROOT_DIR}}/kubeconfig"
BROWSER: '{{.BROWSER | default "$(uname -s | grep -q Darwin && echo chromium || echo chrome)"}}'
BROWSER_TYPES: "chrome chromium"
tasks:
kind:create:
desc: Create the local kind cluster (browsergrid-dev)
preconditions:
- sh: command -v kind >/dev/null 2>&1
msg: "kind is required. Install from https://kind.sigs.k8s.io/"
- sh: command -v kubectl >/dev/null 2>&1
msg: "kubectl is required. Install from https://kubernetes.io/docs/tasks/tools/"
cmds:
- |
if ! kind get clusters | grep -q "{{.KIND_CLUSTER}}"; then
kind create cluster --name {{.KIND_CLUSTER}} --config k8s/local/kind-config.yaml
else
echo "kind cluster {{.KIND_CLUSTER}} already exists"
fi
- kind get kubeconfig --name {{.KIND_CLUSTER}} > "{{.KUBECONFIG}}"
kind:recreate:
desc: Recreate the local kind cluster with updated configuration
preconditions:
- sh: command -v kind >/dev/null 2>&1
msg: "kind is required. Install from https://kind.sigs.k8s.io/"
- sh: command -v kubectl >/dev/null 2>&1
msg: "kubectl is required. Install from https://kubernetes.io/docs/tasks/tools/"
cmds:
- task: kind:delete
- kind create cluster --name {{.KIND_CLUSTER}} --config k8s/local/kind-config.yaml
- kind get kubeconfig --name {{.KIND_CLUSTER}} > "{{.KUBECONFIG}}"
kind:delete:
desc: Delete the local kind cluster
cmds:
- |
if kind get clusters | grep -q "{{.KIND_CLUSTER}}"; then
kind delete cluster --name {{.KIND_CLUSTER}}
else
echo "kind cluster {{.KIND_CLUSTER}} already removed"
fi
- rm -f "{{.KUBECONFIG}}"
k8s:bootstrap:
desc: Create base browsergrid namespace, service accounts, and RBAC
deps: [kind:create]
cmds:
- kubectl --kubeconfig "{{.KUBECONFIG}}" apply -f k8s/local/base.yaml
browsers:load:
desc: Build and load browser images into the kind cluster (use BROWSER=chrome|chromium)
deps: [kind:create, browsers:build]
cmds:
- kind load docker-image browsergrid/base:latest browsergrid/{{.BROWSER}}:latest --name {{.KIND_CLUSTER}}
browsers:load-all:
desc: Build and load all browser images into the kind cluster (skips Chrome on Mac/ARM)
deps: [kind:create]
cmds:
- |
# Detect system type
if uname -s | grep -q Darwin; then
IS_MAC=true
else
IS_MAC=false
fi
if uname -m | grep -q arm; then
IS_ARM=true
else
IS_ARM=false
fi
# Determine which browsers to build and load
BROWSERS_TO_BUILD="{{.BROWSER_TYPES}}"
if [ "$IS_MAC" = "true" ] && [ "$IS_ARM" = "true" ]; then
echo "Detected Mac ARM system - skipping Chrome, building Chromium only"
BROWSERS_TO_BUILD="chromium"
else
echo "Building all browsers: $BROWSERS_TO_BUILD"
fi
# Build base image once
echo "Building browser base..."
BROWSER=chrome docker-compose -f docker/docker-compose.browsers.yml build base
# Build and load each browser
for browser in $BROWSERS_TO_BUILD; do
echo "Building and loading $browser..."
BROWSER=$browser docker-compose -f docker/docker-compose.browsers.yml build browser
kind load docker-image browsergrid/base:latest browsergrid/$browser:latest --name {{.KIND_CLUSTER}}
done
browsers:build:
desc: Build browser images using docker-compose (use BROWSER=chrome|chromium)
cmds:
- |
if ! echo "{{.BROWSER_TYPES}}" | grep -q "{{.BROWSER}}"; then
echo "Error: Invalid browser type '{{.BROWSER}}'"
echo "Supported browsers: {{.BROWSER_TYPES}}"
exit 1
fi
echo "Building browser base..."
BROWSER={{.BROWSER}} docker-compose -f docker/docker-compose.browsers.yml build base
echo "Building {{.BROWSER}} image..."
BROWSER={{.BROWSER}} docker-compose -f docker/docker-compose.browsers.yml build browser
browsers:up:
desc: Spin up browser container in docker-compose (use BROWSER=chrome|chromium)
deps: [browsers:build]
cmds:
- |
if ! echo "{{.BROWSER_TYPES}}" | grep -q "{{.BROWSER}}"; then
echo "Error: Invalid browser type '{{.BROWSER}}'"
echo "Supported browsers: {{.BROWSER_TYPES}}"
exit 1
fi
echo "Starting services with {{.BROWSER}}..."
BROWSER={{.BROWSER}} docker-compose -f docker/docker-compose.browsers.yml up -d browser
browsers:logs:
desc: View logs from browser container (use BROWSER=chrome|chromium)
cmds:
- BROWSER={{.BROWSER}} docker-compose -f docker/docker-compose.browsers.yml logs -f browser
browsers:shell:
desc: Open shell in browser container (use BROWSER=chrome|chromium)
cmds:
- |
echo "Opening shell in {{.BROWSER}} container..."
BROWSER={{.BROWSER}} docker-compose -f docker/docker-compose.browsers.yml exec browser /bin/bash
browsers:down:
desc: Stop browser container (use BROWSER=chrome|chromium)
cmds:
- BROWSER={{.BROWSER}} docker-compose -f docker/docker-compose.browsers.yml down
dev:build:
desc: Build the Browsergrid server image and load it into kind
deps: [kind:create]
cmds:
- docker build -f docker/server/Dockerfile.dev -t browsergrid/app:dev .
- kind load docker-image browsergrid/app:dev --name {{.KIND_CLUSTER}}
dev:up:
desc: Deploy Browsergrid into the local cluster
deps: [k8s:bootstrap, dev:build, resources:start]
cmds:
- |
set -a
. .env
set +a
envsubst < k8s/local/deployment.yaml | kubectl --kubeconfig "{{.KUBECONFIG}}" apply -f -
dev:restart:
desc: Restart Browsergrid in the local cluster
cmds:
- kubectl --kubeconfig "{{.KUBECONFIG}}" rollout restart deploy/browsergrid -n browsergrid-dev
dev:logs:
desc: Follow logs from the active Browsergrid pod
cmds:
- |
POD=$(kubectl --kubeconfig "{{.KUBECONFIG}}" get pods -n browsergrid-dev -l app=browsergrid --sort-by=.metadata.creationTimestamp -o jsonpath='{range .items[*]}{.metadata.name}{"\n"}{end}' | tail -n1)
if [ -z "$POD" ]; then
echo "No browsergrid pods found" >&2
exit 1
fi
echo "Streaming logs from $POD"
kubectl --kubeconfig "{{.KUBECONFIG}}" logs "$POD" -n browsergrid-dev -f
dev:logs:previous:
desc: Show logs from the prior Browsergrid pod instance after a restart
cmds:
- |
POD=$(kubectl --kubeconfig "{{.KUBECONFIG}}" get pods -n browsergrid-dev -l app=browsergrid --sort-by=.metadata.creationTimestamp -o jsonpath='{range .items[*]}{.metadata.name}{"\n"}{end}' | tail -n1)
if [ -z "$POD" ]; then
echo "No browsergrid pods found" >&2
exit 1
fi
echo "Displaying previous logs for $POD"
kubectl --kubeconfig "{{.KUBECONFIG}}" logs "$POD" -n browsergrid-dev --previous
dev:logs:describe:
desc: Inspect the current Browsergrid pod status and restart history
cmds:
- |
POD=$(kubectl --kubeconfig "{{.KUBECONFIG}}" get pods -n browsergrid-dev -l app=browsergrid --sort-by=.metadata.creationTimestamp -o jsonpath='{range .items[*]}{.metadata.name}{"\n"}{end}' | tail -n1)
if [ -z "$POD" ]; then
echo "No browsergrid pods found" >&2
exit 1
fi
kubectl --kubeconfig "{{.KUBECONFIG}}" describe pod "$POD" -n browsergrid-dev
dev:delete:
desc: Delete the Browsergrid deployment from the local cluster
cmds:
- kubectl --kubeconfig "{{.KUBECONFIG}}" delete deploy/browsergrid -n browsergrid-dev
resources:start:
desc: Start shared resources (PostgreSQL, Redis, Adminer) using docker-compose
cmds:
- docker-compose -f docker/docker-compose.resources.yml up -d
resources:stop:
desc: Stop shared resources using docker-compose
cmds:
- docker-compose -f docker/docker-compose.resources.yml down
resources:logs:
desc: View logs from shared resources
cmds:
- docker-compose -f docker/docker-compose.resources.yml logs -f
resources:wait:
desc: Wait for PostgreSQL to be ready in docker-compose
cmds:
- |
echo "Waiting for PostgreSQL to accept connections..."
for attempt in $(seq 1 60); do
if docker-compose -f docker/docker-compose.resources.yml exec -T postgres pg_isready -U postgres -d browsergrid_dev >/dev/null 2>&1; then
echo "PostgreSQL is ready"
exit 0
fi
sleep 1
done
echo "PostgreSQL did not become ready in time" >&2
exit 1
dev:init:
desc: Complete local development setup with volume mounts
cmds:
- task: resources:start
- task: resources:wait
- task: kind:recreate
- task: k8s:bootstrap
- task: browsers:load-all
- task: dev:build
- task: dev:up
- |
MIX_ENV=dev mix ecto.create
MIX_ENV=dev mix ecto.migrate
destroy:
desc: Tear down all local Kubernetes resources and stop resources
cmds:
- task: resources:stop
- task: kind:delete