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