@catladder/pipeline 1.102.0 โ†’ 1.104.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.
@@ -0,0 +1,2958 @@
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
+ "interruptible": true,
26
+ "needs": [],
27
+ "retry": {
28
+ "max": 2,
29
+ "when": [
30
+ "runner_system_failure",
31
+ "stuck_or_timeout_failure",
32
+ ],
33
+ },
34
+ "script": [
35
+ "cd api",
36
+ "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
37
+ "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
38
+ "yarn install --immutable",
39
+ "yarn lint",
40
+ ],
41
+ "stage": "test",
42
+ "variables": {
43
+ "APP_PATH": "api",
44
+ "KUBERNETES_CPU_LIMIT": "2",
45
+ "KUBERNETES_CPU_REQUEST": "0.5",
46
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
47
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
48
+ },
49
+ },
50
+ "api ๐Ÿ”จ app | dev ": {
51
+ "artifacts": {
52
+ "paths": [
53
+ "api/__build_info.json",
54
+ "api/dist",
55
+ "api/.next",
56
+ ],
57
+ "reports": {
58
+ "junit": undefined,
59
+ },
60
+ },
61
+ "cache": [
62
+ {
63
+ "key": "api-yarn",
64
+ "paths": [
65
+ "api/.yarn",
66
+ ],
67
+ "policy": "pull-push",
68
+ },
69
+ {
70
+ "key": "api-node-modules",
71
+ "paths": [
72
+ "api/node_modules",
73
+ ],
74
+ "policy": "pull-push",
75
+ },
76
+ {
77
+ "key": "api-next-cache",
78
+ "paths": [
79
+ "api/.next/cache/",
80
+ ],
81
+ "policy": "pull-push",
82
+ },
83
+ ],
84
+ "image": "path/to/docker/jobs-default:the-version",
85
+ "interruptible": true,
86
+ "needs": [],
87
+ "retry": {
88
+ "max": 2,
89
+ "when": [
90
+ "runner_system_failure",
91
+ "stuck_or_timeout_failure",
92
+ ],
93
+ },
94
+ "script": [
95
+ "echo '{"id":"some-id","time":"01-01-2023 12:13:14"}' > api/__build_info.json",
96
+ "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
97
+ "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
98
+ "cd api",
99
+ "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
100
+ "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
101
+ "yarn install --immutable",
102
+ "yarn build",
103
+ ],
104
+ "stage": "build",
105
+ "variables": {
106
+ "APP_DIR": "api",
107
+ "BUILD_INFO_BUILD_TIME": "01-01-2023 12:13:14",
108
+ "BUILD_INFO_CURRENT_VERSION": "3.2.1",
109
+ "BUILD_INFO_ID": "some-id",
110
+ "ENV_SHORT": "dev",
111
+ "ENV_TYPE": "dev",
112
+ "GCLOUD_DEPLOY_credentialsKey": "$CL_dev_api_GCLOUD_DEPLOY_credentialsKey",
113
+ "GCLOUD_RUN_canonicalHostSuffix": "$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix",
114
+ "HOST": "pan-test-app-dev-api-unknown-host.example.com",
115
+ "HOST_CANONICAL": "pan-test-app-dev-api-unknown-host.example.com",
116
+ "KUBERNETES_CPU_LIMIT": "2",
117
+ "KUBERNETES_CPU_REQUEST": "0.5",
118
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
119
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
120
+ "ROOT_URL": "https://pan-test-app-dev-api-unknown-host.example.com",
121
+ "_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"]",
122
+ },
123
+ },
124
+ "api ๐Ÿ”จ docker | dev ": {
125
+ "cache": [
126
+ {
127
+ "key": "api-yarn",
128
+ "paths": [
129
+ "api/.yarn",
130
+ ],
131
+ "policy": "pull",
132
+ },
133
+ ],
134
+ "image": "path/to/docker/docker-build:the-version",
135
+ "interruptible": true,
136
+ "needs": [
137
+ "api ๐Ÿ”จ app | dev ",
138
+ ],
139
+ "retry": {
140
+ "max": 2,
141
+ "when": [
142
+ "runner_system_failure",
143
+ "stuck_or_timeout_failure",
144
+ ],
145
+ },
146
+ "script": [
147
+ "ensureNodeDockerfile",
148
+ "docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY",
149
+ "docker version",
150
+ "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",
151
+ "docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
152
+ "docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE",
153
+ "docker push $DOCKER_CACHE_IMAGE",
154
+ ],
155
+ "services": [
156
+ {
157
+ "command": [
158
+ "--tls=false",
159
+ ],
160
+ "name": "docker:20-dind",
161
+ },
162
+ ],
163
+ "stage": "build",
164
+ "variables": {
165
+ "APP_DIR": "api",
166
+ "DOCKERFILE_ADDITIONS": undefined,
167
+ "DOCKERFILE_ADDITIONS_END": undefined,
168
+ "DOCKER_BUILDKIT": "1",
169
+ "DOCKER_CACHE_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/caches/api",
170
+ "DOCKER_COPY_AND_INSTALL_APP": "COPY --chown=node:node $APP_DIR .
171
+ RUN yarn plugin import workspace-tools
172
+ RUN yarn workspaces focus --production && yarn rebuild",
173
+ "DOCKER_COPY_WORKSPACE_FILES": "COPY --chown=node:node api/package.json /app/api/package.json
174
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
175
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
176
+ COPY --chown=node:node .yarn /app/.yarn",
177
+ "DOCKER_DIR": ".",
178
+ "DOCKER_DRIVER": "overlay2",
179
+ "DOCKER_HOST": "tcp://0.0.0.0:2375",
180
+ "DOCKER_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/$DOCKER_IMAGE_NAME",
181
+ "DOCKER_IMAGE_NAME": "dev/api",
182
+ "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
183
+ "DOCKER_REGISTRY": "$CI_REGISTRY",
184
+ "DOCKER_REGISTRY_IMAGE_PATH": "$CI_REGISTRY_IMAGE",
185
+ "DOCKER_TLS_CERTDIR": "",
186
+ "KUBERNETES_CPU_LIMIT": "1",
187
+ "KUBERNETES_CPU_REQUEST": "0.5",
188
+ "KUBERNETES_MEMORY_LIMIT": "2Gi",
189
+ "KUBERNETES_MEMORY_REQUEST": "1Gi",
190
+ },
191
+ },
192
+ "api ๐Ÿš€ Deploy | dev ": {
193
+ "allow_failure": false,
194
+ "artifacts": {
195
+ "paths": [
196
+ "____envvars.yaml",
197
+ ],
198
+ },
199
+ "environment": {
200
+ "auto_stop_in": "4 weeks",
201
+ "name": "dev/api",
202
+ "on_stop": "api ๐Ÿ›‘ Stop โš ๏ธ | dev ",
203
+ "url": "https://pan-test-app-dev-api-unknown-host.example.com",
204
+ },
205
+ "image": "path/to/docker/gcloud:the-version",
206
+ "interruptible": true,
207
+ "needs": [
208
+ {
209
+ "artifacts": false,
210
+ "job": "api ๐Ÿ‘ฎ lint",
211
+ },
212
+ {
213
+ "artifacts": false,
214
+ "job": "api ๐Ÿ”จ app | dev ",
215
+ },
216
+ {
217
+ "artifacts": false,
218
+ "job": "api ๐Ÿ”จ docker | dev ",
219
+ },
220
+ {
221
+ "artifacts": false,
222
+ "job": "api ๐Ÿงช test",
223
+ },
224
+ {
225
+ "artifacts": false,
226
+ "job": "api ๐Ÿ›ก audit",
227
+ },
228
+ ],
229
+ "retry": {
230
+ "max": 2,
231
+ "when": [
232
+ "runner_system_failure",
233
+ "stuck_or_timeout_failure",
234
+ ],
235
+ },
236
+ "rules": [
237
+ {
238
+ "when": "on_success",
239
+ },
240
+ ],
241
+ "script": [
242
+ "echo $CL_dev_api_GCLOUD_DEPLOY_credentialsKey > ./____keyfile.json
243
+ ",
244
+ "gcloud auth activate-service-account --key-file="./____keyfile.json"",
245
+ "export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe asdf --format="value(projectNumber)")",
246
+ "echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"",
247
+ "docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY",
248
+ "gcloud auth configure-docker asia-east1-docker.pkg.dev",
249
+ "docker pull $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
250
+ "docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG",
251
+ "docker push asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG",
252
+ "echo "$ENV_VARS" > ____envvars.yaml",
253
+ "gcloud run deploy pan-test-app-dev-api --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",
254
+ "docker image rm asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG",
255
+ ],
256
+ "services": [
257
+ {
258
+ "command": [
259
+ "--tls=false",
260
+ ],
261
+ "name": "docker:20-dind",
262
+ },
263
+ ],
264
+ "stage": "deploy dev",
265
+ "variables": {
266
+ "APP_DIR": "api",
267
+ "BUILD_INFO_BUILD_TIME": "01-01-2023 12:13:14",
268
+ "BUILD_INFO_CURRENT_VERSION": "3.2.1",
269
+ "BUILD_INFO_ID": "some-id",
270
+ "CLOUDSDK_CORE_DISABLE_PROMPTS": "1",
271
+ "DOCKER_BUILDKIT": "1",
272
+ "DOCKER_CACHE_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/caches/api",
273
+ "DOCKER_DRIVER": "overlay2",
274
+ "DOCKER_HOST": "tcp://0.0.0.0:2375",
275
+ "DOCKER_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/$DOCKER_IMAGE_NAME",
276
+ "DOCKER_IMAGE_NAME": "dev/api",
277
+ "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
278
+ "DOCKER_REGISTRY": "$CI_REGISTRY",
279
+ "DOCKER_REGISTRY_IMAGE_PATH": "$CI_REGISTRY_IMAGE",
280
+ "DOCKER_TLS_CERTDIR": "",
281
+ "ENV_SHORT": "dev",
282
+ "ENV_TYPE": "dev",
283
+ "ENV_VARS": "ENV_SHORT: 'dev'
284
+ APP_DIR: 'api'
285
+ ENV_TYPE: 'dev'
286
+ BUILD_INFO_ID: 'some-id'
287
+ BUILD_INFO_BUILD_TIME: '01-01-2023 12:13:14'
288
+ BUILD_INFO_CURRENT_VERSION: '3.2.1'
289
+ HOST: 'pan-test-app-dev-api-unknown-host.example.com'
290
+ ROOT_URL: 'https://pan-test-app-dev-api-unknown-host.example.com'
291
+ HOST_CANONICAL: 'pan-test-app-dev-api-unknown-host.example.com'
292
+ GCLOUD_RUN_canonicalHostSuffix: '$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix'
293
+ _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"]'
294
+ ",
295
+ "GCLOUD_DEPLOY_credentialsKey": "$CL_dev_api_GCLOUD_DEPLOY_credentialsKey",
296
+ "GCLOUD_RUN_canonicalHostSuffix": "$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix",
297
+ "HOST": "pan-test-app-dev-api-unknown-host.example.com",
298
+ "HOST_CANONICAL": "pan-test-app-dev-api-unknown-host.example.com",
299
+ "KUBERNETES_CPU_LIMIT": "1",
300
+ "KUBERNETES_CPU_REQUEST": "0.5",
301
+ "KUBERNETES_MEMORY_LIMIT": "400Mi",
302
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
303
+ "ROOT_URL": "https://pan-test-app-dev-api-unknown-host.example.com",
304
+ "_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"]",
305
+ },
306
+ },
307
+ "api ๐Ÿ›‘ Stop โš ๏ธ | dev ": {
308
+ "environment": {
309
+ "action": "stop",
310
+ "name": "dev/api",
311
+ "url": "https://pan-test-app-dev-api-unknown-host.example.com",
312
+ },
313
+ "image": "path/to/docker/gcloud:the-version",
314
+ "interruptible": true,
315
+ "needs": [],
316
+ "retry": {
317
+ "max": 2,
318
+ "when": [
319
+ "runner_system_failure",
320
+ "stuck_or_timeout_failure",
321
+ ],
322
+ },
323
+ "rules": [
324
+ {
325
+ "allow_failure": true,
326
+ "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/",
327
+ "when": "on_success",
328
+ },
329
+ {
330
+ "allow_failure": true,
331
+ "when": "manual",
332
+ },
333
+ ],
334
+ "script": [
335
+ "set +e",
336
+ "echo $CL_dev_api_GCLOUD_DEPLOY_credentialsKey > ./____keyfile.json
337
+ ",
338
+ "gcloud auth activate-service-account --key-file="./____keyfile.json"",
339
+ "gcloud run services delete pan-test-app-dev-api --project=asdf --region=asia-east1",
340
+ "set -e",
341
+ ],
342
+ "stage": "stop dev",
343
+ "variables": {
344
+ "CLOUDSDK_CORE_DISABLE_PROMPTS": "1",
345
+ "GIT_STRATEGY": "none",
346
+ "KUBERNETES_CPU_LIMIT": "1",
347
+ "KUBERNETES_CPU_REQUEST": "0.5",
348
+ "KUBERNETES_MEMORY_LIMIT": "400Mi",
349
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
350
+ },
351
+ },
352
+ "api ๐Ÿ›ก audit": {
353
+ "allow_failure": true,
354
+ "interruptible": true,
355
+ "needs": [],
356
+ "retry": {
357
+ "max": 2,
358
+ "when": [
359
+ "runner_system_failure",
360
+ "stuck_or_timeout_failure",
361
+ ],
362
+ },
363
+ "script": [
364
+ "cd api",
365
+ "yarn npm audit --environment production",
366
+ ],
367
+ "stage": "test",
368
+ "variables": {
369
+ "APP_PATH": "api",
370
+ "KUBERNETES_CPU_LIMIT": "2",
371
+ "KUBERNETES_CPU_REQUEST": "0.5",
372
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
373
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
374
+ },
375
+ },
376
+ "api ๐Ÿงช test": {
377
+ "cache": [
378
+ {
379
+ "key": "api-yarn",
380
+ "paths": [
381
+ "api/.yarn",
382
+ ],
383
+ "policy": "pull-push",
384
+ },
385
+ {
386
+ "key": "api-node-modules",
387
+ "paths": [
388
+ "api/node_modules",
389
+ ],
390
+ "policy": "pull-push",
391
+ },
392
+ ],
393
+ "image": "path/to/docker/jobs-testing-chrome:the-version",
394
+ "interruptible": true,
395
+ "needs": [],
396
+ "retry": {
397
+ "max": 2,
398
+ "when": [
399
+ "runner_system_failure",
400
+ "stuck_or_timeout_failure",
401
+ ],
402
+ },
403
+ "script": [
404
+ "cd api",
405
+ "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
406
+ "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
407
+ "yarn install --immutable",
408
+ "yarn test",
409
+ ],
410
+ "stage": "test",
411
+ "variables": {
412
+ "APP_PATH": "api",
413
+ "KUBERNETES_CPU_LIMIT": "2",
414
+ "KUBERNETES_CPU_REQUEST": "0.5",
415
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
416
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
417
+ },
418
+ },
419
+ "api ๐Ÿงพ sbom upload | dev ": {
420
+ "allow_failure": true,
421
+ "image": "git.panter.ch:5001/open-source/dependency-track-uploader:dtrackuploader-v0.2.1",
422
+ "interruptible": true,
423
+ "needs": [
424
+ "api ๐Ÿงพ sbom | dev ",
425
+ ],
426
+ "retry": {
427
+ "max": 2,
428
+ "when": [
429
+ "runner_system_failure",
430
+ "stuck_or_timeout_failure",
431
+ ],
432
+ },
433
+ "script": [
434
+ "/dtrackuploader https://dep.panter.dev/ "$DT_KEY" upload "pan-test-app/api" "dev" "__sbom.json" vex.json",
435
+ ],
436
+ "stage": "verify",
437
+ "variables": {},
438
+ },
439
+ "api ๐Ÿงพ sbom | dev ": {
440
+ "allow_failure": true,
441
+ "artifacts": {
442
+ "paths": [
443
+ "__sbom.json",
444
+ ],
445
+ },
446
+ "image": "aquasec/trivy:0.38.3",
447
+ "interruptible": true,
448
+ "needs": [
449
+ "api ๐Ÿš€ Deploy | dev ",
450
+ ],
451
+ "retry": {
452
+ "max": 2,
453
+ "when": [
454
+ "runner_system_failure",
455
+ "stuck_or_timeout_failure",
456
+ ],
457
+ },
458
+ "script": [
459
+ "trivy fs --quiet --format cyclonedx --output "__sbom.json" api",
460
+ ],
461
+ "stage": "verify",
462
+ "variables": {},
463
+ },
464
+ "app ๐Ÿ‘ฎ lint": {
465
+ "cache": [
466
+ {
467
+ "key": "app-yarn",
468
+ "paths": [
469
+ "app/.yarn",
470
+ ],
471
+ "policy": "pull-push",
472
+ },
473
+ {
474
+ "key": "app-node-modules",
475
+ "paths": [
476
+ "app/node_modules",
477
+ ],
478
+ "policy": "pull-push",
479
+ },
480
+ ],
481
+ "interruptible": true,
482
+ "needs": [],
483
+ "retry": {
484
+ "max": 2,
485
+ "when": [
486
+ "runner_system_failure",
487
+ "stuck_or_timeout_failure",
488
+ ],
489
+ },
490
+ "script": [
491
+ "cd app",
492
+ "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
493
+ "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
494
+ "yarn install --immutable",
495
+ "yarn lint",
496
+ ],
497
+ "stage": "test",
498
+ "variables": {
499
+ "APP_PATH": "app",
500
+ "KUBERNETES_CPU_LIMIT": "2",
501
+ "KUBERNETES_CPU_REQUEST": "0.5",
502
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
503
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
504
+ "LANG": "en_US.UTF-8",
505
+ "LC_A": "L=en_US.UTF-8",
506
+ },
507
+ },
508
+ "app ๐Ÿ”จ app | dev ": {
509
+ "artifacts": {
510
+ "paths": [
511
+ "app/__build_info.json",
512
+ "app/dist",
513
+ "app/.next",
514
+ ],
515
+ "reports": {
516
+ "junit": undefined,
517
+ },
518
+ },
519
+ "cache": [
520
+ {
521
+ "key": {
522
+ "files": [
523
+ "app/Gemfile.lock",
524
+ ],
525
+ },
526
+ "paths": [
527
+ "app/vendor",
528
+ ],
529
+ },
530
+ {
531
+ "key": "app-yarn",
532
+ "paths": [
533
+ "app/.yarn",
534
+ ],
535
+ "policy": "pull-push",
536
+ },
537
+ {
538
+ "key": "app-node-modules",
539
+ "paths": [
540
+ "app/node_modules",
541
+ ],
542
+ "policy": "pull-push",
543
+ },
544
+ {
545
+ "key": "app-next-cache",
546
+ "paths": [
547
+ "app/.next/cache/",
548
+ ],
549
+ "policy": "pull-push",
550
+ },
551
+ ],
552
+ "image": "path/to/docker/jobs-default:the-version",
553
+ "interruptible": true,
554
+ "needs": [],
555
+ "retry": {
556
+ "max": 2,
557
+ "when": [
558
+ "runner_system_failure",
559
+ "stuck_or_timeout_failure",
560
+ ],
561
+ },
562
+ "script": [
563
+ "cat <<EOF > app/.env
564
+ ENV_SHORT=dev
565
+ APP_DIR=app
566
+ ENV_TYPE=dev
567
+ BUILD_INFO_ID=some-id
568
+ BUILD_INFO_BUILD_TIME=01-01-2023 12:13:14
569
+ BUILD_INFO_CURRENT_VERSION=3.2.1
570
+ HOST=unknown-host.example.com
571
+ ROOT_URL=https://unknown-host.example.com
572
+ APP_STORE_CONNECT_API_KEY_CONTENT=$CL_dev_app_APP_STORE_CONNECT_API_KEY_CONTENT
573
+ APP_STORE_CONNECT_ISSUER_ID=$CL_dev_app_APP_STORE_CONNECT_ISSUER_ID
574
+ APP_STORE_CONNECT_API_KEY_ID=$CL_dev_app_APP_STORE_CONNECT_API_KEY_ID
575
+ GRAPHQL_URL=https://pan-test-app-dev-api-unknown-host.example.com/graphql
576
+ _ALL_ENV_VAR_KEYS=["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","APP_STORE_CONNECT_API_KEY_CONTENT","APP_STORE_CONNECT_ISSUER_ID","APP_STORE_CONNECT_API_KEY_ID","GRAPHQL_URL"]
577
+ EOF",
578
+ "echo '{"id":"some-id","time":"01-01-2023 12:13:14"}' > app/__build_info.json",
579
+ "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
580
+ "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
581
+ "cd app",
582
+ "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
583
+ "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
584
+ "yarn install --immutable",
585
+ "bundle config set --local path 'vendor/ruby'",
586
+ "gem install bundler",
587
+ "bundle install",
588
+ "bundle exec pod install --project-directory=ios",
589
+ "bundle exec fastlane build",
590
+ ],
591
+ "stage": "build",
592
+ "tags": [
593
+ "mac-runner",
594
+ ],
595
+ "variables": {
596
+ "APP_DIR": "app",
597
+ "APP_STORE_CONNECT_API_KEY_CONTENT": "$CL_dev_app_APP_STORE_CONNECT_API_KEY_CONTENT",
598
+ "APP_STORE_CONNECT_API_KEY_ID": "$CL_dev_app_APP_STORE_CONNECT_API_KEY_ID",
599
+ "APP_STORE_CONNECT_ISSUER_ID": "$CL_dev_app_APP_STORE_CONNECT_ISSUER_ID",
600
+ "BUILD_INFO_BUILD_TIME": "01-01-2023 12:13:14",
601
+ "BUILD_INFO_CURRENT_VERSION": "3.2.1",
602
+ "BUILD_INFO_ID": "some-id",
603
+ "ENV_SHORT": "dev",
604
+ "ENV_TYPE": "dev",
605
+ "GRAPHQL_URL": "https://pan-test-app-dev-api-unknown-host.example.com/graphql",
606
+ "HOST": "unknown-host.example.com",
607
+ "KUBERNETES_CPU_LIMIT": "2",
608
+ "KUBERNETES_CPU_REQUEST": "0.5",
609
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
610
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
611
+ "LANG": "en_US.UTF-8",
612
+ "LC_A": "L=en_US.UTF-8",
613
+ "ROOT_URL": "https://unknown-host.example.com",
614
+ "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","APP_STORE_CONNECT_API_KEY_CONTENT","APP_STORE_CONNECT_ISSUER_ID","APP_STORE_CONNECT_API_KEY_ID","GRAPHQL_URL"]",
615
+ },
616
+ },
617
+ "app ๐Ÿš€ Deploy | dev ": {
618
+ "allow_failure": false,
619
+ "cache": [
620
+ {
621
+ "key": {
622
+ "files": [
623
+ "app/Gemfile.lock",
624
+ ],
625
+ },
626
+ "paths": [
627
+ "app/vendor",
628
+ ],
629
+ },
630
+ ],
631
+ "environment": {
632
+ "name": "dev/app",
633
+ "url": "https://unknown-host.example.com",
634
+ },
635
+ "image": "path/to/docker/jobs-default:the-version",
636
+ "interruptible": true,
637
+ "needs": [
638
+ {
639
+ "artifacts": false,
640
+ "job": "app ๐Ÿ‘ฎ lint",
641
+ },
642
+ {
643
+ "artifacts": true,
644
+ "job": "app ๐Ÿ”จ app | dev ",
645
+ },
646
+ {
647
+ "artifacts": false,
648
+ "job": "app ๐Ÿงช test",
649
+ },
650
+ {
651
+ "artifacts": false,
652
+ "job": "app ๐Ÿ›ก audit",
653
+ },
654
+ ],
655
+ "retry": {
656
+ "max": 2,
657
+ "when": [
658
+ "runner_system_failure",
659
+ "stuck_or_timeout_failure",
660
+ ],
661
+ },
662
+ "rules": [
663
+ {
664
+ "when": "on_success",
665
+ },
666
+ ],
667
+ "script": [
668
+ "cd app",
669
+ "bundle config set --local path 'vendor/ruby'",
670
+ "gem install bundler",
671
+ "bundle install",
672
+ "bundle exec fastlane deploy_test",
673
+ ],
674
+ "stage": "deploy dev",
675
+ "tags": [
676
+ "mac-runner",
677
+ ],
678
+ "variables": {
679
+ "APP_DIR": "app",
680
+ "APP_STORE_CONNECT_API_KEY_CONTENT": "$CL_dev_app_APP_STORE_CONNECT_API_KEY_CONTENT",
681
+ "APP_STORE_CONNECT_API_KEY_ID": "$CL_dev_app_APP_STORE_CONNECT_API_KEY_ID",
682
+ "APP_STORE_CONNECT_ISSUER_ID": "$CL_dev_app_APP_STORE_CONNECT_ISSUER_ID",
683
+ "BUILD_INFO_BUILD_TIME": "01-01-2023 12:13:14",
684
+ "BUILD_INFO_CURRENT_VERSION": "3.2.1",
685
+ "BUILD_INFO_ID": "some-id",
686
+ "ENV_SHORT": "dev",
687
+ "ENV_TYPE": "dev",
688
+ "GRAPHQL_URL": "https://pan-test-app-dev-api-unknown-host.example.com/graphql",
689
+ "HOST": "unknown-host.example.com",
690
+ "KUBERNETES_CPU_LIMIT": "1",
691
+ "KUBERNETES_CPU_REQUEST": "0.5",
692
+ "KUBERNETES_MEMORY_LIMIT": "400Mi",
693
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
694
+ "LANG": "en_US.UTF-8",
695
+ "LC_A": "L=en_US.UTF-8",
696
+ "ROOT_URL": "https://unknown-host.example.com",
697
+ "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","APP_STORE_CONNECT_API_KEY_CONTENT","APP_STORE_CONNECT_ISSUER_ID","APP_STORE_CONNECT_API_KEY_ID","GRAPHQL_URL"]",
698
+ },
699
+ },
700
+ "app ๐Ÿ›ก audit": {
701
+ "allow_failure": true,
702
+ "interruptible": true,
703
+ "needs": [],
704
+ "retry": {
705
+ "max": 2,
706
+ "when": [
707
+ "runner_system_failure",
708
+ "stuck_or_timeout_failure",
709
+ ],
710
+ },
711
+ "script": [
712
+ "cd app",
713
+ "yarn npm audit --environment production",
714
+ ],
715
+ "stage": "test",
716
+ "variables": {
717
+ "APP_PATH": "app",
718
+ "KUBERNETES_CPU_LIMIT": "2",
719
+ "KUBERNETES_CPU_REQUEST": "0.5",
720
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
721
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
722
+ "LANG": "en_US.UTF-8",
723
+ "LC_A": "L=en_US.UTF-8",
724
+ },
725
+ },
726
+ "app ๐Ÿงช test": {
727
+ "cache": [
728
+ {
729
+ "key": "app-yarn",
730
+ "paths": [
731
+ "app/.yarn",
732
+ ],
733
+ "policy": "pull-push",
734
+ },
735
+ {
736
+ "key": "app-node-modules",
737
+ "paths": [
738
+ "app/node_modules",
739
+ ],
740
+ "policy": "pull-push",
741
+ },
742
+ ],
743
+ "image": "path/to/docker/jobs-testing-chrome:the-version",
744
+ "interruptible": true,
745
+ "needs": [],
746
+ "retry": {
747
+ "max": 2,
748
+ "when": [
749
+ "runner_system_failure",
750
+ "stuck_or_timeout_failure",
751
+ ],
752
+ },
753
+ "script": [
754
+ "cd app",
755
+ "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
756
+ "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
757
+ "yarn install --immutable",
758
+ "yarn test",
759
+ ],
760
+ "stage": "test",
761
+ "variables": {
762
+ "APP_PATH": "app",
763
+ "KUBERNETES_CPU_LIMIT": "2",
764
+ "KUBERNETES_CPU_REQUEST": "0.5",
765
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
766
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
767
+ "LANG": "en_US.UTF-8",
768
+ "LC_A": "L=en_US.UTF-8",
769
+ },
770
+ },
771
+ "app ๐Ÿงพ sbom upload | dev ": {
772
+ "allow_failure": true,
773
+ "image": "git.panter.ch:5001/open-source/dependency-track-uploader:dtrackuploader-v0.2.1",
774
+ "interruptible": true,
775
+ "needs": [
776
+ "app ๐Ÿงพ sbom | dev ",
777
+ ],
778
+ "retry": {
779
+ "max": 2,
780
+ "when": [
781
+ "runner_system_failure",
782
+ "stuck_or_timeout_failure",
783
+ ],
784
+ },
785
+ "script": [
786
+ "/dtrackuploader https://dep.panter.dev/ "$DT_KEY" upload "pan-test-app/app" "dev" "__sbom.json" vex.json",
787
+ ],
788
+ "stage": "verify",
789
+ "variables": {},
790
+ },
791
+ "app ๐Ÿงพ sbom | dev ": {
792
+ "allow_failure": true,
793
+ "artifacts": {
794
+ "paths": [
795
+ "__sbom.json",
796
+ ],
797
+ },
798
+ "image": "aquasec/trivy:0.38.3",
799
+ "interruptible": true,
800
+ "needs": [
801
+ "app ๐Ÿš€ Deploy | dev ",
802
+ ],
803
+ "retry": {
804
+ "max": 2,
805
+ "when": [
806
+ "runner_system_failure",
807
+ "stuck_or_timeout_failure",
808
+ ],
809
+ },
810
+ "script": [
811
+ "trivy fs --quiet --format cyclonedx --output "__sbom.json" app",
812
+ ],
813
+ "stage": "verify",
814
+ "variables": {},
815
+ },
816
+ },
817
+ "stages": [
818
+ "setup",
819
+ "setup dev",
820
+ "setup review",
821
+ "setup stage",
822
+ "setup prod",
823
+ "setup local",
824
+ "test",
825
+ "test dev",
826
+ "test review",
827
+ "test stage",
828
+ "test prod",
829
+ "test local",
830
+ "build",
831
+ "build dev",
832
+ "build review",
833
+ "build stage",
834
+ "build prod",
835
+ "build local",
836
+ "deploy",
837
+ "deploy dev",
838
+ "deploy review",
839
+ "deploy stage",
840
+ "deploy prod",
841
+ "deploy local",
842
+ "verify",
843
+ "verify dev",
844
+ "verify review",
845
+ "verify stage",
846
+ "verify prod",
847
+ "verify local",
848
+ "rollback",
849
+ "rollback dev",
850
+ "rollback review",
851
+ "rollback stage",
852
+ "rollback prod",
853
+ "rollback local",
854
+ "stop",
855
+ "stop dev",
856
+ "stop review",
857
+ "stop stage",
858
+ "stop prod",
859
+ "stop local",
860
+ ],
861
+ "variables": {
862
+ "FF_USE_FASTZIP": "true",
863
+ },
864
+ "workflow": {
865
+ "rules": [
866
+ {
867
+ "if": "$CI_COMMIT_TAG",
868
+ },
869
+ {
870
+ "if": "$CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/",
871
+ "when": "never",
872
+ },
873
+ {
874
+ "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+.([0-9]+|x).x$/",
875
+ },
876
+ {
877
+ "if": "$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH",
878
+ },
879
+ {
880
+ "if": "$CI_MERGE_REQUEST_ID",
881
+ },
882
+ ],
883
+ },
884
+ },
885
+ "mr": {
886
+ "image": "path/to/docker/jobs-default:the-version",
887
+ "jobs": {
888
+ "api ๐Ÿ‘ฎ lint": {
889
+ "cache": [
890
+ {
891
+ "key": "api-yarn",
892
+ "paths": [
893
+ "api/.yarn",
894
+ ],
895
+ "policy": "pull-push",
896
+ },
897
+ {
898
+ "key": "api-node-modules",
899
+ "paths": [
900
+ "api/node_modules",
901
+ ],
902
+ "policy": "pull-push",
903
+ },
904
+ ],
905
+ "interruptible": true,
906
+ "needs": [],
907
+ "retry": {
908
+ "max": 2,
909
+ "when": [
910
+ "runner_system_failure",
911
+ "stuck_or_timeout_failure",
912
+ ],
913
+ },
914
+ "script": [
915
+ "cd api",
916
+ "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
917
+ "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
918
+ "yarn install --immutable",
919
+ "yarn lint",
920
+ ],
921
+ "stage": "test",
922
+ "variables": {
923
+ "APP_PATH": "api",
924
+ "KUBERNETES_CPU_LIMIT": "2",
925
+ "KUBERNETES_CPU_REQUEST": "0.5",
926
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
927
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
928
+ },
929
+ },
930
+ "api ๐Ÿ”จ app | review ": {
931
+ "artifacts": {
932
+ "paths": [
933
+ "api/__build_info.json",
934
+ "api/dist",
935
+ "api/.next",
936
+ ],
937
+ "reports": {
938
+ "junit": undefined,
939
+ },
940
+ },
941
+ "cache": [
942
+ {
943
+ "key": "api-yarn",
944
+ "paths": [
945
+ "api/.yarn",
946
+ ],
947
+ "policy": "pull-push",
948
+ },
949
+ {
950
+ "key": "api-node-modules",
951
+ "paths": [
952
+ "api/node_modules",
953
+ ],
954
+ "policy": "pull-push",
955
+ },
956
+ {
957
+ "key": "api-next-cache",
958
+ "paths": [
959
+ "api/.next/cache/",
960
+ ],
961
+ "policy": "pull-push",
962
+ },
963
+ ],
964
+ "image": "path/to/docker/jobs-default:the-version",
965
+ "interruptible": true,
966
+ "needs": [],
967
+ "retry": {
968
+ "max": 2,
969
+ "when": [
970
+ "runner_system_failure",
971
+ "stuck_or_timeout_failure",
972
+ ],
973
+ },
974
+ "script": [
975
+ "echo '{"id":"some-id","time":"01-01-2023 12:13:14"}' > api/__build_info.json",
976
+ "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
977
+ "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
978
+ "cd api",
979
+ "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
980
+ "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
981
+ "yarn install --immutable",
982
+ "yarn build",
983
+ ],
984
+ "stage": "build",
985
+ "variables": {
986
+ "APP_DIR": "api",
987
+ "BUILD_INFO_BUILD_TIME": "01-01-2023 12:13:14",
988
+ "BUILD_INFO_CURRENT_VERSION": "3.2.1",
989
+ "BUILD_INFO_ID": "some-id",
990
+ "ENV_SHORT": "review",
991
+ "ENV_TYPE": "review",
992
+ "GCLOUD_DEPLOY_credentialsKey": "$CL_review_api_GCLOUD_DEPLOY_credentialsKey",
993
+ "GCLOUD_RUN_canonicalHostSuffix": "$CL_review_api_GCLOUD_RUN_canonicalHostSuffix",
994
+ "HOST": "pan-test-app-review-mr1234-api-unknown-host.example.com",
995
+ "HOST_CANONICAL": "pan-test-app-review-mr1234-api-unknown-host.example.com",
996
+ "KUBERNETES_CPU_LIMIT": "2",
997
+ "KUBERNETES_CPU_REQUEST": "0.5",
998
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
999
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
1000
+ "ROOT_URL": "https://pan-test-app-review-mr1234-api-unknown-host.example.com",
1001
+ "_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"]",
1002
+ },
1003
+ },
1004
+ "api ๐Ÿ”จ docker | review ": {
1005
+ "cache": [
1006
+ {
1007
+ "key": "api-yarn",
1008
+ "paths": [
1009
+ "api/.yarn",
1010
+ ],
1011
+ "policy": "pull",
1012
+ },
1013
+ ],
1014
+ "image": "path/to/docker/docker-build:the-version",
1015
+ "interruptible": true,
1016
+ "needs": [
1017
+ "api ๐Ÿ”จ app | review ",
1018
+ ],
1019
+ "retry": {
1020
+ "max": 2,
1021
+ "when": [
1022
+ "runner_system_failure",
1023
+ "stuck_or_timeout_failure",
1024
+ ],
1025
+ },
1026
+ "script": [
1027
+ "ensureNodeDockerfile",
1028
+ "docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY",
1029
+ "docker version",
1030
+ "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",
1031
+ "docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
1032
+ "docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE",
1033
+ "docker push $DOCKER_CACHE_IMAGE",
1034
+ ],
1035
+ "services": [
1036
+ {
1037
+ "command": [
1038
+ "--tls=false",
1039
+ ],
1040
+ "name": "docker:20-dind",
1041
+ },
1042
+ ],
1043
+ "stage": "build",
1044
+ "variables": {
1045
+ "APP_DIR": "api",
1046
+ "DOCKERFILE_ADDITIONS": undefined,
1047
+ "DOCKERFILE_ADDITIONS_END": undefined,
1048
+ "DOCKER_BUILDKIT": "1",
1049
+ "DOCKER_CACHE_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/caches/api",
1050
+ "DOCKER_COPY_AND_INSTALL_APP": "COPY --chown=node:node $APP_DIR .
1051
+ RUN yarn plugin import workspace-tools
1052
+ RUN yarn workspaces focus --production && yarn rebuild",
1053
+ "DOCKER_COPY_WORKSPACE_FILES": "COPY --chown=node:node api/package.json /app/api/package.json
1054
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
1055
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
1056
+ COPY --chown=node:node .yarn /app/.yarn",
1057
+ "DOCKER_DIR": ".",
1058
+ "DOCKER_DRIVER": "overlay2",
1059
+ "DOCKER_HOST": "tcp://0.0.0.0:2375",
1060
+ "DOCKER_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/$DOCKER_IMAGE_NAME",
1061
+ "DOCKER_IMAGE_NAME": "review/api",
1062
+ "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
1063
+ "DOCKER_REGISTRY": "$CI_REGISTRY",
1064
+ "DOCKER_REGISTRY_IMAGE_PATH": "$CI_REGISTRY_IMAGE",
1065
+ "DOCKER_TLS_CERTDIR": "",
1066
+ "KUBERNETES_CPU_LIMIT": "1",
1067
+ "KUBERNETES_CPU_REQUEST": "0.5",
1068
+ "KUBERNETES_MEMORY_LIMIT": "2Gi",
1069
+ "KUBERNETES_MEMORY_REQUEST": "1Gi",
1070
+ },
1071
+ },
1072
+ "api ๐Ÿš€ Deploy | review ": {
1073
+ "allow_failure": false,
1074
+ "artifacts": {
1075
+ "paths": [
1076
+ "____envvars.yaml",
1077
+ ],
1078
+ },
1079
+ "environment": {
1080
+ "auto_stop_in": "2 week",
1081
+ "name": "review/some-commit/api",
1082
+ "on_stop": "api ๐Ÿ›‘ Stop โš ๏ธ | review ",
1083
+ "url": "https://pan-test-app-review-mr1234-api-unknown-host.example.com",
1084
+ },
1085
+ "image": "path/to/docker/gcloud:the-version",
1086
+ "interruptible": true,
1087
+ "needs": [
1088
+ {
1089
+ "artifacts": false,
1090
+ "job": "api ๐Ÿ‘ฎ lint",
1091
+ },
1092
+ {
1093
+ "artifacts": false,
1094
+ "job": "api ๐Ÿ”จ app | review ",
1095
+ },
1096
+ {
1097
+ "artifacts": false,
1098
+ "job": "api ๐Ÿ”จ docker | review ",
1099
+ },
1100
+ {
1101
+ "artifacts": false,
1102
+ "job": "api ๐Ÿงช test",
1103
+ },
1104
+ {
1105
+ "artifacts": false,
1106
+ "job": "api ๐Ÿ›ก audit",
1107
+ },
1108
+ ],
1109
+ "retry": {
1110
+ "max": 2,
1111
+ "when": [
1112
+ "runner_system_failure",
1113
+ "stuck_or_timeout_failure",
1114
+ ],
1115
+ },
1116
+ "rules": [
1117
+ {
1118
+ "when": "on_success",
1119
+ },
1120
+ ],
1121
+ "script": [
1122
+ "echo $CL_review_api_GCLOUD_DEPLOY_credentialsKey > ./____keyfile.json
1123
+ ",
1124
+ "gcloud auth activate-service-account --key-file="./____keyfile.json"",
1125
+ "export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe asdf --format="value(projectNumber)")",
1126
+ "echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"",
1127
+ "docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY",
1128
+ "gcloud auth configure-docker asia-east1-docker.pkg.dev",
1129
+ "docker pull $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
1130
+ "docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG",
1131
+ "docker push asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG",
1132
+ "echo "$ENV_VARS" > ____envvars.yaml",
1133
+ "gcloud run deploy pan-test-app-review-mr1234-api --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",
1134
+ "docker image rm asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG",
1135
+ ],
1136
+ "services": [
1137
+ {
1138
+ "command": [
1139
+ "--tls=false",
1140
+ ],
1141
+ "name": "docker:20-dind",
1142
+ },
1143
+ ],
1144
+ "stage": "deploy review",
1145
+ "variables": {
1146
+ "APP_DIR": "api",
1147
+ "BUILD_INFO_BUILD_TIME": "01-01-2023 12:13:14",
1148
+ "BUILD_INFO_CURRENT_VERSION": "3.2.1",
1149
+ "BUILD_INFO_ID": "some-id",
1150
+ "CLOUDSDK_CORE_DISABLE_PROMPTS": "1",
1151
+ "DOCKER_BUILDKIT": "1",
1152
+ "DOCKER_CACHE_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/caches/api",
1153
+ "DOCKER_DRIVER": "overlay2",
1154
+ "DOCKER_HOST": "tcp://0.0.0.0:2375",
1155
+ "DOCKER_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/$DOCKER_IMAGE_NAME",
1156
+ "DOCKER_IMAGE_NAME": "review/api",
1157
+ "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
1158
+ "DOCKER_REGISTRY": "$CI_REGISTRY",
1159
+ "DOCKER_REGISTRY_IMAGE_PATH": "$CI_REGISTRY_IMAGE",
1160
+ "DOCKER_TLS_CERTDIR": "",
1161
+ "ENV_SHORT": "review",
1162
+ "ENV_TYPE": "review",
1163
+ "ENV_VARS": "ENV_SHORT: 'review'
1164
+ APP_DIR: 'api'
1165
+ ENV_TYPE: 'review'
1166
+ BUILD_INFO_ID: 'some-id'
1167
+ BUILD_INFO_BUILD_TIME: '01-01-2023 12:13:14'
1168
+ BUILD_INFO_CURRENT_VERSION: '3.2.1'
1169
+ HOST: 'pan-test-app-review-mr1234-api-unknown-host.example.com'
1170
+ ROOT_URL: 'https://pan-test-app-review-mr1234-api-unknown-host.example.com'
1171
+ HOST_CANONICAL: 'pan-test-app-review-mr1234-api-unknown-host.example.com'
1172
+ GCLOUD_RUN_canonicalHostSuffix: '$CL_review_api_GCLOUD_RUN_canonicalHostSuffix'
1173
+ _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"]'
1174
+ ",
1175
+ "GCLOUD_DEPLOY_credentialsKey": "$CL_review_api_GCLOUD_DEPLOY_credentialsKey",
1176
+ "GCLOUD_RUN_canonicalHostSuffix": "$CL_review_api_GCLOUD_RUN_canonicalHostSuffix",
1177
+ "HOST": "pan-test-app-review-mr1234-api-unknown-host.example.com",
1178
+ "HOST_CANONICAL": "pan-test-app-review-mr1234-api-unknown-host.example.com",
1179
+ "KUBERNETES_CPU_LIMIT": "1",
1180
+ "KUBERNETES_CPU_REQUEST": "0.5",
1181
+ "KUBERNETES_MEMORY_LIMIT": "400Mi",
1182
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
1183
+ "ROOT_URL": "https://pan-test-app-review-mr1234-api-unknown-host.example.com",
1184
+ "_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"]",
1185
+ },
1186
+ },
1187
+ "api ๐Ÿ›‘ Stop โš ๏ธ | review ": {
1188
+ "environment": {
1189
+ "action": "stop",
1190
+ "name": "review/some-commit/api",
1191
+ "url": "https://pan-test-app-review-mr1234-api-unknown-host.example.com",
1192
+ },
1193
+ "image": "path/to/docker/gcloud:the-version",
1194
+ "interruptible": true,
1195
+ "needs": [],
1196
+ "retry": {
1197
+ "max": 2,
1198
+ "when": [
1199
+ "runner_system_failure",
1200
+ "stuck_or_timeout_failure",
1201
+ ],
1202
+ },
1203
+ "rules": [
1204
+ {
1205
+ "allow_failure": true,
1206
+ "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/",
1207
+ "when": "on_success",
1208
+ },
1209
+ {
1210
+ "allow_failure": true,
1211
+ "when": "manual",
1212
+ },
1213
+ ],
1214
+ "script": [
1215
+ "set +e",
1216
+ "echo $CL_review_api_GCLOUD_DEPLOY_credentialsKey > ./____keyfile.json
1217
+ ",
1218
+ "gcloud auth activate-service-account --key-file="./____keyfile.json"",
1219
+ "gcloud run services delete pan-test-app-review-mr1234-api --project=asdf --region=asia-east1",
1220
+ "set -e",
1221
+ ],
1222
+ "stage": "stop review",
1223
+ "variables": {
1224
+ "CLOUDSDK_CORE_DISABLE_PROMPTS": "1",
1225
+ "GIT_STRATEGY": "none",
1226
+ "KUBERNETES_CPU_LIMIT": "1",
1227
+ "KUBERNETES_CPU_REQUEST": "0.5",
1228
+ "KUBERNETES_MEMORY_LIMIT": "400Mi",
1229
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
1230
+ },
1231
+ },
1232
+ "api ๐Ÿ›ก audit": {
1233
+ "allow_failure": true,
1234
+ "interruptible": true,
1235
+ "needs": [],
1236
+ "retry": {
1237
+ "max": 2,
1238
+ "when": [
1239
+ "runner_system_failure",
1240
+ "stuck_or_timeout_failure",
1241
+ ],
1242
+ },
1243
+ "script": [
1244
+ "cd api",
1245
+ "yarn npm audit --environment production",
1246
+ ],
1247
+ "stage": "test",
1248
+ "variables": {
1249
+ "APP_PATH": "api",
1250
+ "KUBERNETES_CPU_LIMIT": "2",
1251
+ "KUBERNETES_CPU_REQUEST": "0.5",
1252
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
1253
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
1254
+ },
1255
+ },
1256
+ "api ๐Ÿงช test": {
1257
+ "cache": [
1258
+ {
1259
+ "key": "api-yarn",
1260
+ "paths": [
1261
+ "api/.yarn",
1262
+ ],
1263
+ "policy": "pull-push",
1264
+ },
1265
+ {
1266
+ "key": "api-node-modules",
1267
+ "paths": [
1268
+ "api/node_modules",
1269
+ ],
1270
+ "policy": "pull-push",
1271
+ },
1272
+ ],
1273
+ "image": "path/to/docker/jobs-testing-chrome:the-version",
1274
+ "interruptible": true,
1275
+ "needs": [],
1276
+ "retry": {
1277
+ "max": 2,
1278
+ "when": [
1279
+ "runner_system_failure",
1280
+ "stuck_or_timeout_failure",
1281
+ ],
1282
+ },
1283
+ "script": [
1284
+ "cd api",
1285
+ "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
1286
+ "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
1287
+ "yarn install --immutable",
1288
+ "yarn test",
1289
+ ],
1290
+ "stage": "test",
1291
+ "variables": {
1292
+ "APP_PATH": "api",
1293
+ "KUBERNETES_CPU_LIMIT": "2",
1294
+ "KUBERNETES_CPU_REQUEST": "0.5",
1295
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
1296
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
1297
+ },
1298
+ },
1299
+ "api ๐Ÿงพ sbom upload | review ": {
1300
+ "allow_failure": true,
1301
+ "image": "git.panter.ch:5001/open-source/dependency-track-uploader:dtrackuploader-v0.2.1",
1302
+ "interruptible": true,
1303
+ "needs": [
1304
+ "api ๐Ÿงพ sbom | review ",
1305
+ ],
1306
+ "retry": {
1307
+ "max": 2,
1308
+ "when": [
1309
+ "runner_system_failure",
1310
+ "stuck_or_timeout_failure",
1311
+ ],
1312
+ },
1313
+ "script": [
1314
+ "/dtrackuploader https://dep.panter.dev/ "$DT_KEY" upload "pan-test-app/api" "review" "__sbom.json" vex.json",
1315
+ ],
1316
+ "stage": "verify",
1317
+ "variables": {},
1318
+ },
1319
+ "api ๐Ÿงพ sbom | review ": {
1320
+ "allow_failure": true,
1321
+ "artifacts": {
1322
+ "paths": [
1323
+ "__sbom.json",
1324
+ ],
1325
+ },
1326
+ "image": "aquasec/trivy:0.38.3",
1327
+ "interruptible": true,
1328
+ "needs": [
1329
+ "api ๐Ÿš€ Deploy | review ",
1330
+ ],
1331
+ "retry": {
1332
+ "max": 2,
1333
+ "when": [
1334
+ "runner_system_failure",
1335
+ "stuck_or_timeout_failure",
1336
+ ],
1337
+ },
1338
+ "script": [
1339
+ "trivy fs --quiet --format cyclonedx --output "__sbom.json" api",
1340
+ ],
1341
+ "stage": "verify",
1342
+ "variables": {},
1343
+ },
1344
+ "app ๐Ÿ‘ฎ lint": {
1345
+ "cache": [
1346
+ {
1347
+ "key": "app-yarn",
1348
+ "paths": [
1349
+ "app/.yarn",
1350
+ ],
1351
+ "policy": "pull-push",
1352
+ },
1353
+ {
1354
+ "key": "app-node-modules",
1355
+ "paths": [
1356
+ "app/node_modules",
1357
+ ],
1358
+ "policy": "pull-push",
1359
+ },
1360
+ ],
1361
+ "interruptible": true,
1362
+ "needs": [],
1363
+ "retry": {
1364
+ "max": 2,
1365
+ "when": [
1366
+ "runner_system_failure",
1367
+ "stuck_or_timeout_failure",
1368
+ ],
1369
+ },
1370
+ "script": [
1371
+ "cd app",
1372
+ "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
1373
+ "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
1374
+ "yarn install --immutable",
1375
+ "yarn lint",
1376
+ ],
1377
+ "stage": "test",
1378
+ "variables": {
1379
+ "APP_PATH": "app",
1380
+ "KUBERNETES_CPU_LIMIT": "2",
1381
+ "KUBERNETES_CPU_REQUEST": "0.5",
1382
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
1383
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
1384
+ "LANG": "en_US.UTF-8",
1385
+ "LC_A": "L=en_US.UTF-8",
1386
+ },
1387
+ },
1388
+ "app ๐Ÿ”จ app | review ": {
1389
+ "artifacts": {
1390
+ "paths": [
1391
+ "app/__build_info.json",
1392
+ "app/dist",
1393
+ "app/.next",
1394
+ ],
1395
+ "reports": {
1396
+ "junit": undefined,
1397
+ },
1398
+ },
1399
+ "cache": [
1400
+ {
1401
+ "key": {
1402
+ "files": [
1403
+ "app/Gemfile.lock",
1404
+ ],
1405
+ },
1406
+ "paths": [
1407
+ "app/vendor",
1408
+ ],
1409
+ },
1410
+ {
1411
+ "key": "app-yarn",
1412
+ "paths": [
1413
+ "app/.yarn",
1414
+ ],
1415
+ "policy": "pull-push",
1416
+ },
1417
+ {
1418
+ "key": "app-node-modules",
1419
+ "paths": [
1420
+ "app/node_modules",
1421
+ ],
1422
+ "policy": "pull-push",
1423
+ },
1424
+ {
1425
+ "key": "app-next-cache",
1426
+ "paths": [
1427
+ "app/.next/cache/",
1428
+ ],
1429
+ "policy": "pull-push",
1430
+ },
1431
+ ],
1432
+ "image": "path/to/docker/jobs-default:the-version",
1433
+ "interruptible": true,
1434
+ "needs": [],
1435
+ "retry": {
1436
+ "max": 2,
1437
+ "when": [
1438
+ "runner_system_failure",
1439
+ "stuck_or_timeout_failure",
1440
+ ],
1441
+ },
1442
+ "script": [
1443
+ "cat <<EOF > app/.env
1444
+ ENV_SHORT=review
1445
+ APP_DIR=app
1446
+ ENV_TYPE=review
1447
+ BUILD_INFO_ID=some-id
1448
+ BUILD_INFO_BUILD_TIME=01-01-2023 12:13:14
1449
+ BUILD_INFO_CURRENT_VERSION=3.2.1
1450
+ HOST=unknown-host.example.com
1451
+ ROOT_URL=https://unknown-host.example.com
1452
+ APP_STORE_CONNECT_API_KEY_CONTENT=$CL_review_app_APP_STORE_CONNECT_API_KEY_CONTENT
1453
+ APP_STORE_CONNECT_ISSUER_ID=$CL_review_app_APP_STORE_CONNECT_ISSUER_ID
1454
+ APP_STORE_CONNECT_API_KEY_ID=$CL_review_app_APP_STORE_CONNECT_API_KEY_ID
1455
+ GRAPHQL_URL=https://pan-test-app-review-mr1234-api-unknown-host.example.com/graphql
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","APP_STORE_CONNECT_API_KEY_CONTENT","APP_STORE_CONNECT_ISSUER_ID","APP_STORE_CONNECT_API_KEY_ID","GRAPHQL_URL"]
1457
+ EOF",
1458
+ "echo '{"id":"some-id","time":"01-01-2023 12:13:14"}' > app/__build_info.json",
1459
+ "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
1460
+ "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
1461
+ "cd app",
1462
+ "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
1463
+ "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
1464
+ "yarn install --immutable",
1465
+ "bundle config set --local path 'vendor/ruby'",
1466
+ "gem install bundler",
1467
+ "bundle install",
1468
+ "bundle exec pod install --project-directory=ios",
1469
+ "bundle exec fastlane build",
1470
+ ],
1471
+ "stage": "build",
1472
+ "tags": [
1473
+ "mac-runner",
1474
+ ],
1475
+ "variables": {
1476
+ "APP_DIR": "app",
1477
+ "APP_STORE_CONNECT_API_KEY_CONTENT": "$CL_review_app_APP_STORE_CONNECT_API_KEY_CONTENT",
1478
+ "APP_STORE_CONNECT_API_KEY_ID": "$CL_review_app_APP_STORE_CONNECT_API_KEY_ID",
1479
+ "APP_STORE_CONNECT_ISSUER_ID": "$CL_review_app_APP_STORE_CONNECT_ISSUER_ID",
1480
+ "BUILD_INFO_BUILD_TIME": "01-01-2023 12:13:14",
1481
+ "BUILD_INFO_CURRENT_VERSION": "3.2.1",
1482
+ "BUILD_INFO_ID": "some-id",
1483
+ "ENV_SHORT": "review",
1484
+ "ENV_TYPE": "review",
1485
+ "GRAPHQL_URL": "https://pan-test-app-review-mr1234-api-unknown-host.example.com/graphql",
1486
+ "HOST": "unknown-host.example.com",
1487
+ "KUBERNETES_CPU_LIMIT": "2",
1488
+ "KUBERNETES_CPU_REQUEST": "0.5",
1489
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
1490
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
1491
+ "LANG": "en_US.UTF-8",
1492
+ "LC_A": "L=en_US.UTF-8",
1493
+ "ROOT_URL": "https://unknown-host.example.com",
1494
+ "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","APP_STORE_CONNECT_API_KEY_CONTENT","APP_STORE_CONNECT_ISSUER_ID","APP_STORE_CONNECT_API_KEY_ID","GRAPHQL_URL"]",
1495
+ },
1496
+ },
1497
+ "app ๐Ÿš€ Deploy | review ": {
1498
+ "allow_failure": false,
1499
+ "cache": [
1500
+ {
1501
+ "key": {
1502
+ "files": [
1503
+ "app/Gemfile.lock",
1504
+ ],
1505
+ },
1506
+ "paths": [
1507
+ "app/vendor",
1508
+ ],
1509
+ },
1510
+ ],
1511
+ "environment": {
1512
+ "name": "review/some-commit/app",
1513
+ "url": "https://unknown-host.example.com",
1514
+ },
1515
+ "image": "path/to/docker/jobs-default:the-version",
1516
+ "interruptible": true,
1517
+ "needs": [
1518
+ {
1519
+ "artifacts": false,
1520
+ "job": "app ๐Ÿ‘ฎ lint",
1521
+ },
1522
+ {
1523
+ "artifacts": true,
1524
+ "job": "app ๐Ÿ”จ app | review ",
1525
+ },
1526
+ {
1527
+ "artifacts": false,
1528
+ "job": "app ๐Ÿงช test",
1529
+ },
1530
+ {
1531
+ "artifacts": false,
1532
+ "job": "app ๐Ÿ›ก audit",
1533
+ },
1534
+ ],
1535
+ "retry": {
1536
+ "max": 2,
1537
+ "when": [
1538
+ "runner_system_failure",
1539
+ "stuck_or_timeout_failure",
1540
+ ],
1541
+ },
1542
+ "rules": [
1543
+ {
1544
+ "when": "on_success",
1545
+ },
1546
+ ],
1547
+ "script": [
1548
+ "cd app",
1549
+ "bundle config set --local path 'vendor/ruby'",
1550
+ "gem install bundler",
1551
+ "bundle install",
1552
+ "bundle exec fastlane deploy_test",
1553
+ ],
1554
+ "stage": "deploy review",
1555
+ "tags": [
1556
+ "mac-runner",
1557
+ ],
1558
+ "variables": {
1559
+ "APP_DIR": "app",
1560
+ "APP_STORE_CONNECT_API_KEY_CONTENT": "$CL_review_app_APP_STORE_CONNECT_API_KEY_CONTENT",
1561
+ "APP_STORE_CONNECT_API_KEY_ID": "$CL_review_app_APP_STORE_CONNECT_API_KEY_ID",
1562
+ "APP_STORE_CONNECT_ISSUER_ID": "$CL_review_app_APP_STORE_CONNECT_ISSUER_ID",
1563
+ "BUILD_INFO_BUILD_TIME": "01-01-2023 12:13:14",
1564
+ "BUILD_INFO_CURRENT_VERSION": "3.2.1",
1565
+ "BUILD_INFO_ID": "some-id",
1566
+ "ENV_SHORT": "review",
1567
+ "ENV_TYPE": "review",
1568
+ "GRAPHQL_URL": "https://pan-test-app-review-mr1234-api-unknown-host.example.com/graphql",
1569
+ "HOST": "unknown-host.example.com",
1570
+ "KUBERNETES_CPU_LIMIT": "1",
1571
+ "KUBERNETES_CPU_REQUEST": "0.5",
1572
+ "KUBERNETES_MEMORY_LIMIT": "400Mi",
1573
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
1574
+ "LANG": "en_US.UTF-8",
1575
+ "LC_A": "L=en_US.UTF-8",
1576
+ "ROOT_URL": "https://unknown-host.example.com",
1577
+ "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","APP_STORE_CONNECT_API_KEY_CONTENT","APP_STORE_CONNECT_ISSUER_ID","APP_STORE_CONNECT_API_KEY_ID","GRAPHQL_URL"]",
1578
+ },
1579
+ },
1580
+ "app ๐Ÿ›ก audit": {
1581
+ "allow_failure": true,
1582
+ "interruptible": true,
1583
+ "needs": [],
1584
+ "retry": {
1585
+ "max": 2,
1586
+ "when": [
1587
+ "runner_system_failure",
1588
+ "stuck_or_timeout_failure",
1589
+ ],
1590
+ },
1591
+ "script": [
1592
+ "cd app",
1593
+ "yarn npm audit --environment production",
1594
+ ],
1595
+ "stage": "test",
1596
+ "variables": {
1597
+ "APP_PATH": "app",
1598
+ "KUBERNETES_CPU_LIMIT": "2",
1599
+ "KUBERNETES_CPU_REQUEST": "0.5",
1600
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
1601
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
1602
+ "LANG": "en_US.UTF-8",
1603
+ "LC_A": "L=en_US.UTF-8",
1604
+ },
1605
+ },
1606
+ "app ๐Ÿงช test": {
1607
+ "cache": [
1608
+ {
1609
+ "key": "app-yarn",
1610
+ "paths": [
1611
+ "app/.yarn",
1612
+ ],
1613
+ "policy": "pull-push",
1614
+ },
1615
+ {
1616
+ "key": "app-node-modules",
1617
+ "paths": [
1618
+ "app/node_modules",
1619
+ ],
1620
+ "policy": "pull-push",
1621
+ },
1622
+ ],
1623
+ "image": "path/to/docker/jobs-testing-chrome:the-version",
1624
+ "interruptible": true,
1625
+ "needs": [],
1626
+ "retry": {
1627
+ "max": 2,
1628
+ "when": [
1629
+ "runner_system_failure",
1630
+ "stuck_or_timeout_failure",
1631
+ ],
1632
+ },
1633
+ "script": [
1634
+ "cd app",
1635
+ "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
1636
+ "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
1637
+ "yarn install --immutable",
1638
+ "yarn test",
1639
+ ],
1640
+ "stage": "test",
1641
+ "variables": {
1642
+ "APP_PATH": "app",
1643
+ "KUBERNETES_CPU_LIMIT": "2",
1644
+ "KUBERNETES_CPU_REQUEST": "0.5",
1645
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
1646
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
1647
+ "LANG": "en_US.UTF-8",
1648
+ "LC_A": "L=en_US.UTF-8",
1649
+ },
1650
+ },
1651
+ "app ๐Ÿงพ sbom upload | review ": {
1652
+ "allow_failure": true,
1653
+ "image": "git.panter.ch:5001/open-source/dependency-track-uploader:dtrackuploader-v0.2.1",
1654
+ "interruptible": true,
1655
+ "needs": [
1656
+ "app ๐Ÿงพ sbom | review ",
1657
+ ],
1658
+ "retry": {
1659
+ "max": 2,
1660
+ "when": [
1661
+ "runner_system_failure",
1662
+ "stuck_or_timeout_failure",
1663
+ ],
1664
+ },
1665
+ "script": [
1666
+ "/dtrackuploader https://dep.panter.dev/ "$DT_KEY" upload "pan-test-app/app" "review" "__sbom.json" vex.json",
1667
+ ],
1668
+ "stage": "verify",
1669
+ "variables": {},
1670
+ },
1671
+ "app ๐Ÿงพ sbom | review ": {
1672
+ "allow_failure": true,
1673
+ "artifacts": {
1674
+ "paths": [
1675
+ "__sbom.json",
1676
+ ],
1677
+ },
1678
+ "image": "aquasec/trivy:0.38.3",
1679
+ "interruptible": true,
1680
+ "needs": [
1681
+ "app ๐Ÿš€ Deploy | review ",
1682
+ ],
1683
+ "retry": {
1684
+ "max": 2,
1685
+ "when": [
1686
+ "runner_system_failure",
1687
+ "stuck_or_timeout_failure",
1688
+ ],
1689
+ },
1690
+ "script": [
1691
+ "trivy fs --quiet --format cyclonedx --output "__sbom.json" app",
1692
+ ],
1693
+ "stage": "verify",
1694
+ "variables": {},
1695
+ },
1696
+ },
1697
+ "stages": [
1698
+ "setup",
1699
+ "setup dev",
1700
+ "setup review",
1701
+ "setup stage",
1702
+ "setup prod",
1703
+ "setup local",
1704
+ "test",
1705
+ "test dev",
1706
+ "test review",
1707
+ "test stage",
1708
+ "test prod",
1709
+ "test local",
1710
+ "build",
1711
+ "build dev",
1712
+ "build review",
1713
+ "build stage",
1714
+ "build prod",
1715
+ "build local",
1716
+ "deploy",
1717
+ "deploy dev",
1718
+ "deploy review",
1719
+ "deploy stage",
1720
+ "deploy prod",
1721
+ "deploy local",
1722
+ "verify",
1723
+ "verify dev",
1724
+ "verify review",
1725
+ "verify stage",
1726
+ "verify prod",
1727
+ "verify local",
1728
+ "rollback",
1729
+ "rollback dev",
1730
+ "rollback review",
1731
+ "rollback stage",
1732
+ "rollback prod",
1733
+ "rollback local",
1734
+ "stop",
1735
+ "stop dev",
1736
+ "stop review",
1737
+ "stop stage",
1738
+ "stop prod",
1739
+ "stop local",
1740
+ ],
1741
+ "variables": {
1742
+ "FF_USE_FASTZIP": "true",
1743
+ },
1744
+ "workflow": {
1745
+ "rules": [
1746
+ {
1747
+ "if": "$CI_COMMIT_TAG",
1748
+ },
1749
+ {
1750
+ "if": "$CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/",
1751
+ "when": "never",
1752
+ },
1753
+ {
1754
+ "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+.([0-9]+|x).x$/",
1755
+ },
1756
+ {
1757
+ "if": "$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH",
1758
+ },
1759
+ {
1760
+ "if": "$CI_MERGE_REQUEST_ID",
1761
+ },
1762
+ ],
1763
+ },
1764
+ },
1765
+ "taggedRelease": {
1766
+ "image": "path/to/docker/jobs-default:the-version",
1767
+ "jobs": {
1768
+ "api ๐Ÿ”จ app | prod ": {
1769
+ "artifacts": {
1770
+ "paths": [
1771
+ "api/__build_info.json",
1772
+ "api/dist",
1773
+ "api/.next",
1774
+ ],
1775
+ "reports": {
1776
+ "junit": undefined,
1777
+ },
1778
+ },
1779
+ "cache": [
1780
+ {
1781
+ "key": "api-yarn",
1782
+ "paths": [
1783
+ "api/.yarn",
1784
+ ],
1785
+ "policy": "pull-push",
1786
+ },
1787
+ {
1788
+ "key": "api-node-modules",
1789
+ "paths": [
1790
+ "api/node_modules",
1791
+ ],
1792
+ "policy": "pull-push",
1793
+ },
1794
+ {
1795
+ "key": "api-next-cache",
1796
+ "paths": [
1797
+ "api/.next/cache/",
1798
+ ],
1799
+ "policy": "pull-push",
1800
+ },
1801
+ ],
1802
+ "image": "path/to/docker/jobs-default:the-version",
1803
+ "interruptible": true,
1804
+ "needs": [],
1805
+ "retry": {
1806
+ "max": 2,
1807
+ "when": [
1808
+ "runner_system_failure",
1809
+ "stuck_or_timeout_failure",
1810
+ ],
1811
+ },
1812
+ "script": [
1813
+ "echo '{"id":"some-id","time":"01-01-2023 12:13:14"}' > api/__build_info.json",
1814
+ "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
1815
+ "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
1816
+ "cd api",
1817
+ "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
1818
+ "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
1819
+ "yarn install --immutable",
1820
+ "yarn build",
1821
+ ],
1822
+ "stage": "build",
1823
+ "variables": {
1824
+ "APP_DIR": "api",
1825
+ "BUILD_INFO_BUILD_TIME": "01-01-2023 12:13:14",
1826
+ "BUILD_INFO_CURRENT_VERSION": "3.2.1",
1827
+ "BUILD_INFO_ID": "some-id",
1828
+ "ENV_SHORT": "prod",
1829
+ "ENV_TYPE": "prod",
1830
+ "GCLOUD_DEPLOY_credentialsKey": "$CL_prod_api_GCLOUD_DEPLOY_credentialsKey",
1831
+ "GCLOUD_RUN_canonicalHostSuffix": "$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix",
1832
+ "HOST": "pan-test-app-prod-api-unknown-host.example.com",
1833
+ "HOST_CANONICAL": "pan-test-app-prod-api-unknown-host.example.com",
1834
+ "KUBERNETES_CPU_LIMIT": "2",
1835
+ "KUBERNETES_CPU_REQUEST": "0.5",
1836
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
1837
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
1838
+ "ROOT_URL": "https://pan-test-app-prod-api-unknown-host.example.com",
1839
+ "_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"]",
1840
+ },
1841
+ },
1842
+ "api ๐Ÿ”จ app | stage ": {
1843
+ "artifacts": {
1844
+ "paths": [
1845
+ "api/__build_info.json",
1846
+ "api/dist",
1847
+ "api/.next",
1848
+ ],
1849
+ "reports": {
1850
+ "junit": undefined,
1851
+ },
1852
+ },
1853
+ "cache": [
1854
+ {
1855
+ "key": "api-yarn",
1856
+ "paths": [
1857
+ "api/.yarn",
1858
+ ],
1859
+ "policy": "pull-push",
1860
+ },
1861
+ {
1862
+ "key": "api-node-modules",
1863
+ "paths": [
1864
+ "api/node_modules",
1865
+ ],
1866
+ "policy": "pull-push",
1867
+ },
1868
+ {
1869
+ "key": "api-next-cache",
1870
+ "paths": [
1871
+ "api/.next/cache/",
1872
+ ],
1873
+ "policy": "pull-push",
1874
+ },
1875
+ ],
1876
+ "image": "path/to/docker/jobs-default:the-version",
1877
+ "interruptible": true,
1878
+ "needs": [],
1879
+ "retry": {
1880
+ "max": 2,
1881
+ "when": [
1882
+ "runner_system_failure",
1883
+ "stuck_or_timeout_failure",
1884
+ ],
1885
+ },
1886
+ "script": [
1887
+ "echo '{"id":"some-id","time":"01-01-2023 12:13:14"}' > api/__build_info.json",
1888
+ "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
1889
+ "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
1890
+ "cd api",
1891
+ "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
1892
+ "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
1893
+ "yarn install --immutable",
1894
+ "yarn build",
1895
+ ],
1896
+ "stage": "build",
1897
+ "variables": {
1898
+ "APP_DIR": "api",
1899
+ "BUILD_INFO_BUILD_TIME": "01-01-2023 12:13:14",
1900
+ "BUILD_INFO_CURRENT_VERSION": "3.2.1",
1901
+ "BUILD_INFO_ID": "some-id",
1902
+ "ENV_SHORT": "stage",
1903
+ "ENV_TYPE": "stage",
1904
+ "GCLOUD_DEPLOY_credentialsKey": "$CL_stage_api_GCLOUD_DEPLOY_credentialsKey",
1905
+ "GCLOUD_RUN_canonicalHostSuffix": "$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix",
1906
+ "HOST": "pan-test-app-stage-api-unknown-host.example.com",
1907
+ "HOST_CANONICAL": "pan-test-app-stage-api-unknown-host.example.com",
1908
+ "KUBERNETES_CPU_LIMIT": "2",
1909
+ "KUBERNETES_CPU_REQUEST": "0.5",
1910
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
1911
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
1912
+ "ROOT_URL": "https://pan-test-app-stage-api-unknown-host.example.com",
1913
+ "_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"]",
1914
+ },
1915
+ },
1916
+ "api ๐Ÿ”จ docker | prod ": {
1917
+ "cache": [
1918
+ {
1919
+ "key": "api-yarn",
1920
+ "paths": [
1921
+ "api/.yarn",
1922
+ ],
1923
+ "policy": "pull",
1924
+ },
1925
+ ],
1926
+ "image": "path/to/docker/docker-build:the-version",
1927
+ "interruptible": true,
1928
+ "needs": [
1929
+ "api ๐Ÿ”จ app | prod ",
1930
+ ],
1931
+ "retry": {
1932
+ "max": 2,
1933
+ "when": [
1934
+ "runner_system_failure",
1935
+ "stuck_or_timeout_failure",
1936
+ ],
1937
+ },
1938
+ "script": [
1939
+ "ensureNodeDockerfile",
1940
+ "docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY",
1941
+ "docker version",
1942
+ "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",
1943
+ "docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
1944
+ "docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE",
1945
+ "docker push $DOCKER_CACHE_IMAGE",
1946
+ ],
1947
+ "services": [
1948
+ {
1949
+ "command": [
1950
+ "--tls=false",
1951
+ ],
1952
+ "name": "docker:20-dind",
1953
+ },
1954
+ ],
1955
+ "stage": "build",
1956
+ "variables": {
1957
+ "APP_DIR": "api",
1958
+ "DOCKERFILE_ADDITIONS": undefined,
1959
+ "DOCKERFILE_ADDITIONS_END": undefined,
1960
+ "DOCKER_BUILDKIT": "1",
1961
+ "DOCKER_CACHE_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/caches/api",
1962
+ "DOCKER_COPY_AND_INSTALL_APP": "COPY --chown=node:node $APP_DIR .
1963
+ RUN yarn plugin import workspace-tools
1964
+ RUN yarn workspaces focus --production && yarn rebuild",
1965
+ "DOCKER_COPY_WORKSPACE_FILES": "COPY --chown=node:node api/package.json /app/api/package.json
1966
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
1967
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
1968
+ COPY --chown=node:node .yarn /app/.yarn",
1969
+ "DOCKER_DIR": ".",
1970
+ "DOCKER_DRIVER": "overlay2",
1971
+ "DOCKER_HOST": "tcp://0.0.0.0:2375",
1972
+ "DOCKER_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/$DOCKER_IMAGE_NAME",
1973
+ "DOCKER_IMAGE_NAME": "prod/api",
1974
+ "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
1975
+ "DOCKER_REGISTRY": "$CI_REGISTRY",
1976
+ "DOCKER_REGISTRY_IMAGE_PATH": "$CI_REGISTRY_IMAGE",
1977
+ "DOCKER_TLS_CERTDIR": "",
1978
+ "KUBERNETES_CPU_LIMIT": "1",
1979
+ "KUBERNETES_CPU_REQUEST": "0.5",
1980
+ "KUBERNETES_MEMORY_LIMIT": "2Gi",
1981
+ "KUBERNETES_MEMORY_REQUEST": "1Gi",
1982
+ },
1983
+ },
1984
+ "api ๐Ÿ”จ docker | stage ": {
1985
+ "cache": [
1986
+ {
1987
+ "key": "api-yarn",
1988
+ "paths": [
1989
+ "api/.yarn",
1990
+ ],
1991
+ "policy": "pull",
1992
+ },
1993
+ ],
1994
+ "image": "path/to/docker/docker-build:the-version",
1995
+ "interruptible": true,
1996
+ "needs": [
1997
+ "api ๐Ÿ”จ app | stage ",
1998
+ ],
1999
+ "retry": {
2000
+ "max": 2,
2001
+ "when": [
2002
+ "runner_system_failure",
2003
+ "stuck_or_timeout_failure",
2004
+ ],
2005
+ },
2006
+ "script": [
2007
+ "ensureNodeDockerfile",
2008
+ "docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY",
2009
+ "docker version",
2010
+ "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",
2011
+ "docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
2012
+ "docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE",
2013
+ "docker push $DOCKER_CACHE_IMAGE",
2014
+ ],
2015
+ "services": [
2016
+ {
2017
+ "command": [
2018
+ "--tls=false",
2019
+ ],
2020
+ "name": "docker:20-dind",
2021
+ },
2022
+ ],
2023
+ "stage": "build",
2024
+ "variables": {
2025
+ "APP_DIR": "api",
2026
+ "DOCKERFILE_ADDITIONS": undefined,
2027
+ "DOCKERFILE_ADDITIONS_END": undefined,
2028
+ "DOCKER_BUILDKIT": "1",
2029
+ "DOCKER_CACHE_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/caches/api",
2030
+ "DOCKER_COPY_AND_INSTALL_APP": "COPY --chown=node:node $APP_DIR .
2031
+ RUN yarn plugin import workspace-tools
2032
+ RUN yarn workspaces focus --production && yarn rebuild",
2033
+ "DOCKER_COPY_WORKSPACE_FILES": "COPY --chown=node:node api/package.json /app/api/package.json
2034
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
2035
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
2036
+ COPY --chown=node:node .yarn /app/.yarn",
2037
+ "DOCKER_DIR": ".",
2038
+ "DOCKER_DRIVER": "overlay2",
2039
+ "DOCKER_HOST": "tcp://0.0.0.0:2375",
2040
+ "DOCKER_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/$DOCKER_IMAGE_NAME",
2041
+ "DOCKER_IMAGE_NAME": "stage/api",
2042
+ "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
2043
+ "DOCKER_REGISTRY": "$CI_REGISTRY",
2044
+ "DOCKER_REGISTRY_IMAGE_PATH": "$CI_REGISTRY_IMAGE",
2045
+ "DOCKER_TLS_CERTDIR": "",
2046
+ "KUBERNETES_CPU_LIMIT": "1",
2047
+ "KUBERNETES_CPU_REQUEST": "0.5",
2048
+ "KUBERNETES_MEMORY_LIMIT": "2Gi",
2049
+ "KUBERNETES_MEMORY_REQUEST": "1Gi",
2050
+ },
2051
+ },
2052
+ "api ๐Ÿš€ Deploy | prod ": {
2053
+ "allow_failure": true,
2054
+ "artifacts": {
2055
+ "paths": [
2056
+ "____envvars.yaml",
2057
+ ],
2058
+ },
2059
+ "environment": {
2060
+ "auto_stop_in": undefined,
2061
+ "name": "prod/api",
2062
+ "on_stop": "api ๐Ÿ›‘ Stop โš ๏ธ | prod ",
2063
+ "url": "https://pan-test-app-prod-api-unknown-host.example.com",
2064
+ },
2065
+ "image": "path/to/docker/gcloud:the-version",
2066
+ "interruptible": true,
2067
+ "needs": [
2068
+ {
2069
+ "artifacts": false,
2070
+ "job": "api ๐Ÿ”จ app | prod ",
2071
+ },
2072
+ {
2073
+ "artifacts": false,
2074
+ "job": "api ๐Ÿ”จ docker | prod ",
2075
+ },
2076
+ ],
2077
+ "retry": {
2078
+ "max": 2,
2079
+ "when": [
2080
+ "runner_system_failure",
2081
+ "stuck_or_timeout_failure",
2082
+ ],
2083
+ },
2084
+ "rules": [
2085
+ {
2086
+ "when": "manual",
2087
+ },
2088
+ ],
2089
+ "script": [
2090
+ "echo $CL_prod_api_GCLOUD_DEPLOY_credentialsKey > ./____keyfile.json
2091
+ ",
2092
+ "gcloud auth activate-service-account --key-file="./____keyfile.json"",
2093
+ "export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe asdf --format="value(projectNumber)")",
2094
+ "echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"",
2095
+ "docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY",
2096
+ "gcloud auth configure-docker asia-east1-docker.pkg.dev",
2097
+ "docker pull $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
2098
+ "docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG",
2099
+ "docker push asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG",
2100
+ "echo "$ENV_VARS" > ____envvars.yaml",
2101
+ "gcloud run deploy pan-test-app-prod-api --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",
2102
+ "docker image rm asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG",
2103
+ ],
2104
+ "services": [
2105
+ {
2106
+ "command": [
2107
+ "--tls=false",
2108
+ ],
2109
+ "name": "docker:20-dind",
2110
+ },
2111
+ ],
2112
+ "stage": "deploy prod",
2113
+ "variables": {
2114
+ "APP_DIR": "api",
2115
+ "BUILD_INFO_BUILD_TIME": "01-01-2023 12:13:14",
2116
+ "BUILD_INFO_CURRENT_VERSION": "3.2.1",
2117
+ "BUILD_INFO_ID": "some-id",
2118
+ "CLOUDSDK_CORE_DISABLE_PROMPTS": "1",
2119
+ "DOCKER_BUILDKIT": "1",
2120
+ "DOCKER_CACHE_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/caches/api",
2121
+ "DOCKER_DRIVER": "overlay2",
2122
+ "DOCKER_HOST": "tcp://0.0.0.0:2375",
2123
+ "DOCKER_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/$DOCKER_IMAGE_NAME",
2124
+ "DOCKER_IMAGE_NAME": "prod/api",
2125
+ "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
2126
+ "DOCKER_REGISTRY": "$CI_REGISTRY",
2127
+ "DOCKER_REGISTRY_IMAGE_PATH": "$CI_REGISTRY_IMAGE",
2128
+ "DOCKER_TLS_CERTDIR": "",
2129
+ "ENV_SHORT": "prod",
2130
+ "ENV_TYPE": "prod",
2131
+ "ENV_VARS": "ENV_SHORT: 'prod'
2132
+ APP_DIR: 'api'
2133
+ ENV_TYPE: 'prod'
2134
+ BUILD_INFO_ID: 'some-id'
2135
+ BUILD_INFO_BUILD_TIME: '01-01-2023 12:13:14'
2136
+ BUILD_INFO_CURRENT_VERSION: '3.2.1'
2137
+ HOST: 'pan-test-app-prod-api-unknown-host.example.com'
2138
+ ROOT_URL: 'https://pan-test-app-prod-api-unknown-host.example.com'
2139
+ HOST_CANONICAL: 'pan-test-app-prod-api-unknown-host.example.com'
2140
+ GCLOUD_RUN_canonicalHostSuffix: '$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix'
2141
+ _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"]'
2142
+ ",
2143
+ "GCLOUD_DEPLOY_credentialsKey": "$CL_prod_api_GCLOUD_DEPLOY_credentialsKey",
2144
+ "GCLOUD_RUN_canonicalHostSuffix": "$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix",
2145
+ "HOST": "pan-test-app-prod-api-unknown-host.example.com",
2146
+ "HOST_CANONICAL": "pan-test-app-prod-api-unknown-host.example.com",
2147
+ "KUBERNETES_CPU_LIMIT": "1",
2148
+ "KUBERNETES_CPU_REQUEST": "0.5",
2149
+ "KUBERNETES_MEMORY_LIMIT": "400Mi",
2150
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
2151
+ "ROOT_URL": "https://pan-test-app-prod-api-unknown-host.example.com",
2152
+ "_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"]",
2153
+ },
2154
+ },
2155
+ "api ๐Ÿš€ Deploy | stage ": {
2156
+ "allow_failure": false,
2157
+ "artifacts": {
2158
+ "paths": [
2159
+ "____envvars.yaml",
2160
+ ],
2161
+ },
2162
+ "environment": {
2163
+ "auto_stop_in": undefined,
2164
+ "name": "stage/api",
2165
+ "on_stop": "api ๐Ÿ›‘ Stop โš ๏ธ | stage ",
2166
+ "url": "https://pan-test-app-stage-api-unknown-host.example.com",
2167
+ },
2168
+ "image": "path/to/docker/gcloud:the-version",
2169
+ "interruptible": true,
2170
+ "needs": [
2171
+ {
2172
+ "artifacts": false,
2173
+ "job": "api ๐Ÿ”จ app | stage ",
2174
+ },
2175
+ {
2176
+ "artifacts": false,
2177
+ "job": "api ๐Ÿ”จ docker | stage ",
2178
+ },
2179
+ ],
2180
+ "retry": {
2181
+ "max": 2,
2182
+ "when": [
2183
+ "runner_system_failure",
2184
+ "stuck_or_timeout_failure",
2185
+ ],
2186
+ },
2187
+ "rules": [
2188
+ {
2189
+ "when": "on_success",
2190
+ },
2191
+ ],
2192
+ "script": [
2193
+ "echo $CL_stage_api_GCLOUD_DEPLOY_credentialsKey > ./____keyfile.json
2194
+ ",
2195
+ "gcloud auth activate-service-account --key-file="./____keyfile.json"",
2196
+ "export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe asdf --format="value(projectNumber)")",
2197
+ "echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"",
2198
+ "docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY",
2199
+ "gcloud auth configure-docker asia-east1-docker.pkg.dev",
2200
+ "docker pull $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
2201
+ "docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG",
2202
+ "docker push asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG",
2203
+ "echo "$ENV_VARS" > ____envvars.yaml",
2204
+ "gcloud run deploy pan-test-app-stage-api --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",
2205
+ "docker image rm asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG",
2206
+ ],
2207
+ "services": [
2208
+ {
2209
+ "command": [
2210
+ "--tls=false",
2211
+ ],
2212
+ "name": "docker:20-dind",
2213
+ },
2214
+ ],
2215
+ "stage": "deploy stage",
2216
+ "variables": {
2217
+ "APP_DIR": "api",
2218
+ "BUILD_INFO_BUILD_TIME": "01-01-2023 12:13:14",
2219
+ "BUILD_INFO_CURRENT_VERSION": "3.2.1",
2220
+ "BUILD_INFO_ID": "some-id",
2221
+ "CLOUDSDK_CORE_DISABLE_PROMPTS": "1",
2222
+ "DOCKER_BUILDKIT": "1",
2223
+ "DOCKER_CACHE_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/caches/api",
2224
+ "DOCKER_DRIVER": "overlay2",
2225
+ "DOCKER_HOST": "tcp://0.0.0.0:2375",
2226
+ "DOCKER_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/$DOCKER_IMAGE_NAME",
2227
+ "DOCKER_IMAGE_NAME": "stage/api",
2228
+ "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
2229
+ "DOCKER_REGISTRY": "$CI_REGISTRY",
2230
+ "DOCKER_REGISTRY_IMAGE_PATH": "$CI_REGISTRY_IMAGE",
2231
+ "DOCKER_TLS_CERTDIR": "",
2232
+ "ENV_SHORT": "stage",
2233
+ "ENV_TYPE": "stage",
2234
+ "ENV_VARS": "ENV_SHORT: 'stage'
2235
+ APP_DIR: 'api'
2236
+ ENV_TYPE: 'stage'
2237
+ BUILD_INFO_ID: 'some-id'
2238
+ BUILD_INFO_BUILD_TIME: '01-01-2023 12:13:14'
2239
+ BUILD_INFO_CURRENT_VERSION: '3.2.1'
2240
+ HOST: 'pan-test-app-stage-api-unknown-host.example.com'
2241
+ ROOT_URL: 'https://pan-test-app-stage-api-unknown-host.example.com'
2242
+ HOST_CANONICAL: 'pan-test-app-stage-api-unknown-host.example.com'
2243
+ GCLOUD_RUN_canonicalHostSuffix: '$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix'
2244
+ _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"]'
2245
+ ",
2246
+ "GCLOUD_DEPLOY_credentialsKey": "$CL_stage_api_GCLOUD_DEPLOY_credentialsKey",
2247
+ "GCLOUD_RUN_canonicalHostSuffix": "$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix",
2248
+ "HOST": "pan-test-app-stage-api-unknown-host.example.com",
2249
+ "HOST_CANONICAL": "pan-test-app-stage-api-unknown-host.example.com",
2250
+ "KUBERNETES_CPU_LIMIT": "1",
2251
+ "KUBERNETES_CPU_REQUEST": "0.5",
2252
+ "KUBERNETES_MEMORY_LIMIT": "400Mi",
2253
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
2254
+ "ROOT_URL": "https://pan-test-app-stage-api-unknown-host.example.com",
2255
+ "_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"]",
2256
+ },
2257
+ },
2258
+ "api ๐Ÿ›‘ Stop โš ๏ธ | prod ": {
2259
+ "environment": {
2260
+ "action": "stop",
2261
+ "name": "prod/api",
2262
+ "url": "https://pan-test-app-prod-api-unknown-host.example.com",
2263
+ },
2264
+ "image": "path/to/docker/gcloud:the-version",
2265
+ "interruptible": true,
2266
+ "needs": [],
2267
+ "retry": {
2268
+ "max": 2,
2269
+ "when": [
2270
+ "runner_system_failure",
2271
+ "stuck_or_timeout_failure",
2272
+ ],
2273
+ },
2274
+ "rules": [
2275
+ {
2276
+ "allow_failure": true,
2277
+ "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/",
2278
+ "when": "on_success",
2279
+ },
2280
+ {
2281
+ "allow_failure": true,
2282
+ "when": "manual",
2283
+ },
2284
+ ],
2285
+ "script": [
2286
+ "set +e",
2287
+ "echo $CL_prod_api_GCLOUD_DEPLOY_credentialsKey > ./____keyfile.json
2288
+ ",
2289
+ "gcloud auth activate-service-account --key-file="./____keyfile.json"",
2290
+ "gcloud run services delete pan-test-app-prod-api --project=asdf --region=asia-east1",
2291
+ "set -e",
2292
+ ],
2293
+ "stage": "stop prod",
2294
+ "variables": {
2295
+ "CLOUDSDK_CORE_DISABLE_PROMPTS": "1",
2296
+ "GIT_STRATEGY": "none",
2297
+ "KUBERNETES_CPU_LIMIT": "1",
2298
+ "KUBERNETES_CPU_REQUEST": "0.5",
2299
+ "KUBERNETES_MEMORY_LIMIT": "400Mi",
2300
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
2301
+ },
2302
+ },
2303
+ "api ๐Ÿ›‘ Stop โš ๏ธ | stage ": {
2304
+ "environment": {
2305
+ "action": "stop",
2306
+ "name": "stage/api",
2307
+ "url": "https://pan-test-app-stage-api-unknown-host.example.com",
2308
+ },
2309
+ "image": "path/to/docker/gcloud:the-version",
2310
+ "interruptible": true,
2311
+ "needs": [],
2312
+ "retry": {
2313
+ "max": 2,
2314
+ "when": [
2315
+ "runner_system_failure",
2316
+ "stuck_or_timeout_failure",
2317
+ ],
2318
+ },
2319
+ "rules": [
2320
+ {
2321
+ "allow_failure": true,
2322
+ "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/",
2323
+ "when": "on_success",
2324
+ },
2325
+ {
2326
+ "allow_failure": true,
2327
+ "when": "manual",
2328
+ },
2329
+ ],
2330
+ "script": [
2331
+ "set +e",
2332
+ "echo $CL_stage_api_GCLOUD_DEPLOY_credentialsKey > ./____keyfile.json
2333
+ ",
2334
+ "gcloud auth activate-service-account --key-file="./____keyfile.json"",
2335
+ "gcloud run services delete pan-test-app-stage-api --project=asdf --region=asia-east1",
2336
+ "set -e",
2337
+ ],
2338
+ "stage": "stop stage",
2339
+ "variables": {
2340
+ "CLOUDSDK_CORE_DISABLE_PROMPTS": "1",
2341
+ "GIT_STRATEGY": "none",
2342
+ "KUBERNETES_CPU_LIMIT": "1",
2343
+ "KUBERNETES_CPU_REQUEST": "0.5",
2344
+ "KUBERNETES_MEMORY_LIMIT": "400Mi",
2345
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
2346
+ },
2347
+ },
2348
+ "api ๐Ÿงพ sbom upload | prod ": {
2349
+ "allow_failure": true,
2350
+ "image": "git.panter.ch:5001/open-source/dependency-track-uploader:dtrackuploader-v0.2.1",
2351
+ "interruptible": true,
2352
+ "needs": [
2353
+ "api ๐Ÿงพ sbom | prod ",
2354
+ ],
2355
+ "retry": {
2356
+ "max": 2,
2357
+ "when": [
2358
+ "runner_system_failure",
2359
+ "stuck_or_timeout_failure",
2360
+ ],
2361
+ },
2362
+ "script": [
2363
+ "/dtrackuploader https://dep.panter.dev/ "$DT_KEY" upload "pan-test-app/api" "prod" "__sbom.json" vex.json",
2364
+ ],
2365
+ "stage": "verify",
2366
+ "variables": {},
2367
+ },
2368
+ "api ๐Ÿงพ sbom upload | stage ": {
2369
+ "allow_failure": true,
2370
+ "image": "git.panter.ch:5001/open-source/dependency-track-uploader:dtrackuploader-v0.2.1",
2371
+ "interruptible": true,
2372
+ "needs": [
2373
+ "api ๐Ÿงพ sbom | stage ",
2374
+ ],
2375
+ "retry": {
2376
+ "max": 2,
2377
+ "when": [
2378
+ "runner_system_failure",
2379
+ "stuck_or_timeout_failure",
2380
+ ],
2381
+ },
2382
+ "script": [
2383
+ "/dtrackuploader https://dep.panter.dev/ "$DT_KEY" upload "pan-test-app/api" "stage" "__sbom.json" vex.json",
2384
+ ],
2385
+ "stage": "verify",
2386
+ "variables": {},
2387
+ },
2388
+ "api ๐Ÿงพ sbom | prod ": {
2389
+ "allow_failure": true,
2390
+ "artifacts": {
2391
+ "paths": [
2392
+ "__sbom.json",
2393
+ ],
2394
+ },
2395
+ "image": "aquasec/trivy:0.38.3",
2396
+ "interruptible": true,
2397
+ "needs": [
2398
+ "api ๐Ÿš€ Deploy | prod ",
2399
+ ],
2400
+ "retry": {
2401
+ "max": 2,
2402
+ "when": [
2403
+ "runner_system_failure",
2404
+ "stuck_or_timeout_failure",
2405
+ ],
2406
+ },
2407
+ "script": [
2408
+ "trivy fs --quiet --format cyclonedx --output "__sbom.json" api",
2409
+ ],
2410
+ "stage": "verify",
2411
+ "variables": {},
2412
+ },
2413
+ "api ๐Ÿงพ sbom | stage ": {
2414
+ "allow_failure": true,
2415
+ "artifacts": {
2416
+ "paths": [
2417
+ "__sbom.json",
2418
+ ],
2419
+ },
2420
+ "image": "aquasec/trivy:0.38.3",
2421
+ "interruptible": true,
2422
+ "needs": [
2423
+ "api ๐Ÿš€ Deploy | stage ",
2424
+ ],
2425
+ "retry": {
2426
+ "max": 2,
2427
+ "when": [
2428
+ "runner_system_failure",
2429
+ "stuck_or_timeout_failure",
2430
+ ],
2431
+ },
2432
+ "script": [
2433
+ "trivy fs --quiet --format cyclonedx --output "__sbom.json" api",
2434
+ ],
2435
+ "stage": "verify",
2436
+ "variables": {},
2437
+ },
2438
+ "app ๐Ÿ”จ app | prod ": {
2439
+ "artifacts": {
2440
+ "paths": [
2441
+ "app/__build_info.json",
2442
+ "app/dist",
2443
+ "app/.next",
2444
+ ],
2445
+ "reports": {
2446
+ "junit": undefined,
2447
+ },
2448
+ },
2449
+ "cache": [
2450
+ {
2451
+ "key": {
2452
+ "files": [
2453
+ "app/Gemfile.lock",
2454
+ ],
2455
+ },
2456
+ "paths": [
2457
+ "app/vendor",
2458
+ ],
2459
+ },
2460
+ {
2461
+ "key": "app-yarn",
2462
+ "paths": [
2463
+ "app/.yarn",
2464
+ ],
2465
+ "policy": "pull-push",
2466
+ },
2467
+ {
2468
+ "key": "app-node-modules",
2469
+ "paths": [
2470
+ "app/node_modules",
2471
+ ],
2472
+ "policy": "pull-push",
2473
+ },
2474
+ {
2475
+ "key": "app-next-cache",
2476
+ "paths": [
2477
+ "app/.next/cache/",
2478
+ ],
2479
+ "policy": "pull-push",
2480
+ },
2481
+ ],
2482
+ "image": "path/to/docker/jobs-default:the-version",
2483
+ "interruptible": true,
2484
+ "needs": [],
2485
+ "retry": {
2486
+ "max": 2,
2487
+ "when": [
2488
+ "runner_system_failure",
2489
+ "stuck_or_timeout_failure",
2490
+ ],
2491
+ },
2492
+ "script": [
2493
+ "cat <<EOF > app/.env
2494
+ ENV_SHORT=prod
2495
+ APP_DIR=app
2496
+ ENV_TYPE=prod
2497
+ BUILD_INFO_ID=some-id
2498
+ BUILD_INFO_BUILD_TIME=01-01-2023 12:13:14
2499
+ BUILD_INFO_CURRENT_VERSION=3.2.1
2500
+ HOST=unknown-host.example.com
2501
+ ROOT_URL=https://unknown-host.example.com
2502
+ APP_STORE_CONNECT_API_KEY_CONTENT=$CL_prod_app_APP_STORE_CONNECT_API_KEY_CONTENT
2503
+ APP_STORE_CONNECT_ISSUER_ID=$CL_prod_app_APP_STORE_CONNECT_ISSUER_ID
2504
+ APP_STORE_CONNECT_API_KEY_ID=$CL_prod_app_APP_STORE_CONNECT_API_KEY_ID
2505
+ GRAPHQL_URL=https://pan-test-app-prod-api-unknown-host.example.com/graphql
2506
+ _ALL_ENV_VAR_KEYS=["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","APP_STORE_CONNECT_API_KEY_CONTENT","APP_STORE_CONNECT_ISSUER_ID","APP_STORE_CONNECT_API_KEY_ID","GRAPHQL_URL"]
2507
+ EOF",
2508
+ "echo '{"id":"some-id","time":"01-01-2023 12:13:14"}' > app/__build_info.json",
2509
+ "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
2510
+ "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
2511
+ "cd app",
2512
+ "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
2513
+ "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
2514
+ "yarn install --immutable",
2515
+ "bundle config set --local path 'vendor/ruby'",
2516
+ "gem install bundler",
2517
+ "bundle install",
2518
+ "bundle exec pod install --project-directory=ios",
2519
+ "bundle exec fastlane build",
2520
+ ],
2521
+ "stage": "build",
2522
+ "tags": [
2523
+ "mac-runner",
2524
+ ],
2525
+ "variables": {
2526
+ "APP_DIR": "app",
2527
+ "APP_STORE_CONNECT_API_KEY_CONTENT": "$CL_prod_app_APP_STORE_CONNECT_API_KEY_CONTENT",
2528
+ "APP_STORE_CONNECT_API_KEY_ID": "$CL_prod_app_APP_STORE_CONNECT_API_KEY_ID",
2529
+ "APP_STORE_CONNECT_ISSUER_ID": "$CL_prod_app_APP_STORE_CONNECT_ISSUER_ID",
2530
+ "BUILD_INFO_BUILD_TIME": "01-01-2023 12:13:14",
2531
+ "BUILD_INFO_CURRENT_VERSION": "3.2.1",
2532
+ "BUILD_INFO_ID": "some-id",
2533
+ "ENV_SHORT": "prod",
2534
+ "ENV_TYPE": "prod",
2535
+ "GRAPHQL_URL": "https://pan-test-app-prod-api-unknown-host.example.com/graphql",
2536
+ "HOST": "unknown-host.example.com",
2537
+ "KUBERNETES_CPU_LIMIT": "2",
2538
+ "KUBERNETES_CPU_REQUEST": "0.5",
2539
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
2540
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
2541
+ "LANG": "en_US.UTF-8",
2542
+ "LC_A": "L=en_US.UTF-8",
2543
+ "ROOT_URL": "https://unknown-host.example.com",
2544
+ "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","APP_STORE_CONNECT_API_KEY_CONTENT","APP_STORE_CONNECT_ISSUER_ID","APP_STORE_CONNECT_API_KEY_ID","GRAPHQL_URL"]",
2545
+ },
2546
+ },
2547
+ "app ๐Ÿ”จ app | stage ": {
2548
+ "artifacts": {
2549
+ "paths": [
2550
+ "app/__build_info.json",
2551
+ "app/dist",
2552
+ "app/.next",
2553
+ ],
2554
+ "reports": {
2555
+ "junit": undefined,
2556
+ },
2557
+ },
2558
+ "cache": [
2559
+ {
2560
+ "key": {
2561
+ "files": [
2562
+ "app/Gemfile.lock",
2563
+ ],
2564
+ },
2565
+ "paths": [
2566
+ "app/vendor",
2567
+ ],
2568
+ },
2569
+ {
2570
+ "key": "app-yarn",
2571
+ "paths": [
2572
+ "app/.yarn",
2573
+ ],
2574
+ "policy": "pull-push",
2575
+ },
2576
+ {
2577
+ "key": "app-node-modules",
2578
+ "paths": [
2579
+ "app/node_modules",
2580
+ ],
2581
+ "policy": "pull-push",
2582
+ },
2583
+ {
2584
+ "key": "app-next-cache",
2585
+ "paths": [
2586
+ "app/.next/cache/",
2587
+ ],
2588
+ "policy": "pull-push",
2589
+ },
2590
+ ],
2591
+ "image": "path/to/docker/jobs-default:the-version",
2592
+ "interruptible": true,
2593
+ "needs": [],
2594
+ "retry": {
2595
+ "max": 2,
2596
+ "when": [
2597
+ "runner_system_failure",
2598
+ "stuck_or_timeout_failure",
2599
+ ],
2600
+ },
2601
+ "script": [
2602
+ "cat <<EOF > app/.env
2603
+ ENV_SHORT=stage
2604
+ APP_DIR=app
2605
+ ENV_TYPE=stage
2606
+ BUILD_INFO_ID=some-id
2607
+ BUILD_INFO_BUILD_TIME=01-01-2023 12:13:14
2608
+ BUILD_INFO_CURRENT_VERSION=3.2.1
2609
+ HOST=unknown-host.example.com
2610
+ ROOT_URL=https://unknown-host.example.com
2611
+ APP_STORE_CONNECT_API_KEY_CONTENT=$CL_stage_app_APP_STORE_CONNECT_API_KEY_CONTENT
2612
+ APP_STORE_CONNECT_ISSUER_ID=$CL_stage_app_APP_STORE_CONNECT_ISSUER_ID
2613
+ APP_STORE_CONNECT_API_KEY_ID=$CL_stage_app_APP_STORE_CONNECT_API_KEY_ID
2614
+ GRAPHQL_URL=https://pan-test-app-stage-api-unknown-host.example.com/graphql
2615
+ _ALL_ENV_VAR_KEYS=["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","APP_STORE_CONNECT_API_KEY_CONTENT","APP_STORE_CONNECT_ISSUER_ID","APP_STORE_CONNECT_API_KEY_ID","GRAPHQL_URL"]
2616
+ EOF",
2617
+ "echo '{"id":"some-id","time":"01-01-2023 12:13:14"}' > app/__build_info.json",
2618
+ "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
2619
+ "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
2620
+ "cd app",
2621
+ "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
2622
+ "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
2623
+ "yarn install --immutable",
2624
+ "bundle config set --local path 'vendor/ruby'",
2625
+ "gem install bundler",
2626
+ "bundle install",
2627
+ "bundle exec pod install --project-directory=ios",
2628
+ "bundle exec fastlane build",
2629
+ ],
2630
+ "stage": "build",
2631
+ "tags": [
2632
+ "mac-runner",
2633
+ ],
2634
+ "variables": {
2635
+ "APP_DIR": "app",
2636
+ "APP_STORE_CONNECT_API_KEY_CONTENT": "$CL_stage_app_APP_STORE_CONNECT_API_KEY_CONTENT",
2637
+ "APP_STORE_CONNECT_API_KEY_ID": "$CL_stage_app_APP_STORE_CONNECT_API_KEY_ID",
2638
+ "APP_STORE_CONNECT_ISSUER_ID": "$CL_stage_app_APP_STORE_CONNECT_ISSUER_ID",
2639
+ "BUILD_INFO_BUILD_TIME": "01-01-2023 12:13:14",
2640
+ "BUILD_INFO_CURRENT_VERSION": "3.2.1",
2641
+ "BUILD_INFO_ID": "some-id",
2642
+ "ENV_SHORT": "stage",
2643
+ "ENV_TYPE": "stage",
2644
+ "GRAPHQL_URL": "https://pan-test-app-stage-api-unknown-host.example.com/graphql",
2645
+ "HOST": "unknown-host.example.com",
2646
+ "KUBERNETES_CPU_LIMIT": "2",
2647
+ "KUBERNETES_CPU_REQUEST": "0.5",
2648
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
2649
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
2650
+ "LANG": "en_US.UTF-8",
2651
+ "LC_A": "L=en_US.UTF-8",
2652
+ "ROOT_URL": "https://unknown-host.example.com",
2653
+ "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","APP_STORE_CONNECT_API_KEY_CONTENT","APP_STORE_CONNECT_ISSUER_ID","APP_STORE_CONNECT_API_KEY_ID","GRAPHQL_URL"]",
2654
+ },
2655
+ },
2656
+ "app ๐Ÿš€ Deploy | prod ": {
2657
+ "allow_failure": true,
2658
+ "cache": [
2659
+ {
2660
+ "key": {
2661
+ "files": [
2662
+ "app/Gemfile.lock",
2663
+ ],
2664
+ },
2665
+ "paths": [
2666
+ "app/vendor",
2667
+ ],
2668
+ },
2669
+ ],
2670
+ "environment": {
2671
+ "name": "prod/app",
2672
+ "url": "https://unknown-host.example.com",
2673
+ },
2674
+ "image": "path/to/docker/jobs-default:the-version",
2675
+ "interruptible": true,
2676
+ "needs": [
2677
+ {
2678
+ "artifacts": true,
2679
+ "job": "app ๐Ÿ”จ app | prod ",
2680
+ },
2681
+ ],
2682
+ "retry": {
2683
+ "max": 2,
2684
+ "when": [
2685
+ "runner_system_failure",
2686
+ "stuck_or_timeout_failure",
2687
+ ],
2688
+ },
2689
+ "rules": [
2690
+ {
2691
+ "when": "manual",
2692
+ },
2693
+ ],
2694
+ "script": [
2695
+ "cd app",
2696
+ "bundle config set --local path 'vendor/ruby'",
2697
+ "gem install bundler",
2698
+ "bundle install",
2699
+ "bundle exec fastlane deploy_test",
2700
+ ],
2701
+ "stage": "deploy prod",
2702
+ "tags": [
2703
+ "mac-runner",
2704
+ ],
2705
+ "variables": {
2706
+ "APP_DIR": "app",
2707
+ "APP_STORE_CONNECT_API_KEY_CONTENT": "$CL_prod_app_APP_STORE_CONNECT_API_KEY_CONTENT",
2708
+ "APP_STORE_CONNECT_API_KEY_ID": "$CL_prod_app_APP_STORE_CONNECT_API_KEY_ID",
2709
+ "APP_STORE_CONNECT_ISSUER_ID": "$CL_prod_app_APP_STORE_CONNECT_ISSUER_ID",
2710
+ "BUILD_INFO_BUILD_TIME": "01-01-2023 12:13:14",
2711
+ "BUILD_INFO_CURRENT_VERSION": "3.2.1",
2712
+ "BUILD_INFO_ID": "some-id",
2713
+ "ENV_SHORT": "prod",
2714
+ "ENV_TYPE": "prod",
2715
+ "GRAPHQL_URL": "https://pan-test-app-prod-api-unknown-host.example.com/graphql",
2716
+ "HOST": "unknown-host.example.com",
2717
+ "KUBERNETES_CPU_LIMIT": "1",
2718
+ "KUBERNETES_CPU_REQUEST": "0.5",
2719
+ "KUBERNETES_MEMORY_LIMIT": "400Mi",
2720
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
2721
+ "LANG": "en_US.UTF-8",
2722
+ "LC_A": "L=en_US.UTF-8",
2723
+ "ROOT_URL": "https://unknown-host.example.com",
2724
+ "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","APP_STORE_CONNECT_API_KEY_CONTENT","APP_STORE_CONNECT_ISSUER_ID","APP_STORE_CONNECT_API_KEY_ID","GRAPHQL_URL"]",
2725
+ },
2726
+ },
2727
+ "app ๐Ÿš€ Deploy | stage ": {
2728
+ "allow_failure": false,
2729
+ "cache": [
2730
+ {
2731
+ "key": {
2732
+ "files": [
2733
+ "app/Gemfile.lock",
2734
+ ],
2735
+ },
2736
+ "paths": [
2737
+ "app/vendor",
2738
+ ],
2739
+ },
2740
+ ],
2741
+ "environment": {
2742
+ "name": "stage/app",
2743
+ "url": "https://unknown-host.example.com",
2744
+ },
2745
+ "image": "path/to/docker/jobs-default:the-version",
2746
+ "interruptible": true,
2747
+ "needs": [
2748
+ {
2749
+ "artifacts": true,
2750
+ "job": "app ๐Ÿ”จ app | stage ",
2751
+ },
2752
+ ],
2753
+ "retry": {
2754
+ "max": 2,
2755
+ "when": [
2756
+ "runner_system_failure",
2757
+ "stuck_or_timeout_failure",
2758
+ ],
2759
+ },
2760
+ "rules": [
2761
+ {
2762
+ "when": "on_success",
2763
+ },
2764
+ ],
2765
+ "script": [
2766
+ "cd app",
2767
+ "bundle config set --local path 'vendor/ruby'",
2768
+ "gem install bundler",
2769
+ "bundle install",
2770
+ "bundle exec fastlane deploy_test",
2771
+ ],
2772
+ "stage": "deploy stage",
2773
+ "tags": [
2774
+ "mac-runner",
2775
+ ],
2776
+ "variables": {
2777
+ "APP_DIR": "app",
2778
+ "APP_STORE_CONNECT_API_KEY_CONTENT": "$CL_stage_app_APP_STORE_CONNECT_API_KEY_CONTENT",
2779
+ "APP_STORE_CONNECT_API_KEY_ID": "$CL_stage_app_APP_STORE_CONNECT_API_KEY_ID",
2780
+ "APP_STORE_CONNECT_ISSUER_ID": "$CL_stage_app_APP_STORE_CONNECT_ISSUER_ID",
2781
+ "BUILD_INFO_BUILD_TIME": "01-01-2023 12:13:14",
2782
+ "BUILD_INFO_CURRENT_VERSION": "3.2.1",
2783
+ "BUILD_INFO_ID": "some-id",
2784
+ "ENV_SHORT": "stage",
2785
+ "ENV_TYPE": "stage",
2786
+ "GRAPHQL_URL": "https://pan-test-app-stage-api-unknown-host.example.com/graphql",
2787
+ "HOST": "unknown-host.example.com",
2788
+ "KUBERNETES_CPU_LIMIT": "1",
2789
+ "KUBERNETES_CPU_REQUEST": "0.5",
2790
+ "KUBERNETES_MEMORY_LIMIT": "400Mi",
2791
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
2792
+ "LANG": "en_US.UTF-8",
2793
+ "LC_A": "L=en_US.UTF-8",
2794
+ "ROOT_URL": "https://unknown-host.example.com",
2795
+ "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","APP_STORE_CONNECT_API_KEY_CONTENT","APP_STORE_CONNECT_ISSUER_ID","APP_STORE_CONNECT_API_KEY_ID","GRAPHQL_URL"]",
2796
+ },
2797
+ },
2798
+ "app ๐Ÿงพ sbom upload | prod ": {
2799
+ "allow_failure": true,
2800
+ "image": "git.panter.ch:5001/open-source/dependency-track-uploader:dtrackuploader-v0.2.1",
2801
+ "interruptible": true,
2802
+ "needs": [
2803
+ "app ๐Ÿงพ sbom | prod ",
2804
+ ],
2805
+ "retry": {
2806
+ "max": 2,
2807
+ "when": [
2808
+ "runner_system_failure",
2809
+ "stuck_or_timeout_failure",
2810
+ ],
2811
+ },
2812
+ "script": [
2813
+ "/dtrackuploader https://dep.panter.dev/ "$DT_KEY" upload "pan-test-app/app" "prod" "__sbom.json" vex.json",
2814
+ ],
2815
+ "stage": "verify",
2816
+ "variables": {},
2817
+ },
2818
+ "app ๐Ÿงพ sbom upload | stage ": {
2819
+ "allow_failure": true,
2820
+ "image": "git.panter.ch:5001/open-source/dependency-track-uploader:dtrackuploader-v0.2.1",
2821
+ "interruptible": true,
2822
+ "needs": [
2823
+ "app ๐Ÿงพ sbom | stage ",
2824
+ ],
2825
+ "retry": {
2826
+ "max": 2,
2827
+ "when": [
2828
+ "runner_system_failure",
2829
+ "stuck_or_timeout_failure",
2830
+ ],
2831
+ },
2832
+ "script": [
2833
+ "/dtrackuploader https://dep.panter.dev/ "$DT_KEY" upload "pan-test-app/app" "stage" "__sbom.json" vex.json",
2834
+ ],
2835
+ "stage": "verify",
2836
+ "variables": {},
2837
+ },
2838
+ "app ๐Ÿงพ sbom | prod ": {
2839
+ "allow_failure": true,
2840
+ "artifacts": {
2841
+ "paths": [
2842
+ "__sbom.json",
2843
+ ],
2844
+ },
2845
+ "image": "aquasec/trivy:0.38.3",
2846
+ "interruptible": true,
2847
+ "needs": [
2848
+ "app ๐Ÿš€ Deploy | prod ",
2849
+ ],
2850
+ "retry": {
2851
+ "max": 2,
2852
+ "when": [
2853
+ "runner_system_failure",
2854
+ "stuck_or_timeout_failure",
2855
+ ],
2856
+ },
2857
+ "script": [
2858
+ "trivy fs --quiet --format cyclonedx --output "__sbom.json" app",
2859
+ ],
2860
+ "stage": "verify",
2861
+ "variables": {},
2862
+ },
2863
+ "app ๐Ÿงพ sbom | stage ": {
2864
+ "allow_failure": true,
2865
+ "artifacts": {
2866
+ "paths": [
2867
+ "__sbom.json",
2868
+ ],
2869
+ },
2870
+ "image": "aquasec/trivy:0.38.3",
2871
+ "interruptible": true,
2872
+ "needs": [
2873
+ "app ๐Ÿš€ Deploy | stage ",
2874
+ ],
2875
+ "retry": {
2876
+ "max": 2,
2877
+ "when": [
2878
+ "runner_system_failure",
2879
+ "stuck_or_timeout_failure",
2880
+ ],
2881
+ },
2882
+ "script": [
2883
+ "trivy fs --quiet --format cyclonedx --output "__sbom.json" app",
2884
+ ],
2885
+ "stage": "verify",
2886
+ "variables": {},
2887
+ },
2888
+ },
2889
+ "stages": [
2890
+ "setup",
2891
+ "setup dev",
2892
+ "setup review",
2893
+ "setup stage",
2894
+ "setup prod",
2895
+ "setup local",
2896
+ "test",
2897
+ "test dev",
2898
+ "test review",
2899
+ "test stage",
2900
+ "test prod",
2901
+ "test local",
2902
+ "build",
2903
+ "build dev",
2904
+ "build review",
2905
+ "build stage",
2906
+ "build prod",
2907
+ "build local",
2908
+ "deploy",
2909
+ "deploy dev",
2910
+ "deploy review",
2911
+ "deploy stage",
2912
+ "deploy prod",
2913
+ "deploy local",
2914
+ "verify",
2915
+ "verify dev",
2916
+ "verify review",
2917
+ "verify stage",
2918
+ "verify prod",
2919
+ "verify local",
2920
+ "rollback",
2921
+ "rollback dev",
2922
+ "rollback review",
2923
+ "rollback stage",
2924
+ "rollback prod",
2925
+ "rollback local",
2926
+ "stop",
2927
+ "stop dev",
2928
+ "stop review",
2929
+ "stop stage",
2930
+ "stop prod",
2931
+ "stop local",
2932
+ ],
2933
+ "variables": {
2934
+ "FF_USE_FASTZIP": "true",
2935
+ },
2936
+ "workflow": {
2937
+ "rules": [
2938
+ {
2939
+ "if": "$CI_COMMIT_TAG",
2940
+ },
2941
+ {
2942
+ "if": "$CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/",
2943
+ "when": "never",
2944
+ },
2945
+ {
2946
+ "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+.([0-9]+|x).x$/",
2947
+ },
2948
+ {
2949
+ "if": "$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH",
2950
+ },
2951
+ {
2952
+ "if": "$CI_MERGE_REQUEST_ID",
2953
+ },
2954
+ ],
2955
+ },
2956
+ },
2957
+ }
2958
+ `;