generated from TBD54566975/tbd-project-template
-
Notifications
You must be signed in to change notification settings - Fork 8
401 lines (401 loc) · 13.9 KB
/
ci.yml
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
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
on:
pull_request:
merge_group:
name: CI
concurrency:
group: ${{ github.ref }}-ci
cancel-in-progress: true
jobs:
test:
name: Test Go
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Build Cache
uses: ./.github/actions/build-cache
- name: Init Hermit
uses: cashapp/[email protected]
- name: Build Language Plugins
run: just build-language-plugins
- name: Test
run: |
go-test-annotate
# go-test-annotate ${{ (github.event_name == 'pull_request' && github.event.action != 'enqueued' && !contains( github.event.pull_request.labels.*.name, 'run-all')) && '-short' || '' }}
test-readme:
name: Test README
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Build Cache
uses: ./.github/actions/build-cache
- name: Init Hermit
uses: cashapp/[email protected]
- name: Build Language Plugins
run: just build-language-plugins
- name: Test README
run: just test-readme
lint:
name: Lint
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Build Cache
uses: ./.github/actions/build-cache
- name: Init Hermit
uses: cashapp/[email protected]
- name: golangci-lint
run: |
golangci-lint --version
golangci-lint run --new-from-rev="$(git merge-base origin/main HEAD)" --out-format github-actions ./...
- name: lint-commit-or-rollback
run: lint-commit-or-rollback ./backend/... 2>&1 | to-annotation
- name: go-check-sumtype
shell: bash
run: go-check-sumtype --include-shared-interfaces=true ./backend/... ./cmd/... ./internal/... 2>&1 | to-annotation
- name: actionlint
shell: bash
run: actionlint --oneline | to-annotation
# Too annoying to disable individual warnings
# - name: staticcheck
# run: staticcheck ./...
- name: lint-scripts
run: just lint-scripts
proto-breaking:
name: Proto Breaking Change Check
if: ${{ github.event_name == 'pull_request' && !contains(github.event.pull_request.labels.*.name, 'skip-proto-breaking') }}
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Init Hermit
uses: cashapp/[email protected]
- name: Proto Breaking Change Check
shell: bash
run: |
set -o pipefail
buf breaking --against 'https://github.com/block/ftl.git#branch=main' | to-annotation || true
console:
name: Console
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Build Cache
uses: ./.github/actions/build-cache
- name: Init Hermit
uses: cashapp/[email protected]
- name: Console pnpm install
run: just pnpm-install
- name: Console Lint
run: just lint-frontend
- name: Console Build
run: just build-frontend
- name: Console Test
run: just test-frontend
test-wasm:
name: Test sqlc-gen-ftl
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Init Hermit
uses: cashapp/[email protected]
- name: Build Cache
uses: ./.github/actions/build-cache
- name: Test WASM
run: cd sqlc-gen-ftl && cargo test --features ci --test sqlc_gen_ftl_test -- --nocapture
- name: Check for uncommitted changes
run: |
if [[ -n $(git status -s) ]]; then
echo "Error: Building sqlc-gen-ftl resulted in uncommitted changes:"
git status -s
git --no-pager diff
exit 1
fi
extension:
name: VSCode Extension
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Build Cache
uses: ./.github/actions/build-cache
- name: Init Hermit
uses: cashapp/[email protected]
- name: VSCode extension pnpm install
run: just pnpm-install
- name: VSCode extension lint
working-directory: frontend/vscode
run: pnpm run lint
- name: VSCode extension pnpm build and package
run: just package-extension
plugin:
name: Intellij Plugin
# if: github.event_name != 'pull_request' || github.event.action == 'enqueued' || contains( github.event.pull_request.labels.*.name, 'run-all')
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Build Cache
uses: ./.github/actions/build-cache
- name: Init Hermit
uses: cashapp/[email protected]
- name: Install Java
run: java -version
- name: Build Intellij Plugin
run: just build-intellij-plugin
build-all:
name: Rebuild All
# if: github.event_name != 'pull_request' || github.event.action == 'enqueued' || contains( github.event.pull_request.labels.*.name, 'run-all')
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Build Cache
uses: ./.github/actions/build-cache
- name: Init Hermit
uses: cashapp/[email protected]
- name: Rebuild All
run: just build-all
- name: Check No SCM Changes
run: |
if [[ -n $(git status -s) ]]
then
echo "Running the build resulted in changes to git controlled files:"
git status -s
git --no-pager diff
exit 1
fi
docs:
name: Build Docs
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
submodules: true
- uses: cashapp/[email protected]
- run: cd docs && zola build
arch-lint:
name: Lint Architecture
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: cashapp/[email protected]
- run: go-arch-lint check || true
docker-shard:
name: Shard Docker Builds
runs-on: ubuntu-latest
outputs:
matrix: ${{ steps.set-matrix.outputs.matrix }}
steps:
- name: Checkout code
uses: actions/checkout@v4
- uses: cashapp/[email protected]
- id: set-matrix
name: Shard Docker Builds
uses: ./.github/actions/shard-docker-builds
build-docker-images:
name: Build ${{ matrix.service }} Docker Image
needs: docker-shard
runs-on: ubuntu-latest
strategy:
matrix:
service: ${{ fromJson(needs.docker-shard.outputs.matrix) }}
steps:
- name: Checkout code
uses: actions/checkout@v4
- uses: cashapp/[email protected]
- name: Build Image and Save
uses: ./.github/actions/save-docker-image
with:
service: ${{ matrix.service }}
console-e2e:
name: Console e2e
# if: github.event_name != 'pull_request' || github.event.action == 'enqueued' || contains( github.event.pull_request.labels.*.name, 'run-all')
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Build Cache
uses: ./.github/actions/build-cache
- name: Init Hermit
uses: cashapp/[email protected]
- name: Restore playwright browser cache
id: cache-playwright
uses: actions/cache/restore@v4
with:
path: ~/.cache/ms-playwright
key: ${{ runner.os }}-playwright-${{ hashFiles('**/pnpm-lock.yaml') }}
restore-keys: |
${{ runner.os }}-playwright-
- name: Console pnpm install
run: just pnpm-install
- name: Build Language Plugins
run: just build-language-plugins
- name: Console e2e
run: just e2e-frontend
integration-shard:
name: Shard Integration Tests
# if: github.event_name != 'pull_request' || github.event.action == 'enqueued' || contains( github.event.pull_request.labels.*.name, 'run-all')
runs-on: ubuntu-latest
outputs:
matrix: ${{ steps.extract-tests.outputs.matrix }}
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Init Hermit
uses: cashapp/[email protected]
- name: Extract test cases
id: extract-tests
run: |
set -euo pipefail
# shellcheck disable=SC2046
echo "matrix={\"test\":$(jq -c -n '$ARGS.positional' --args $(git grep -l '^//go:build integration' | xargs grep '^func Test' | awk '{print $2}' | cut -d'(' -f1 | paste -d '|' - - | sed 's/|*$//'))}" >> "$GITHUB_OUTPUT"
integration-run:
name: Integration Test
# if: github.event_name != 'pull_request' || github.event.action == 'enqueued' || contains( github.event.pull_request.labels.*.name, 'run-all')
needs: integration-shard
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix: ${{fromJson(needs.integration-shard.outputs.matrix)}}
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Build Cache
uses: ./.github/actions/build-cache
- name: Init Hermit
uses: cashapp/[email protected]
- name: Download Go Modules
run: go mod download
- name: Build Language Plugins
run: just build-language-plugins
- name: Run ${{ matrix.test }}
run: |
set -euo pipefail
# shellcheck disable=SC2046
echo '${{ matrix.test }}' | tr '|' ' ' | xargs -n1 just integration-tests
infrastructure-shard:
name: Shard Infrastructure Tests
# if: github.event_name != 'pull_request' || github.event.action == 'enqueued' || contains( github.event.pull_request.labels.*.name, 'run-all')
runs-on: ubuntu-latest
outputs:
matrix: ${{ steps.extract-tests.outputs.matrix }}
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Init Hermit
uses: cashapp/[email protected]
- name: Extract test cases
id: extract-tests
run: |
set -euo pipefail
# shellcheck disable=SC2046
echo "matrix={\"test\":$(jq -c -n '$ARGS.positional' --args $(git grep -l '^//go:build infrastructure' | xargs grep '^func Test' | awk '{print $2}' | cut -d'(' -f1))}" >> "$GITHUB_OUTPUT"
infrastructure-run:
name: Infrastructure Test
#if: github.event_name != 'pull_request' || github.event.action == 'enqueued' || contains( github.event.pull_request.labels.*.name, 'run-all')
needs:
- infrastructure-shard
- build-docker-images
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix: ${{fromJson(needs.infrastructure-shard.outputs.matrix)}}
steps:
- name: Free Disk Space (Ubuntu)
uses: jlumbroso/free-disk-space@main
with:
# this might remove tools that are actually needed,
# if set to "true" but frees about 6 GB
tool-cache: false
large-packages: false # this is slow
- name: Checkout code
uses: actions/checkout@v4
- name: Init Hermit
uses: cashapp/[email protected]
- name: Load Docker Images
uses: ./.github/actions/load-docker-images
- name: Start Cluster
run: just k8s setup-istio-cluster
- name: Tag and Push Docker Images
run: |
for image in $(just list-docker-images); do
docker tag "ftl0/ftl-${image}:latest" "localhost:5000/ftl-${image}:latest"
docker push "localhost:5000/ftl-${image}:latest"
done
- name: Build Cache
uses: ./.github/actions/build-cache
- name: Download Go Modules
run: go mod download
- name: Start FTL
run: just k8s apply
- name: Build Language Plugins
run: just build-language-plugins
- name: Run ${{ matrix.test }}
run: |
set -euo pipefail
# shellcheck disable=SC2046
go test -v -race -tags infrastructure -run '^${{ matrix.test }}$' $(git grep -l '^//go:build infrastructure' | xargs grep -l '^func ${{ matrix.test }}' | xargs -I {} dirname ./{})
- name: Archive Report
uses: actions/upload-artifact@v4
if: always() # Always upload the report even on failure
with:
name: kube-report-${{ matrix.test }}
path: /tmp/ftl-kube-report/
- name: Teardown Cluster
working-directory: deployment
if: always() # Always cleanup the cluster even on failure
run: just teardown-cluster
- name: Delete Images
if: always() # We don't want to cache these images, delete them before the cache action
run: just k8s delete-all-images
integration-success:
name: Integration Success
needs: [integration-run]
runs-on: ubuntu-latest
if: ${{ always() }}
steps:
- name: Check integration tests result
run: |
if [[ "${{ needs.integration-run.result }}" == "failure" ]]; then
echo "Integration tests failed"
exit 1
else
echo "Integration tests passed"
fi
docker-success:
name: Docker Success
needs: [build-docker-images]
runs-on: ubuntu-latest
if: ${{ always() }}
steps:
- name: Check docker builds result
run: |
if [[ "${{ needs.build-docker-images.result }}" == "failure" ]]; then
echo "Docker builds failed"
exit 1
else
echo "Docker builds passed"
fi
infrastructure-success:
name: Infrastructure Success
needs: [infrastructure-run]
runs-on: ubuntu-latest
if: ${{ always() }}
steps:
- name: Check infrastructure tests result
run: |
if [[ "${{ needs.infrastructure-run.result }}" == "failure" ]]; then
echo "Infrastructure tests failed"
exit 1
else
echo "Infrastructure tests passed"
fi