@catladder/pipeline 1.162.0 → 1.163.1

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 (80) hide show
  1. package/README.md +15 -1
  2. package/dist/build/types.d.ts +6 -0
  3. package/dist/bundles/catladder-gitlab/index.js +2 -2
  4. package/dist/constants.js +1 -1
  5. package/dist/pipeline/generatePipelineFiles.d.ts +38 -0
  6. package/dist/pipeline/generatePipelineFiles.js +44 -23
  7. package/dist/tsconfig.tsbuildinfo +1 -1
  8. package/examples/__snapshots__/cloud-run-memory-limit.test.ts.snap +1341 -0
  9. package/examples/__snapshots__/cloud-run-meteor-with-worker.test.ts.snap +1325 -0
  10. package/examples/__snapshots__/cloud-run-no-cpu-throttling.test.ts.snap +1341 -0
  11. package/examples/__snapshots__/cloud-run-no-service.test.ts.snap +1393 -0
  12. package/examples/__snapshots__/cloud-run-non-public.test.ts.snap +1341 -0
  13. package/examples/__snapshots__/cloud-run-post-stop-job.test.ts.snap +1352 -0
  14. package/examples/__snapshots__/cloud-run-service-gen2.test.ts.snap +1341 -0
  15. package/examples/__snapshots__/cloud-run-service-increase-timout.test.ts.snap +1341 -0
  16. package/examples/__snapshots__/cloud-run-service-with-volumes.test.ts.snap +1385 -0
  17. package/examples/__snapshots__/cloud-run-storybook.test.ts.snap +1233 -4
  18. package/examples/__snapshots__/cloud-run-with-ngnix.test.ts.snap +1349 -4
  19. package/examples/__snapshots__/cloud-run-with-sql-reuse-db.test.ts.snap +2825 -0
  20. package/examples/__snapshots__/cloud-run-with-sql.test.ts.snap +2572 -0
  21. package/examples/__snapshots__/cloud-run-with-worker.test.ts.snap +1349 -0
  22. package/examples/__snapshots__/custom-build-job-with-tests.test.ts.snap +1196 -0
  23. package/examples/__snapshots__/custom-build-job.test.ts.snap +1085 -0
  24. package/examples/__snapshots__/custom-deploy.test.ts.snap +1103 -0
  25. package/examples/__snapshots__/custom-envs.test.ts.snap +709 -0
  26. package/examples/__snapshots__/custom-sbom-java.test.ts.snap +1093 -0
  27. package/examples/__snapshots__/git-submodule.test.ts.snap +1342 -0
  28. package/examples/__snapshots__/kubernetes-application-customization.test.ts.snap +1778 -0
  29. package/examples/__snapshots__/kubernetes-with-cloud-sql-legacy.test.ts.snap +1790 -0
  30. package/examples/__snapshots__/kubernetes-with-cloud-sql.test.ts.snap +1798 -0
  31. package/examples/__snapshots__/kubernetes-with-jobs.test.ts.snap +3352 -0
  32. package/examples/__snapshots__/kubernetes-with-mongodb.test.ts.snap +1902 -0
  33. package/examples/__snapshots__/local-dot-env.test.ts.snap +1341 -0
  34. package/examples/__snapshots__/meteor-kubernetes.test.ts.snap +1839 -0
  35. package/examples/__snapshots__/multiline-var.test.ts.snap +3376 -0
  36. package/examples/__snapshots__/native-app.test.ts.snap +2149 -0
  37. package/examples/__snapshots__/node-build-with-custom-image.test.ts.snap +1341 -0
  38. package/examples/__snapshots__/node-build-with-docker-additions.test.ts.snap +1349 -0
  39. package/examples/__snapshots__/rails-k8s-with-worker.test.ts.snap +1470 -0
  40. package/examples/__snapshots__/wait-for-other-deploy.test.ts.snap +1275 -0
  41. package/examples/__utils__/helpers.ts +14 -1
  42. package/examples/cloud-run-memory-limit.test.ts +9 -1
  43. package/examples/cloud-run-meteor-with-worker.test.ts +9 -1
  44. package/examples/cloud-run-no-cpu-throttling.test.ts +9 -1
  45. package/examples/cloud-run-no-service.test.ts +9 -1
  46. package/examples/cloud-run-non-public.test.ts +9 -1
  47. package/examples/cloud-run-post-stop-job.test.ts +9 -1
  48. package/examples/cloud-run-service-gen2.test.ts +9 -1
  49. package/examples/cloud-run-service-increase-timout.test.ts +9 -1
  50. package/examples/cloud-run-service-with-volumes.test.ts +9 -1
  51. package/examples/cloud-run-storybook.test.ts +9 -1
  52. package/examples/cloud-run-storybook.ts +9 -1
  53. package/examples/cloud-run-with-ngnix.test.ts +9 -1
  54. package/examples/cloud-run-with-ngnix.ts +5 -1
  55. package/examples/cloud-run-with-sql-reuse-db.test.ts +9 -1
  56. package/examples/cloud-run-with-sql.test.ts +9 -1
  57. package/examples/cloud-run-with-worker.test.ts +9 -1
  58. package/examples/custom-build-job-with-tests.test.ts +9 -1
  59. package/examples/custom-build-job.test.ts +9 -1
  60. package/examples/custom-deploy.test.ts +9 -1
  61. package/examples/custom-envs.test.ts +9 -1
  62. package/examples/custom-sbom-java.test.ts +9 -1
  63. package/examples/git-submodule.test.ts +9 -1
  64. package/examples/kubernetes-application-customization.test.ts +9 -1
  65. package/examples/kubernetes-with-cloud-sql-legacy.test.ts +9 -1
  66. package/examples/kubernetes-with-cloud-sql.test.ts +9 -1
  67. package/examples/kubernetes-with-jobs.test.ts +9 -1
  68. package/examples/kubernetes-with-mongodb.test.ts +9 -1
  69. package/examples/local-dot-env.test.ts +9 -1
  70. package/examples/meteor-kubernetes.test.ts +9 -1
  71. package/examples/multiline-var.test.ts +9 -1
  72. package/examples/native-app.test.ts +9 -1
  73. package/examples/node-build-with-custom-image.test.ts +9 -1
  74. package/examples/node-build-with-docker-additions.test.ts +9 -1
  75. package/examples/rails-k8s-with-worker.test.ts +9 -1
  76. package/examples/wait-for-other-deploy.test.ts +9 -1
  77. package/package.json +4 -3
  78. package/scripts/generate-examples-test.ts +7 -5
  79. package/src/build/types.ts +6 -0
  80. package/src/pipeline/generatePipelineFiles.ts +61 -36
@@ -1,5 +1,1844 @@
1
1
  // Jest Snapshot v1, https://goo.gl/fbAQLP
2
2
 
3
+ exports[`matches snapshot for cloud-run-memory-limit 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
421
+
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
835
+
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
1242
+
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
1661
+
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
+ "
1840
+ `;
1841
+
3
1842
  exports[`matches snapshot for meteor-kubernetes 1`] = `
4
1843
  {
5
1844
  "mainBranch": {