@catladder/pipeline 1.98.2 → 1.99.1

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