@catladder/pipeline 1.89.2 → 1.89.4

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