@catladder/pipeline 1.109.2 โ†’ 1.110.1

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