@catladder/pipeline 1.89.4 → 1.91.0

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