@catladder/pipeline 1.163.0 → 1.163.2

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