@catladder/pipeline 1.87.0 → 1.89.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,2280 @@
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 ↩️ Rollback ⚠️ | dev ": {
9
+ "environment": {
10
+ "action": "access",
11
+ "kubernetes": {
12
+ "namespace": "pan-test-app-dev",
13
+ },
14
+ "name": "dev/api",
15
+ "url": "https://api.dev.test-app.pan.panter.cloud",
16
+ },
17
+ "image": "path/to/docker/kubernetes:the-version",
18
+ "interruptible": true,
19
+ "needs": [],
20
+ "retry": {
21
+ "max": 2,
22
+ "when": [
23
+ "runner_system_failure",
24
+ "stuck_or_timeout_failure",
25
+ ],
26
+ },
27
+ "rules": [
28
+ {
29
+ "allow_failure": true,
30
+ "when": "manual",
31
+ },
32
+ ],
33
+ "script": [
34
+ "kubectl config set-cluster "kube-pan-test-app-dev-api" --server="$CL_dev_api_KUBE_URL" --certificate-authority <(echo $CL_dev_api_KUBE_CA_PEM | base64 -d) --embed-certs=true",
35
+ "kubectl config set-credentials "kube-pan-test-app-dev-api" --token="$CL_dev_api_KUBE_TOKEN"",
36
+ "kubectl config set-context "kube-pan-test-app-dev-api" --cluster="kube-pan-test-app-dev-api" --user="kube-pan-test-app-dev-api" --namespace="pan-test-app-dev"",
37
+ "kubectl config use-context "kube-pan-test-app-dev-api"",
38
+ "kubernetesRollback",
39
+ ],
40
+ "stage": "rollback dev",
41
+ "variables": {
42
+ "APP_DIR": "api",
43
+ "BUILD_ID": "some-id",
44
+ "COMPONENT_NAME": "api",
45
+ "ENV_SHORT": "dev",
46
+ "ENV_TYPE": "dev",
47
+ "GIT_STRATEGY": "none",
48
+ "HELM_ARGS": "",
49
+ "HELM_EXPERIMENTAL_OCI": "1",
50
+ "HELM_GITLAB_CHART_NAME": "/helm-charts/the-panter-chart",
51
+ "HOST": "api.dev.test-app.pan.panter.cloud",
52
+ "HOST_CANONICAL": "api.dev.test-app.pan.panter.cloud",
53
+ "KUBERNETES_CPU_LIMIT": "1",
54
+ "KUBERNETES_CPU_REQUEST": "0.5",
55
+ "KUBERNETES_MEMORY_LIMIT": "500Mi",
56
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
57
+ "KUBE_APP_NAME": "api",
58
+ "KUBE_APP_NAME_PREFIX": "",
59
+ "KUBE_DOCKER_IMAGE_PULL_SECRET": "gitlab-registry-api",
60
+ "KUBE_NAMESPACE": "pan-test-app-dev",
61
+ "KUBE_VALUES": "env:
62
+ secret: {}
63
+ public:
64
+ ENV_SHORT: 'dev'
65
+ APP_DIR: 'api'
66
+ ENV_TYPE: 'dev'
67
+ HOST: 'api.dev.test-app.pan.panter.cloud'
68
+ ROOT_URL: 'https://api.dev.test-app.pan.panter.cloud'
69
+ KUBE_NAMESPACE: 'pan-test-app-dev'
70
+ KUBE_APP_NAME: 'api'
71
+ KUBE_APP_NAME_PREFIX: ''
72
+ HOST_CANONICAL: 'api.dev.test-app.pan.panter.cloud'
73
+ _ALL_ENV_VAR_KEYS: '["ENV_SHORT","APP_DIR","ENV_TYPE","HOST","ROOT_URL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","HOST_CANONICAL"]'
74
+ application:
75
+ host: 'api.dev.test-app.pan.panter.cloud'
76
+ command: 'node main.js'
77
+ livenessProbe:
78
+ httpGet:
79
+ path: '__health'
80
+ readinessProbe:
81
+ httpGet:
82
+ path: '__health'
83
+ startupProbe:
84
+ httpGet:
85
+ path: '__health'
86
+ autoscale:
87
+ minReplicas: 2
88
+ maxReplicas: 5
89
+ metrics:
90
+ - type: 'Resource'
91
+ resource:
92
+ name: 'cpu'
93
+ target:
94
+ type: 'Utilization'
95
+ averageUtilization: 0.5
96
+ resources:
97
+ limits:
98
+ cpu: '1'
99
+ memory: '2048Mi'
100
+ ",
101
+ "RELEASE_NAME": "pan-test-app-dev-api",
102
+ "ROOT_URL": "https://api.dev.test-app.pan.panter.cloud",
103
+ "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","HOST","ROOT_URL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","HOST_CANONICAL"]",
104
+ },
105
+ },
106
+ "api 👮 lint": {
107
+ "cache": [
108
+ {
109
+ "key": "api-yarn",
110
+ "paths": [
111
+ "api/.yarn",
112
+ ],
113
+ "policy": "pull-push",
114
+ },
115
+ {
116
+ "key": "api-node-modules",
117
+ "paths": [
118
+ "api/node_modules",
119
+ ],
120
+ "policy": "pull-push",
121
+ },
122
+ ],
123
+ "environment": undefined,
124
+ "interruptible": true,
125
+ "needs": [],
126
+ "retry": {
127
+ "max": 2,
128
+ "when": [
129
+ "runner_system_failure",
130
+ "stuck_or_timeout_failure",
131
+ ],
132
+ },
133
+ "script": [
134
+ "cd api",
135
+ "if [ -f ./.nvmrc ]; then source /root/.nvm/nvm.sh && nvm install <<< .nvmrc; fi",
136
+ "yarn install --immutable",
137
+ "yarn lint",
138
+ ],
139
+ "stage": "test",
140
+ "variables": {
141
+ "APP_PATH": "api",
142
+ "KUBERNETES_CPU_LIMIT": "2",
143
+ "KUBERNETES_CPU_REQUEST": "0.5",
144
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
145
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
146
+ },
147
+ },
148
+ "api 🔨 app | dev ": {
149
+ "artifacts": {
150
+ "paths": [
151
+ "api/__build_info.json",
152
+ "api/dist",
153
+ "api/.next",
154
+ ],
155
+ "reports": {
156
+ "junit": undefined,
157
+ },
158
+ },
159
+ "cache": [
160
+ {
161
+ "key": "api-yarn",
162
+ "paths": [
163
+ "api/.yarn",
164
+ ],
165
+ "policy": "pull-push",
166
+ },
167
+ {
168
+ "key": "api-node-modules",
169
+ "paths": [
170
+ "api/node_modules",
171
+ ],
172
+ "policy": "pull-push",
173
+ },
174
+ {
175
+ "key": "api-next-cache",
176
+ "paths": [
177
+ "api/.next/cache/",
178
+ ],
179
+ "policy": "pull-push",
180
+ },
181
+ ],
182
+ "environment": undefined,
183
+ "image": "path/to/docker/jobs-default:the-version",
184
+ "interruptible": true,
185
+ "needs": [],
186
+ "retry": {
187
+ "max": 2,
188
+ "when": [
189
+ "runner_system_failure",
190
+ "stuck_or_timeout_failure",
191
+ ],
192
+ },
193
+ "script": [
194
+ "echo '{"id":"some-id","time":"01-01-2023 12:13:14"}' > api/__build_info.json",
195
+ "if [ -f ./.nvmrc ]; then source /root/.nvm/nvm.sh && nvm install <<< .nvmrc; fi",
196
+ "cd api",
197
+ "if [ -f ./.nvmrc ]; then source /root/.nvm/nvm.sh && nvm install <<< .nvmrc; fi",
198
+ "yarn install --immutable",
199
+ "yarn build",
200
+ ],
201
+ "stage": "build",
202
+ "variables": {
203
+ "APP_DIR": "api",
204
+ "ENV_SHORT": "dev",
205
+ "ENV_TYPE": "dev",
206
+ "HOST": "api.dev.test-app.pan.panter.cloud",
207
+ "HOST_CANONICAL": "api.dev.test-app.pan.panter.cloud",
208
+ "KUBERNETES_CPU_LIMIT": "2",
209
+ "KUBERNETES_CPU_REQUEST": "0.5",
210
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
211
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
212
+ "KUBE_APP_NAME": "api",
213
+ "KUBE_APP_NAME_PREFIX": "",
214
+ "KUBE_NAMESPACE": "pan-test-app-dev",
215
+ "ROOT_URL": "https://api.dev.test-app.pan.panter.cloud",
216
+ "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","HOST","ROOT_URL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","HOST_CANONICAL"]",
217
+ },
218
+ },
219
+ "api 🔨 docker | dev ": {
220
+ "cache": [
221
+ {
222
+ "key": "api-yarn",
223
+ "paths": [
224
+ "api/.yarn",
225
+ ],
226
+ "policy": "pull",
227
+ },
228
+ ],
229
+ "environment": undefined,
230
+ "image": "path/to/docker/docker-build:the-version",
231
+ "interruptible": true,
232
+ "needs": [
233
+ "api 🔨 app | dev ",
234
+ ],
235
+ "retry": {
236
+ "max": 2,
237
+ "when": [
238
+ "runner_system_failure",
239
+ "stuck_or_timeout_failure",
240
+ ],
241
+ },
242
+ "script": [
243
+ "ensureNodeDockerfile",
244
+ "docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY",
245
+ "docker version",
246
+ "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",
247
+ "docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
248
+ "docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE",
249
+ "docker push $DOCKER_CACHE_IMAGE",
250
+ ],
251
+ "services": [
252
+ {
253
+ "command": [
254
+ "--tls=false",
255
+ ],
256
+ "name": "docker:20-dind",
257
+ },
258
+ ],
259
+ "stage": "build",
260
+ "variables": {
261
+ "APP_DIR": "api",
262
+ "DOCKERFILE_ADDITIONS": undefined,
263
+ "DOCKERFILE_ADDITIONS_END": undefined,
264
+ "DOCKER_BUILDKIT": "1",
265
+ "DOCKER_CACHE_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/caches/api",
266
+ "DOCKER_COPY_WORKSPACE_FILES": "COPY --chown=node:node api/package.json /app/api/package.json
267
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock",
268
+ "DOCKER_DIR": ".",
269
+ "DOCKER_DRIVER": "overlay2",
270
+ "DOCKER_HOST": "tcp://0.0.0.0:2375",
271
+ "DOCKER_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/$DOCKER_IMAGE_NAME",
272
+ "DOCKER_IMAGE_NAME": "dev/api",
273
+ "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
274
+ "DOCKER_REGISTRY": "$CI_REGISTRY",
275
+ "DOCKER_REGISTRY_IMAGE_PATH": "$CI_REGISTRY_IMAGE",
276
+ "DOCKER_TLS_CERTDIR": "",
277
+ "KUBERNETES_CPU_LIMIT": "1",
278
+ "KUBERNETES_CPU_REQUEST": "0.5",
279
+ "KUBERNETES_MEMORY_LIMIT": "2Gi",
280
+ "KUBERNETES_MEMORY_REQUEST": "1Gi",
281
+ "YARN_INSTALL": "yarn plugin import workspace-tools && yarn workspaces focus --production && yarn rebuild",
282
+ "YARN_INSTALL_WITHOUT_SCRIPTS": "YARN_ENABLE_SCRIPTS=false yarn plugin import workspace-tools && yarn workspaces focus --production && yarn rebuild",
283
+ },
284
+ },
285
+ "api 🚀 Deploy | dev ": {
286
+ "allow_failure": false,
287
+ "environment": {
288
+ "auto_stop_in": "4 weeks",
289
+ "kubernetes": {
290
+ "namespace": "pan-test-app-dev",
291
+ },
292
+ "name": "dev/api",
293
+ "on_stop": "api 🛑 Stop ⚠️ | dev ",
294
+ "url": "https://api.dev.test-app.pan.panter.cloud",
295
+ },
296
+ "image": "path/to/docker/kubernetes:the-version",
297
+ "interruptible": true,
298
+ "needs": [
299
+ {
300
+ "artifacts": false,
301
+ "job": "api 👮 lint",
302
+ },
303
+ {
304
+ "artifacts": false,
305
+ "job": "api 🔨 app | dev ",
306
+ },
307
+ {
308
+ "artifacts": false,
309
+ "job": "api 🔨 docker | dev ",
310
+ },
311
+ {
312
+ "artifacts": false,
313
+ "job": "api 🧪 test",
314
+ },
315
+ {
316
+ "artifacts": false,
317
+ "job": "api 🛡 audit",
318
+ },
319
+ ],
320
+ "retry": {
321
+ "max": 2,
322
+ "when": [
323
+ "runner_system_failure",
324
+ "stuck_or_timeout_failure",
325
+ ],
326
+ },
327
+ "rules": [
328
+ {
329
+ "when": "on_success",
330
+ },
331
+ ],
332
+ "script": [
333
+ "kubectl config set-cluster "kube-pan-test-app-dev-api" --server="$CL_dev_api_KUBE_URL" --certificate-authority <(echo $CL_dev_api_KUBE_CA_PEM | base64 -d) --embed-certs=true",
334
+ "kubectl config set-credentials "kube-pan-test-app-dev-api" --token="$CL_dev_api_KUBE_TOKEN"",
335
+ "kubectl config set-context "kube-pan-test-app-dev-api" --cluster="kube-pan-test-app-dev-api" --user="kube-pan-test-app-dev-api" --namespace="pan-test-app-dev"",
336
+ "kubectl config use-context "kube-pan-test-app-dev-api"",
337
+ "kubernetesCreateSecret",
338
+ "kubernetesDeploy",
339
+ "echo deployment successful 😻",
340
+ ],
341
+ "stage": "deploy dev",
342
+ "variables": {
343
+ "APP_DIR": "api",
344
+ "BUILD_ID": "some-id",
345
+ "COMPONENT_NAME": "api",
346
+ "DOCKER_CACHE_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/caches/api",
347
+ "DOCKER_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/$DOCKER_IMAGE_NAME",
348
+ "DOCKER_IMAGE_NAME": "dev/api",
349
+ "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
350
+ "DOCKER_REGISTRY": "$CI_REGISTRY",
351
+ "DOCKER_REGISTRY_IMAGE_PATH": "$CI_REGISTRY_IMAGE",
352
+ "ENV_SHORT": "dev",
353
+ "ENV_TYPE": "dev",
354
+ "HELM_ARGS": "",
355
+ "HELM_EXPERIMENTAL_OCI": "1",
356
+ "HELM_GITLAB_CHART_NAME": "/helm-charts/the-panter-chart",
357
+ "HOST": "api.dev.test-app.pan.panter.cloud",
358
+ "HOST_CANONICAL": "api.dev.test-app.pan.panter.cloud",
359
+ "KUBERNETES_CPU_LIMIT": "1",
360
+ "KUBERNETES_CPU_REQUEST": "0.5",
361
+ "KUBERNETES_MEMORY_LIMIT": "500Mi",
362
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
363
+ "KUBE_APP_NAME": "api",
364
+ "KUBE_APP_NAME_PREFIX": "",
365
+ "KUBE_DOCKER_IMAGE_PULL_SECRET": "gitlab-registry-api",
366
+ "KUBE_NAMESPACE": "pan-test-app-dev",
367
+ "KUBE_VALUES": "env:
368
+ secret: {}
369
+ public:
370
+ ENV_SHORT: 'dev'
371
+ APP_DIR: 'api'
372
+ ENV_TYPE: 'dev'
373
+ HOST: 'api.dev.test-app.pan.panter.cloud'
374
+ ROOT_URL: 'https://api.dev.test-app.pan.panter.cloud'
375
+ KUBE_NAMESPACE: 'pan-test-app-dev'
376
+ KUBE_APP_NAME: 'api'
377
+ KUBE_APP_NAME_PREFIX: ''
378
+ HOST_CANONICAL: 'api.dev.test-app.pan.panter.cloud'
379
+ _ALL_ENV_VAR_KEYS: '["ENV_SHORT","APP_DIR","ENV_TYPE","HOST","ROOT_URL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","HOST_CANONICAL"]'
380
+ application:
381
+ host: 'api.dev.test-app.pan.panter.cloud'
382
+ command: 'node main.js'
383
+ livenessProbe:
384
+ httpGet:
385
+ path: '__health'
386
+ readinessProbe:
387
+ httpGet:
388
+ path: '__health'
389
+ startupProbe:
390
+ httpGet:
391
+ path: '__health'
392
+ autoscale:
393
+ minReplicas: 2
394
+ maxReplicas: 5
395
+ metrics:
396
+ - type: 'Resource'
397
+ resource:
398
+ name: 'cpu'
399
+ target:
400
+ type: 'Utilization'
401
+ averageUtilization: 0.5
402
+ resources:
403
+ limits:
404
+ cpu: '1'
405
+ memory: '2048Mi'
406
+ ",
407
+ "RELEASE_NAME": "pan-test-app-dev-api",
408
+ "ROOT_URL": "https://api.dev.test-app.pan.panter.cloud",
409
+ "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","HOST","ROOT_URL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","HOST_CANONICAL"]",
410
+ },
411
+ },
412
+ "api 🛑 Stop ⚠️ | dev ": {
413
+ "environment": {
414
+ "action": "stop",
415
+ "kubernetes": {
416
+ "namespace": "pan-test-app-dev",
417
+ },
418
+ "name": "dev/api",
419
+ "url": "https://api.dev.test-app.pan.panter.cloud",
420
+ },
421
+ "image": "path/to/docker/kubernetes:the-version",
422
+ "interruptible": true,
423
+ "needs": [],
424
+ "retry": {
425
+ "max": 2,
426
+ "when": [
427
+ "runner_system_failure",
428
+ "stuck_or_timeout_failure",
429
+ ],
430
+ },
431
+ "rules": [
432
+ {
433
+ "allow_failure": true,
434
+ "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/",
435
+ "when": "on_success",
436
+ },
437
+ {
438
+ "allow_failure": true,
439
+ "when": "manual",
440
+ },
441
+ ],
442
+ "script": [
443
+ "kubectl config set-cluster "kube-pan-test-app-dev-api" --server="$CL_dev_api_KUBE_URL" --certificate-authority <(echo $CL_dev_api_KUBE_CA_PEM | base64 -d) --embed-certs=true",
444
+ "kubectl config set-credentials "kube-pan-test-app-dev-api" --token="$CL_dev_api_KUBE_TOKEN"",
445
+ "kubectl config set-context "kube-pan-test-app-dev-api" --cluster="kube-pan-test-app-dev-api" --user="kube-pan-test-app-dev-api" --namespace="pan-test-app-dev"",
446
+ "kubectl config use-context "kube-pan-test-app-dev-api"",
447
+ "kubernetesDelete",
448
+ ],
449
+ "stage": "stop dev",
450
+ "variables": {
451
+ "APP_DIR": "api",
452
+ "BUILD_ID": "some-id",
453
+ "COMPONENT_NAME": "api",
454
+ "ENV_SHORT": "dev",
455
+ "ENV_TYPE": "dev",
456
+ "GIT_STRATEGY": "none",
457
+ "HELM_ARGS": "",
458
+ "HELM_EXPERIMENTAL_OCI": "1",
459
+ "HELM_GITLAB_CHART_NAME": "/helm-charts/the-panter-chart",
460
+ "HOST": "api.dev.test-app.pan.panter.cloud",
461
+ "HOST_CANONICAL": "api.dev.test-app.pan.panter.cloud",
462
+ "KUBERNETES_CPU_LIMIT": "1",
463
+ "KUBERNETES_CPU_REQUEST": "0.5",
464
+ "KUBERNETES_MEMORY_LIMIT": "500Mi",
465
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
466
+ "KUBE_APP_NAME": "api",
467
+ "KUBE_APP_NAME_PREFIX": "",
468
+ "KUBE_DOCKER_IMAGE_PULL_SECRET": "gitlab-registry-api",
469
+ "KUBE_NAMESPACE": "pan-test-app-dev",
470
+ "KUBE_VALUES": "env:
471
+ secret: {}
472
+ public:
473
+ ENV_SHORT: 'dev'
474
+ APP_DIR: 'api'
475
+ ENV_TYPE: 'dev'
476
+ HOST: 'api.dev.test-app.pan.panter.cloud'
477
+ ROOT_URL: 'https://api.dev.test-app.pan.panter.cloud'
478
+ KUBE_NAMESPACE: 'pan-test-app-dev'
479
+ KUBE_APP_NAME: 'api'
480
+ KUBE_APP_NAME_PREFIX: ''
481
+ HOST_CANONICAL: 'api.dev.test-app.pan.panter.cloud'
482
+ _ALL_ENV_VAR_KEYS: '["ENV_SHORT","APP_DIR","ENV_TYPE","HOST","ROOT_URL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","HOST_CANONICAL"]'
483
+ application:
484
+ host: 'api.dev.test-app.pan.panter.cloud'
485
+ command: 'node main.js'
486
+ livenessProbe:
487
+ httpGet:
488
+ path: '__health'
489
+ readinessProbe:
490
+ httpGet:
491
+ path: '__health'
492
+ startupProbe:
493
+ httpGet:
494
+ path: '__health'
495
+ autoscale:
496
+ minReplicas: 2
497
+ maxReplicas: 5
498
+ metrics:
499
+ - type: 'Resource'
500
+ resource:
501
+ name: 'cpu'
502
+ target:
503
+ type: 'Utilization'
504
+ averageUtilization: 0.5
505
+ resources:
506
+ limits:
507
+ cpu: '1'
508
+ memory: '2048Mi'
509
+ ",
510
+ "RELEASE_NAME": "pan-test-app-dev-api",
511
+ "ROOT_URL": "https://api.dev.test-app.pan.panter.cloud",
512
+ "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","HOST","ROOT_URL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","HOST_CANONICAL"]",
513
+ },
514
+ },
515
+ "api 🛡 audit": {
516
+ "allow_failure": true,
517
+ "cache": undefined,
518
+ "environment": undefined,
519
+ "interruptible": true,
520
+ "needs": [],
521
+ "retry": {
522
+ "max": 2,
523
+ "when": [
524
+ "runner_system_failure",
525
+ "stuck_or_timeout_failure",
526
+ ],
527
+ },
528
+ "script": [
529
+ "cd api",
530
+ "yarn npm audit --environment production",
531
+ ],
532
+ "stage": "test",
533
+ "variables": {
534
+ "APP_PATH": "api",
535
+ "KUBERNETES_CPU_LIMIT": "2",
536
+ "KUBERNETES_CPU_REQUEST": "0.5",
537
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
538
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
539
+ },
540
+ },
541
+ "api 🧪 test": {
542
+ "cache": [
543
+ {
544
+ "key": "api-yarn",
545
+ "paths": [
546
+ "api/.yarn",
547
+ ],
548
+ "policy": "pull-push",
549
+ },
550
+ {
551
+ "key": "api-node-modules",
552
+ "paths": [
553
+ "api/node_modules",
554
+ ],
555
+ "policy": "pull-push",
556
+ },
557
+ ],
558
+ "environment": undefined,
559
+ "image": "path/to/docker/jobs-testing-chrome:the-version",
560
+ "interruptible": true,
561
+ "needs": [],
562
+ "retry": {
563
+ "max": 2,
564
+ "when": [
565
+ "runner_system_failure",
566
+ "stuck_or_timeout_failure",
567
+ ],
568
+ },
569
+ "script": [
570
+ "cd api",
571
+ "if [ -f ./.nvmrc ]; then source /root/.nvm/nvm.sh && nvm install <<< .nvmrc; fi",
572
+ "yarn install --immutable",
573
+ "yarn test",
574
+ ],
575
+ "stage": "test",
576
+ "variables": {
577
+ "APP_PATH": "api",
578
+ "KUBERNETES_CPU_LIMIT": "2",
579
+ "KUBERNETES_CPU_REQUEST": "0.5",
580
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
581
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
582
+ },
583
+ },
584
+ },
585
+ "stages": [
586
+ "setup",
587
+ "setup dev",
588
+ "setup review",
589
+ "setup stage",
590
+ "setup prod",
591
+ "setup local",
592
+ "test",
593
+ "test dev",
594
+ "test review",
595
+ "test stage",
596
+ "test prod",
597
+ "test local",
598
+ "build",
599
+ "build dev",
600
+ "build review",
601
+ "build stage",
602
+ "build prod",
603
+ "build local",
604
+ "deploy",
605
+ "deploy dev",
606
+ "deploy review",
607
+ "deploy stage",
608
+ "deploy prod",
609
+ "deploy local",
610
+ "verify",
611
+ "verify dev",
612
+ "verify review",
613
+ "verify stage",
614
+ "verify prod",
615
+ "verify local",
616
+ "rollback",
617
+ "rollback dev",
618
+ "rollback review",
619
+ "rollback stage",
620
+ "rollback prod",
621
+ "rollback local",
622
+ "stop",
623
+ "stop dev",
624
+ "stop review",
625
+ "stop stage",
626
+ "stop prod",
627
+ "stop local",
628
+ ],
629
+ "variables": {
630
+ "FF_USE_FASTZIP": "true",
631
+ },
632
+ "workflow": {
633
+ "rules": [
634
+ {
635
+ "if": "$CI_COMMIT_TAG",
636
+ },
637
+ {
638
+ "if": "$CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/",
639
+ "when": "never",
640
+ },
641
+ {
642
+ "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+.([0-9]+|x).x$/",
643
+ },
644
+ {
645
+ "if": "$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH",
646
+ },
647
+ {
648
+ "if": "$CI_MERGE_REQUEST_ID",
649
+ },
650
+ ],
651
+ },
652
+ },
653
+ "mr": {
654
+ "image": "path/to/docker/jobs-default:the-version",
655
+ "jobs": {
656
+ "api ↩️ Rollback ⚠️ | review ": {
657
+ "environment": {
658
+ "action": "access",
659
+ "kubernetes": {
660
+ "namespace": "pan-test-app-review",
661
+ },
662
+ "name": "review/some-commit/api",
663
+ "url": "https://api.mr1234.review.test-app.pan.panter.cloud",
664
+ },
665
+ "image": "path/to/docker/kubernetes:the-version",
666
+ "interruptible": true,
667
+ "needs": [],
668
+ "retry": {
669
+ "max": 2,
670
+ "when": [
671
+ "runner_system_failure",
672
+ "stuck_or_timeout_failure",
673
+ ],
674
+ },
675
+ "rules": [
676
+ {
677
+ "allow_failure": true,
678
+ "when": "manual",
679
+ },
680
+ ],
681
+ "script": [
682
+ "kubectl config set-cluster "kube-pan-test-app-review-mr1234-api" --server="$CL_review_api_KUBE_URL" --certificate-authority <(echo $CL_review_api_KUBE_CA_PEM | base64 -d) --embed-certs=true",
683
+ "kubectl config set-credentials "kube-pan-test-app-review-mr1234-api" --token="$CL_review_api_KUBE_TOKEN"",
684
+ "kubectl config set-context "kube-pan-test-app-review-mr1234-api" --cluster="kube-pan-test-app-review-mr1234-api" --user="kube-pan-test-app-review-mr1234-api" --namespace="pan-test-app-review"",
685
+ "kubectl config use-context "kube-pan-test-app-review-mr1234-api"",
686
+ "kubernetesRollback",
687
+ ],
688
+ "stage": "rollback review",
689
+ "variables": {
690
+ "APP_DIR": "api",
691
+ "BUILD_ID": "some-id",
692
+ "COMPONENT_NAME": "api",
693
+ "ENV_SHORT": "review",
694
+ "ENV_TYPE": "review",
695
+ "GIT_STRATEGY": "none",
696
+ "HELM_ARGS": "",
697
+ "HELM_EXPERIMENTAL_OCI": "1",
698
+ "HELM_GITLAB_CHART_NAME": "/helm-charts/the-panter-chart",
699
+ "HOST": "api.mr1234.review.test-app.pan.panter.cloud",
700
+ "HOST_CANONICAL": "api.mr1234.review.test-app.pan.panter.cloud",
701
+ "KUBERNETES_CPU_LIMIT": "1",
702
+ "KUBERNETES_CPU_REQUEST": "0.5",
703
+ "KUBERNETES_MEMORY_LIMIT": "500Mi",
704
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
705
+ "KUBE_APP_NAME": "mr1234-api",
706
+ "KUBE_APP_NAME_PREFIX": "mr1234-",
707
+ "KUBE_DOCKER_IMAGE_PULL_SECRET": "gitlab-registry-api",
708
+ "KUBE_NAMESPACE": "pan-test-app-review",
709
+ "KUBE_VALUES": "env:
710
+ secret: {}
711
+ public:
712
+ ENV_SHORT: 'review'
713
+ APP_DIR: 'api'
714
+ ENV_TYPE: 'review'
715
+ HOST: 'api.mr1234.review.test-app.pan.panter.cloud'
716
+ ROOT_URL: 'https://api.mr1234.review.test-app.pan.panter.cloud'
717
+ KUBE_NAMESPACE: 'pan-test-app-review'
718
+ KUBE_APP_NAME: 'mr1234-api'
719
+ KUBE_APP_NAME_PREFIX: 'mr1234-'
720
+ HOST_CANONICAL: 'api.mr1234.review.test-app.pan.panter.cloud'
721
+ _ALL_ENV_VAR_KEYS: '["ENV_SHORT","APP_DIR","ENV_TYPE","HOST","ROOT_URL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","HOST_CANONICAL"]'
722
+ application:
723
+ host: 'api.mr1234.review.test-app.pan.panter.cloud'
724
+ command: 'node main.js'
725
+ livenessProbe:
726
+ httpGet:
727
+ path: '__health'
728
+ readinessProbe:
729
+ httpGet:
730
+ path: '__health'
731
+ startupProbe:
732
+ httpGet:
733
+ path: '__health'
734
+ autoscale:
735
+ minReplicas: 2
736
+ maxReplicas: 5
737
+ metrics:
738
+ - type: 'Resource'
739
+ resource:
740
+ name: 'cpu'
741
+ target:
742
+ type: 'Utilization'
743
+ averageUtilization: 0.5
744
+ resources:
745
+ limits:
746
+ cpu: '1'
747
+ memory: '2048Mi'
748
+ ",
749
+ "RELEASE_NAME": "pan-test-app-review-mr1234-api",
750
+ "ROOT_URL": "https://api.mr1234.review.test-app.pan.panter.cloud",
751
+ "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","HOST","ROOT_URL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","HOST_CANONICAL"]",
752
+ },
753
+ },
754
+ "api 👮 lint": {
755
+ "cache": [
756
+ {
757
+ "key": "api-yarn",
758
+ "paths": [
759
+ "api/.yarn",
760
+ ],
761
+ "policy": "pull-push",
762
+ },
763
+ {
764
+ "key": "api-node-modules",
765
+ "paths": [
766
+ "api/node_modules",
767
+ ],
768
+ "policy": "pull-push",
769
+ },
770
+ ],
771
+ "environment": undefined,
772
+ "interruptible": true,
773
+ "needs": [],
774
+ "retry": {
775
+ "max": 2,
776
+ "when": [
777
+ "runner_system_failure",
778
+ "stuck_or_timeout_failure",
779
+ ],
780
+ },
781
+ "script": [
782
+ "cd api",
783
+ "if [ -f ./.nvmrc ]; then source /root/.nvm/nvm.sh && nvm install <<< .nvmrc; fi",
784
+ "yarn install --immutable",
785
+ "yarn lint",
786
+ ],
787
+ "stage": "test",
788
+ "variables": {
789
+ "APP_PATH": "api",
790
+ "KUBERNETES_CPU_LIMIT": "2",
791
+ "KUBERNETES_CPU_REQUEST": "0.5",
792
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
793
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
794
+ },
795
+ },
796
+ "api 🔨 app | review ": {
797
+ "artifacts": {
798
+ "paths": [
799
+ "api/__build_info.json",
800
+ "api/dist",
801
+ "api/.next",
802
+ ],
803
+ "reports": {
804
+ "junit": undefined,
805
+ },
806
+ },
807
+ "cache": [
808
+ {
809
+ "key": "api-yarn",
810
+ "paths": [
811
+ "api/.yarn",
812
+ ],
813
+ "policy": "pull-push",
814
+ },
815
+ {
816
+ "key": "api-node-modules",
817
+ "paths": [
818
+ "api/node_modules",
819
+ ],
820
+ "policy": "pull-push",
821
+ },
822
+ {
823
+ "key": "api-next-cache",
824
+ "paths": [
825
+ "api/.next/cache/",
826
+ ],
827
+ "policy": "pull-push",
828
+ },
829
+ ],
830
+ "environment": undefined,
831
+ "image": "path/to/docker/jobs-default:the-version",
832
+ "interruptible": true,
833
+ "needs": [],
834
+ "retry": {
835
+ "max": 2,
836
+ "when": [
837
+ "runner_system_failure",
838
+ "stuck_or_timeout_failure",
839
+ ],
840
+ },
841
+ "script": [
842
+ "echo '{"id":"some-id","time":"01-01-2023 12:13:14"}' > api/__build_info.json",
843
+ "if [ -f ./.nvmrc ]; then source /root/.nvm/nvm.sh && nvm install <<< .nvmrc; fi",
844
+ "cd api",
845
+ "if [ -f ./.nvmrc ]; then source /root/.nvm/nvm.sh && nvm install <<< .nvmrc; fi",
846
+ "yarn install --immutable",
847
+ "yarn build",
848
+ ],
849
+ "stage": "build",
850
+ "variables": {
851
+ "APP_DIR": "api",
852
+ "ENV_SHORT": "review",
853
+ "ENV_TYPE": "review",
854
+ "HOST": "api.mr1234.review.test-app.pan.panter.cloud",
855
+ "HOST_CANONICAL": "api.mr1234.review.test-app.pan.panter.cloud",
856
+ "KUBERNETES_CPU_LIMIT": "2",
857
+ "KUBERNETES_CPU_REQUEST": "0.5",
858
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
859
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
860
+ "KUBE_APP_NAME": "mr1234-api",
861
+ "KUBE_APP_NAME_PREFIX": "mr1234-",
862
+ "KUBE_NAMESPACE": "pan-test-app-review",
863
+ "ROOT_URL": "https://api.mr1234.review.test-app.pan.panter.cloud",
864
+ "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","HOST","ROOT_URL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","HOST_CANONICAL"]",
865
+ },
866
+ },
867
+ "api 🔨 docker | review ": {
868
+ "cache": [
869
+ {
870
+ "key": "api-yarn",
871
+ "paths": [
872
+ "api/.yarn",
873
+ ],
874
+ "policy": "pull",
875
+ },
876
+ ],
877
+ "environment": undefined,
878
+ "image": "path/to/docker/docker-build:the-version",
879
+ "interruptible": true,
880
+ "needs": [
881
+ "api 🔨 app | review ",
882
+ ],
883
+ "retry": {
884
+ "max": 2,
885
+ "when": [
886
+ "runner_system_failure",
887
+ "stuck_or_timeout_failure",
888
+ ],
889
+ },
890
+ "script": [
891
+ "ensureNodeDockerfile",
892
+ "docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY",
893
+ "docker version",
894
+ "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",
895
+ "docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
896
+ "docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE",
897
+ "docker push $DOCKER_CACHE_IMAGE",
898
+ ],
899
+ "services": [
900
+ {
901
+ "command": [
902
+ "--tls=false",
903
+ ],
904
+ "name": "docker:20-dind",
905
+ },
906
+ ],
907
+ "stage": "build",
908
+ "variables": {
909
+ "APP_DIR": "api",
910
+ "DOCKERFILE_ADDITIONS": undefined,
911
+ "DOCKERFILE_ADDITIONS_END": undefined,
912
+ "DOCKER_BUILDKIT": "1",
913
+ "DOCKER_CACHE_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/caches/api",
914
+ "DOCKER_COPY_WORKSPACE_FILES": "COPY --chown=node:node api/package.json /app/api/package.json
915
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock",
916
+ "DOCKER_DIR": ".",
917
+ "DOCKER_DRIVER": "overlay2",
918
+ "DOCKER_HOST": "tcp://0.0.0.0:2375",
919
+ "DOCKER_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/$DOCKER_IMAGE_NAME",
920
+ "DOCKER_IMAGE_NAME": "review/api",
921
+ "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
922
+ "DOCKER_REGISTRY": "$CI_REGISTRY",
923
+ "DOCKER_REGISTRY_IMAGE_PATH": "$CI_REGISTRY_IMAGE",
924
+ "DOCKER_TLS_CERTDIR": "",
925
+ "KUBERNETES_CPU_LIMIT": "1",
926
+ "KUBERNETES_CPU_REQUEST": "0.5",
927
+ "KUBERNETES_MEMORY_LIMIT": "2Gi",
928
+ "KUBERNETES_MEMORY_REQUEST": "1Gi",
929
+ "YARN_INSTALL": "yarn plugin import workspace-tools && yarn workspaces focus --production && yarn rebuild",
930
+ "YARN_INSTALL_WITHOUT_SCRIPTS": "YARN_ENABLE_SCRIPTS=false yarn plugin import workspace-tools && yarn workspaces focus --production && yarn rebuild",
931
+ },
932
+ },
933
+ "api 🚀 Deploy | review ": {
934
+ "allow_failure": false,
935
+ "environment": {
936
+ "auto_stop_in": "2 week",
937
+ "kubernetes": {
938
+ "namespace": "pan-test-app-review",
939
+ },
940
+ "name": "review/some-commit/api",
941
+ "on_stop": "api 🛑 Stop ⚠️ | review ",
942
+ "url": "https://api.mr1234.review.test-app.pan.panter.cloud",
943
+ },
944
+ "image": "path/to/docker/kubernetes:the-version",
945
+ "interruptible": true,
946
+ "needs": [
947
+ {
948
+ "artifacts": false,
949
+ "job": "api 👮 lint",
950
+ },
951
+ {
952
+ "artifacts": false,
953
+ "job": "api 🔨 app | review ",
954
+ },
955
+ {
956
+ "artifacts": false,
957
+ "job": "api 🔨 docker | review ",
958
+ },
959
+ {
960
+ "artifacts": false,
961
+ "job": "api 🧪 test",
962
+ },
963
+ {
964
+ "artifacts": false,
965
+ "job": "api 🛡 audit",
966
+ },
967
+ ],
968
+ "retry": {
969
+ "max": 2,
970
+ "when": [
971
+ "runner_system_failure",
972
+ "stuck_or_timeout_failure",
973
+ ],
974
+ },
975
+ "rules": [
976
+ {
977
+ "when": "on_success",
978
+ },
979
+ ],
980
+ "script": [
981
+ "kubectl config set-cluster "kube-pan-test-app-review-mr1234-api" --server="$CL_review_api_KUBE_URL" --certificate-authority <(echo $CL_review_api_KUBE_CA_PEM | base64 -d) --embed-certs=true",
982
+ "kubectl config set-credentials "kube-pan-test-app-review-mr1234-api" --token="$CL_review_api_KUBE_TOKEN"",
983
+ "kubectl config set-context "kube-pan-test-app-review-mr1234-api" --cluster="kube-pan-test-app-review-mr1234-api" --user="kube-pan-test-app-review-mr1234-api" --namespace="pan-test-app-review"",
984
+ "kubectl config use-context "kube-pan-test-app-review-mr1234-api"",
985
+ "kubernetesCreateSecret",
986
+ "kubernetesDeploy",
987
+ "echo deployment successful 😻",
988
+ ],
989
+ "stage": "deploy review",
990
+ "variables": {
991
+ "APP_DIR": "api",
992
+ "BUILD_ID": "some-id",
993
+ "COMPONENT_NAME": "api",
994
+ "DOCKER_CACHE_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/caches/api",
995
+ "DOCKER_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/$DOCKER_IMAGE_NAME",
996
+ "DOCKER_IMAGE_NAME": "review/api",
997
+ "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
998
+ "DOCKER_REGISTRY": "$CI_REGISTRY",
999
+ "DOCKER_REGISTRY_IMAGE_PATH": "$CI_REGISTRY_IMAGE",
1000
+ "ENV_SHORT": "review",
1001
+ "ENV_TYPE": "review",
1002
+ "HELM_ARGS": "",
1003
+ "HELM_EXPERIMENTAL_OCI": "1",
1004
+ "HELM_GITLAB_CHART_NAME": "/helm-charts/the-panter-chart",
1005
+ "HOST": "api.mr1234.review.test-app.pan.panter.cloud",
1006
+ "HOST_CANONICAL": "api.mr1234.review.test-app.pan.panter.cloud",
1007
+ "KUBERNETES_CPU_LIMIT": "1",
1008
+ "KUBERNETES_CPU_REQUEST": "0.5",
1009
+ "KUBERNETES_MEMORY_LIMIT": "500Mi",
1010
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
1011
+ "KUBE_APP_NAME": "mr1234-api",
1012
+ "KUBE_APP_NAME_PREFIX": "mr1234-",
1013
+ "KUBE_DOCKER_IMAGE_PULL_SECRET": "gitlab-registry-api",
1014
+ "KUBE_NAMESPACE": "pan-test-app-review",
1015
+ "KUBE_VALUES": "env:
1016
+ secret: {}
1017
+ public:
1018
+ ENV_SHORT: 'review'
1019
+ APP_DIR: 'api'
1020
+ ENV_TYPE: 'review'
1021
+ HOST: 'api.mr1234.review.test-app.pan.panter.cloud'
1022
+ ROOT_URL: 'https://api.mr1234.review.test-app.pan.panter.cloud'
1023
+ KUBE_NAMESPACE: 'pan-test-app-review'
1024
+ KUBE_APP_NAME: 'mr1234-api'
1025
+ KUBE_APP_NAME_PREFIX: 'mr1234-'
1026
+ HOST_CANONICAL: 'api.mr1234.review.test-app.pan.panter.cloud'
1027
+ _ALL_ENV_VAR_KEYS: '["ENV_SHORT","APP_DIR","ENV_TYPE","HOST","ROOT_URL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","HOST_CANONICAL"]'
1028
+ application:
1029
+ host: 'api.mr1234.review.test-app.pan.panter.cloud'
1030
+ command: 'node main.js'
1031
+ livenessProbe:
1032
+ httpGet:
1033
+ path: '__health'
1034
+ readinessProbe:
1035
+ httpGet:
1036
+ path: '__health'
1037
+ startupProbe:
1038
+ httpGet:
1039
+ path: '__health'
1040
+ autoscale:
1041
+ minReplicas: 2
1042
+ maxReplicas: 5
1043
+ metrics:
1044
+ - type: 'Resource'
1045
+ resource:
1046
+ name: 'cpu'
1047
+ target:
1048
+ type: 'Utilization'
1049
+ averageUtilization: 0.5
1050
+ resources:
1051
+ limits:
1052
+ cpu: '1'
1053
+ memory: '2048Mi'
1054
+ ",
1055
+ "RELEASE_NAME": "pan-test-app-review-mr1234-api",
1056
+ "ROOT_URL": "https://api.mr1234.review.test-app.pan.panter.cloud",
1057
+ "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","HOST","ROOT_URL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","HOST_CANONICAL"]",
1058
+ },
1059
+ },
1060
+ "api 🛑 Stop ⚠️ | review ": {
1061
+ "environment": {
1062
+ "action": "stop",
1063
+ "kubernetes": {
1064
+ "namespace": "pan-test-app-review",
1065
+ },
1066
+ "name": "review/some-commit/api",
1067
+ "url": "https://api.mr1234.review.test-app.pan.panter.cloud",
1068
+ },
1069
+ "image": "path/to/docker/kubernetes:the-version",
1070
+ "interruptible": true,
1071
+ "needs": [],
1072
+ "retry": {
1073
+ "max": 2,
1074
+ "when": [
1075
+ "runner_system_failure",
1076
+ "stuck_or_timeout_failure",
1077
+ ],
1078
+ },
1079
+ "rules": [
1080
+ {
1081
+ "allow_failure": true,
1082
+ "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/",
1083
+ "when": "on_success",
1084
+ },
1085
+ {
1086
+ "allow_failure": true,
1087
+ "when": "manual",
1088
+ },
1089
+ ],
1090
+ "script": [
1091
+ "kubectl config set-cluster "kube-pan-test-app-review-mr1234-api" --server="$CL_review_api_KUBE_URL" --certificate-authority <(echo $CL_review_api_KUBE_CA_PEM | base64 -d) --embed-certs=true",
1092
+ "kubectl config set-credentials "kube-pan-test-app-review-mr1234-api" --token="$CL_review_api_KUBE_TOKEN"",
1093
+ "kubectl config set-context "kube-pan-test-app-review-mr1234-api" --cluster="kube-pan-test-app-review-mr1234-api" --user="kube-pan-test-app-review-mr1234-api" --namespace="pan-test-app-review"",
1094
+ "kubectl config use-context "kube-pan-test-app-review-mr1234-api"",
1095
+ "kubernetesDelete",
1096
+ ],
1097
+ "stage": "stop review",
1098
+ "variables": {
1099
+ "APP_DIR": "api",
1100
+ "BUILD_ID": "some-id",
1101
+ "COMPONENT_NAME": "api",
1102
+ "ENV_SHORT": "review",
1103
+ "ENV_TYPE": "review",
1104
+ "GIT_STRATEGY": "none",
1105
+ "HELM_ARGS": "",
1106
+ "HELM_EXPERIMENTAL_OCI": "1",
1107
+ "HELM_GITLAB_CHART_NAME": "/helm-charts/the-panter-chart",
1108
+ "HOST": "api.mr1234.review.test-app.pan.panter.cloud",
1109
+ "HOST_CANONICAL": "api.mr1234.review.test-app.pan.panter.cloud",
1110
+ "KUBERNETES_CPU_LIMIT": "1",
1111
+ "KUBERNETES_CPU_REQUEST": "0.5",
1112
+ "KUBERNETES_MEMORY_LIMIT": "500Mi",
1113
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
1114
+ "KUBE_APP_NAME": "mr1234-api",
1115
+ "KUBE_APP_NAME_PREFIX": "mr1234-",
1116
+ "KUBE_DOCKER_IMAGE_PULL_SECRET": "gitlab-registry-api",
1117
+ "KUBE_NAMESPACE": "pan-test-app-review",
1118
+ "KUBE_VALUES": "env:
1119
+ secret: {}
1120
+ public:
1121
+ ENV_SHORT: 'review'
1122
+ APP_DIR: 'api'
1123
+ ENV_TYPE: 'review'
1124
+ HOST: 'api.mr1234.review.test-app.pan.panter.cloud'
1125
+ ROOT_URL: 'https://api.mr1234.review.test-app.pan.panter.cloud'
1126
+ KUBE_NAMESPACE: 'pan-test-app-review'
1127
+ KUBE_APP_NAME: 'mr1234-api'
1128
+ KUBE_APP_NAME_PREFIX: 'mr1234-'
1129
+ HOST_CANONICAL: 'api.mr1234.review.test-app.pan.panter.cloud'
1130
+ _ALL_ENV_VAR_KEYS: '["ENV_SHORT","APP_DIR","ENV_TYPE","HOST","ROOT_URL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","HOST_CANONICAL"]'
1131
+ application:
1132
+ host: 'api.mr1234.review.test-app.pan.panter.cloud'
1133
+ command: 'node main.js'
1134
+ livenessProbe:
1135
+ httpGet:
1136
+ path: '__health'
1137
+ readinessProbe:
1138
+ httpGet:
1139
+ path: '__health'
1140
+ startupProbe:
1141
+ httpGet:
1142
+ path: '__health'
1143
+ autoscale:
1144
+ minReplicas: 2
1145
+ maxReplicas: 5
1146
+ metrics:
1147
+ - type: 'Resource'
1148
+ resource:
1149
+ name: 'cpu'
1150
+ target:
1151
+ type: 'Utilization'
1152
+ averageUtilization: 0.5
1153
+ resources:
1154
+ limits:
1155
+ cpu: '1'
1156
+ memory: '2048Mi'
1157
+ ",
1158
+ "RELEASE_NAME": "pan-test-app-review-mr1234-api",
1159
+ "ROOT_URL": "https://api.mr1234.review.test-app.pan.panter.cloud",
1160
+ "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","HOST","ROOT_URL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","HOST_CANONICAL"]",
1161
+ },
1162
+ },
1163
+ "api 🛡 audit": {
1164
+ "allow_failure": true,
1165
+ "cache": undefined,
1166
+ "environment": undefined,
1167
+ "interruptible": true,
1168
+ "needs": [],
1169
+ "retry": {
1170
+ "max": 2,
1171
+ "when": [
1172
+ "runner_system_failure",
1173
+ "stuck_or_timeout_failure",
1174
+ ],
1175
+ },
1176
+ "script": [
1177
+ "cd api",
1178
+ "yarn npm audit --environment production",
1179
+ ],
1180
+ "stage": "test",
1181
+ "variables": {
1182
+ "APP_PATH": "api",
1183
+ "KUBERNETES_CPU_LIMIT": "2",
1184
+ "KUBERNETES_CPU_REQUEST": "0.5",
1185
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
1186
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
1187
+ },
1188
+ },
1189
+ "api 🧪 test": {
1190
+ "cache": [
1191
+ {
1192
+ "key": "api-yarn",
1193
+ "paths": [
1194
+ "api/.yarn",
1195
+ ],
1196
+ "policy": "pull-push",
1197
+ },
1198
+ {
1199
+ "key": "api-node-modules",
1200
+ "paths": [
1201
+ "api/node_modules",
1202
+ ],
1203
+ "policy": "pull-push",
1204
+ },
1205
+ ],
1206
+ "environment": undefined,
1207
+ "image": "path/to/docker/jobs-testing-chrome:the-version",
1208
+ "interruptible": true,
1209
+ "needs": [],
1210
+ "retry": {
1211
+ "max": 2,
1212
+ "when": [
1213
+ "runner_system_failure",
1214
+ "stuck_or_timeout_failure",
1215
+ ],
1216
+ },
1217
+ "script": [
1218
+ "cd api",
1219
+ "if [ -f ./.nvmrc ]; then source /root/.nvm/nvm.sh && nvm install <<< .nvmrc; fi",
1220
+ "yarn install --immutable",
1221
+ "yarn test",
1222
+ ],
1223
+ "stage": "test",
1224
+ "variables": {
1225
+ "APP_PATH": "api",
1226
+ "KUBERNETES_CPU_LIMIT": "2",
1227
+ "KUBERNETES_CPU_REQUEST": "0.5",
1228
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
1229
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
1230
+ },
1231
+ },
1232
+ },
1233
+ "stages": [
1234
+ "setup",
1235
+ "setup dev",
1236
+ "setup review",
1237
+ "setup stage",
1238
+ "setup prod",
1239
+ "setup local",
1240
+ "test",
1241
+ "test dev",
1242
+ "test review",
1243
+ "test stage",
1244
+ "test prod",
1245
+ "test local",
1246
+ "build",
1247
+ "build dev",
1248
+ "build review",
1249
+ "build stage",
1250
+ "build prod",
1251
+ "build local",
1252
+ "deploy",
1253
+ "deploy dev",
1254
+ "deploy review",
1255
+ "deploy stage",
1256
+ "deploy prod",
1257
+ "deploy local",
1258
+ "verify",
1259
+ "verify dev",
1260
+ "verify review",
1261
+ "verify stage",
1262
+ "verify prod",
1263
+ "verify local",
1264
+ "rollback",
1265
+ "rollback dev",
1266
+ "rollback review",
1267
+ "rollback stage",
1268
+ "rollback prod",
1269
+ "rollback local",
1270
+ "stop",
1271
+ "stop dev",
1272
+ "stop review",
1273
+ "stop stage",
1274
+ "stop prod",
1275
+ "stop local",
1276
+ ],
1277
+ "variables": {
1278
+ "FF_USE_FASTZIP": "true",
1279
+ },
1280
+ "workflow": {
1281
+ "rules": [
1282
+ {
1283
+ "if": "$CI_COMMIT_TAG",
1284
+ },
1285
+ {
1286
+ "if": "$CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/",
1287
+ "when": "never",
1288
+ },
1289
+ {
1290
+ "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+.([0-9]+|x).x$/",
1291
+ },
1292
+ {
1293
+ "if": "$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH",
1294
+ },
1295
+ {
1296
+ "if": "$CI_MERGE_REQUEST_ID",
1297
+ },
1298
+ ],
1299
+ },
1300
+ },
1301
+ "taggedRelease": {
1302
+ "image": "path/to/docker/jobs-default:the-version",
1303
+ "jobs": {
1304
+ "api ↩️ Rollback ⚠️ | prod ": {
1305
+ "environment": {
1306
+ "action": "access",
1307
+ "kubernetes": {
1308
+ "namespace": "pan-test-app-prod",
1309
+ },
1310
+ "name": "prod/api",
1311
+ "url": "https://api.prod.test-app.pan.panter.cloud",
1312
+ },
1313
+ "image": "path/to/docker/kubernetes:the-version",
1314
+ "interruptible": true,
1315
+ "needs": [],
1316
+ "retry": {
1317
+ "max": 2,
1318
+ "when": [
1319
+ "runner_system_failure",
1320
+ "stuck_or_timeout_failure",
1321
+ ],
1322
+ },
1323
+ "rules": [
1324
+ {
1325
+ "allow_failure": true,
1326
+ "when": "manual",
1327
+ },
1328
+ ],
1329
+ "script": [
1330
+ "kubectl config set-cluster "kube-pan-test-app-prod-api" --server="$CL_prod_api_KUBE_URL" --certificate-authority <(echo $CL_prod_api_KUBE_CA_PEM | base64 -d) --embed-certs=true",
1331
+ "kubectl config set-credentials "kube-pan-test-app-prod-api" --token="$CL_prod_api_KUBE_TOKEN"",
1332
+ "kubectl config set-context "kube-pan-test-app-prod-api" --cluster="kube-pan-test-app-prod-api" --user="kube-pan-test-app-prod-api" --namespace="pan-test-app-prod"",
1333
+ "kubectl config use-context "kube-pan-test-app-prod-api"",
1334
+ "kubernetesRollback",
1335
+ ],
1336
+ "stage": "rollback prod",
1337
+ "variables": {
1338
+ "APP_DIR": "api",
1339
+ "BUILD_ID": "some-id",
1340
+ "COMPONENT_NAME": "api",
1341
+ "ENV_SHORT": "prod",
1342
+ "ENV_TYPE": "prod",
1343
+ "GIT_STRATEGY": "none",
1344
+ "HELM_ARGS": "",
1345
+ "HELM_EXPERIMENTAL_OCI": "1",
1346
+ "HELM_GITLAB_CHART_NAME": "/helm-charts/the-panter-chart",
1347
+ "HOST": "api.prod.test-app.pan.panter.cloud",
1348
+ "HOST_CANONICAL": "api.prod.test-app.pan.panter.cloud",
1349
+ "KUBERNETES_CPU_LIMIT": "1",
1350
+ "KUBERNETES_CPU_REQUEST": "0.5",
1351
+ "KUBERNETES_MEMORY_LIMIT": "500Mi",
1352
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
1353
+ "KUBE_APP_NAME": "api",
1354
+ "KUBE_APP_NAME_PREFIX": "",
1355
+ "KUBE_DOCKER_IMAGE_PULL_SECRET": "gitlab-registry-api",
1356
+ "KUBE_NAMESPACE": "pan-test-app-prod",
1357
+ "KUBE_VALUES": "env:
1358
+ secret: {}
1359
+ public:
1360
+ ENV_SHORT: 'prod'
1361
+ APP_DIR: 'api'
1362
+ ENV_TYPE: 'prod'
1363
+ HOST: 'api.prod.test-app.pan.panter.cloud'
1364
+ ROOT_URL: 'https://api.prod.test-app.pan.panter.cloud'
1365
+ KUBE_NAMESPACE: 'pan-test-app-prod'
1366
+ KUBE_APP_NAME: 'api'
1367
+ KUBE_APP_NAME_PREFIX: ''
1368
+ HOST_CANONICAL: 'api.prod.test-app.pan.panter.cloud'
1369
+ _ALL_ENV_VAR_KEYS: '["ENV_SHORT","APP_DIR","ENV_TYPE","HOST","ROOT_URL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","HOST_CANONICAL"]'
1370
+ application:
1371
+ host: 'api.prod.test-app.pan.panter.cloud'
1372
+ command: 'node main.js'
1373
+ livenessProbe:
1374
+ httpGet:
1375
+ path: '__health'
1376
+ readinessProbe:
1377
+ httpGet:
1378
+ path: '__health'
1379
+ startupProbe:
1380
+ httpGet:
1381
+ path: '__health'
1382
+ autoscale:
1383
+ minReplicas: 2
1384
+ maxReplicas: 5
1385
+ metrics:
1386
+ - type: 'Resource'
1387
+ resource:
1388
+ name: 'cpu'
1389
+ target:
1390
+ type: 'Utilization'
1391
+ averageUtilization: 0.5
1392
+ resources:
1393
+ limits:
1394
+ cpu: '1'
1395
+ memory: '2048Mi'
1396
+ ",
1397
+ "RELEASE_NAME": "pan-test-app-prod-api",
1398
+ "ROOT_URL": "https://api.prod.test-app.pan.panter.cloud",
1399
+ "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","HOST","ROOT_URL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","HOST_CANONICAL"]",
1400
+ },
1401
+ },
1402
+ "api ↩️ Rollback ⚠️ | stage ": {
1403
+ "environment": {
1404
+ "action": "access",
1405
+ "kubernetes": {
1406
+ "namespace": "pan-test-app-stage",
1407
+ },
1408
+ "name": "stage/api",
1409
+ "url": "https://api.stage.test-app.pan.panter.cloud",
1410
+ },
1411
+ "image": "path/to/docker/kubernetes:the-version",
1412
+ "interruptible": true,
1413
+ "needs": [],
1414
+ "retry": {
1415
+ "max": 2,
1416
+ "when": [
1417
+ "runner_system_failure",
1418
+ "stuck_or_timeout_failure",
1419
+ ],
1420
+ },
1421
+ "rules": [
1422
+ {
1423
+ "allow_failure": true,
1424
+ "when": "manual",
1425
+ },
1426
+ ],
1427
+ "script": [
1428
+ "kubectl config set-cluster "kube-pan-test-app-stage-api" --server="$CL_stage_api_KUBE_URL" --certificate-authority <(echo $CL_stage_api_KUBE_CA_PEM | base64 -d) --embed-certs=true",
1429
+ "kubectl config set-credentials "kube-pan-test-app-stage-api" --token="$CL_stage_api_KUBE_TOKEN"",
1430
+ "kubectl config set-context "kube-pan-test-app-stage-api" --cluster="kube-pan-test-app-stage-api" --user="kube-pan-test-app-stage-api" --namespace="pan-test-app-stage"",
1431
+ "kubectl config use-context "kube-pan-test-app-stage-api"",
1432
+ "kubernetesRollback",
1433
+ ],
1434
+ "stage": "rollback stage",
1435
+ "variables": {
1436
+ "APP_DIR": "api",
1437
+ "BUILD_ID": "some-id",
1438
+ "COMPONENT_NAME": "api",
1439
+ "ENV_SHORT": "stage",
1440
+ "ENV_TYPE": "stage",
1441
+ "GIT_STRATEGY": "none",
1442
+ "HELM_ARGS": "",
1443
+ "HELM_EXPERIMENTAL_OCI": "1",
1444
+ "HELM_GITLAB_CHART_NAME": "/helm-charts/the-panter-chart",
1445
+ "HOST": "api.stage.test-app.pan.panter.cloud",
1446
+ "HOST_CANONICAL": "api.stage.test-app.pan.panter.cloud",
1447
+ "KUBERNETES_CPU_LIMIT": "1",
1448
+ "KUBERNETES_CPU_REQUEST": "0.5",
1449
+ "KUBERNETES_MEMORY_LIMIT": "500Mi",
1450
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
1451
+ "KUBE_APP_NAME": "api",
1452
+ "KUBE_APP_NAME_PREFIX": "",
1453
+ "KUBE_DOCKER_IMAGE_PULL_SECRET": "gitlab-registry-api",
1454
+ "KUBE_NAMESPACE": "pan-test-app-stage",
1455
+ "KUBE_VALUES": "env:
1456
+ secret: {}
1457
+ public:
1458
+ ENV_SHORT: 'stage'
1459
+ APP_DIR: 'api'
1460
+ ENV_TYPE: 'stage'
1461
+ HOST: 'api.stage.test-app.pan.panter.cloud'
1462
+ ROOT_URL: 'https://api.stage.test-app.pan.panter.cloud'
1463
+ KUBE_NAMESPACE: 'pan-test-app-stage'
1464
+ KUBE_APP_NAME: 'api'
1465
+ KUBE_APP_NAME_PREFIX: ''
1466
+ HOST_CANONICAL: 'api.stage.test-app.pan.panter.cloud'
1467
+ _ALL_ENV_VAR_KEYS: '["ENV_SHORT","APP_DIR","ENV_TYPE","HOST","ROOT_URL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","HOST_CANONICAL"]'
1468
+ application:
1469
+ host: 'api.stage.test-app.pan.panter.cloud'
1470
+ command: 'node main.js'
1471
+ livenessProbe:
1472
+ httpGet:
1473
+ path: '__health'
1474
+ readinessProbe:
1475
+ httpGet:
1476
+ path: '__health'
1477
+ startupProbe:
1478
+ httpGet:
1479
+ path: '__health'
1480
+ autoscale:
1481
+ minReplicas: 2
1482
+ maxReplicas: 5
1483
+ metrics:
1484
+ - type: 'Resource'
1485
+ resource:
1486
+ name: 'cpu'
1487
+ target:
1488
+ type: 'Utilization'
1489
+ averageUtilization: 0.5
1490
+ resources:
1491
+ limits:
1492
+ cpu: '1'
1493
+ memory: '2048Mi'
1494
+ ",
1495
+ "RELEASE_NAME": "pan-test-app-stage-api",
1496
+ "ROOT_URL": "https://api.stage.test-app.pan.panter.cloud",
1497
+ "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","HOST","ROOT_URL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","HOST_CANONICAL"]",
1498
+ },
1499
+ },
1500
+ "api 🔨 app | prod ": {
1501
+ "artifacts": {
1502
+ "paths": [
1503
+ "api/__build_info.json",
1504
+ "api/dist",
1505
+ "api/.next",
1506
+ ],
1507
+ "reports": {
1508
+ "junit": undefined,
1509
+ },
1510
+ },
1511
+ "cache": [
1512
+ {
1513
+ "key": "api-yarn",
1514
+ "paths": [
1515
+ "api/.yarn",
1516
+ ],
1517
+ "policy": "pull-push",
1518
+ },
1519
+ {
1520
+ "key": "api-node-modules",
1521
+ "paths": [
1522
+ "api/node_modules",
1523
+ ],
1524
+ "policy": "pull-push",
1525
+ },
1526
+ {
1527
+ "key": "api-next-cache",
1528
+ "paths": [
1529
+ "api/.next/cache/",
1530
+ ],
1531
+ "policy": "pull-push",
1532
+ },
1533
+ ],
1534
+ "environment": undefined,
1535
+ "image": "path/to/docker/jobs-default:the-version",
1536
+ "interruptible": true,
1537
+ "needs": [],
1538
+ "retry": {
1539
+ "max": 2,
1540
+ "when": [
1541
+ "runner_system_failure",
1542
+ "stuck_or_timeout_failure",
1543
+ ],
1544
+ },
1545
+ "script": [
1546
+ "echo '{"id":"some-id","time":"01-01-2023 12:13:14"}' > api/__build_info.json",
1547
+ "if [ -f ./.nvmrc ]; then source /root/.nvm/nvm.sh && nvm install <<< .nvmrc; fi",
1548
+ "cd api",
1549
+ "if [ -f ./.nvmrc ]; then source /root/.nvm/nvm.sh && nvm install <<< .nvmrc; fi",
1550
+ "yarn install --immutable",
1551
+ "yarn build",
1552
+ ],
1553
+ "stage": "build",
1554
+ "variables": {
1555
+ "APP_DIR": "api",
1556
+ "ENV_SHORT": "prod",
1557
+ "ENV_TYPE": "prod",
1558
+ "HOST": "api.prod.test-app.pan.panter.cloud",
1559
+ "HOST_CANONICAL": "api.prod.test-app.pan.panter.cloud",
1560
+ "KUBERNETES_CPU_LIMIT": "2",
1561
+ "KUBERNETES_CPU_REQUEST": "0.5",
1562
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
1563
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
1564
+ "KUBE_APP_NAME": "api",
1565
+ "KUBE_APP_NAME_PREFIX": "",
1566
+ "KUBE_NAMESPACE": "pan-test-app-prod",
1567
+ "ROOT_URL": "https://api.prod.test-app.pan.panter.cloud",
1568
+ "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","HOST","ROOT_URL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","HOST_CANONICAL"]",
1569
+ },
1570
+ },
1571
+ "api 🔨 app | stage ": {
1572
+ "artifacts": {
1573
+ "paths": [
1574
+ "api/__build_info.json",
1575
+ "api/dist",
1576
+ "api/.next",
1577
+ ],
1578
+ "reports": {
1579
+ "junit": undefined,
1580
+ },
1581
+ },
1582
+ "cache": [
1583
+ {
1584
+ "key": "api-yarn",
1585
+ "paths": [
1586
+ "api/.yarn",
1587
+ ],
1588
+ "policy": "pull-push",
1589
+ },
1590
+ {
1591
+ "key": "api-node-modules",
1592
+ "paths": [
1593
+ "api/node_modules",
1594
+ ],
1595
+ "policy": "pull-push",
1596
+ },
1597
+ {
1598
+ "key": "api-next-cache",
1599
+ "paths": [
1600
+ "api/.next/cache/",
1601
+ ],
1602
+ "policy": "pull-push",
1603
+ },
1604
+ ],
1605
+ "environment": undefined,
1606
+ "image": "path/to/docker/jobs-default:the-version",
1607
+ "interruptible": true,
1608
+ "needs": [],
1609
+ "retry": {
1610
+ "max": 2,
1611
+ "when": [
1612
+ "runner_system_failure",
1613
+ "stuck_or_timeout_failure",
1614
+ ],
1615
+ },
1616
+ "script": [
1617
+ "echo '{"id":"some-id","time":"01-01-2023 12:13:14"}' > api/__build_info.json",
1618
+ "if [ -f ./.nvmrc ]; then source /root/.nvm/nvm.sh && nvm install <<< .nvmrc; fi",
1619
+ "cd api",
1620
+ "if [ -f ./.nvmrc ]; then source /root/.nvm/nvm.sh && nvm install <<< .nvmrc; fi",
1621
+ "yarn install --immutable",
1622
+ "yarn build",
1623
+ ],
1624
+ "stage": "build",
1625
+ "variables": {
1626
+ "APP_DIR": "api",
1627
+ "ENV_SHORT": "stage",
1628
+ "ENV_TYPE": "stage",
1629
+ "HOST": "api.stage.test-app.pan.panter.cloud",
1630
+ "HOST_CANONICAL": "api.stage.test-app.pan.panter.cloud",
1631
+ "KUBERNETES_CPU_LIMIT": "2",
1632
+ "KUBERNETES_CPU_REQUEST": "0.5",
1633
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
1634
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
1635
+ "KUBE_APP_NAME": "api",
1636
+ "KUBE_APP_NAME_PREFIX": "",
1637
+ "KUBE_NAMESPACE": "pan-test-app-stage",
1638
+ "ROOT_URL": "https://api.stage.test-app.pan.panter.cloud",
1639
+ "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","HOST","ROOT_URL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","HOST_CANONICAL"]",
1640
+ },
1641
+ },
1642
+ "api 🔨 docker | prod ": {
1643
+ "cache": [
1644
+ {
1645
+ "key": "api-yarn",
1646
+ "paths": [
1647
+ "api/.yarn",
1648
+ ],
1649
+ "policy": "pull",
1650
+ },
1651
+ ],
1652
+ "environment": undefined,
1653
+ "image": "path/to/docker/docker-build:the-version",
1654
+ "interruptible": true,
1655
+ "needs": [
1656
+ "api 🔨 app | prod ",
1657
+ ],
1658
+ "retry": {
1659
+ "max": 2,
1660
+ "when": [
1661
+ "runner_system_failure",
1662
+ "stuck_or_timeout_failure",
1663
+ ],
1664
+ },
1665
+ "script": [
1666
+ "ensureNodeDockerfile",
1667
+ "docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY",
1668
+ "docker version",
1669
+ "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",
1670
+ "docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
1671
+ "docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE",
1672
+ "docker push $DOCKER_CACHE_IMAGE",
1673
+ ],
1674
+ "services": [
1675
+ {
1676
+ "command": [
1677
+ "--tls=false",
1678
+ ],
1679
+ "name": "docker:20-dind",
1680
+ },
1681
+ ],
1682
+ "stage": "build",
1683
+ "variables": {
1684
+ "APP_DIR": "api",
1685
+ "DOCKERFILE_ADDITIONS": undefined,
1686
+ "DOCKERFILE_ADDITIONS_END": undefined,
1687
+ "DOCKER_BUILDKIT": "1",
1688
+ "DOCKER_CACHE_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/caches/api",
1689
+ "DOCKER_COPY_WORKSPACE_FILES": "COPY --chown=node:node api/package.json /app/api/package.json
1690
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock",
1691
+ "DOCKER_DIR": ".",
1692
+ "DOCKER_DRIVER": "overlay2",
1693
+ "DOCKER_HOST": "tcp://0.0.0.0:2375",
1694
+ "DOCKER_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/$DOCKER_IMAGE_NAME",
1695
+ "DOCKER_IMAGE_NAME": "prod/api",
1696
+ "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
1697
+ "DOCKER_REGISTRY": "$CI_REGISTRY",
1698
+ "DOCKER_REGISTRY_IMAGE_PATH": "$CI_REGISTRY_IMAGE",
1699
+ "DOCKER_TLS_CERTDIR": "",
1700
+ "KUBERNETES_CPU_LIMIT": "1",
1701
+ "KUBERNETES_CPU_REQUEST": "0.5",
1702
+ "KUBERNETES_MEMORY_LIMIT": "2Gi",
1703
+ "KUBERNETES_MEMORY_REQUEST": "1Gi",
1704
+ "YARN_INSTALL": "yarn plugin import workspace-tools && yarn workspaces focus --production && yarn rebuild",
1705
+ "YARN_INSTALL_WITHOUT_SCRIPTS": "YARN_ENABLE_SCRIPTS=false yarn plugin import workspace-tools && yarn workspaces focus --production && yarn rebuild",
1706
+ },
1707
+ },
1708
+ "api 🔨 docker | stage ": {
1709
+ "cache": [
1710
+ {
1711
+ "key": "api-yarn",
1712
+ "paths": [
1713
+ "api/.yarn",
1714
+ ],
1715
+ "policy": "pull",
1716
+ },
1717
+ ],
1718
+ "environment": undefined,
1719
+ "image": "path/to/docker/docker-build:the-version",
1720
+ "interruptible": true,
1721
+ "needs": [
1722
+ "api 🔨 app | stage ",
1723
+ ],
1724
+ "retry": {
1725
+ "max": 2,
1726
+ "when": [
1727
+ "runner_system_failure",
1728
+ "stuck_or_timeout_failure",
1729
+ ],
1730
+ },
1731
+ "script": [
1732
+ "ensureNodeDockerfile",
1733
+ "docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY",
1734
+ "docker version",
1735
+ "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",
1736
+ "docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
1737
+ "docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE",
1738
+ "docker push $DOCKER_CACHE_IMAGE",
1739
+ ],
1740
+ "services": [
1741
+ {
1742
+ "command": [
1743
+ "--tls=false",
1744
+ ],
1745
+ "name": "docker:20-dind",
1746
+ },
1747
+ ],
1748
+ "stage": "build",
1749
+ "variables": {
1750
+ "APP_DIR": "api",
1751
+ "DOCKERFILE_ADDITIONS": undefined,
1752
+ "DOCKERFILE_ADDITIONS_END": undefined,
1753
+ "DOCKER_BUILDKIT": "1",
1754
+ "DOCKER_CACHE_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/caches/api",
1755
+ "DOCKER_COPY_WORKSPACE_FILES": "COPY --chown=node:node api/package.json /app/api/package.json
1756
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock",
1757
+ "DOCKER_DIR": ".",
1758
+ "DOCKER_DRIVER": "overlay2",
1759
+ "DOCKER_HOST": "tcp://0.0.0.0:2375",
1760
+ "DOCKER_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/$DOCKER_IMAGE_NAME",
1761
+ "DOCKER_IMAGE_NAME": "stage/api",
1762
+ "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
1763
+ "DOCKER_REGISTRY": "$CI_REGISTRY",
1764
+ "DOCKER_REGISTRY_IMAGE_PATH": "$CI_REGISTRY_IMAGE",
1765
+ "DOCKER_TLS_CERTDIR": "",
1766
+ "KUBERNETES_CPU_LIMIT": "1",
1767
+ "KUBERNETES_CPU_REQUEST": "0.5",
1768
+ "KUBERNETES_MEMORY_LIMIT": "2Gi",
1769
+ "KUBERNETES_MEMORY_REQUEST": "1Gi",
1770
+ "YARN_INSTALL": "yarn plugin import workspace-tools && yarn workspaces focus --production && yarn rebuild",
1771
+ "YARN_INSTALL_WITHOUT_SCRIPTS": "YARN_ENABLE_SCRIPTS=false yarn plugin import workspace-tools && yarn workspaces focus --production && yarn rebuild",
1772
+ },
1773
+ },
1774
+ "api 🚀 Deploy | prod ": {
1775
+ "allow_failure": true,
1776
+ "environment": {
1777
+ "auto_stop_in": undefined,
1778
+ "kubernetes": {
1779
+ "namespace": "pan-test-app-prod",
1780
+ },
1781
+ "name": "prod/api",
1782
+ "on_stop": "api 🛑 Stop ⚠️ | prod ",
1783
+ "url": "https://api.prod.test-app.pan.panter.cloud",
1784
+ },
1785
+ "image": "path/to/docker/kubernetes:the-version",
1786
+ "interruptible": true,
1787
+ "needs": [
1788
+ {
1789
+ "artifacts": false,
1790
+ "job": "api 🔨 app | prod ",
1791
+ },
1792
+ {
1793
+ "artifacts": false,
1794
+ "job": "api 🔨 docker | prod ",
1795
+ },
1796
+ ],
1797
+ "retry": {
1798
+ "max": 2,
1799
+ "when": [
1800
+ "runner_system_failure",
1801
+ "stuck_or_timeout_failure",
1802
+ ],
1803
+ },
1804
+ "rules": [
1805
+ {
1806
+ "when": "manual",
1807
+ },
1808
+ ],
1809
+ "script": [
1810
+ "kubectl config set-cluster "kube-pan-test-app-prod-api" --server="$CL_prod_api_KUBE_URL" --certificate-authority <(echo $CL_prod_api_KUBE_CA_PEM | base64 -d) --embed-certs=true",
1811
+ "kubectl config set-credentials "kube-pan-test-app-prod-api" --token="$CL_prod_api_KUBE_TOKEN"",
1812
+ "kubectl config set-context "kube-pan-test-app-prod-api" --cluster="kube-pan-test-app-prod-api" --user="kube-pan-test-app-prod-api" --namespace="pan-test-app-prod"",
1813
+ "kubectl config use-context "kube-pan-test-app-prod-api"",
1814
+ "kubernetesCreateSecret",
1815
+ "kubernetesDeploy",
1816
+ "echo deployment successful 😻",
1817
+ ],
1818
+ "stage": "deploy prod",
1819
+ "variables": {
1820
+ "APP_DIR": "api",
1821
+ "BUILD_ID": "some-id",
1822
+ "COMPONENT_NAME": "api",
1823
+ "DOCKER_CACHE_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/caches/api",
1824
+ "DOCKER_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/$DOCKER_IMAGE_NAME",
1825
+ "DOCKER_IMAGE_NAME": "prod/api",
1826
+ "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
1827
+ "DOCKER_REGISTRY": "$CI_REGISTRY",
1828
+ "DOCKER_REGISTRY_IMAGE_PATH": "$CI_REGISTRY_IMAGE",
1829
+ "ENV_SHORT": "prod",
1830
+ "ENV_TYPE": "prod",
1831
+ "HELM_ARGS": "",
1832
+ "HELM_EXPERIMENTAL_OCI": "1",
1833
+ "HELM_GITLAB_CHART_NAME": "/helm-charts/the-panter-chart",
1834
+ "HOST": "api.prod.test-app.pan.panter.cloud",
1835
+ "HOST_CANONICAL": "api.prod.test-app.pan.panter.cloud",
1836
+ "KUBERNETES_CPU_LIMIT": "1",
1837
+ "KUBERNETES_CPU_REQUEST": "0.5",
1838
+ "KUBERNETES_MEMORY_LIMIT": "500Mi",
1839
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
1840
+ "KUBE_APP_NAME": "api",
1841
+ "KUBE_APP_NAME_PREFIX": "",
1842
+ "KUBE_DOCKER_IMAGE_PULL_SECRET": "gitlab-registry-api",
1843
+ "KUBE_NAMESPACE": "pan-test-app-prod",
1844
+ "KUBE_VALUES": "env:
1845
+ secret: {}
1846
+ public:
1847
+ ENV_SHORT: 'prod'
1848
+ APP_DIR: 'api'
1849
+ ENV_TYPE: 'prod'
1850
+ HOST: 'api.prod.test-app.pan.panter.cloud'
1851
+ ROOT_URL: 'https://api.prod.test-app.pan.panter.cloud'
1852
+ KUBE_NAMESPACE: 'pan-test-app-prod'
1853
+ KUBE_APP_NAME: 'api'
1854
+ KUBE_APP_NAME_PREFIX: ''
1855
+ HOST_CANONICAL: 'api.prod.test-app.pan.panter.cloud'
1856
+ _ALL_ENV_VAR_KEYS: '["ENV_SHORT","APP_DIR","ENV_TYPE","HOST","ROOT_URL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","HOST_CANONICAL"]'
1857
+ application:
1858
+ host: 'api.prod.test-app.pan.panter.cloud'
1859
+ command: 'node main.js'
1860
+ livenessProbe:
1861
+ httpGet:
1862
+ path: '__health'
1863
+ readinessProbe:
1864
+ httpGet:
1865
+ path: '__health'
1866
+ startupProbe:
1867
+ httpGet:
1868
+ path: '__health'
1869
+ autoscale:
1870
+ minReplicas: 2
1871
+ maxReplicas: 5
1872
+ metrics:
1873
+ - type: 'Resource'
1874
+ resource:
1875
+ name: 'cpu'
1876
+ target:
1877
+ type: 'Utilization'
1878
+ averageUtilization: 0.5
1879
+ resources:
1880
+ limits:
1881
+ cpu: '1'
1882
+ memory: '2048Mi'
1883
+ ",
1884
+ "RELEASE_NAME": "pan-test-app-prod-api",
1885
+ "ROOT_URL": "https://api.prod.test-app.pan.panter.cloud",
1886
+ "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","HOST","ROOT_URL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","HOST_CANONICAL"]",
1887
+ },
1888
+ },
1889
+ "api 🚀 Deploy | stage ": {
1890
+ "allow_failure": false,
1891
+ "environment": {
1892
+ "auto_stop_in": undefined,
1893
+ "kubernetes": {
1894
+ "namespace": "pan-test-app-stage",
1895
+ },
1896
+ "name": "stage/api",
1897
+ "on_stop": "api 🛑 Stop ⚠️ | stage ",
1898
+ "url": "https://api.stage.test-app.pan.panter.cloud",
1899
+ },
1900
+ "image": "path/to/docker/kubernetes:the-version",
1901
+ "interruptible": true,
1902
+ "needs": [
1903
+ {
1904
+ "artifacts": false,
1905
+ "job": "api 🔨 app | stage ",
1906
+ },
1907
+ {
1908
+ "artifacts": false,
1909
+ "job": "api 🔨 docker | stage ",
1910
+ },
1911
+ ],
1912
+ "retry": {
1913
+ "max": 2,
1914
+ "when": [
1915
+ "runner_system_failure",
1916
+ "stuck_or_timeout_failure",
1917
+ ],
1918
+ },
1919
+ "rules": [
1920
+ {
1921
+ "when": "on_success",
1922
+ },
1923
+ ],
1924
+ "script": [
1925
+ "kubectl config set-cluster "kube-pan-test-app-stage-api" --server="$CL_stage_api_KUBE_URL" --certificate-authority <(echo $CL_stage_api_KUBE_CA_PEM | base64 -d) --embed-certs=true",
1926
+ "kubectl config set-credentials "kube-pan-test-app-stage-api" --token="$CL_stage_api_KUBE_TOKEN"",
1927
+ "kubectl config set-context "kube-pan-test-app-stage-api" --cluster="kube-pan-test-app-stage-api" --user="kube-pan-test-app-stage-api" --namespace="pan-test-app-stage"",
1928
+ "kubectl config use-context "kube-pan-test-app-stage-api"",
1929
+ "kubernetesCreateSecret",
1930
+ "kubernetesDeploy",
1931
+ "echo deployment successful 😻",
1932
+ ],
1933
+ "stage": "deploy stage",
1934
+ "variables": {
1935
+ "APP_DIR": "api",
1936
+ "BUILD_ID": "some-id",
1937
+ "COMPONENT_NAME": "api",
1938
+ "DOCKER_CACHE_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/caches/api",
1939
+ "DOCKER_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/$DOCKER_IMAGE_NAME",
1940
+ "DOCKER_IMAGE_NAME": "stage/api",
1941
+ "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
1942
+ "DOCKER_REGISTRY": "$CI_REGISTRY",
1943
+ "DOCKER_REGISTRY_IMAGE_PATH": "$CI_REGISTRY_IMAGE",
1944
+ "ENV_SHORT": "stage",
1945
+ "ENV_TYPE": "stage",
1946
+ "HELM_ARGS": "",
1947
+ "HELM_EXPERIMENTAL_OCI": "1",
1948
+ "HELM_GITLAB_CHART_NAME": "/helm-charts/the-panter-chart",
1949
+ "HOST": "api.stage.test-app.pan.panter.cloud",
1950
+ "HOST_CANONICAL": "api.stage.test-app.pan.panter.cloud",
1951
+ "KUBERNETES_CPU_LIMIT": "1",
1952
+ "KUBERNETES_CPU_REQUEST": "0.5",
1953
+ "KUBERNETES_MEMORY_LIMIT": "500Mi",
1954
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
1955
+ "KUBE_APP_NAME": "api",
1956
+ "KUBE_APP_NAME_PREFIX": "",
1957
+ "KUBE_DOCKER_IMAGE_PULL_SECRET": "gitlab-registry-api",
1958
+ "KUBE_NAMESPACE": "pan-test-app-stage",
1959
+ "KUBE_VALUES": "env:
1960
+ secret: {}
1961
+ public:
1962
+ ENV_SHORT: 'stage'
1963
+ APP_DIR: 'api'
1964
+ ENV_TYPE: 'stage'
1965
+ HOST: 'api.stage.test-app.pan.panter.cloud'
1966
+ ROOT_URL: 'https://api.stage.test-app.pan.panter.cloud'
1967
+ KUBE_NAMESPACE: 'pan-test-app-stage'
1968
+ KUBE_APP_NAME: 'api'
1969
+ KUBE_APP_NAME_PREFIX: ''
1970
+ HOST_CANONICAL: 'api.stage.test-app.pan.panter.cloud'
1971
+ _ALL_ENV_VAR_KEYS: '["ENV_SHORT","APP_DIR","ENV_TYPE","HOST","ROOT_URL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","HOST_CANONICAL"]'
1972
+ application:
1973
+ host: 'api.stage.test-app.pan.panter.cloud'
1974
+ command: 'node main.js'
1975
+ livenessProbe:
1976
+ httpGet:
1977
+ path: '__health'
1978
+ readinessProbe:
1979
+ httpGet:
1980
+ path: '__health'
1981
+ startupProbe:
1982
+ httpGet:
1983
+ path: '__health'
1984
+ autoscale:
1985
+ minReplicas: 2
1986
+ maxReplicas: 5
1987
+ metrics:
1988
+ - type: 'Resource'
1989
+ resource:
1990
+ name: 'cpu'
1991
+ target:
1992
+ type: 'Utilization'
1993
+ averageUtilization: 0.5
1994
+ resources:
1995
+ limits:
1996
+ cpu: '1'
1997
+ memory: '2048Mi'
1998
+ ",
1999
+ "RELEASE_NAME": "pan-test-app-stage-api",
2000
+ "ROOT_URL": "https://api.stage.test-app.pan.panter.cloud",
2001
+ "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","HOST","ROOT_URL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","HOST_CANONICAL"]",
2002
+ },
2003
+ },
2004
+ "api 🛑 Stop ⚠️ | prod ": {
2005
+ "environment": {
2006
+ "action": "stop",
2007
+ "kubernetes": {
2008
+ "namespace": "pan-test-app-prod",
2009
+ },
2010
+ "name": "prod/api",
2011
+ "url": "https://api.prod.test-app.pan.panter.cloud",
2012
+ },
2013
+ "image": "path/to/docker/kubernetes:the-version",
2014
+ "interruptible": true,
2015
+ "needs": [],
2016
+ "retry": {
2017
+ "max": 2,
2018
+ "when": [
2019
+ "runner_system_failure",
2020
+ "stuck_or_timeout_failure",
2021
+ ],
2022
+ },
2023
+ "rules": [
2024
+ {
2025
+ "allow_failure": true,
2026
+ "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/",
2027
+ "when": "on_success",
2028
+ },
2029
+ {
2030
+ "allow_failure": true,
2031
+ "when": "manual",
2032
+ },
2033
+ ],
2034
+ "script": [
2035
+ "kubectl config set-cluster "kube-pan-test-app-prod-api" --server="$CL_prod_api_KUBE_URL" --certificate-authority <(echo $CL_prod_api_KUBE_CA_PEM | base64 -d) --embed-certs=true",
2036
+ "kubectl config set-credentials "kube-pan-test-app-prod-api" --token="$CL_prod_api_KUBE_TOKEN"",
2037
+ "kubectl config set-context "kube-pan-test-app-prod-api" --cluster="kube-pan-test-app-prod-api" --user="kube-pan-test-app-prod-api" --namespace="pan-test-app-prod"",
2038
+ "kubectl config use-context "kube-pan-test-app-prod-api"",
2039
+ "kubernetesDelete",
2040
+ ],
2041
+ "stage": "stop prod",
2042
+ "variables": {
2043
+ "APP_DIR": "api",
2044
+ "BUILD_ID": "some-id",
2045
+ "COMPONENT_NAME": "api",
2046
+ "ENV_SHORT": "prod",
2047
+ "ENV_TYPE": "prod",
2048
+ "GIT_STRATEGY": "none",
2049
+ "HELM_ARGS": "",
2050
+ "HELM_EXPERIMENTAL_OCI": "1",
2051
+ "HELM_GITLAB_CHART_NAME": "/helm-charts/the-panter-chart",
2052
+ "HOST": "api.prod.test-app.pan.panter.cloud",
2053
+ "HOST_CANONICAL": "api.prod.test-app.pan.panter.cloud",
2054
+ "KUBERNETES_CPU_LIMIT": "1",
2055
+ "KUBERNETES_CPU_REQUEST": "0.5",
2056
+ "KUBERNETES_MEMORY_LIMIT": "500Mi",
2057
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
2058
+ "KUBE_APP_NAME": "api",
2059
+ "KUBE_APP_NAME_PREFIX": "",
2060
+ "KUBE_DOCKER_IMAGE_PULL_SECRET": "gitlab-registry-api",
2061
+ "KUBE_NAMESPACE": "pan-test-app-prod",
2062
+ "KUBE_VALUES": "env:
2063
+ secret: {}
2064
+ public:
2065
+ ENV_SHORT: 'prod'
2066
+ APP_DIR: 'api'
2067
+ ENV_TYPE: 'prod'
2068
+ HOST: 'api.prod.test-app.pan.panter.cloud'
2069
+ ROOT_URL: 'https://api.prod.test-app.pan.panter.cloud'
2070
+ KUBE_NAMESPACE: 'pan-test-app-prod'
2071
+ KUBE_APP_NAME: 'api'
2072
+ KUBE_APP_NAME_PREFIX: ''
2073
+ HOST_CANONICAL: 'api.prod.test-app.pan.panter.cloud'
2074
+ _ALL_ENV_VAR_KEYS: '["ENV_SHORT","APP_DIR","ENV_TYPE","HOST","ROOT_URL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","HOST_CANONICAL"]'
2075
+ application:
2076
+ host: 'api.prod.test-app.pan.panter.cloud'
2077
+ command: 'node main.js'
2078
+ livenessProbe:
2079
+ httpGet:
2080
+ path: '__health'
2081
+ readinessProbe:
2082
+ httpGet:
2083
+ path: '__health'
2084
+ startupProbe:
2085
+ httpGet:
2086
+ path: '__health'
2087
+ autoscale:
2088
+ minReplicas: 2
2089
+ maxReplicas: 5
2090
+ metrics:
2091
+ - type: 'Resource'
2092
+ resource:
2093
+ name: 'cpu'
2094
+ target:
2095
+ type: 'Utilization'
2096
+ averageUtilization: 0.5
2097
+ resources:
2098
+ limits:
2099
+ cpu: '1'
2100
+ memory: '2048Mi'
2101
+ ",
2102
+ "RELEASE_NAME": "pan-test-app-prod-api",
2103
+ "ROOT_URL": "https://api.prod.test-app.pan.panter.cloud",
2104
+ "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","HOST","ROOT_URL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","HOST_CANONICAL"]",
2105
+ },
2106
+ },
2107
+ "api 🛑 Stop ⚠️ | stage ": {
2108
+ "environment": {
2109
+ "action": "stop",
2110
+ "kubernetes": {
2111
+ "namespace": "pan-test-app-stage",
2112
+ },
2113
+ "name": "stage/api",
2114
+ "url": "https://api.stage.test-app.pan.panter.cloud",
2115
+ },
2116
+ "image": "path/to/docker/kubernetes:the-version",
2117
+ "interruptible": true,
2118
+ "needs": [],
2119
+ "retry": {
2120
+ "max": 2,
2121
+ "when": [
2122
+ "runner_system_failure",
2123
+ "stuck_or_timeout_failure",
2124
+ ],
2125
+ },
2126
+ "rules": [
2127
+ {
2128
+ "allow_failure": true,
2129
+ "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/",
2130
+ "when": "on_success",
2131
+ },
2132
+ {
2133
+ "allow_failure": true,
2134
+ "when": "manual",
2135
+ },
2136
+ ],
2137
+ "script": [
2138
+ "kubectl config set-cluster "kube-pan-test-app-stage-api" --server="$CL_stage_api_KUBE_URL" --certificate-authority <(echo $CL_stage_api_KUBE_CA_PEM | base64 -d) --embed-certs=true",
2139
+ "kubectl config set-credentials "kube-pan-test-app-stage-api" --token="$CL_stage_api_KUBE_TOKEN"",
2140
+ "kubectl config set-context "kube-pan-test-app-stage-api" --cluster="kube-pan-test-app-stage-api" --user="kube-pan-test-app-stage-api" --namespace="pan-test-app-stage"",
2141
+ "kubectl config use-context "kube-pan-test-app-stage-api"",
2142
+ "kubernetesDelete",
2143
+ ],
2144
+ "stage": "stop stage",
2145
+ "variables": {
2146
+ "APP_DIR": "api",
2147
+ "BUILD_ID": "some-id",
2148
+ "COMPONENT_NAME": "api",
2149
+ "ENV_SHORT": "stage",
2150
+ "ENV_TYPE": "stage",
2151
+ "GIT_STRATEGY": "none",
2152
+ "HELM_ARGS": "",
2153
+ "HELM_EXPERIMENTAL_OCI": "1",
2154
+ "HELM_GITLAB_CHART_NAME": "/helm-charts/the-panter-chart",
2155
+ "HOST": "api.stage.test-app.pan.panter.cloud",
2156
+ "HOST_CANONICAL": "api.stage.test-app.pan.panter.cloud",
2157
+ "KUBERNETES_CPU_LIMIT": "1",
2158
+ "KUBERNETES_CPU_REQUEST": "0.5",
2159
+ "KUBERNETES_MEMORY_LIMIT": "500Mi",
2160
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
2161
+ "KUBE_APP_NAME": "api",
2162
+ "KUBE_APP_NAME_PREFIX": "",
2163
+ "KUBE_DOCKER_IMAGE_PULL_SECRET": "gitlab-registry-api",
2164
+ "KUBE_NAMESPACE": "pan-test-app-stage",
2165
+ "KUBE_VALUES": "env:
2166
+ secret: {}
2167
+ public:
2168
+ ENV_SHORT: 'stage'
2169
+ APP_DIR: 'api'
2170
+ ENV_TYPE: 'stage'
2171
+ HOST: 'api.stage.test-app.pan.panter.cloud'
2172
+ ROOT_URL: 'https://api.stage.test-app.pan.panter.cloud'
2173
+ KUBE_NAMESPACE: 'pan-test-app-stage'
2174
+ KUBE_APP_NAME: 'api'
2175
+ KUBE_APP_NAME_PREFIX: ''
2176
+ HOST_CANONICAL: 'api.stage.test-app.pan.panter.cloud'
2177
+ _ALL_ENV_VAR_KEYS: '["ENV_SHORT","APP_DIR","ENV_TYPE","HOST","ROOT_URL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","HOST_CANONICAL"]'
2178
+ application:
2179
+ host: 'api.stage.test-app.pan.panter.cloud'
2180
+ command: 'node main.js'
2181
+ livenessProbe:
2182
+ httpGet:
2183
+ path: '__health'
2184
+ readinessProbe:
2185
+ httpGet:
2186
+ path: '__health'
2187
+ startupProbe:
2188
+ httpGet:
2189
+ path: '__health'
2190
+ autoscale:
2191
+ minReplicas: 2
2192
+ maxReplicas: 5
2193
+ metrics:
2194
+ - type: 'Resource'
2195
+ resource:
2196
+ name: 'cpu'
2197
+ target:
2198
+ type: 'Utilization'
2199
+ averageUtilization: 0.5
2200
+ resources:
2201
+ limits:
2202
+ cpu: '1'
2203
+ memory: '2048Mi'
2204
+ ",
2205
+ "RELEASE_NAME": "pan-test-app-stage-api",
2206
+ "ROOT_URL": "https://api.stage.test-app.pan.panter.cloud",
2207
+ "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","HOST","ROOT_URL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","HOST_CANONICAL"]",
2208
+ },
2209
+ },
2210
+ },
2211
+ "stages": [
2212
+ "setup",
2213
+ "setup dev",
2214
+ "setup review",
2215
+ "setup stage",
2216
+ "setup prod",
2217
+ "setup local",
2218
+ "test",
2219
+ "test dev",
2220
+ "test review",
2221
+ "test stage",
2222
+ "test prod",
2223
+ "test local",
2224
+ "build",
2225
+ "build dev",
2226
+ "build review",
2227
+ "build stage",
2228
+ "build prod",
2229
+ "build local",
2230
+ "deploy",
2231
+ "deploy dev",
2232
+ "deploy review",
2233
+ "deploy stage",
2234
+ "deploy prod",
2235
+ "deploy local",
2236
+ "verify",
2237
+ "verify dev",
2238
+ "verify review",
2239
+ "verify stage",
2240
+ "verify prod",
2241
+ "verify local",
2242
+ "rollback",
2243
+ "rollback dev",
2244
+ "rollback review",
2245
+ "rollback stage",
2246
+ "rollback prod",
2247
+ "rollback local",
2248
+ "stop",
2249
+ "stop dev",
2250
+ "stop review",
2251
+ "stop stage",
2252
+ "stop prod",
2253
+ "stop local",
2254
+ ],
2255
+ "variables": {
2256
+ "FF_USE_FASTZIP": "true",
2257
+ },
2258
+ "workflow": {
2259
+ "rules": [
2260
+ {
2261
+ "if": "$CI_COMMIT_TAG",
2262
+ },
2263
+ {
2264
+ "if": "$CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/",
2265
+ "when": "never",
2266
+ },
2267
+ {
2268
+ "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+.([0-9]+|x).x$/",
2269
+ },
2270
+ {
2271
+ "if": "$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH",
2272
+ },
2273
+ {
2274
+ "if": "$CI_MERGE_REQUEST_ID",
2275
+ },
2276
+ ],
2277
+ },
2278
+ },
2279
+ }
2280
+ `;