@catladder/pipeline 1.125.1 โ†’ 1.126.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. package/dist/bundles/catladder-gitlab/index.js +1 -1
  2. package/dist/constants.js +1 -1
  3. package/dist/deploy/base/deploy.js +1 -1
  4. package/dist/deploy/cloudRun/deployJob.js +10 -6
  5. package/dist/deploy/types/googleCloudRun.d.ts +6 -2
  6. package/dist/tsconfig.tsbuildinfo +1 -1
  7. package/examples/__snapshots__/cloud-run-memory-limit.ts.snap +1 -1
  8. package/examples/__snapshots__/cloud-run-meteor-with-worker.ts.snap +1 -1
  9. package/examples/__snapshots__/cloud-run-no-cpu-throttling.ts.snap +1 -1
  10. package/examples/__snapshots__/cloud-run-non-public.ts.snap +1 -1
  11. package/examples/__snapshots__/cloud-run-post-stop-job.ts.snap +1855 -0
  12. package/examples/__snapshots__/cloud-run-with-sql-reuse-db.ts.snap +2 -2
  13. package/examples/__snapshots__/cloud-run-with-sql.ts.snap +2 -2
  14. package/examples/__snapshots__/cloud-run-with-worker.ts.snap +1 -1
  15. package/examples/__snapshots__/custom-build-job-with-tests.ts.snap +1 -1
  16. package/examples/__snapshots__/custom-build-job.ts.snap +1 -1
  17. package/examples/__snapshots__/custom-deploy.ts.snap +1 -1
  18. package/examples/__snapshots__/custom-sbom-java.ts.snap +1 -1
  19. package/examples/__snapshots__/kubernetes-application-customization.ts.snap +1 -1
  20. package/examples/__snapshots__/kubernetes-with-cloud-sql-legacy.ts.snap +1 -1
  21. package/examples/__snapshots__/kubernetes-with-cloud-sql.ts.snap +1 -1
  22. package/examples/__snapshots__/kubernetes-with-jobs.ts.snap +2 -2
  23. package/examples/__snapshots__/kubernetes-with-mongodb.ts.snap +1 -1
  24. package/examples/__snapshots__/meteor-kubernetes.ts.snap +1 -1
  25. package/examples/__snapshots__/native-app.ts.snap +1 -1
  26. package/examples/__snapshots__/node-build-with-custom-image.ts.snap +1 -1
  27. package/examples/__snapshots__/rails-k8s-with-worker.ts.snap +2 -2
  28. package/examples/cloud-run-post-stop-job.ts +40 -0
  29. package/package.json +1 -1
  30. package/src/deploy/base/deploy.ts +1 -1
  31. package/src/deploy/cloudRun/deployJob.ts +20 -4
  32. package/src/deploy/types/googleCloudRun.ts +7 -2
@@ -0,0 +1,1855 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`matches snapshot 1`] = `
4
+ {
5
+ "mainBranch": {
6
+ "image": "path/to/docker/jobs-default:the-version",
7
+ "jobs": {
8
+ "api ๐Ÿ‘ฎ lint": {
9
+ "cache": [
10
+ {
11
+ "key": "api-yarn",
12
+ "paths": [
13
+ "api/.yarn",
14
+ ],
15
+ "policy": "pull-push",
16
+ },
17
+ {
18
+ "key": "api-node-modules",
19
+ "paths": [
20
+ "api/node_modules",
21
+ ],
22
+ "policy": "pull-push",
23
+ },
24
+ ],
25
+ "image": "path/to/docker/jobs-default:the-version",
26
+ "interruptible": true,
27
+ "needs": [],
28
+ "retry": {
29
+ "max": 2,
30
+ "when": [
31
+ "runner_system_failure",
32
+ "stuck_or_timeout_failure",
33
+ ],
34
+ },
35
+ "script": [
36
+ "cd api",
37
+ "echo -e "\\e[0Ksection_start:$(date +%s):yarn prepare[collapsed=true]\\r\\e[0KNode and yarn install"",
38
+ "echo -e "\\e[0Ksection_start:$(date +%s):node install[collapsed=true]\\r\\e[0KEnsure node version"",
39
+ "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
40
+ "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
41
+ "echo -e "\\e[0Ksection_end:$(date +%s):node install\\r\\e[0K"",
42
+ "yarn install --immutable",
43
+ "echo -e "\\e[0Ksection_end:$(date +%s):yarn prepare\\r\\e[0K"",
44
+ "yarn lint",
45
+ ],
46
+ "stage": "test",
47
+ "variables": {
48
+ "APP_PATH": "api",
49
+ "KUBERNETES_CPU_LIMIT": "2",
50
+ "KUBERNETES_CPU_REQUEST": "0.5",
51
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
52
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
53
+ },
54
+ },
55
+ "api ๐Ÿ”จ app | dev ": {
56
+ "artifacts": {
57
+ "expire_in": "1 day",
58
+ "paths": [
59
+ "api/__build_info.json",
60
+ "api/dist",
61
+ "api/.next",
62
+ ],
63
+ "reports": {
64
+ "junit": undefined,
65
+ },
66
+ "when": "always",
67
+ },
68
+ "cache": [
69
+ {
70
+ "key": "api-yarn",
71
+ "paths": [
72
+ "api/.yarn",
73
+ ],
74
+ "policy": "pull-push",
75
+ },
76
+ {
77
+ "key": "api-node-modules",
78
+ "paths": [
79
+ "api/node_modules",
80
+ ],
81
+ "policy": "pull-push",
82
+ },
83
+ {
84
+ "key": "api-next-cache",
85
+ "paths": [
86
+ "api/.next/cache/",
87
+ ],
88
+ "policy": "pull-push",
89
+ },
90
+ ],
91
+ "image": "path/to/docker/jobs-default:the-version",
92
+ "interruptible": true,
93
+ "needs": [],
94
+ "retry": {
95
+ "max": 2,
96
+ "when": [
97
+ "runner_system_failure",
98
+ "stuck_or_timeout_failure",
99
+ ],
100
+ },
101
+ "script": [
102
+ "echo '{"id":"some-id","time":"01-01-2023 12:13:14"}' > api/__build_info.json",
103
+ "echo -e "\\e[0Ksection_start:$(date +%s):node install[collapsed=true]\\r\\e[0KEnsure node version"",
104
+ "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
105
+ "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
106
+ "echo -e "\\e[0Ksection_end:$(date +%s):node install\\r\\e[0K"",
107
+ "cd api",
108
+ "echo -e "\\e[0Ksection_start:$(date +%s):yarn prepare[collapsed=true]\\r\\e[0KNode and yarn install"",
109
+ "echo -e "\\e[0Ksection_start:$(date +%s):node install[collapsed=true]\\r\\e[0KEnsure node version"",
110
+ "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
111
+ "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
112
+ "echo -e "\\e[0Ksection_end:$(date +%s):node install\\r\\e[0K"",
113
+ "yarn install --immutable",
114
+ "echo -e "\\e[0Ksection_end:$(date +%s):yarn prepare\\r\\e[0K"",
115
+ "yarn build",
116
+ ],
117
+ "stage": "build",
118
+ "variables": {
119
+ "APP_DIR": "api",
120
+ "BUILD_INFO_BUILD_TIME": "01-01-2023 12:13:14",
121
+ "BUILD_INFO_CURRENT_VERSION": "3.2.1",
122
+ "BUILD_INFO_ID": "some-id",
123
+ "ENV_SHORT": "dev",
124
+ "ENV_TYPE": "dev",
125
+ "GCLOUD_DEPLOY_credentialsKey": "$CL_dev_api_GCLOUD_DEPLOY_credentialsKey",
126
+ "GCLOUD_RUN_canonicalHostSuffix": "$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix",
127
+ "HOST": "pan-test-app-dev-api-unknown-host.example.com",
128
+ "HOST_CANONICAL": "pan-test-app-dev-api-unknown-host.example.com",
129
+ "KUBERNETES_CPU_LIMIT": "2",
130
+ "KUBERNETES_CPU_REQUEST": "0.5",
131
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
132
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
133
+ "ROOT_URL": "https://pan-test-app-dev-api-unknown-host.example.com",
134
+ "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_CANONICAL","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]",
135
+ },
136
+ },
137
+ "api ๐Ÿ”จ docker | dev ": {
138
+ "cache": [
139
+ {
140
+ "key": "api-yarn",
141
+ "paths": [
142
+ "api/.yarn",
143
+ ],
144
+ "policy": "pull",
145
+ },
146
+ ],
147
+ "image": "path/to/docker/docker-build:the-version",
148
+ "interruptible": true,
149
+ "needs": [
150
+ "api ๐Ÿ”จ app | dev ",
151
+ ],
152
+ "retry": {
153
+ "max": 2,
154
+ "when": [
155
+ "runner_system_failure",
156
+ "stuck_or_timeout_failure",
157
+ ],
158
+ },
159
+ "script": [
160
+ "ensureNodeDockerfile",
161
+ "echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"",
162
+ "echo $CL_dev_api_GCLOUD_DEPLOY_credentialsKey > ./____keyfile.json
163
+ ",
164
+ "gcloud auth activate-service-account --key-file="./____keyfile.json"",
165
+ "gcloud auth configure-docker europe-west6-docker.pkg.dev",
166
+ "echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"",
167
+ "echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"",
168
+ "docker build --network host --cache-from $DOCKER_CACHE_IMAGE --tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG -f $APP_DIR/Dockerfile . --build-arg BUILDKIT_INLINE_CACHE=1",
169
+ "echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"",
170
+ "echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"",
171
+ "docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
172
+ "docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE",
173
+ "docker push $DOCKER_CACHE_IMAGE",
174
+ "echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"",
175
+ ],
176
+ "services": [
177
+ {
178
+ "command": [
179
+ "--tls=false",
180
+ ],
181
+ "name": "docker:24.0.6-dind",
182
+ },
183
+ ],
184
+ "stage": "build",
185
+ "variables": {
186
+ "APP_DIR": "api",
187
+ "DOCKERFILE_ADDITIONS": undefined,
188
+ "DOCKERFILE_ADDITIONS_END": undefined,
189
+ "DOCKER_BUILDKIT": "1",
190
+ "DOCKER_CACHE_IMAGE": "europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api",
191
+ "DOCKER_COPY_AND_INSTALL_APP": "COPY --chown=node:node $APP_DIR .
192
+ RUN yarn plugin import workspace-tools
193
+ RUN yarn workspaces focus --production && yarn rebuild",
194
+ "DOCKER_COPY_WORKSPACE_FILES": "COPY --chown=node:node api/package.json /app/api/package.json
195
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
196
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
197
+ COPY --chown=node:node .yarn /app/.yarn",
198
+ "DOCKER_DIR": ".",
199
+ "DOCKER_DRIVER": "overlay2",
200
+ "DOCKER_HOST": "tcp://0.0.0.0:2375",
201
+ "DOCKER_IMAGE": "europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/dev/api",
202
+ "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
203
+ "DOCKER_REGISTRY": "europe-west6-docker.pkg.dev",
204
+ "DOCKER_TLS_CERTDIR": "",
205
+ "KUBERNETES_CPU_LIMIT": "1",
206
+ "KUBERNETES_CPU_REQUEST": "0.5",
207
+ "KUBERNETES_MEMORY_LIMIT": "2Gi",
208
+ "KUBERNETES_MEMORY_REQUEST": "1Gi",
209
+ },
210
+ },
211
+ "api ๐Ÿš€ Deploy | dev ": {
212
+ "allow_failure": false,
213
+ "artifacts": {
214
+ "paths": [
215
+ "____envvars.yaml",
216
+ ],
217
+ },
218
+ "environment": {
219
+ "auto_stop_in": "4 weeks",
220
+ "name": "dev/api",
221
+ "on_stop": "api ๐Ÿ›‘ Stop โš ๏ธ | dev ",
222
+ "url": "https://pan-test-app-dev-api-unknown-host.example.com",
223
+ },
224
+ "image": "path/to/docker/gcloud:the-version",
225
+ "interruptible": true,
226
+ "needs": [
227
+ {
228
+ "artifacts": false,
229
+ "job": "api ๐Ÿ‘ฎ lint",
230
+ },
231
+ {
232
+ "artifacts": false,
233
+ "job": "api ๐Ÿ”จ app | dev ",
234
+ },
235
+ {
236
+ "artifacts": false,
237
+ "job": "api ๐Ÿ”จ docker | dev ",
238
+ },
239
+ {
240
+ "artifacts": false,
241
+ "job": "api ๐Ÿงช test",
242
+ },
243
+ {
244
+ "artifacts": true,
245
+ "job": "api ๐Ÿงพ sbom | dev ",
246
+ },
247
+ {
248
+ "artifacts": false,
249
+ "job": "api ๐Ÿ›ก audit",
250
+ },
251
+ ],
252
+ "retry": {
253
+ "max": 2,
254
+ "when": [
255
+ "runner_system_failure",
256
+ "stuck_or_timeout_failure",
257
+ ],
258
+ },
259
+ "rules": [
260
+ {
261
+ "when": "on_success",
262
+ },
263
+ ],
264
+ "script": [
265
+ "echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."",
266
+ "echo $CL_dev_api_GCLOUD_DEPLOY_credentialsKey > ./____keyfile.json
267
+ ",
268
+ "gcloud auth activate-service-account --key-file="./____keyfile.json"",
269
+ "export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe google-project-id --format="value(projectNumber)")",
270
+ "echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"",
271
+ "echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"",
272
+ "echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"",
273
+ "echo "$ENV_VARS" > ____envvars.yaml",
274
+ "gcloud run deploy pan-test-app-dev-api --command="yarn,start" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/dev/api:$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --labels=customer-name=pan,component-name=api,app-name=test-app,env-type=dev,env-name=dev,build-type=node --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost",
275
+ "echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"",
276
+ "echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"",
277
+ "gcloud run revisions list --project=google-project-id --region=europe-west6 --service=pan-test-app-dev-api --limit=unlimited --sort-by=metadata.creationTimestamp --format="value(name)" --filter='(status.conditions.status=False OR status.conditions.status=Unknown)' | while read -r revisionname; do gcloud run revisions delete --project=google-project-id --region=europe-west6 --quiet $revisionname ; done",
278
+ "gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/dev/api --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/dev/api@$version --quiet --delete-tags; done",
279
+ "gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api@$version --quiet --delete-tags; done",
280
+ "echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"",
281
+ "echo Uploading SBOM to Dependency Track",
282
+ "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/api" "https://pan-test-app-dev-api-unknown-host.example.com" "__sbom.json" vex.json || true",
283
+ ],
284
+ "services": [
285
+ {
286
+ "command": [
287
+ "--tls=false",
288
+ ],
289
+ "name": "docker:24.0.6-dind",
290
+ },
291
+ ],
292
+ "stage": "deploy dev",
293
+ "variables": {
294
+ "APP_DIR": "api",
295
+ "BUILD_INFO_BUILD_TIME": "01-01-2023 12:13:14",
296
+ "BUILD_INFO_CURRENT_VERSION": "3.2.1",
297
+ "BUILD_INFO_ID": "some-id",
298
+ "CLOUDSDK_CORE_DISABLE_PROMPTS": "1",
299
+ "DOCKER_BUILDKIT": "1",
300
+ "DOCKER_CACHE_IMAGE": "europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api",
301
+ "DOCKER_DRIVER": "overlay2",
302
+ "DOCKER_HOST": "tcp://0.0.0.0:2375",
303
+ "DOCKER_IMAGE": "europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/dev/api",
304
+ "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
305
+ "DOCKER_REGISTRY": "europe-west6-docker.pkg.dev",
306
+ "DOCKER_TLS_CERTDIR": "",
307
+ "ENV_SHORT": "dev",
308
+ "ENV_TYPE": "dev",
309
+ "ENV_VARS": "ENV_SHORT: 'dev'
310
+ APP_DIR: 'api'
311
+ ENV_TYPE: 'dev'
312
+ BUILD_INFO_ID: 'some-id'
313
+ BUILD_INFO_BUILD_TIME: '01-01-2023 12:13:14'
314
+ BUILD_INFO_CURRENT_VERSION: '3.2.1'
315
+ HOST: 'pan-test-app-dev-api-unknown-host.example.com'
316
+ ROOT_URL: 'https://pan-test-app-dev-api-unknown-host.example.com'
317
+ HOST_CANONICAL: 'pan-test-app-dev-api-unknown-host.example.com'
318
+ GCLOUD_RUN_canonicalHostSuffix: '$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix'
319
+ _ALL_ENV_VAR_KEYS: '["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_CANONICAL","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]'
320
+ ",
321
+ "GCLOUD_DEPLOY_credentialsKey": "$CL_dev_api_GCLOUD_DEPLOY_credentialsKey",
322
+ "GCLOUD_RUN_canonicalHostSuffix": "$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix",
323
+ "HOST": "pan-test-app-dev-api-unknown-host.example.com",
324
+ "HOST_CANONICAL": "pan-test-app-dev-api-unknown-host.example.com",
325
+ "KUBERNETES_CPU_LIMIT": "1",
326
+ "KUBERNETES_CPU_REQUEST": "0.5",
327
+ "KUBERNETES_MEMORY_LIMIT": "400Mi",
328
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
329
+ "ROOT_URL": "https://pan-test-app-dev-api-unknown-host.example.com",
330
+ "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_CANONICAL","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]",
331
+ },
332
+ },
333
+ "api ๐Ÿ›‘ Stop โš ๏ธ | dev ": {
334
+ "environment": {
335
+ "action": "stop",
336
+ "name": "dev/api",
337
+ "url": "https://pan-test-app-dev-api-unknown-host.example.com",
338
+ },
339
+ "image": "path/to/docker/gcloud:the-version",
340
+ "interruptible": true,
341
+ "needs": [],
342
+ "retry": {
343
+ "max": 2,
344
+ "when": [
345
+ "runner_system_failure",
346
+ "stuck_or_timeout_failure",
347
+ ],
348
+ },
349
+ "rules": [
350
+ {
351
+ "allow_failure": true,
352
+ "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/",
353
+ "when": "on_success",
354
+ },
355
+ {
356
+ "allow_failure": true,
357
+ "when": "manual",
358
+ },
359
+ ],
360
+ "script": [
361
+ "set +e",
362
+ "echo $CL_dev_api_GCLOUD_DEPLOY_credentialsKey > ./____keyfile.json
363
+ ",
364
+ "gcloud auth activate-service-account --key-file="./____keyfile.json"",
365
+ "gcloud run services delete pan-test-app-dev-api --project=google-project-id --region=europe-west6",
366
+ "gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/dev/api --quiet --delete-tags",
367
+ "gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api@$version --quiet --delete-tags; done",
368
+ "echo Disabling component in Dependency Track",
369
+ "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/api" "https://pan-test-app-dev-api-unknown-host.example.com" || true",
370
+ "set -e",
371
+ ],
372
+ "stage": "stop dev",
373
+ "variables": {
374
+ "CLOUDSDK_CORE_DISABLE_PROMPTS": "1",
375
+ "GIT_STRATEGY": "none",
376
+ "KUBERNETES_CPU_LIMIT": "1",
377
+ "KUBERNETES_CPU_REQUEST": "0.5",
378
+ "KUBERNETES_MEMORY_LIMIT": "400Mi",
379
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
380
+ },
381
+ },
382
+ "api ๐Ÿ›ก audit": {
383
+ "allow_failure": true,
384
+ "image": "path/to/docker/jobs-default:the-version",
385
+ "interruptible": true,
386
+ "needs": [],
387
+ "retry": {
388
+ "max": 2,
389
+ "when": [
390
+ "runner_system_failure",
391
+ "stuck_or_timeout_failure",
392
+ ],
393
+ },
394
+ "script": [
395
+ "cd api",
396
+ "yarn npm audit --environment production",
397
+ ],
398
+ "stage": "test",
399
+ "variables": {
400
+ "APP_PATH": "api",
401
+ "KUBERNETES_CPU_LIMIT": "2",
402
+ "KUBERNETES_CPU_REQUEST": "0.5",
403
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
404
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
405
+ },
406
+ },
407
+ "api ๐Ÿงช test": {
408
+ "cache": [
409
+ {
410
+ "key": "api-yarn",
411
+ "paths": [
412
+ "api/.yarn",
413
+ ],
414
+ "policy": "pull-push",
415
+ },
416
+ {
417
+ "key": "api-node-modules",
418
+ "paths": [
419
+ "api/node_modules",
420
+ ],
421
+ "policy": "pull-push",
422
+ },
423
+ ],
424
+ "image": "path/to/docker/jobs-testing-chrome:the-version",
425
+ "interruptible": true,
426
+ "needs": [],
427
+ "retry": {
428
+ "max": 2,
429
+ "when": [
430
+ "runner_system_failure",
431
+ "stuck_or_timeout_failure",
432
+ ],
433
+ },
434
+ "script": [
435
+ "cd api",
436
+ "echo -e "\\e[0Ksection_start:$(date +%s):yarn prepare[collapsed=true]\\r\\e[0KNode and yarn install"",
437
+ "echo -e "\\e[0Ksection_start:$(date +%s):node install[collapsed=true]\\r\\e[0KEnsure node version"",
438
+ "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
439
+ "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
440
+ "echo -e "\\e[0Ksection_end:$(date +%s):node install\\r\\e[0K"",
441
+ "yarn install --immutable",
442
+ "echo -e "\\e[0Ksection_end:$(date +%s):yarn prepare\\r\\e[0K"",
443
+ "yarn test",
444
+ ],
445
+ "stage": "test",
446
+ "variables": {
447
+ "APP_PATH": "api",
448
+ "KUBERNETES_CPU_LIMIT": "2",
449
+ "KUBERNETES_CPU_REQUEST": "0.5",
450
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
451
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
452
+ },
453
+ },
454
+ "api ๐Ÿงพ sbom | dev ": {
455
+ "allow_failure": true,
456
+ "artifacts": {
457
+ "paths": [
458
+ "__sbom.json",
459
+ ],
460
+ },
461
+ "image": "aquasec/trivy:0.38.3",
462
+ "interruptible": true,
463
+ "needs": [],
464
+ "retry": {
465
+ "max": 2,
466
+ "when": [
467
+ "runner_system_failure",
468
+ "stuck_or_timeout_failure",
469
+ ],
470
+ },
471
+ "script": [
472
+ "trivy fs --quiet --format cyclonedx --output "__sbom.json" api",
473
+ ],
474
+ "stage": "build",
475
+ "variables": {},
476
+ },
477
+ },
478
+ "stages": [
479
+ "setup",
480
+ "setup dev",
481
+ "setup review",
482
+ "setup stage",
483
+ "setup prod",
484
+ "setup local",
485
+ "test",
486
+ "test dev",
487
+ "test review",
488
+ "test stage",
489
+ "test prod",
490
+ "test local",
491
+ "build",
492
+ "build dev",
493
+ "build review",
494
+ "build stage",
495
+ "build prod",
496
+ "build local",
497
+ "deploy",
498
+ "deploy dev",
499
+ "deploy review",
500
+ "deploy stage",
501
+ "deploy prod",
502
+ "deploy local",
503
+ "verify",
504
+ "verify dev",
505
+ "verify review",
506
+ "verify stage",
507
+ "verify prod",
508
+ "verify local",
509
+ "rollback",
510
+ "rollback dev",
511
+ "rollback review",
512
+ "rollback stage",
513
+ "rollback prod",
514
+ "rollback local",
515
+ "stop",
516
+ "stop dev",
517
+ "stop review",
518
+ "stop stage",
519
+ "stop prod",
520
+ "stop local",
521
+ ],
522
+ "variables": {
523
+ "FF_USE_FASTZIP": "true",
524
+ "GIT_DEPTH": 1,
525
+ },
526
+ "workflow": {
527
+ "rules": [
528
+ {
529
+ "if": "$CI_COMMIT_TAG",
530
+ },
531
+ {
532
+ "if": "$CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/",
533
+ "when": "never",
534
+ },
535
+ {
536
+ "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+.([0-9]+|x).x$/",
537
+ },
538
+ {
539
+ "if": "$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH",
540
+ },
541
+ {
542
+ "if": "$CI_MERGE_REQUEST_ID",
543
+ },
544
+ ],
545
+ },
546
+ },
547
+ "mr": {
548
+ "image": "path/to/docker/jobs-default:the-version",
549
+ "jobs": {
550
+ "api ๐Ÿ‘ฎ lint": {
551
+ "cache": [
552
+ {
553
+ "key": "api-yarn",
554
+ "paths": [
555
+ "api/.yarn",
556
+ ],
557
+ "policy": "pull-push",
558
+ },
559
+ {
560
+ "key": "api-node-modules",
561
+ "paths": [
562
+ "api/node_modules",
563
+ ],
564
+ "policy": "pull-push",
565
+ },
566
+ ],
567
+ "image": "path/to/docker/jobs-default:the-version",
568
+ "interruptible": true,
569
+ "needs": [],
570
+ "retry": {
571
+ "max": 2,
572
+ "when": [
573
+ "runner_system_failure",
574
+ "stuck_or_timeout_failure",
575
+ ],
576
+ },
577
+ "script": [
578
+ "cd api",
579
+ "echo -e "\\e[0Ksection_start:$(date +%s):yarn prepare[collapsed=true]\\r\\e[0KNode and yarn install"",
580
+ "echo -e "\\e[0Ksection_start:$(date +%s):node install[collapsed=true]\\r\\e[0KEnsure node version"",
581
+ "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
582
+ "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
583
+ "echo -e "\\e[0Ksection_end:$(date +%s):node install\\r\\e[0K"",
584
+ "yarn install --immutable",
585
+ "echo -e "\\e[0Ksection_end:$(date +%s):yarn prepare\\r\\e[0K"",
586
+ "yarn lint",
587
+ ],
588
+ "stage": "test",
589
+ "variables": {
590
+ "APP_PATH": "api",
591
+ "KUBERNETES_CPU_LIMIT": "2",
592
+ "KUBERNETES_CPU_REQUEST": "0.5",
593
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
594
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
595
+ },
596
+ },
597
+ "api ๐Ÿ”จ app | review ": {
598
+ "artifacts": {
599
+ "expire_in": "1 day",
600
+ "paths": [
601
+ "api/__build_info.json",
602
+ "api/dist",
603
+ "api/.next",
604
+ ],
605
+ "reports": {
606
+ "junit": undefined,
607
+ },
608
+ "when": "always",
609
+ },
610
+ "cache": [
611
+ {
612
+ "key": "api-yarn",
613
+ "paths": [
614
+ "api/.yarn",
615
+ ],
616
+ "policy": "pull-push",
617
+ },
618
+ {
619
+ "key": "api-node-modules",
620
+ "paths": [
621
+ "api/node_modules",
622
+ ],
623
+ "policy": "pull-push",
624
+ },
625
+ {
626
+ "key": "api-next-cache",
627
+ "paths": [
628
+ "api/.next/cache/",
629
+ ],
630
+ "policy": "pull-push",
631
+ },
632
+ ],
633
+ "image": "path/to/docker/jobs-default:the-version",
634
+ "interruptible": true,
635
+ "needs": [],
636
+ "retry": {
637
+ "max": 2,
638
+ "when": [
639
+ "runner_system_failure",
640
+ "stuck_or_timeout_failure",
641
+ ],
642
+ },
643
+ "script": [
644
+ "echo '{"id":"some-id","time":"01-01-2023 12:13:14"}' > api/__build_info.json",
645
+ "echo -e "\\e[0Ksection_start:$(date +%s):node install[collapsed=true]\\r\\e[0KEnsure node version"",
646
+ "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
647
+ "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
648
+ "echo -e "\\e[0Ksection_end:$(date +%s):node install\\r\\e[0K"",
649
+ "cd api",
650
+ "echo -e "\\e[0Ksection_start:$(date +%s):yarn prepare[collapsed=true]\\r\\e[0KNode and yarn install"",
651
+ "echo -e "\\e[0Ksection_start:$(date +%s):node install[collapsed=true]\\r\\e[0KEnsure node version"",
652
+ "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
653
+ "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
654
+ "echo -e "\\e[0Ksection_end:$(date +%s):node install\\r\\e[0K"",
655
+ "yarn install --immutable",
656
+ "echo -e "\\e[0Ksection_end:$(date +%s):yarn prepare\\r\\e[0K"",
657
+ "yarn build",
658
+ ],
659
+ "stage": "build",
660
+ "variables": {
661
+ "APP_DIR": "api",
662
+ "BUILD_INFO_BUILD_TIME": "01-01-2023 12:13:14",
663
+ "BUILD_INFO_CURRENT_VERSION": "3.2.1",
664
+ "BUILD_INFO_ID": "some-id",
665
+ "CLOUD_RUN_JOB_TRIGGER_URL_drop_db": "https://europe-west6-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/google-project-id/jobs/pan-test-app-review-mr1234-api-drop-db:run",
666
+ "ENV_SHORT": "review",
667
+ "ENV_TYPE": "review",
668
+ "GCLOUD_DEPLOY_credentialsKey": "$CL_review_api_GCLOUD_DEPLOY_credentialsKey",
669
+ "GCLOUD_RUN_canonicalHostSuffix": "$CL_review_api_GCLOUD_RUN_canonicalHostSuffix",
670
+ "HOST": "pan-test-app-review-mr1234-api-unknown-host.example.com",
671
+ "HOST_CANONICAL": "pan-test-app-review-mr1234-api-unknown-host.example.com",
672
+ "KUBERNETES_CPU_LIMIT": "2",
673
+ "KUBERNETES_CPU_REQUEST": "0.5",
674
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
675
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
676
+ "ROOT_URL": "https://pan-test-app-review-mr1234-api-unknown-host.example.com",
677
+ "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_CANONICAL","CLOUD_RUN_JOB_TRIGGER_URL_drop_db","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]",
678
+ },
679
+ },
680
+ "api ๐Ÿ”จ docker | review ": {
681
+ "cache": [
682
+ {
683
+ "key": "api-yarn",
684
+ "paths": [
685
+ "api/.yarn",
686
+ ],
687
+ "policy": "pull",
688
+ },
689
+ ],
690
+ "image": "path/to/docker/docker-build:the-version",
691
+ "interruptible": true,
692
+ "needs": [
693
+ "api ๐Ÿ”จ app | review ",
694
+ ],
695
+ "retry": {
696
+ "max": 2,
697
+ "when": [
698
+ "runner_system_failure",
699
+ "stuck_or_timeout_failure",
700
+ ],
701
+ },
702
+ "script": [
703
+ "ensureNodeDockerfile",
704
+ "echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"",
705
+ "echo $CL_review_api_GCLOUD_DEPLOY_credentialsKey > ./____keyfile.json
706
+ ",
707
+ "gcloud auth activate-service-account --key-file="./____keyfile.json"",
708
+ "gcloud auth configure-docker europe-west6-docker.pkg.dev",
709
+ "echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"",
710
+ "echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"",
711
+ "docker build --network host --cache-from $DOCKER_CACHE_IMAGE --tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG -f $APP_DIR/Dockerfile . --build-arg BUILDKIT_INLINE_CACHE=1",
712
+ "echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"",
713
+ "echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"",
714
+ "docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
715
+ "docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE",
716
+ "docker push $DOCKER_CACHE_IMAGE",
717
+ "echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"",
718
+ ],
719
+ "services": [
720
+ {
721
+ "command": [
722
+ "--tls=false",
723
+ ],
724
+ "name": "docker:24.0.6-dind",
725
+ },
726
+ ],
727
+ "stage": "build",
728
+ "variables": {
729
+ "APP_DIR": "api",
730
+ "DOCKERFILE_ADDITIONS": undefined,
731
+ "DOCKERFILE_ADDITIONS_END": undefined,
732
+ "DOCKER_BUILDKIT": "1",
733
+ "DOCKER_CACHE_IMAGE": "europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api",
734
+ "DOCKER_COPY_AND_INSTALL_APP": "COPY --chown=node:node $APP_DIR .
735
+ RUN yarn plugin import workspace-tools
736
+ RUN yarn workspaces focus --production && yarn rebuild",
737
+ "DOCKER_COPY_WORKSPACE_FILES": "COPY --chown=node:node api/package.json /app/api/package.json
738
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
739
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
740
+ COPY --chown=node:node .yarn /app/.yarn",
741
+ "DOCKER_DIR": ".",
742
+ "DOCKER_DRIVER": "overlay2",
743
+ "DOCKER_HOST": "tcp://0.0.0.0:2375",
744
+ "DOCKER_IMAGE": "europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/api/mr1234",
745
+ "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
746
+ "DOCKER_REGISTRY": "europe-west6-docker.pkg.dev",
747
+ "DOCKER_TLS_CERTDIR": "",
748
+ "KUBERNETES_CPU_LIMIT": "1",
749
+ "KUBERNETES_CPU_REQUEST": "0.5",
750
+ "KUBERNETES_MEMORY_LIMIT": "2Gi",
751
+ "KUBERNETES_MEMORY_REQUEST": "1Gi",
752
+ },
753
+ },
754
+ "api ๐Ÿš€ Deploy | review ": {
755
+ "allow_failure": false,
756
+ "artifacts": {
757
+ "paths": [
758
+ "____envvars.yaml",
759
+ ],
760
+ },
761
+ "environment": {
762
+ "auto_stop_in": "1 week",
763
+ "name": "review/some-commit/api",
764
+ "on_stop": "api ๐Ÿ›‘ Stop โš ๏ธ | review ",
765
+ "url": "https://pan-test-app-review-mr1234-api-unknown-host.example.com",
766
+ },
767
+ "image": "path/to/docker/gcloud:the-version",
768
+ "interruptible": true,
769
+ "needs": [
770
+ {
771
+ "artifacts": false,
772
+ "job": "api ๐Ÿ‘ฎ lint",
773
+ },
774
+ {
775
+ "artifacts": false,
776
+ "job": "api ๐Ÿ”จ app | review ",
777
+ },
778
+ {
779
+ "artifacts": false,
780
+ "job": "api ๐Ÿ”จ docker | review ",
781
+ },
782
+ {
783
+ "artifacts": false,
784
+ "job": "api ๐Ÿงช test",
785
+ },
786
+ {
787
+ "artifacts": true,
788
+ "job": "api ๐Ÿงพ sbom | review ",
789
+ },
790
+ {
791
+ "artifacts": false,
792
+ "job": "api ๐Ÿ›ก audit",
793
+ },
794
+ ],
795
+ "retry": {
796
+ "max": 2,
797
+ "when": [
798
+ "runner_system_failure",
799
+ "stuck_or_timeout_failure",
800
+ ],
801
+ },
802
+ "rules": [
803
+ {
804
+ "when": "on_success",
805
+ },
806
+ ],
807
+ "script": [
808
+ "echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."",
809
+ "echo $CL_review_api_GCLOUD_DEPLOY_credentialsKey > ./____keyfile.json
810
+ ",
811
+ "gcloud auth activate-service-account --key-file="./____keyfile.json"",
812
+ "export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe google-project-id --format="value(projectNumber)")",
813
+ "echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"",
814
+ "echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"",
815
+ "echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"",
816
+ "echo "$ENV_VARS" > ____envvars.yaml",
817
+ "set +e",
818
+ "gcloud beta run jobs create pan-test-app-review-mr1234-api-drop-db --command="/bin/sh,-c,mongosh \\$MONGO_URL --eval 'db.dropDatabase()'" --image=rtsp/mongosh:latest --project=google-project-id --region=europe-west6 --labels=customer-name=pan,component-name=api,app-name=test-app,env-type=review,env-name=review,build-type=node --memory=512Mi --task-timeout=10m",
819
+ "set -e",
820
+ "gcloud beta run jobs update pan-test-app-review-mr1234-api-drop-db --command="/bin/sh,-c,mongosh \\$MONGO_URL --eval 'db.dropDatabase()'" --image=rtsp/mongosh:latest --project=google-project-id --region=europe-west6 --labels=customer-name=pan,component-name=api,app-name=test-app,env-type=review,env-name=review,build-type=node --memory=512Mi --task-timeout=10m --env-vars-file=____envvars.yaml",
821
+ "gcloud run deploy pan-test-app-review-mr1234-api --command="yarn,start" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/api/mr1234:$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --labels=customer-name=pan,component-name=api,app-name=test-app,env-type=review,env-name=review,build-type=node --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost",
822
+ "echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"",
823
+ "echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"",
824
+ "gcloud run revisions list --project=google-project-id --region=europe-west6 --service=pan-test-app-review-mr1234-api --limit=unlimited --sort-by=metadata.creationTimestamp --format="value(name)" --filter='(status.conditions.status=False OR status.conditions.status=Unknown)' | while read -r revisionname; do gcloud run revisions delete --project=google-project-id --region=europe-west6 --quiet $revisionname ; done",
825
+ "gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/api/mr1234 --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/api/mr1234@$version --quiet --delete-tags; done",
826
+ "gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api@$version --quiet --delete-tags; done",
827
+ "set +e",
828
+ "gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/api --quiet --delete-tags",
829
+ "set -e",
830
+ "echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"",
831
+ "echo Uploading SBOM to Dependency Track",
832
+ "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/api" "https://pan-test-app-review-mr1234-api-unknown-host.example.com" "__sbom.json" vex.json || true",
833
+ ],
834
+ "services": [
835
+ {
836
+ "command": [
837
+ "--tls=false",
838
+ ],
839
+ "name": "docker:24.0.6-dind",
840
+ },
841
+ ],
842
+ "stage": "deploy review",
843
+ "variables": {
844
+ "APP_DIR": "api",
845
+ "BUILD_INFO_BUILD_TIME": "01-01-2023 12:13:14",
846
+ "BUILD_INFO_CURRENT_VERSION": "3.2.1",
847
+ "BUILD_INFO_ID": "some-id",
848
+ "CLOUDSDK_CORE_DISABLE_PROMPTS": "1",
849
+ "CLOUD_RUN_JOB_TRIGGER_URL_drop_db": "https://europe-west6-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/google-project-id/jobs/pan-test-app-review-mr1234-api-drop-db:run",
850
+ "DOCKER_BUILDKIT": "1",
851
+ "DOCKER_CACHE_IMAGE": "europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api",
852
+ "DOCKER_DRIVER": "overlay2",
853
+ "DOCKER_HOST": "tcp://0.0.0.0:2375",
854
+ "DOCKER_IMAGE": "europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/api/mr1234",
855
+ "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
856
+ "DOCKER_REGISTRY": "europe-west6-docker.pkg.dev",
857
+ "DOCKER_TLS_CERTDIR": "",
858
+ "ENV_SHORT": "review",
859
+ "ENV_TYPE": "review",
860
+ "ENV_VARS": "ENV_SHORT: 'review'
861
+ APP_DIR: 'api'
862
+ ENV_TYPE: 'review'
863
+ BUILD_INFO_ID: 'some-id'
864
+ BUILD_INFO_BUILD_TIME: '01-01-2023 12:13:14'
865
+ BUILD_INFO_CURRENT_VERSION: '3.2.1'
866
+ HOST: 'pan-test-app-review-mr1234-api-unknown-host.example.com'
867
+ ROOT_URL: 'https://pan-test-app-review-mr1234-api-unknown-host.example.com'
868
+ HOST_CANONICAL: 'pan-test-app-review-mr1234-api-unknown-host.example.com'
869
+ CLOUD_RUN_JOB_TRIGGER_URL_drop_db: 'https://europe-west6-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/google-project-id/jobs/pan-test-app-review-mr1234-api-drop-db:run'
870
+ GCLOUD_RUN_canonicalHostSuffix: '$CL_review_api_GCLOUD_RUN_canonicalHostSuffix'
871
+ _ALL_ENV_VAR_KEYS: '["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_CANONICAL","CLOUD_RUN_JOB_TRIGGER_URL_drop_db","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]'
872
+ ",
873
+ "GCLOUD_DEPLOY_credentialsKey": "$CL_review_api_GCLOUD_DEPLOY_credentialsKey",
874
+ "GCLOUD_RUN_canonicalHostSuffix": "$CL_review_api_GCLOUD_RUN_canonicalHostSuffix",
875
+ "HOST": "pan-test-app-review-mr1234-api-unknown-host.example.com",
876
+ "HOST_CANONICAL": "pan-test-app-review-mr1234-api-unknown-host.example.com",
877
+ "KUBERNETES_CPU_LIMIT": "1",
878
+ "KUBERNETES_CPU_REQUEST": "0.5",
879
+ "KUBERNETES_MEMORY_LIMIT": "400Mi",
880
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
881
+ "ROOT_URL": "https://pan-test-app-review-mr1234-api-unknown-host.example.com",
882
+ "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_CANONICAL","CLOUD_RUN_JOB_TRIGGER_URL_drop_db","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]",
883
+ },
884
+ },
885
+ "api ๐Ÿ›‘ Stop โš ๏ธ | review ": {
886
+ "environment": {
887
+ "action": "stop",
888
+ "name": "review/some-commit/api",
889
+ "url": "https://pan-test-app-review-mr1234-api-unknown-host.example.com",
890
+ },
891
+ "image": "path/to/docker/gcloud:the-version",
892
+ "interruptible": true,
893
+ "needs": [],
894
+ "retry": {
895
+ "max": 2,
896
+ "when": [
897
+ "runner_system_failure",
898
+ "stuck_or_timeout_failure",
899
+ ],
900
+ },
901
+ "rules": [
902
+ {
903
+ "allow_failure": true,
904
+ "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/",
905
+ "when": "on_success",
906
+ },
907
+ {
908
+ "allow_failure": true,
909
+ "when": "manual",
910
+ },
911
+ ],
912
+ "script": [
913
+ "set +e",
914
+ "echo $CL_review_api_GCLOUD_DEPLOY_credentialsKey > ./____keyfile.json
915
+ ",
916
+ "gcloud auth activate-service-account --key-file="./____keyfile.json"",
917
+ "gcloud run services delete pan-test-app-review-mr1234-api --project=google-project-id --region=europe-west6",
918
+ "gcloud beta run jobs execute pan-test-app-review-mr1234-api-drop-db --project=google-project-id --region=europe-west6 --wait",
919
+ "gcloud beta run jobs executions list --project=google-project-id --region=europe-west6 --job pan-test-app-review-mr1234-api-drop-db --format="value(name)" | xargs -I {} gcloud beta run jobs executions delete {} --quiet --project=google-project-id --region=europe-west6",
920
+ "gcloud beta run jobs delete pan-test-app-review-mr1234-api-drop-db --project=google-project-id --region=europe-west6",
921
+ "gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/api/mr1234 --quiet --delete-tags",
922
+ "gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api@$version --quiet --delete-tags; done",
923
+ "set +e",
924
+ "gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/api --quiet --delete-tags",
925
+ "set -e",
926
+ "echo Disabling component in Dependency Track",
927
+ "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/api" "https://pan-test-app-review-mr1234-api-unknown-host.example.com" || true",
928
+ "set -e",
929
+ ],
930
+ "stage": "stop review",
931
+ "variables": {
932
+ "CLOUDSDK_CORE_DISABLE_PROMPTS": "1",
933
+ "GIT_STRATEGY": "none",
934
+ "KUBERNETES_CPU_LIMIT": "1",
935
+ "KUBERNETES_CPU_REQUEST": "0.5",
936
+ "KUBERNETES_MEMORY_LIMIT": "400Mi",
937
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
938
+ },
939
+ },
940
+ "api ๐Ÿ›ก audit": {
941
+ "allow_failure": true,
942
+ "image": "path/to/docker/jobs-default:the-version",
943
+ "interruptible": true,
944
+ "needs": [],
945
+ "retry": {
946
+ "max": 2,
947
+ "when": [
948
+ "runner_system_failure",
949
+ "stuck_or_timeout_failure",
950
+ ],
951
+ },
952
+ "script": [
953
+ "cd api",
954
+ "yarn npm audit --environment production",
955
+ ],
956
+ "stage": "test",
957
+ "variables": {
958
+ "APP_PATH": "api",
959
+ "KUBERNETES_CPU_LIMIT": "2",
960
+ "KUBERNETES_CPU_REQUEST": "0.5",
961
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
962
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
963
+ },
964
+ },
965
+ "api ๐Ÿงช test": {
966
+ "cache": [
967
+ {
968
+ "key": "api-yarn",
969
+ "paths": [
970
+ "api/.yarn",
971
+ ],
972
+ "policy": "pull-push",
973
+ },
974
+ {
975
+ "key": "api-node-modules",
976
+ "paths": [
977
+ "api/node_modules",
978
+ ],
979
+ "policy": "pull-push",
980
+ },
981
+ ],
982
+ "image": "path/to/docker/jobs-testing-chrome:the-version",
983
+ "interruptible": true,
984
+ "needs": [],
985
+ "retry": {
986
+ "max": 2,
987
+ "when": [
988
+ "runner_system_failure",
989
+ "stuck_or_timeout_failure",
990
+ ],
991
+ },
992
+ "script": [
993
+ "cd api",
994
+ "echo -e "\\e[0Ksection_start:$(date +%s):yarn prepare[collapsed=true]\\r\\e[0KNode and yarn install"",
995
+ "echo -e "\\e[0Ksection_start:$(date +%s):node install[collapsed=true]\\r\\e[0KEnsure node version"",
996
+ "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
997
+ "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
998
+ "echo -e "\\e[0Ksection_end:$(date +%s):node install\\r\\e[0K"",
999
+ "yarn install --immutable",
1000
+ "echo -e "\\e[0Ksection_end:$(date +%s):yarn prepare\\r\\e[0K"",
1001
+ "yarn test",
1002
+ ],
1003
+ "stage": "test",
1004
+ "variables": {
1005
+ "APP_PATH": "api",
1006
+ "KUBERNETES_CPU_LIMIT": "2",
1007
+ "KUBERNETES_CPU_REQUEST": "0.5",
1008
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
1009
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
1010
+ },
1011
+ },
1012
+ "api ๐Ÿงพ sbom | review ": {
1013
+ "allow_failure": true,
1014
+ "artifacts": {
1015
+ "paths": [
1016
+ "__sbom.json",
1017
+ ],
1018
+ },
1019
+ "image": "aquasec/trivy:0.38.3",
1020
+ "interruptible": true,
1021
+ "needs": [],
1022
+ "retry": {
1023
+ "max": 2,
1024
+ "when": [
1025
+ "runner_system_failure",
1026
+ "stuck_or_timeout_failure",
1027
+ ],
1028
+ },
1029
+ "script": [
1030
+ "trivy fs --quiet --format cyclonedx --output "__sbom.json" api",
1031
+ ],
1032
+ "stage": "build",
1033
+ "variables": {},
1034
+ },
1035
+ },
1036
+ "stages": [
1037
+ "setup",
1038
+ "setup dev",
1039
+ "setup review",
1040
+ "setup stage",
1041
+ "setup prod",
1042
+ "setup local",
1043
+ "test",
1044
+ "test dev",
1045
+ "test review",
1046
+ "test stage",
1047
+ "test prod",
1048
+ "test local",
1049
+ "build",
1050
+ "build dev",
1051
+ "build review",
1052
+ "build stage",
1053
+ "build prod",
1054
+ "build local",
1055
+ "deploy",
1056
+ "deploy dev",
1057
+ "deploy review",
1058
+ "deploy stage",
1059
+ "deploy prod",
1060
+ "deploy local",
1061
+ "verify",
1062
+ "verify dev",
1063
+ "verify review",
1064
+ "verify stage",
1065
+ "verify prod",
1066
+ "verify local",
1067
+ "rollback",
1068
+ "rollback dev",
1069
+ "rollback review",
1070
+ "rollback stage",
1071
+ "rollback prod",
1072
+ "rollback local",
1073
+ "stop",
1074
+ "stop dev",
1075
+ "stop review",
1076
+ "stop stage",
1077
+ "stop prod",
1078
+ "stop local",
1079
+ ],
1080
+ "variables": {
1081
+ "FF_USE_FASTZIP": "true",
1082
+ "GIT_DEPTH": 1,
1083
+ },
1084
+ "workflow": {
1085
+ "rules": [
1086
+ {
1087
+ "if": "$CI_COMMIT_TAG",
1088
+ },
1089
+ {
1090
+ "if": "$CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/",
1091
+ "when": "never",
1092
+ },
1093
+ {
1094
+ "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+.([0-9]+|x).x$/",
1095
+ },
1096
+ {
1097
+ "if": "$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH",
1098
+ },
1099
+ {
1100
+ "if": "$CI_MERGE_REQUEST_ID",
1101
+ },
1102
+ ],
1103
+ },
1104
+ },
1105
+ "taggedRelease": {
1106
+ "image": "path/to/docker/jobs-default:the-version",
1107
+ "jobs": {
1108
+ "api ๐Ÿ”จ app | prod ": {
1109
+ "artifacts": {
1110
+ "expire_in": "1 day",
1111
+ "paths": [
1112
+ "api/__build_info.json",
1113
+ "api/dist",
1114
+ "api/.next",
1115
+ ],
1116
+ "reports": {
1117
+ "junit": undefined,
1118
+ },
1119
+ "when": "always",
1120
+ },
1121
+ "cache": [
1122
+ {
1123
+ "key": "api-yarn",
1124
+ "paths": [
1125
+ "api/.yarn",
1126
+ ],
1127
+ "policy": "pull-push",
1128
+ },
1129
+ {
1130
+ "key": "api-node-modules",
1131
+ "paths": [
1132
+ "api/node_modules",
1133
+ ],
1134
+ "policy": "pull-push",
1135
+ },
1136
+ {
1137
+ "key": "api-next-cache",
1138
+ "paths": [
1139
+ "api/.next/cache/",
1140
+ ],
1141
+ "policy": "pull-push",
1142
+ },
1143
+ ],
1144
+ "image": "path/to/docker/jobs-default:the-version",
1145
+ "interruptible": true,
1146
+ "needs": [],
1147
+ "retry": {
1148
+ "max": 2,
1149
+ "when": [
1150
+ "runner_system_failure",
1151
+ "stuck_or_timeout_failure",
1152
+ ],
1153
+ },
1154
+ "script": [
1155
+ "echo '{"id":"some-id","time":"01-01-2023 12:13:14"}' > api/__build_info.json",
1156
+ "echo -e "\\e[0Ksection_start:$(date +%s):node install[collapsed=true]\\r\\e[0KEnsure node version"",
1157
+ "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
1158
+ "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
1159
+ "echo -e "\\e[0Ksection_end:$(date +%s):node install\\r\\e[0K"",
1160
+ "cd api",
1161
+ "echo -e "\\e[0Ksection_start:$(date +%s):yarn prepare[collapsed=true]\\r\\e[0KNode and yarn install"",
1162
+ "echo -e "\\e[0Ksection_start:$(date +%s):node install[collapsed=true]\\r\\e[0KEnsure node version"",
1163
+ "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
1164
+ "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
1165
+ "echo -e "\\e[0Ksection_end:$(date +%s):node install\\r\\e[0K"",
1166
+ "yarn install --immutable",
1167
+ "echo -e "\\e[0Ksection_end:$(date +%s):yarn prepare\\r\\e[0K"",
1168
+ "yarn build",
1169
+ ],
1170
+ "stage": "build",
1171
+ "variables": {
1172
+ "APP_DIR": "api",
1173
+ "BUILD_INFO_BUILD_TIME": "01-01-2023 12:13:14",
1174
+ "BUILD_INFO_CURRENT_VERSION": "3.2.1",
1175
+ "BUILD_INFO_ID": "some-id",
1176
+ "ENV_SHORT": "prod",
1177
+ "ENV_TYPE": "prod",
1178
+ "GCLOUD_DEPLOY_credentialsKey": "$CL_prod_api_GCLOUD_DEPLOY_credentialsKey",
1179
+ "GCLOUD_RUN_canonicalHostSuffix": "$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix",
1180
+ "HOST": "pan-test-app-prod-api-unknown-host.example.com",
1181
+ "HOST_CANONICAL": "pan-test-app-prod-api-unknown-host.example.com",
1182
+ "KUBERNETES_CPU_LIMIT": "2",
1183
+ "KUBERNETES_CPU_REQUEST": "0.5",
1184
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
1185
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
1186
+ "ROOT_URL": "https://pan-test-app-prod-api-unknown-host.example.com",
1187
+ "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_CANONICAL","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]",
1188
+ },
1189
+ },
1190
+ "api ๐Ÿ”จ app | stage ": {
1191
+ "artifacts": {
1192
+ "expire_in": "1 day",
1193
+ "paths": [
1194
+ "api/__build_info.json",
1195
+ "api/dist",
1196
+ "api/.next",
1197
+ ],
1198
+ "reports": {
1199
+ "junit": undefined,
1200
+ },
1201
+ "when": "always",
1202
+ },
1203
+ "cache": [
1204
+ {
1205
+ "key": "api-yarn",
1206
+ "paths": [
1207
+ "api/.yarn",
1208
+ ],
1209
+ "policy": "pull-push",
1210
+ },
1211
+ {
1212
+ "key": "api-node-modules",
1213
+ "paths": [
1214
+ "api/node_modules",
1215
+ ],
1216
+ "policy": "pull-push",
1217
+ },
1218
+ {
1219
+ "key": "api-next-cache",
1220
+ "paths": [
1221
+ "api/.next/cache/",
1222
+ ],
1223
+ "policy": "pull-push",
1224
+ },
1225
+ ],
1226
+ "image": "path/to/docker/jobs-default:the-version",
1227
+ "interruptible": true,
1228
+ "needs": [],
1229
+ "retry": {
1230
+ "max": 2,
1231
+ "when": [
1232
+ "runner_system_failure",
1233
+ "stuck_or_timeout_failure",
1234
+ ],
1235
+ },
1236
+ "script": [
1237
+ "echo '{"id":"some-id","time":"01-01-2023 12:13:14"}' > api/__build_info.json",
1238
+ "echo -e "\\e[0Ksection_start:$(date +%s):node install[collapsed=true]\\r\\e[0KEnsure node version"",
1239
+ "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
1240
+ "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
1241
+ "echo -e "\\e[0Ksection_end:$(date +%s):node install\\r\\e[0K"",
1242
+ "cd api",
1243
+ "echo -e "\\e[0Ksection_start:$(date +%s):yarn prepare[collapsed=true]\\r\\e[0KNode and yarn install"",
1244
+ "echo -e "\\e[0Ksection_start:$(date +%s):node install[collapsed=true]\\r\\e[0KEnsure node version"",
1245
+ "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
1246
+ "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
1247
+ "echo -e "\\e[0Ksection_end:$(date +%s):node install\\r\\e[0K"",
1248
+ "yarn install --immutable",
1249
+ "echo -e "\\e[0Ksection_end:$(date +%s):yarn prepare\\r\\e[0K"",
1250
+ "yarn build",
1251
+ ],
1252
+ "stage": "build",
1253
+ "variables": {
1254
+ "APP_DIR": "api",
1255
+ "BUILD_INFO_BUILD_TIME": "01-01-2023 12:13:14",
1256
+ "BUILD_INFO_CURRENT_VERSION": "3.2.1",
1257
+ "BUILD_INFO_ID": "some-id",
1258
+ "ENV_SHORT": "stage",
1259
+ "ENV_TYPE": "stage",
1260
+ "GCLOUD_DEPLOY_credentialsKey": "$CL_stage_api_GCLOUD_DEPLOY_credentialsKey",
1261
+ "GCLOUD_RUN_canonicalHostSuffix": "$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix",
1262
+ "HOST": "pan-test-app-stage-api-unknown-host.example.com",
1263
+ "HOST_CANONICAL": "pan-test-app-stage-api-unknown-host.example.com",
1264
+ "KUBERNETES_CPU_LIMIT": "2",
1265
+ "KUBERNETES_CPU_REQUEST": "0.5",
1266
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
1267
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
1268
+ "ROOT_URL": "https://pan-test-app-stage-api-unknown-host.example.com",
1269
+ "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_CANONICAL","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]",
1270
+ },
1271
+ },
1272
+ "api ๐Ÿ”จ docker | prod ": {
1273
+ "cache": [
1274
+ {
1275
+ "key": "api-yarn",
1276
+ "paths": [
1277
+ "api/.yarn",
1278
+ ],
1279
+ "policy": "pull",
1280
+ },
1281
+ ],
1282
+ "image": "path/to/docker/docker-build:the-version",
1283
+ "interruptible": true,
1284
+ "needs": [
1285
+ "api ๐Ÿ”จ app | prod ",
1286
+ ],
1287
+ "retry": {
1288
+ "max": 2,
1289
+ "when": [
1290
+ "runner_system_failure",
1291
+ "stuck_or_timeout_failure",
1292
+ ],
1293
+ },
1294
+ "script": [
1295
+ "ensureNodeDockerfile",
1296
+ "echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"",
1297
+ "echo $CL_prod_api_GCLOUD_DEPLOY_credentialsKey > ./____keyfile.json
1298
+ ",
1299
+ "gcloud auth activate-service-account --key-file="./____keyfile.json"",
1300
+ "gcloud auth configure-docker europe-west6-docker.pkg.dev",
1301
+ "echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"",
1302
+ "echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"",
1303
+ "docker build --network host --cache-from $DOCKER_CACHE_IMAGE --tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG -f $APP_DIR/Dockerfile . --build-arg BUILDKIT_INLINE_CACHE=1",
1304
+ "echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"",
1305
+ "echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"",
1306
+ "docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
1307
+ "docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE",
1308
+ "docker push $DOCKER_CACHE_IMAGE",
1309
+ "echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"",
1310
+ ],
1311
+ "services": [
1312
+ {
1313
+ "command": [
1314
+ "--tls=false",
1315
+ ],
1316
+ "name": "docker:24.0.6-dind",
1317
+ },
1318
+ ],
1319
+ "stage": "build",
1320
+ "variables": {
1321
+ "APP_DIR": "api",
1322
+ "DOCKERFILE_ADDITIONS": undefined,
1323
+ "DOCKERFILE_ADDITIONS_END": undefined,
1324
+ "DOCKER_BUILDKIT": "1",
1325
+ "DOCKER_CACHE_IMAGE": "europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api",
1326
+ "DOCKER_COPY_AND_INSTALL_APP": "COPY --chown=node:node $APP_DIR .
1327
+ RUN yarn plugin import workspace-tools
1328
+ RUN yarn workspaces focus --production && yarn rebuild",
1329
+ "DOCKER_COPY_WORKSPACE_FILES": "COPY --chown=node:node api/package.json /app/api/package.json
1330
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
1331
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
1332
+ COPY --chown=node:node .yarn /app/.yarn",
1333
+ "DOCKER_DIR": ".",
1334
+ "DOCKER_DRIVER": "overlay2",
1335
+ "DOCKER_HOST": "tcp://0.0.0.0:2375",
1336
+ "DOCKER_IMAGE": "europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/prod/api",
1337
+ "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
1338
+ "DOCKER_REGISTRY": "europe-west6-docker.pkg.dev",
1339
+ "DOCKER_TLS_CERTDIR": "",
1340
+ "KUBERNETES_CPU_LIMIT": "1",
1341
+ "KUBERNETES_CPU_REQUEST": "0.5",
1342
+ "KUBERNETES_MEMORY_LIMIT": "2Gi",
1343
+ "KUBERNETES_MEMORY_REQUEST": "1Gi",
1344
+ },
1345
+ },
1346
+ "api ๐Ÿ”จ docker | stage ": {
1347
+ "cache": [
1348
+ {
1349
+ "key": "api-yarn",
1350
+ "paths": [
1351
+ "api/.yarn",
1352
+ ],
1353
+ "policy": "pull",
1354
+ },
1355
+ ],
1356
+ "image": "path/to/docker/docker-build:the-version",
1357
+ "interruptible": true,
1358
+ "needs": [
1359
+ "api ๐Ÿ”จ app | stage ",
1360
+ ],
1361
+ "retry": {
1362
+ "max": 2,
1363
+ "when": [
1364
+ "runner_system_failure",
1365
+ "stuck_or_timeout_failure",
1366
+ ],
1367
+ },
1368
+ "script": [
1369
+ "ensureNodeDockerfile",
1370
+ "echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"",
1371
+ "echo $CL_stage_api_GCLOUD_DEPLOY_credentialsKey > ./____keyfile.json
1372
+ ",
1373
+ "gcloud auth activate-service-account --key-file="./____keyfile.json"",
1374
+ "gcloud auth configure-docker europe-west6-docker.pkg.dev",
1375
+ "echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"",
1376
+ "echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"",
1377
+ "docker build --network host --cache-from $DOCKER_CACHE_IMAGE --tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG -f $APP_DIR/Dockerfile . --build-arg BUILDKIT_INLINE_CACHE=1",
1378
+ "echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"",
1379
+ "echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"",
1380
+ "docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
1381
+ "docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE",
1382
+ "docker push $DOCKER_CACHE_IMAGE",
1383
+ "echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"",
1384
+ ],
1385
+ "services": [
1386
+ {
1387
+ "command": [
1388
+ "--tls=false",
1389
+ ],
1390
+ "name": "docker:24.0.6-dind",
1391
+ },
1392
+ ],
1393
+ "stage": "build",
1394
+ "variables": {
1395
+ "APP_DIR": "api",
1396
+ "DOCKERFILE_ADDITIONS": undefined,
1397
+ "DOCKERFILE_ADDITIONS_END": undefined,
1398
+ "DOCKER_BUILDKIT": "1",
1399
+ "DOCKER_CACHE_IMAGE": "europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api",
1400
+ "DOCKER_COPY_AND_INSTALL_APP": "COPY --chown=node:node $APP_DIR .
1401
+ RUN yarn plugin import workspace-tools
1402
+ RUN yarn workspaces focus --production && yarn rebuild",
1403
+ "DOCKER_COPY_WORKSPACE_FILES": "COPY --chown=node:node api/package.json /app/api/package.json
1404
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
1405
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
1406
+ COPY --chown=node:node .yarn /app/.yarn",
1407
+ "DOCKER_DIR": ".",
1408
+ "DOCKER_DRIVER": "overlay2",
1409
+ "DOCKER_HOST": "tcp://0.0.0.0:2375",
1410
+ "DOCKER_IMAGE": "europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/stage/api",
1411
+ "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
1412
+ "DOCKER_REGISTRY": "europe-west6-docker.pkg.dev",
1413
+ "DOCKER_TLS_CERTDIR": "",
1414
+ "KUBERNETES_CPU_LIMIT": "1",
1415
+ "KUBERNETES_CPU_REQUEST": "0.5",
1416
+ "KUBERNETES_MEMORY_LIMIT": "2Gi",
1417
+ "KUBERNETES_MEMORY_REQUEST": "1Gi",
1418
+ },
1419
+ },
1420
+ "api ๐Ÿš€ Deploy | prod ": {
1421
+ "allow_failure": true,
1422
+ "artifacts": {
1423
+ "paths": [
1424
+ "____envvars.yaml",
1425
+ ],
1426
+ },
1427
+ "environment": {
1428
+ "auto_stop_in": undefined,
1429
+ "name": "prod/api",
1430
+ "on_stop": "api ๐Ÿ›‘ Stop โš ๏ธ | prod ",
1431
+ "url": "https://pan-test-app-prod-api-unknown-host.example.com",
1432
+ },
1433
+ "image": "path/to/docker/gcloud:the-version",
1434
+ "interruptible": true,
1435
+ "needs": [
1436
+ {
1437
+ "artifacts": false,
1438
+ "job": "api ๐Ÿ”จ app | prod ",
1439
+ },
1440
+ {
1441
+ "artifacts": false,
1442
+ "job": "api ๐Ÿ”จ docker | prod ",
1443
+ },
1444
+ {
1445
+ "artifacts": true,
1446
+ "job": "api ๐Ÿงพ sbom | prod ",
1447
+ },
1448
+ ],
1449
+ "retry": {
1450
+ "max": 2,
1451
+ "when": [
1452
+ "runner_system_failure",
1453
+ "stuck_or_timeout_failure",
1454
+ ],
1455
+ },
1456
+ "rules": [
1457
+ {
1458
+ "when": "manual",
1459
+ },
1460
+ ],
1461
+ "script": [
1462
+ "echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."",
1463
+ "echo $CL_prod_api_GCLOUD_DEPLOY_credentialsKey > ./____keyfile.json
1464
+ ",
1465
+ "gcloud auth activate-service-account --key-file="./____keyfile.json"",
1466
+ "export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe google-project-id --format="value(projectNumber)")",
1467
+ "echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"",
1468
+ "echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"",
1469
+ "echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"",
1470
+ "echo "$ENV_VARS" > ____envvars.yaml",
1471
+ "gcloud run deploy pan-test-app-prod-api --command="yarn,start" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/prod/api:$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --labels=customer-name=pan,component-name=api,app-name=test-app,env-type=prod,env-name=prod,build-type=node --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost",
1472
+ "echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"",
1473
+ "echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"",
1474
+ "gcloud run revisions list --project=google-project-id --region=europe-west6 --service=pan-test-app-prod-api --limit=unlimited --sort-by=metadata.creationTimestamp --format="value(name)" --filter='(status.conditions.status=False OR status.conditions.status=Unknown)' | tail -n +6 | while read -r revisionname; do gcloud run revisions delete --project=google-project-id --region=europe-west6 --quiet $revisionname ; done",
1475
+ "gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/prod/api --sort-by=~CREATE_TIME --format="value(version)" | tail -n +7 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/prod/api@$version --quiet --delete-tags; done",
1476
+ "gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api@$version --quiet --delete-tags; done",
1477
+ "echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"",
1478
+ "echo Uploading SBOM to Dependency Track",
1479
+ "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/api" "https://pan-test-app-prod-api-unknown-host.example.com" "__sbom.json" vex.json || true",
1480
+ ],
1481
+ "services": [
1482
+ {
1483
+ "command": [
1484
+ "--tls=false",
1485
+ ],
1486
+ "name": "docker:24.0.6-dind",
1487
+ },
1488
+ ],
1489
+ "stage": "deploy prod",
1490
+ "variables": {
1491
+ "APP_DIR": "api",
1492
+ "BUILD_INFO_BUILD_TIME": "01-01-2023 12:13:14",
1493
+ "BUILD_INFO_CURRENT_VERSION": "3.2.1",
1494
+ "BUILD_INFO_ID": "some-id",
1495
+ "CLOUDSDK_CORE_DISABLE_PROMPTS": "1",
1496
+ "DOCKER_BUILDKIT": "1",
1497
+ "DOCKER_CACHE_IMAGE": "europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api",
1498
+ "DOCKER_DRIVER": "overlay2",
1499
+ "DOCKER_HOST": "tcp://0.0.0.0:2375",
1500
+ "DOCKER_IMAGE": "europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/prod/api",
1501
+ "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
1502
+ "DOCKER_REGISTRY": "europe-west6-docker.pkg.dev",
1503
+ "DOCKER_TLS_CERTDIR": "",
1504
+ "ENV_SHORT": "prod",
1505
+ "ENV_TYPE": "prod",
1506
+ "ENV_VARS": "ENV_SHORT: 'prod'
1507
+ APP_DIR: 'api'
1508
+ ENV_TYPE: 'prod'
1509
+ BUILD_INFO_ID: 'some-id'
1510
+ BUILD_INFO_BUILD_TIME: '01-01-2023 12:13:14'
1511
+ BUILD_INFO_CURRENT_VERSION: '3.2.1'
1512
+ HOST: 'pan-test-app-prod-api-unknown-host.example.com'
1513
+ ROOT_URL: 'https://pan-test-app-prod-api-unknown-host.example.com'
1514
+ HOST_CANONICAL: 'pan-test-app-prod-api-unknown-host.example.com'
1515
+ GCLOUD_RUN_canonicalHostSuffix: '$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix'
1516
+ _ALL_ENV_VAR_KEYS: '["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_CANONICAL","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]'
1517
+ ",
1518
+ "GCLOUD_DEPLOY_credentialsKey": "$CL_prod_api_GCLOUD_DEPLOY_credentialsKey",
1519
+ "GCLOUD_RUN_canonicalHostSuffix": "$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix",
1520
+ "HOST": "pan-test-app-prod-api-unknown-host.example.com",
1521
+ "HOST_CANONICAL": "pan-test-app-prod-api-unknown-host.example.com",
1522
+ "KUBERNETES_CPU_LIMIT": "1",
1523
+ "KUBERNETES_CPU_REQUEST": "0.5",
1524
+ "KUBERNETES_MEMORY_LIMIT": "400Mi",
1525
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
1526
+ "ROOT_URL": "https://pan-test-app-prod-api-unknown-host.example.com",
1527
+ "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_CANONICAL","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]",
1528
+ },
1529
+ },
1530
+ "api ๐Ÿš€ Deploy | stage ": {
1531
+ "allow_failure": false,
1532
+ "artifacts": {
1533
+ "paths": [
1534
+ "____envvars.yaml",
1535
+ ],
1536
+ },
1537
+ "environment": {
1538
+ "auto_stop_in": undefined,
1539
+ "name": "stage/api",
1540
+ "on_stop": "api ๐Ÿ›‘ Stop โš ๏ธ | stage ",
1541
+ "url": "https://pan-test-app-stage-api-unknown-host.example.com",
1542
+ },
1543
+ "image": "path/to/docker/gcloud:the-version",
1544
+ "interruptible": true,
1545
+ "needs": [
1546
+ {
1547
+ "artifacts": false,
1548
+ "job": "api ๐Ÿ”จ app | stage ",
1549
+ },
1550
+ {
1551
+ "artifacts": false,
1552
+ "job": "api ๐Ÿ”จ docker | stage ",
1553
+ },
1554
+ {
1555
+ "artifacts": true,
1556
+ "job": "api ๐Ÿงพ sbom | stage ",
1557
+ },
1558
+ ],
1559
+ "retry": {
1560
+ "max": 2,
1561
+ "when": [
1562
+ "runner_system_failure",
1563
+ "stuck_or_timeout_failure",
1564
+ ],
1565
+ },
1566
+ "rules": [
1567
+ {
1568
+ "when": "on_success",
1569
+ },
1570
+ ],
1571
+ "script": [
1572
+ "echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."",
1573
+ "echo $CL_stage_api_GCLOUD_DEPLOY_credentialsKey > ./____keyfile.json
1574
+ ",
1575
+ "gcloud auth activate-service-account --key-file="./____keyfile.json"",
1576
+ "export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe google-project-id --format="value(projectNumber)")",
1577
+ "echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"",
1578
+ "echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"",
1579
+ "echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"",
1580
+ "echo "$ENV_VARS" > ____envvars.yaml",
1581
+ "gcloud run deploy pan-test-app-stage-api --command="yarn,start" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/stage/api:$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --labels=customer-name=pan,component-name=api,app-name=test-app,env-type=stage,env-name=stage,build-type=node --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost",
1582
+ "echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"",
1583
+ "echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"",
1584
+ "gcloud run revisions list --project=google-project-id --region=europe-west6 --service=pan-test-app-stage-api --limit=unlimited --sort-by=metadata.creationTimestamp --format="value(name)" --filter='(status.conditions.status=False OR status.conditions.status=Unknown)' | while read -r revisionname; do gcloud run revisions delete --project=google-project-id --region=europe-west6 --quiet $revisionname ; done",
1585
+ "gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/stage/api --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/stage/api@$version --quiet --delete-tags; done",
1586
+ "gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api@$version --quiet --delete-tags; done",
1587
+ "echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"",
1588
+ "echo Uploading SBOM to Dependency Track",
1589
+ "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/api" "https://pan-test-app-stage-api-unknown-host.example.com" "__sbom.json" vex.json || true",
1590
+ ],
1591
+ "services": [
1592
+ {
1593
+ "command": [
1594
+ "--tls=false",
1595
+ ],
1596
+ "name": "docker:24.0.6-dind",
1597
+ },
1598
+ ],
1599
+ "stage": "deploy stage",
1600
+ "variables": {
1601
+ "APP_DIR": "api",
1602
+ "BUILD_INFO_BUILD_TIME": "01-01-2023 12:13:14",
1603
+ "BUILD_INFO_CURRENT_VERSION": "3.2.1",
1604
+ "BUILD_INFO_ID": "some-id",
1605
+ "CLOUDSDK_CORE_DISABLE_PROMPTS": "1",
1606
+ "DOCKER_BUILDKIT": "1",
1607
+ "DOCKER_CACHE_IMAGE": "europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api",
1608
+ "DOCKER_DRIVER": "overlay2",
1609
+ "DOCKER_HOST": "tcp://0.0.0.0:2375",
1610
+ "DOCKER_IMAGE": "europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/stage/api",
1611
+ "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
1612
+ "DOCKER_REGISTRY": "europe-west6-docker.pkg.dev",
1613
+ "DOCKER_TLS_CERTDIR": "",
1614
+ "ENV_SHORT": "stage",
1615
+ "ENV_TYPE": "stage",
1616
+ "ENV_VARS": "ENV_SHORT: 'stage'
1617
+ APP_DIR: 'api'
1618
+ ENV_TYPE: 'stage'
1619
+ BUILD_INFO_ID: 'some-id'
1620
+ BUILD_INFO_BUILD_TIME: '01-01-2023 12:13:14'
1621
+ BUILD_INFO_CURRENT_VERSION: '3.2.1'
1622
+ HOST: 'pan-test-app-stage-api-unknown-host.example.com'
1623
+ ROOT_URL: 'https://pan-test-app-stage-api-unknown-host.example.com'
1624
+ HOST_CANONICAL: 'pan-test-app-stage-api-unknown-host.example.com'
1625
+ GCLOUD_RUN_canonicalHostSuffix: '$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix'
1626
+ _ALL_ENV_VAR_KEYS: '["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_CANONICAL","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]'
1627
+ ",
1628
+ "GCLOUD_DEPLOY_credentialsKey": "$CL_stage_api_GCLOUD_DEPLOY_credentialsKey",
1629
+ "GCLOUD_RUN_canonicalHostSuffix": "$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix",
1630
+ "HOST": "pan-test-app-stage-api-unknown-host.example.com",
1631
+ "HOST_CANONICAL": "pan-test-app-stage-api-unknown-host.example.com",
1632
+ "KUBERNETES_CPU_LIMIT": "1",
1633
+ "KUBERNETES_CPU_REQUEST": "0.5",
1634
+ "KUBERNETES_MEMORY_LIMIT": "400Mi",
1635
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
1636
+ "ROOT_URL": "https://pan-test-app-stage-api-unknown-host.example.com",
1637
+ "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_CANONICAL","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]",
1638
+ },
1639
+ },
1640
+ "api ๐Ÿ›‘ Stop โš ๏ธ | prod ": {
1641
+ "environment": {
1642
+ "action": "stop",
1643
+ "name": "prod/api",
1644
+ "url": "https://pan-test-app-prod-api-unknown-host.example.com",
1645
+ },
1646
+ "image": "path/to/docker/gcloud:the-version",
1647
+ "interruptible": true,
1648
+ "needs": [],
1649
+ "retry": {
1650
+ "max": 2,
1651
+ "when": [
1652
+ "runner_system_failure",
1653
+ "stuck_or_timeout_failure",
1654
+ ],
1655
+ },
1656
+ "rules": [
1657
+ {
1658
+ "allow_failure": true,
1659
+ "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/",
1660
+ "when": "on_success",
1661
+ },
1662
+ {
1663
+ "allow_failure": true,
1664
+ "when": "manual",
1665
+ },
1666
+ ],
1667
+ "script": [
1668
+ "set +e",
1669
+ "echo $CL_prod_api_GCLOUD_DEPLOY_credentialsKey > ./____keyfile.json
1670
+ ",
1671
+ "gcloud auth activate-service-account --key-file="./____keyfile.json"",
1672
+ "gcloud run services delete pan-test-app-prod-api --project=google-project-id --region=europe-west6",
1673
+ "gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/prod/api --quiet --delete-tags",
1674
+ "gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api@$version --quiet --delete-tags; done",
1675
+ "echo Disabling component in Dependency Track",
1676
+ "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/api" "https://pan-test-app-prod-api-unknown-host.example.com" || true",
1677
+ "set -e",
1678
+ ],
1679
+ "stage": "stop prod",
1680
+ "variables": {
1681
+ "CLOUDSDK_CORE_DISABLE_PROMPTS": "1",
1682
+ "GIT_STRATEGY": "none",
1683
+ "KUBERNETES_CPU_LIMIT": "1",
1684
+ "KUBERNETES_CPU_REQUEST": "0.5",
1685
+ "KUBERNETES_MEMORY_LIMIT": "400Mi",
1686
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
1687
+ },
1688
+ },
1689
+ "api ๐Ÿ›‘ Stop โš ๏ธ | stage ": {
1690
+ "environment": {
1691
+ "action": "stop",
1692
+ "name": "stage/api",
1693
+ "url": "https://pan-test-app-stage-api-unknown-host.example.com",
1694
+ },
1695
+ "image": "path/to/docker/gcloud:the-version",
1696
+ "interruptible": true,
1697
+ "needs": [],
1698
+ "retry": {
1699
+ "max": 2,
1700
+ "when": [
1701
+ "runner_system_failure",
1702
+ "stuck_or_timeout_failure",
1703
+ ],
1704
+ },
1705
+ "rules": [
1706
+ {
1707
+ "allow_failure": true,
1708
+ "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/",
1709
+ "when": "on_success",
1710
+ },
1711
+ {
1712
+ "allow_failure": true,
1713
+ "when": "manual",
1714
+ },
1715
+ ],
1716
+ "script": [
1717
+ "set +e",
1718
+ "echo $CL_stage_api_GCLOUD_DEPLOY_credentialsKey > ./____keyfile.json
1719
+ ",
1720
+ "gcloud auth activate-service-account --key-file="./____keyfile.json"",
1721
+ "gcloud run services delete pan-test-app-stage-api --project=google-project-id --region=europe-west6",
1722
+ "gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/stage/api --quiet --delete-tags",
1723
+ "gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api@$version --quiet --delete-tags; done",
1724
+ "echo Disabling component in Dependency Track",
1725
+ "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/api" "https://pan-test-app-stage-api-unknown-host.example.com" || true",
1726
+ "set -e",
1727
+ ],
1728
+ "stage": "stop stage",
1729
+ "variables": {
1730
+ "CLOUDSDK_CORE_DISABLE_PROMPTS": "1",
1731
+ "GIT_STRATEGY": "none",
1732
+ "KUBERNETES_CPU_LIMIT": "1",
1733
+ "KUBERNETES_CPU_REQUEST": "0.5",
1734
+ "KUBERNETES_MEMORY_LIMIT": "400Mi",
1735
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
1736
+ },
1737
+ },
1738
+ "api ๐Ÿงพ sbom | prod ": {
1739
+ "allow_failure": true,
1740
+ "artifacts": {
1741
+ "paths": [
1742
+ "__sbom.json",
1743
+ ],
1744
+ },
1745
+ "image": "aquasec/trivy:0.38.3",
1746
+ "interruptible": true,
1747
+ "needs": [],
1748
+ "retry": {
1749
+ "max": 2,
1750
+ "when": [
1751
+ "runner_system_failure",
1752
+ "stuck_or_timeout_failure",
1753
+ ],
1754
+ },
1755
+ "script": [
1756
+ "trivy fs --quiet --format cyclonedx --output "__sbom.json" api",
1757
+ ],
1758
+ "stage": "build",
1759
+ "variables": {},
1760
+ },
1761
+ "api ๐Ÿงพ sbom | stage ": {
1762
+ "allow_failure": true,
1763
+ "artifacts": {
1764
+ "paths": [
1765
+ "__sbom.json",
1766
+ ],
1767
+ },
1768
+ "image": "aquasec/trivy:0.38.3",
1769
+ "interruptible": true,
1770
+ "needs": [],
1771
+ "retry": {
1772
+ "max": 2,
1773
+ "when": [
1774
+ "runner_system_failure",
1775
+ "stuck_or_timeout_failure",
1776
+ ],
1777
+ },
1778
+ "script": [
1779
+ "trivy fs --quiet --format cyclonedx --output "__sbom.json" api",
1780
+ ],
1781
+ "stage": "build",
1782
+ "variables": {},
1783
+ },
1784
+ },
1785
+ "stages": [
1786
+ "setup",
1787
+ "setup dev",
1788
+ "setup review",
1789
+ "setup stage",
1790
+ "setup prod",
1791
+ "setup local",
1792
+ "test",
1793
+ "test dev",
1794
+ "test review",
1795
+ "test stage",
1796
+ "test prod",
1797
+ "test local",
1798
+ "build",
1799
+ "build dev",
1800
+ "build review",
1801
+ "build stage",
1802
+ "build prod",
1803
+ "build local",
1804
+ "deploy",
1805
+ "deploy dev",
1806
+ "deploy review",
1807
+ "deploy stage",
1808
+ "deploy prod",
1809
+ "deploy local",
1810
+ "verify",
1811
+ "verify dev",
1812
+ "verify review",
1813
+ "verify stage",
1814
+ "verify prod",
1815
+ "verify local",
1816
+ "rollback",
1817
+ "rollback dev",
1818
+ "rollback review",
1819
+ "rollback stage",
1820
+ "rollback prod",
1821
+ "rollback local",
1822
+ "stop",
1823
+ "stop dev",
1824
+ "stop review",
1825
+ "stop stage",
1826
+ "stop prod",
1827
+ "stop local",
1828
+ ],
1829
+ "variables": {
1830
+ "FF_USE_FASTZIP": "true",
1831
+ "GIT_DEPTH": 1,
1832
+ },
1833
+ "workflow": {
1834
+ "rules": [
1835
+ {
1836
+ "if": "$CI_COMMIT_TAG",
1837
+ },
1838
+ {
1839
+ "if": "$CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/",
1840
+ "when": "never",
1841
+ },
1842
+ {
1843
+ "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+.([0-9]+|x).x$/",
1844
+ },
1845
+ {
1846
+ "if": "$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH",
1847
+ },
1848
+ {
1849
+ "if": "$CI_MERGE_REQUEST_ID",
1850
+ },
1851
+ ],
1852
+ },
1853
+ },
1854
+ }
1855
+ `;