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