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