@catladder/pipeline 1.111.0 → 1.111.2

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