@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,1330 @@
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="web"
58
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
59
+ - cd web
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="web"
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 web
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: web-yarn
100
+ policy: pull-push
101
+ paths:
102
+ - web/.yarn
103
+ - key: web-node-modules
104
+ policy: pull-push
105
+ paths:
106
+ - web/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="web"
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 web
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: web-yarn
141
+ policy: pull-push
142
+ paths:
143
+ - web/.yarn
144
+ - key: web-node-modules
145
+ policy: pull-push
146
+ paths:
147
+ - web/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="web"
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="$(printf %s "pan-test-app-dev-web-$CL_dev_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
173
+ - export ROOT_URL="https://$(printf %s "pan-test-app-dev-web-$CL_dev_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
174
+ - export HOST_INTERNAL="$(printf %s "pan-test-app-dev-web-$CL_dev_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
175
+ - export HOST_CANONICAL="$(printf %s "pan-test-app-dev-web-$CL_dev_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
176
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-dev-web-$CL_dev_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
177
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="google-project-id"
178
+ - export DEPLOY_CLOUD_RUN_REGION="europe-west6"
179
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_dev_web_GCLOUD_DEPLOY_credentialsKey"
180
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_dev_web_GCLOUD_RUN_canonicalHostSuffix"
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\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
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"}' > web/__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 web
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: web-yarn
203
+ policy: pull-push
204
+ paths:
205
+ - web/.yarn
206
+ - key: web-node-modules
207
+ policy: pull-push
208
+ paths:
209
+ - web/node_modules
210
+ - key: webmeteor-build-cache
211
+ policy: pull-push
212
+ paths:
213
+ - web/.meteor/local/resolver-result-cache.json
214
+ - web/.meteor/local/plugin-cache
215
+ - web/.meteor/local/isopacks
216
+ - web/.meteor/local/bundler-cache/scanner
217
+ artifacts:
218
+ paths:
219
+ - web/__build_info.json
220
+ - web/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="web"
249
+ - export DOCKER_BUILD_CONTEXT="."
250
+ - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
251
+ - export DOCKER_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/dev/web"
252
+ - export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/web"
253
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
254
+ - export METEOR_INSTALL_SCRIPTS=""
255
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
256
+ - ensureMeteorDockerfile
257
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
258
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_dev_web_GCLOUD_DEPLOY_credentialsKey")
259
+ - gcloud auth configure-docker europe-west6-docker.pkg.dev
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" web
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/gcloud: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="web"
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="$(printf %s "pan-test-app-dev-web-$CL_dev_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
312
+ - export ROOT_URL="https://$(printf %s "pan-test-app-dev-web-$CL_dev_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
313
+ - export HOST_INTERNAL="$(printf %s "pan-test-app-dev-web-$CL_dev_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
314
+ - export HOST_CANONICAL="$(printf %s "pan-test-app-dev-web-$CL_dev_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
315
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-dev-web-$CL_dev_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
316
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="google-project-id"
317
+ - export DEPLOY_CLOUD_RUN_REGION="europe-west6"
318
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_dev_web_GCLOUD_DEPLOY_credentialsKey"
319
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_dev_web_GCLOUD_RUN_canonicalHostSuffix"
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\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
321
+ - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
322
+ - export DOCKER_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/dev/web"
323
+ - export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/web"
324
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
325
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
326
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
327
+ - echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."
328
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_dev_web_GCLOUD_DEPLOY_credentialsKey")
329
+ - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe google-project-id --format="value(projectNumber)")
330
+ - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
331
+ - echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"
332
+ - echo -e "\\e[0Ksection_start:$(date +%s):writeenvvars[collapsed=true]\\r\\e[0KWrite env vars to file"
333
+ - |
334
+ cat > ____envvars.yaml <<EOF
335
+ ENV_SHORT: |-
336
+ dev
337
+ APP_DIR: |-
338
+ web
339
+ ENV_TYPE: |-
340
+ dev
341
+ BUILD_INFO_BUILD_ID: |-
342
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
343
+ BUILD_INFO_BUILD_TIME: |-
344
+ $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
345
+ BUILD_INFO_CURRENT_VERSION: |-
346
+ $(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/^/ /')
347
+ HOST: |-
348
+ $(printf %s "$(printf %s "pan-test-app-dev-web-$CL_dev_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
349
+ ROOT_URL: |-
350
+ $(printf %s "https://$(printf %s "pan-test-app-dev-web-$CL_dev_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
351
+ HOST_INTERNAL: |-
352
+ $(printf %s "$(printf %s "pan-test-app-dev-web-$CL_dev_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
353
+ HOST_CANONICAL: |-
354
+ $(printf %s "$(printf %s "pan-test-app-dev-web-$CL_dev_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
355
+ ROOT_URL_INTERNAL: |-
356
+ $(printf %s "https://$(printf %s "pan-test-app-dev-web-$CL_dev_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
357
+ DEPLOY_CLOUD_RUN_PROJECT_ID: |-
358
+ google-project-id
359
+ DEPLOY_CLOUD_RUN_REGION: |-
360
+ europe-west6
361
+ GCLOUD_RUN_canonicalHostSuffix: |-
362
+ $(printf %s "$CL_dev_web_GCLOUD_RUN_canonicalHostSuffix" | sed 's/^/ /')
363
+ _ALL_ENV_VAR_KEYS: |-
364
+ ["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","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
365
+
366
+ EOF
367
+ - echo -e "\\e[0Ksection_end:$(date +%s):writeenvvars\\r\\e[0K"
368
+ - echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"
369
+ - gcloud run deploy pan-test-app-dev-web --command="node,main.js" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/dev/web:$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --labels=customer-name=pan,component-name=web,app-name=test-app,env-type=dev,env-name=dev,build-type=meteor,cloud-run-service-name=pan-test-app-dev-web --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost
370
+ - gcloud run deploy pan-test-app-dev-web-worker --command="/bin/sh -c,BACKGROUND_JOBS_ENABLED=1 node main.js" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/dev/web:$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --labels=customer-name=pan,component-name=web,app-name=test-app,env-type=dev,env-name=dev,build-type=meteor,cloud-run-service-name=pan-test-app-dev-web-worker --env-vars-file=____envvars.yaml --min-instances=1 --max-instances=1 --no-cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost
371
+ - echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"
372
+ - echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"
373
+ - gcloud run revisions list --project=google-project-id --region=europe-west6 --service=pan-test-app-dev-web --limit=unlimited --sort-by=metadata.creationTimestamp --format="value(name)" --filter='(status.conditions.status=False OR status.conditions.status=Unknown)' | while read -r revisionname; do gcloud run revisions delete --project=google-project-id --region=europe-west6 --quiet $revisionname ; done
374
+ - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/dev/web --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/dev/web@$version --quiet --delete-tags; done
375
+ - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/web --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/web@$version --quiet --delete-tags; done
376
+ - echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"
377
+ - echo 'Uploading SBOM to Dependency Track'
378
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/web" "https://$(printf %s "pan-test-app-dev-web-$CL_dev_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" "__sbom.json" vex.json || true
379
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-dev-web-$CL_dev_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
380
+ environment:
381
+ name: dev/web
382
+ url: $CL_GITLAB_ENVIRONMENT_URL
383
+ on_stop: 'web ๐Ÿ›‘ Stop โš ๏ธ | dev '
384
+ auto_stop_in: 4 weeks
385
+ artifacts:
386
+ reports:
387
+ dotenv: gitlab_environment.env
388
+ rules:
389
+ - when: never
390
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
391
+ - when: on_success
392
+ if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
393
+ needs:
394
+ - job: web ๐Ÿ‘ฎ lint
395
+ artifacts: false
396
+ - job: 'web ๐Ÿ”จ app | dev '
397
+ artifacts: false
398
+ - job: 'web ๐Ÿ”จ docker | dev '
399
+ artifacts: false
400
+ - job: web ๐Ÿงช test
401
+ artifacts: false
402
+ - job: 'web ๐Ÿงพ sbom | dev '
403
+ artifacts: true
404
+ - job: web ๐Ÿ›ก audit
405
+ artifacts: false
406
+ retry: *a1
407
+ interruptible: true
408
+ allow_failure: false
409
+ 'web ๐Ÿ›‘ Stop โš ๏ธ | dev ':
410
+ stage: stop dev
411
+ image: path/to/docker/gcloud:the-version
412
+ variables:
413
+ KUBERNETES_CPU_REQUEST: '0.22'
414
+ KUBERNETES_MEMORY_REQUEST: 200Mi
415
+ KUBERNETES_MEMORY_LIMIT: 400Mi
416
+ GIT_STRATEGY: none
417
+ script:
418
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
419
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
420
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
421
+ - set +e
422
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_dev_web_GCLOUD_DEPLOY_credentialsKey")
423
+ - gcloud run services delete pan-test-app-dev-web --project=google-project-id --region=europe-west6
424
+ - gcloud run services delete pan-test-app-dev-web-worker --project=google-project-id --region=europe-west6
425
+ - gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/dev/web --quiet --delete-tags
426
+ - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/web --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/web@$version --quiet --delete-tags; done
427
+ - echo 'Disabling component in Dependency Track'
428
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/web" "https://$(printf %s "pan-test-app-dev-web-$CL_dev_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" || true
429
+ - set -e
430
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-dev-web-$CL_dev_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
431
+ environment:
432
+ name: dev/web
433
+ url: $CL_GITLAB_ENVIRONMENT_URL
434
+ action: stop
435
+ artifacts:
436
+ reports:
437
+ dotenv: gitlab_environment.env
438
+ rules:
439
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
440
+ when: on_success
441
+ - when: never
442
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
443
+ - when: manual
444
+ if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
445
+ needs: []
446
+ retry: *a1
447
+ interruptible: true
448
+ allow_failure: true
449
+ 'web ๐Ÿ”จ app | review ':
450
+ stage: build
451
+ image: path/to/docker/jobs-meteor:the-version
452
+ variables:
453
+ KUBERNETES_CPU_REQUEST: '0.45'
454
+ KUBERNETES_MEMORY_REQUEST: 1Gi
455
+ KUBERNETES_MEMORY_LIMIT: 4Gi
456
+ script:
457
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
458
+ - export METEOR_DISABLE_OPTIMISTIC_CACHING="1"
459
+ - export ENV_SHORT="review"
460
+ - export APP_DIR="web"
461
+ - export ENV_TYPE="review"
462
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
463
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
464
+ - 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")"
465
+ - export HOST="$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-web-$CL_review_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
466
+ - export ROOT_URL="https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-web-$CL_review_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
467
+ - export HOST_INTERNAL="$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-web-$CL_review_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
468
+ - export HOST_CANONICAL="$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-web-$CL_review_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
469
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-web-$CL_review_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
470
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="google-project-id"
471
+ - export DEPLOY_CLOUD_RUN_REGION="europe-west6"
472
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_review_web_GCLOUD_DEPLOY_credentialsKey"
473
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_review_web_GCLOUD_RUN_canonicalHostSuffix"
474
+ - 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\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
475
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
476
+ - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > web/__build_info.json
477
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
478
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
479
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
480
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
481
+ - cd web
482
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
483
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
484
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
485
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
486
+ - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
487
+ - yarn install --immutable
488
+ - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
489
+ - echo "add healthcheck package"
490
+ - meteor add panter:healthroute --allow-superuser
491
+ - meteor add qualia:prod-shell --allow-superuser
492
+ - 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
493
+ - cp ./__build_info.json ./dist/bundle/programs/server
494
+ cache:
495
+ - key: web-yarn
496
+ policy: pull-push
497
+ paths:
498
+ - web/.yarn
499
+ - key: web-node-modules
500
+ policy: pull-push
501
+ paths:
502
+ - web/node_modules
503
+ - key: webmeteor-build-cache
504
+ policy: pull-push
505
+ paths:
506
+ - web/.meteor/local/resolver-result-cache.json
507
+ - web/.meteor/local/plugin-cache
508
+ - web/.meteor/local/isopacks
509
+ - web/.meteor/local/bundler-cache/scanner
510
+ artifacts:
511
+ paths:
512
+ - web/__build_info.json
513
+ - web/dist
514
+ expire_in: 1 day
515
+ when: always
516
+ reports: {}
517
+ rules:
518
+ - if: $CI_MERGE_REQUEST_ID
519
+ needs: []
520
+ retry: *a1
521
+ interruptible: true
522
+ 'web ๐Ÿ”จ docker | review ':
523
+ stage: build
524
+ image: path/to/docker/docker-build:the-version
525
+ services:
526
+ - name: docker:24.0.6-dind
527
+ command:
528
+ - --tls=false
529
+ variables:
530
+ DOCKER_HOST: tcp://0.0.0.0:2375
531
+ DOCKER_TLS_CERTDIR: ''
532
+ DOCKER_DRIVER: overlay2
533
+ DOCKER_BUILDKIT: '1'
534
+ KUBERNETES_CPU_REQUEST: '0.45'
535
+ KUBERNETES_MEMORY_REQUEST: 1Gi
536
+ KUBERNETES_MEMORY_LIMIT: 2Gi
537
+ script:
538
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
539
+ - export APP_DIR="web"
540
+ - export DOCKER_BUILD_CONTEXT="."
541
+ - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
542
+ - export DOCKER_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/web/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })"
543
+ - export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/web"
544
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
545
+ - export METEOR_INSTALL_SCRIPTS=""
546
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
547
+ - ensureMeteorDockerfile
548
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
549
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_review_web_GCLOUD_DEPLOY_credentialsKey")
550
+ - gcloud auth configure-docker europe-west6-docker.pkg.dev
551
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
552
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
553
+ - 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
554
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
555
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
556
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
557
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
558
+ - docker push $DOCKER_CACHE_IMAGE
559
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
560
+ rules:
561
+ - if: $CI_MERGE_REQUEST_ID
562
+ needs:
563
+ - 'web ๐Ÿ”จ app | review '
564
+ retry: *a1
565
+ interruptible: true
566
+ 'web ๐Ÿงพ sbom | review ':
567
+ stage: build
568
+ image: aquasec/trivy:0.38.3
569
+ variables: {}
570
+ script:
571
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
572
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
573
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" web
574
+ artifacts:
575
+ paths:
576
+ - __sbom.json
577
+ rules:
578
+ - if: $CI_MERGE_REQUEST_ID
579
+ needs: []
580
+ retry: *a1
581
+ interruptible: true
582
+ allow_failure: true
583
+ 'web ๐Ÿš€ Deploy | review ':
584
+ stage: deploy review
585
+ image: path/to/docker/gcloud:the-version
586
+ variables:
587
+ KUBERNETES_CPU_REQUEST: '0.22'
588
+ KUBERNETES_MEMORY_REQUEST: 200Mi
589
+ KUBERNETES_MEMORY_LIMIT: 400Mi
590
+ script:
591
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
592
+ - export ENV_SHORT="review"
593
+ - export APP_DIR="web"
594
+ - export ENV_TYPE="review"
595
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
596
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
597
+ - 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")"
598
+ - export HOST="$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-web-$CL_review_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
599
+ - export ROOT_URL="https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-web-$CL_review_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
600
+ - export HOST_INTERNAL="$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-web-$CL_review_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
601
+ - export HOST_CANONICAL="$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-web-$CL_review_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
602
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-web-$CL_review_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
603
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="google-project-id"
604
+ - export DEPLOY_CLOUD_RUN_REGION="europe-west6"
605
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_review_web_GCLOUD_DEPLOY_credentialsKey"
606
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_review_web_GCLOUD_RUN_canonicalHostSuffix"
607
+ - 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\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
608
+ - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
609
+ - export DOCKER_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/web/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })"
610
+ - export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/web"
611
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
612
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
613
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
614
+ - echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."
615
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_review_web_GCLOUD_DEPLOY_credentialsKey")
616
+ - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe google-project-id --format="value(projectNumber)")
617
+ - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
618
+ - echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"
619
+ - echo -e "\\e[0Ksection_start:$(date +%s):writeenvvars[collapsed=true]\\r\\e[0KWrite env vars to file"
620
+ - |
621
+ cat > ____envvars.yaml <<EOF
622
+ ENV_SHORT: |-
623
+ review
624
+ APP_DIR: |-
625
+ web
626
+ ENV_TYPE: |-
627
+ review
628
+ BUILD_INFO_BUILD_ID: |-
629
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
630
+ BUILD_INFO_BUILD_TIME: |-
631
+ $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
632
+ BUILD_INFO_CURRENT_VERSION: |-
633
+ $(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/^/ /')
634
+ HOST: |-
635
+ $(printf %s "$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-web-$CL_review_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
636
+ ROOT_URL: |-
637
+ $(printf %s "https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-web-$CL_review_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
638
+ HOST_INTERNAL: |-
639
+ $(printf %s "$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-web-$CL_review_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
640
+ HOST_CANONICAL: |-
641
+ $(printf %s "$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-web-$CL_review_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
642
+ ROOT_URL_INTERNAL: |-
643
+ $(printf %s "https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-web-$CL_review_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
644
+ DEPLOY_CLOUD_RUN_PROJECT_ID: |-
645
+ google-project-id
646
+ DEPLOY_CLOUD_RUN_REGION: |-
647
+ europe-west6
648
+ GCLOUD_RUN_canonicalHostSuffix: |-
649
+ $(printf %s "$CL_review_web_GCLOUD_RUN_canonicalHostSuffix" | sed 's/^/ /')
650
+ _ALL_ENV_VAR_KEYS: |-
651
+ ["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","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
652
+
653
+ EOF
654
+ - echo -e "\\e[0Ksection_end:$(date +%s):writeenvvars\\r\\e[0K"
655
+ - echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"
656
+ - gcloud run deploy $(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-web" | awk '{print tolower($0)}') --command="node,main.js" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/web/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }):$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --labels=customer-name=pan,component-name=web,app-name=test-app,env-type=review,env-name=review,build-type=meteor,cloud-run-service-name=$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-web" | awk '{print tolower($0)}') --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost
657
+ - gcloud run deploy $(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-web" | awk '{print tolower($0)}')-worker --command="/bin/sh -c,BACKGROUND_JOBS_ENABLED=1 node main.js" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/web/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }):$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --labels=customer-name=pan,component-name=web,app-name=test-app,env-type=review,env-name=review,build-type=meteor,cloud-run-service-name=$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-web" | awk '{print tolower($0)}')-worker --env-vars-file=____envvars.yaml --min-instances=1 --max-instances=1 --no-cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost
658
+ - echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"
659
+ - echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"
660
+ - gcloud run revisions list --project=google-project-id --region=europe-west6 --service=$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-web" | awk '{print tolower($0)}') --limit=unlimited --sort-by=metadata.creationTimestamp --format="value(name)" --filter='(status.conditions.status=False OR status.conditions.status=Unknown)' | while read -r revisionname; do gcloud run revisions delete --project=google-project-id --region=europe-west6 --quiet $revisionname ; done
661
+ - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/web/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }) --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/web/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })@$version --quiet --delete-tags; done
662
+ - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/web --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/web@$version --quiet --delete-tags; done
663
+ - set +e
664
+ - gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/web --quiet --delete-tags
665
+ - set -e
666
+ - echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"
667
+ - echo 'Uploading SBOM to Dependency Track'
668
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/web" "https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-web-$CL_review_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" "__sbom.json" vex.json || true
669
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-web-$CL_review_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
670
+ environment:
671
+ name: review/$CI_COMMIT_REF_NAME/web
672
+ url: $CL_GITLAB_ENVIRONMENT_URL
673
+ on_stop: 'web ๐Ÿ›‘ Stop โš ๏ธ | review '
674
+ auto_stop_in: 1 week
675
+ artifacts:
676
+ reports:
677
+ dotenv: gitlab_environment.env
678
+ rules:
679
+ - when: on_success
680
+ if: $CI_MERGE_REQUEST_ID
681
+ needs:
682
+ - job: web ๐Ÿ‘ฎ lint
683
+ artifacts: false
684
+ - job: 'web ๐Ÿ”จ app | review '
685
+ artifacts: false
686
+ - job: 'web ๐Ÿ”จ docker | review '
687
+ artifacts: false
688
+ - job: web ๐Ÿงช test
689
+ artifacts: false
690
+ - job: 'web ๐Ÿงพ sbom | review '
691
+ artifacts: true
692
+ - job: web ๐Ÿ›ก audit
693
+ artifacts: false
694
+ retry: *a1
695
+ interruptible: true
696
+ allow_failure: false
697
+ 'web ๐Ÿ›‘ Stop โš ๏ธ | review ':
698
+ stage: stop review
699
+ image: path/to/docker/gcloud:the-version
700
+ variables:
701
+ KUBERNETES_CPU_REQUEST: '0.22'
702
+ KUBERNETES_MEMORY_REQUEST: 200Mi
703
+ KUBERNETES_MEMORY_LIMIT: 400Mi
704
+ GIT_STRATEGY: none
705
+ script:
706
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
707
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
708
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
709
+ - set +e
710
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_review_web_GCLOUD_DEPLOY_credentialsKey")
711
+ - gcloud run services delete $(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-web" | awk '{print tolower($0)}') --project=google-project-id --region=europe-west6
712
+ - gcloud run services delete $(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-web" | awk '{print tolower($0)}')-worker --project=google-project-id --region=europe-west6
713
+ - gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/web/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }) --quiet --delete-tags
714
+ - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/web --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/web@$version --quiet --delete-tags; done
715
+ - set +e
716
+ - gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/web --quiet --delete-tags
717
+ - set -e
718
+ - echo 'Disabling component in Dependency Track'
719
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/web" "https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-web-$CL_review_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" || true
720
+ - set -e
721
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-web-$CL_review_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
722
+ environment:
723
+ name: review/$CI_COMMIT_REF_NAME/web
724
+ url: $CL_GITLAB_ENVIRONMENT_URL
725
+ action: stop
726
+ artifacts:
727
+ reports:
728
+ dotenv: gitlab_environment.env
729
+ rules:
730
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
731
+ when: on_success
732
+ - when: manual
733
+ if: $CI_MERGE_REQUEST_ID
734
+ needs: []
735
+ retry: *a1
736
+ interruptible: true
737
+ allow_failure: true
738
+ 'web ๐Ÿ”จ app | stage ':
739
+ stage: build
740
+ image: path/to/docker/jobs-meteor:the-version
741
+ variables:
742
+ KUBERNETES_CPU_REQUEST: '0.45'
743
+ KUBERNETES_MEMORY_REQUEST: 1Gi
744
+ KUBERNETES_MEMORY_LIMIT: 4Gi
745
+ script:
746
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
747
+ - export METEOR_DISABLE_OPTIMISTIC_CACHING="1"
748
+ - export ENV_SHORT="stage"
749
+ - export APP_DIR="web"
750
+ - export ENV_TYPE="stage"
751
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
752
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
753
+ - 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")"
754
+ - export HOST="$(printf %s "pan-test-app-stage-web-$CL_stage_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
755
+ - export ROOT_URL="https://$(printf %s "pan-test-app-stage-web-$CL_stage_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
756
+ - export HOST_INTERNAL="$(printf %s "pan-test-app-stage-web-$CL_stage_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
757
+ - export HOST_CANONICAL="$(printf %s "pan-test-app-stage-web-$CL_stage_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
758
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-stage-web-$CL_stage_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
759
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="google-project-id"
760
+ - export DEPLOY_CLOUD_RUN_REGION="europe-west6"
761
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_stage_web_GCLOUD_DEPLOY_credentialsKey"
762
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_stage_web_GCLOUD_RUN_canonicalHostSuffix"
763
+ - 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\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
764
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
765
+ - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > web/__build_info.json
766
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
767
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
768
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
769
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
770
+ - cd web
771
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
772
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
773
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
774
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
775
+ - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
776
+ - yarn install --immutable
777
+ - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
778
+ - echo "add healthcheck package"
779
+ - meteor add panter:healthroute --allow-superuser
780
+ - meteor add qualia:prod-shell --allow-superuser
781
+ - 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
782
+ - cp ./__build_info.json ./dist/bundle/programs/server
783
+ cache:
784
+ - key: web-yarn
785
+ policy: pull-push
786
+ paths:
787
+ - web/.yarn
788
+ - key: web-node-modules
789
+ policy: pull-push
790
+ paths:
791
+ - web/node_modules
792
+ - key: webmeteor-build-cache
793
+ policy: pull-push
794
+ paths:
795
+ - web/.meteor/local/resolver-result-cache.json
796
+ - web/.meteor/local/plugin-cache
797
+ - web/.meteor/local/isopacks
798
+ - web/.meteor/local/bundler-cache/scanner
799
+ artifacts:
800
+ paths:
801
+ - web/__build_info.json
802
+ - web/dist
803
+ expire_in: 1 day
804
+ when: always
805
+ reports: {}
806
+ rules:
807
+ - if: $CI_COMMIT_TAG
808
+ needs: []
809
+ retry: *a1
810
+ interruptible: true
811
+ 'web ๐Ÿ”จ docker | stage ':
812
+ stage: build
813
+ image: path/to/docker/docker-build:the-version
814
+ services:
815
+ - name: docker:24.0.6-dind
816
+ command:
817
+ - --tls=false
818
+ variables:
819
+ DOCKER_HOST: tcp://0.0.0.0:2375
820
+ DOCKER_TLS_CERTDIR: ''
821
+ DOCKER_DRIVER: overlay2
822
+ DOCKER_BUILDKIT: '1'
823
+ KUBERNETES_CPU_REQUEST: '0.45'
824
+ KUBERNETES_MEMORY_REQUEST: 1Gi
825
+ KUBERNETES_MEMORY_LIMIT: 2Gi
826
+ script:
827
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
828
+ - export APP_DIR="web"
829
+ - export DOCKER_BUILD_CONTEXT="."
830
+ - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
831
+ - export DOCKER_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/stage/web"
832
+ - export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/web"
833
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
834
+ - export METEOR_INSTALL_SCRIPTS=""
835
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
836
+ - ensureMeteorDockerfile
837
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
838
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_stage_web_GCLOUD_DEPLOY_credentialsKey")
839
+ - gcloud auth configure-docker europe-west6-docker.pkg.dev
840
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
841
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
842
+ - 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
843
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
844
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
845
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
846
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
847
+ - docker push $DOCKER_CACHE_IMAGE
848
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
849
+ rules:
850
+ - if: $CI_COMMIT_TAG
851
+ needs:
852
+ - 'web ๐Ÿ”จ app | stage '
853
+ retry: *a1
854
+ interruptible: true
855
+ 'web ๐Ÿงพ sbom | stage ':
856
+ stage: build
857
+ image: aquasec/trivy:0.38.3
858
+ variables: {}
859
+ script:
860
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
861
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
862
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" web
863
+ artifacts:
864
+ paths:
865
+ - __sbom.json
866
+ rules:
867
+ - if: $CI_COMMIT_TAG
868
+ needs: []
869
+ retry: *a1
870
+ interruptible: true
871
+ allow_failure: true
872
+ 'web ๐Ÿš€ Deploy | stage ':
873
+ stage: deploy stage
874
+ image: path/to/docker/gcloud:the-version
875
+ variables:
876
+ KUBERNETES_CPU_REQUEST: '0.22'
877
+ KUBERNETES_MEMORY_REQUEST: 200Mi
878
+ KUBERNETES_MEMORY_LIMIT: 400Mi
879
+ script:
880
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
881
+ - export ENV_SHORT="stage"
882
+ - export APP_DIR="web"
883
+ - export ENV_TYPE="stage"
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="$(printf %s "pan-test-app-stage-web-$CL_stage_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
888
+ - export ROOT_URL="https://$(printf %s "pan-test-app-stage-web-$CL_stage_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
889
+ - export HOST_INTERNAL="$(printf %s "pan-test-app-stage-web-$CL_stage_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
890
+ - export HOST_CANONICAL="$(printf %s "pan-test-app-stage-web-$CL_stage_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
891
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-stage-web-$CL_stage_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
892
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="google-project-id"
893
+ - export DEPLOY_CLOUD_RUN_REGION="europe-west6"
894
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_stage_web_GCLOUD_DEPLOY_credentialsKey"
895
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_stage_web_GCLOUD_RUN_canonicalHostSuffix"
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\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
897
+ - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
898
+ - export DOCKER_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/stage/web"
899
+ - export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/web"
900
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
901
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
902
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
903
+ - echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."
904
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_stage_web_GCLOUD_DEPLOY_credentialsKey")
905
+ - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe google-project-id --format="value(projectNumber)")
906
+ - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
907
+ - echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"
908
+ - echo -e "\\e[0Ksection_start:$(date +%s):writeenvvars[collapsed=true]\\r\\e[0KWrite env vars to file"
909
+ - |
910
+ cat > ____envvars.yaml <<EOF
911
+ ENV_SHORT: |-
912
+ stage
913
+ APP_DIR: |-
914
+ web
915
+ ENV_TYPE: |-
916
+ stage
917
+ BUILD_INFO_BUILD_ID: |-
918
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
919
+ BUILD_INFO_BUILD_TIME: |-
920
+ $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
921
+ BUILD_INFO_CURRENT_VERSION: |-
922
+ $(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/^/ /')
923
+ HOST: |-
924
+ $(printf %s "$(printf %s "pan-test-app-stage-web-$CL_stage_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
925
+ ROOT_URL: |-
926
+ $(printf %s "https://$(printf %s "pan-test-app-stage-web-$CL_stage_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
927
+ HOST_INTERNAL: |-
928
+ $(printf %s "$(printf %s "pan-test-app-stage-web-$CL_stage_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
929
+ HOST_CANONICAL: |-
930
+ $(printf %s "$(printf %s "pan-test-app-stage-web-$CL_stage_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
931
+ ROOT_URL_INTERNAL: |-
932
+ $(printf %s "https://$(printf %s "pan-test-app-stage-web-$CL_stage_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
933
+ DEPLOY_CLOUD_RUN_PROJECT_ID: |-
934
+ google-project-id
935
+ DEPLOY_CLOUD_RUN_REGION: |-
936
+ europe-west6
937
+ GCLOUD_RUN_canonicalHostSuffix: |-
938
+ $(printf %s "$CL_stage_web_GCLOUD_RUN_canonicalHostSuffix" | sed 's/^/ /')
939
+ _ALL_ENV_VAR_KEYS: |-
940
+ ["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","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
941
+
942
+ EOF
943
+ - echo -e "\\e[0Ksection_end:$(date +%s):writeenvvars\\r\\e[0K"
944
+ - echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"
945
+ - gcloud run deploy pan-test-app-stage-web --command="node,main.js" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/stage/web:$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --labels=customer-name=pan,component-name=web,app-name=test-app,env-type=stage,env-name=stage,build-type=meteor,cloud-run-service-name=pan-test-app-stage-web --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost
946
+ - gcloud run deploy pan-test-app-stage-web-worker --command="/bin/sh -c,BACKGROUND_JOBS_ENABLED=1 node main.js" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/stage/web:$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --labels=customer-name=pan,component-name=web,app-name=test-app,env-type=stage,env-name=stage,build-type=meteor,cloud-run-service-name=pan-test-app-stage-web-worker --env-vars-file=____envvars.yaml --min-instances=1 --max-instances=1 --no-cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost
947
+ - echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"
948
+ - echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"
949
+ - gcloud run revisions list --project=google-project-id --region=europe-west6 --service=pan-test-app-stage-web --limit=unlimited --sort-by=metadata.creationTimestamp --format="value(name)" --filter='(status.conditions.status=False OR status.conditions.status=Unknown)' | while read -r revisionname; do gcloud run revisions delete --project=google-project-id --region=europe-west6 --quiet $revisionname ; done
950
+ - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/stage/web --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/stage/web@$version --quiet --delete-tags; done
951
+ - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/web --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/web@$version --quiet --delete-tags; done
952
+ - echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"
953
+ - echo 'Uploading SBOM to Dependency Track'
954
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/web" "https://$(printf %s "pan-test-app-stage-web-$CL_stage_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" "__sbom.json" vex.json || true
955
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-stage-web-$CL_stage_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
956
+ environment:
957
+ name: stage/web
958
+ url: $CL_GITLAB_ENVIRONMENT_URL
959
+ on_stop: 'web ๐Ÿ›‘ Stop โš ๏ธ | stage '
960
+ artifacts:
961
+ reports:
962
+ dotenv: gitlab_environment.env
963
+ rules:
964
+ - when: on_success
965
+ if: $CI_COMMIT_TAG
966
+ needs:
967
+ - job: 'web ๐Ÿ”จ app | stage '
968
+ artifacts: false
969
+ - job: 'web ๐Ÿ”จ docker | stage '
970
+ artifacts: false
971
+ - job: 'web ๐Ÿงพ sbom | stage '
972
+ artifacts: true
973
+ retry: *a1
974
+ interruptible: true
975
+ allow_failure: false
976
+ 'web ๐Ÿ›‘ Stop โš ๏ธ | stage ':
977
+ stage: stop stage
978
+ image: path/to/docker/gcloud:the-version
979
+ variables:
980
+ KUBERNETES_CPU_REQUEST: '0.22'
981
+ KUBERNETES_MEMORY_REQUEST: 200Mi
982
+ KUBERNETES_MEMORY_LIMIT: 400Mi
983
+ GIT_STRATEGY: none
984
+ script:
985
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
986
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
987
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
988
+ - set +e
989
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_stage_web_GCLOUD_DEPLOY_credentialsKey")
990
+ - gcloud run services delete pan-test-app-stage-web --project=google-project-id --region=europe-west6
991
+ - gcloud run services delete pan-test-app-stage-web-worker --project=google-project-id --region=europe-west6
992
+ - gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/stage/web --quiet --delete-tags
993
+ - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/web --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/web@$version --quiet --delete-tags; done
994
+ - echo 'Disabling component in Dependency Track'
995
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/web" "https://$(printf %s "pan-test-app-stage-web-$CL_stage_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" || true
996
+ - set -e
997
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-stage-web-$CL_stage_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
998
+ environment:
999
+ name: stage/web
1000
+ url: $CL_GITLAB_ENVIRONMENT_URL
1001
+ action: stop
1002
+ artifacts:
1003
+ reports:
1004
+ dotenv: gitlab_environment.env
1005
+ rules:
1006
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
1007
+ when: on_success
1008
+ - when: manual
1009
+ if: $CI_COMMIT_TAG
1010
+ needs: []
1011
+ retry: *a1
1012
+ interruptible: true
1013
+ allow_failure: true
1014
+ 'web ๐Ÿ”จ app | prod ':
1015
+ stage: build
1016
+ image: path/to/docker/jobs-meteor:the-version
1017
+ variables:
1018
+ KUBERNETES_CPU_REQUEST: '0.45'
1019
+ KUBERNETES_MEMORY_REQUEST: 1Gi
1020
+ KUBERNETES_MEMORY_LIMIT: 4Gi
1021
+ script:
1022
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1023
+ - export METEOR_DISABLE_OPTIMISTIC_CACHING="1"
1024
+ - export ENV_SHORT="prod"
1025
+ - export APP_DIR="web"
1026
+ - export ENV_TYPE="prod"
1027
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1028
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1029
+ - 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")"
1030
+ - export HOST="$(printf %s "pan-test-app-prod-web-$CL_prod_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1031
+ - export ROOT_URL="https://$(printf %s "pan-test-app-prod-web-$CL_prod_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1032
+ - export HOST_INTERNAL="$(printf %s "pan-test-app-prod-web-$CL_prod_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1033
+ - export HOST_CANONICAL="$(printf %s "pan-test-app-prod-web-$CL_prod_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1034
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-prod-web-$CL_prod_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1035
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="google-project-id"
1036
+ - export DEPLOY_CLOUD_RUN_REGION="europe-west6"
1037
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_prod_web_GCLOUD_DEPLOY_credentialsKey"
1038
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_prod_web_GCLOUD_RUN_canonicalHostSuffix"
1039
+ - 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\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
1040
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1041
+ - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > web/__build_info.json
1042
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
1043
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1044
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1045
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
1046
+ - cd web
1047
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
1048
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1049
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1050
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
1051
+ - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
1052
+ - yarn install --immutable
1053
+ - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
1054
+ - echo "add healthcheck package"
1055
+ - meteor add panter:healthroute --allow-superuser
1056
+ - meteor add qualia:prod-shell --allow-superuser
1057
+ - 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
1058
+ - cp ./__build_info.json ./dist/bundle/programs/server
1059
+ cache:
1060
+ - key: web-yarn
1061
+ policy: pull-push
1062
+ paths:
1063
+ - web/.yarn
1064
+ - key: web-node-modules
1065
+ policy: pull-push
1066
+ paths:
1067
+ - web/node_modules
1068
+ - key: webmeteor-build-cache
1069
+ policy: pull-push
1070
+ paths:
1071
+ - web/.meteor/local/resolver-result-cache.json
1072
+ - web/.meteor/local/plugin-cache
1073
+ - web/.meteor/local/isopacks
1074
+ - web/.meteor/local/bundler-cache/scanner
1075
+ artifacts:
1076
+ paths:
1077
+ - web/__build_info.json
1078
+ - web/dist
1079
+ expire_in: 1 day
1080
+ when: always
1081
+ reports: {}
1082
+ rules:
1083
+ - if: $CI_COMMIT_TAG
1084
+ needs: []
1085
+ retry: *a1
1086
+ interruptible: true
1087
+ 'web ๐Ÿ”จ docker | prod ':
1088
+ stage: build
1089
+ image: path/to/docker/docker-build:the-version
1090
+ services:
1091
+ - name: docker:24.0.6-dind
1092
+ command:
1093
+ - --tls=false
1094
+ variables:
1095
+ DOCKER_HOST: tcp://0.0.0.0:2375
1096
+ DOCKER_TLS_CERTDIR: ''
1097
+ DOCKER_DRIVER: overlay2
1098
+ DOCKER_BUILDKIT: '1'
1099
+ KUBERNETES_CPU_REQUEST: '0.45'
1100
+ KUBERNETES_MEMORY_REQUEST: 1Gi
1101
+ KUBERNETES_MEMORY_LIMIT: 2Gi
1102
+ script:
1103
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1104
+ - export APP_DIR="web"
1105
+ - export DOCKER_BUILD_CONTEXT="."
1106
+ - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
1107
+ - export DOCKER_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/prod/web"
1108
+ - export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/web"
1109
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
1110
+ - export METEOR_INSTALL_SCRIPTS=""
1111
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1112
+ - ensureMeteorDockerfile
1113
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
1114
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_prod_web_GCLOUD_DEPLOY_credentialsKey")
1115
+ - gcloud auth configure-docker europe-west6-docker.pkg.dev
1116
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
1117
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
1118
+ - 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
1119
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
1120
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
1121
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
1122
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
1123
+ - docker push $DOCKER_CACHE_IMAGE
1124
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
1125
+ rules:
1126
+ - if: $CI_COMMIT_TAG
1127
+ needs:
1128
+ - 'web ๐Ÿ”จ app | prod '
1129
+ retry: *a1
1130
+ interruptible: true
1131
+ 'web ๐Ÿงพ sbom | prod ':
1132
+ stage: build
1133
+ image: aquasec/trivy:0.38.3
1134
+ variables: {}
1135
+ script:
1136
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1137
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1138
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" web
1139
+ artifacts:
1140
+ paths:
1141
+ - __sbom.json
1142
+ rules:
1143
+ - if: $CI_COMMIT_TAG
1144
+ needs: []
1145
+ retry: *a1
1146
+ interruptible: true
1147
+ allow_failure: true
1148
+ 'web ๐Ÿš€ Deploy | prod ':
1149
+ stage: deploy prod
1150
+ image: path/to/docker/gcloud:the-version
1151
+ variables:
1152
+ KUBERNETES_CPU_REQUEST: '0.22'
1153
+ KUBERNETES_MEMORY_REQUEST: 200Mi
1154
+ KUBERNETES_MEMORY_LIMIT: 400Mi
1155
+ script:
1156
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1157
+ - export ENV_SHORT="prod"
1158
+ - export APP_DIR="web"
1159
+ - export ENV_TYPE="prod"
1160
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1161
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1162
+ - 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")"
1163
+ - export HOST="$(printf %s "pan-test-app-prod-web-$CL_prod_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1164
+ - export ROOT_URL="https://$(printf %s "pan-test-app-prod-web-$CL_prod_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1165
+ - export HOST_INTERNAL="$(printf %s "pan-test-app-prod-web-$CL_prod_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1166
+ - export HOST_CANONICAL="$(printf %s "pan-test-app-prod-web-$CL_prod_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1167
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-prod-web-$CL_prod_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1168
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="google-project-id"
1169
+ - export DEPLOY_CLOUD_RUN_REGION="europe-west6"
1170
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_prod_web_GCLOUD_DEPLOY_credentialsKey"
1171
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_prod_web_GCLOUD_RUN_canonicalHostSuffix"
1172
+ - 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\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
1173
+ - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
1174
+ - export DOCKER_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/prod/web"
1175
+ - export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/web"
1176
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
1177
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
1178
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1179
+ - echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."
1180
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_prod_web_GCLOUD_DEPLOY_credentialsKey")
1181
+ - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe google-project-id --format="value(projectNumber)")
1182
+ - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
1183
+ - echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"
1184
+ - echo -e "\\e[0Ksection_start:$(date +%s):writeenvvars[collapsed=true]\\r\\e[0KWrite env vars to file"
1185
+ - |
1186
+ cat > ____envvars.yaml <<EOF
1187
+ ENV_SHORT: |-
1188
+ prod
1189
+ APP_DIR: |-
1190
+ web
1191
+ ENV_TYPE: |-
1192
+ prod
1193
+ BUILD_INFO_BUILD_ID: |-
1194
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
1195
+ BUILD_INFO_BUILD_TIME: |-
1196
+ $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
1197
+ BUILD_INFO_CURRENT_VERSION: |-
1198
+ $(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/^/ /')
1199
+ HOST: |-
1200
+ $(printf %s "$(printf %s "pan-test-app-prod-web-$CL_prod_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1201
+ ROOT_URL: |-
1202
+ $(printf %s "https://$(printf %s "pan-test-app-prod-web-$CL_prod_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1203
+ HOST_INTERNAL: |-
1204
+ $(printf %s "$(printf %s "pan-test-app-prod-web-$CL_prod_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1205
+ HOST_CANONICAL: |-
1206
+ $(printf %s "$(printf %s "pan-test-app-prod-web-$CL_prod_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1207
+ ROOT_URL_INTERNAL: |-
1208
+ $(printf %s "https://$(printf %s "pan-test-app-prod-web-$CL_prod_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1209
+ DEPLOY_CLOUD_RUN_PROJECT_ID: |-
1210
+ google-project-id
1211
+ DEPLOY_CLOUD_RUN_REGION: |-
1212
+ europe-west6
1213
+ GCLOUD_RUN_canonicalHostSuffix: |-
1214
+ $(printf %s "$CL_prod_web_GCLOUD_RUN_canonicalHostSuffix" | sed 's/^/ /')
1215
+ _ALL_ENV_VAR_KEYS: |-
1216
+ ["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","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
1217
+
1218
+ EOF
1219
+ - echo -e "\\e[0Ksection_end:$(date +%s):writeenvvars\\r\\e[0K"
1220
+ - echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"
1221
+ - gcloud run deploy pan-test-app-prod-web --command="node,main.js" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/prod/web:$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --labels=customer-name=pan,component-name=web,app-name=test-app,env-type=prod,env-name=prod,build-type=meteor,cloud-run-service-name=pan-test-app-prod-web --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost
1222
+ - gcloud run deploy pan-test-app-prod-web-worker --command="/bin/sh -c,BACKGROUND_JOBS_ENABLED=1 node main.js" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/prod/web:$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --labels=customer-name=pan,component-name=web,app-name=test-app,env-type=prod,env-name=prod,build-type=meteor,cloud-run-service-name=pan-test-app-prod-web-worker --env-vars-file=____envvars.yaml --min-instances=1 --max-instances=1 --no-cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost
1223
+ - echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"
1224
+ - echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"
1225
+ - gcloud run revisions list --project=google-project-id --region=europe-west6 --service=pan-test-app-prod-web --limit=unlimited --sort-by=metadata.creationTimestamp --format="value(name)" --filter='(status.conditions.status=False OR status.conditions.status=Unknown)' | tail -n +6 | while read -r revisionname; do gcloud run revisions delete --project=google-project-id --region=europe-west6 --quiet $revisionname ; done
1226
+ - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/prod/web --sort-by=~CREATE_TIME --format="value(version)" | tail -n +7 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/prod/web@$version --quiet --delete-tags; done
1227
+ - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/web --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/web@$version --quiet --delete-tags; done
1228
+ - echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"
1229
+ - echo 'Uploading SBOM to Dependency Track'
1230
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/web" "https://$(printf %s "pan-test-app-prod-web-$CL_prod_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" "__sbom.json" vex.json || true
1231
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-prod-web-$CL_prod_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
1232
+ environment:
1233
+ name: prod/web
1234
+ url: $CL_GITLAB_ENVIRONMENT_URL
1235
+ on_stop: 'web ๐Ÿ›‘ Stop โš ๏ธ | prod '
1236
+ artifacts:
1237
+ reports:
1238
+ dotenv: gitlab_environment.env
1239
+ rules:
1240
+ - when: manual
1241
+ if: $CI_COMMIT_TAG
1242
+ needs:
1243
+ - job: 'web ๐Ÿ”จ app | prod '
1244
+ artifacts: false
1245
+ - job: 'web ๐Ÿ”จ docker | prod '
1246
+ artifacts: false
1247
+ - job: 'web ๐Ÿงพ sbom | prod '
1248
+ artifacts: true
1249
+ retry: *a1
1250
+ interruptible: true
1251
+ allow_failure: true
1252
+ 'web ๐Ÿ›‘ Stop โš ๏ธ | prod ':
1253
+ stage: stop prod
1254
+ image: path/to/docker/gcloud:the-version
1255
+ variables:
1256
+ KUBERNETES_CPU_REQUEST: '0.22'
1257
+ KUBERNETES_MEMORY_REQUEST: 200Mi
1258
+ KUBERNETES_MEMORY_LIMIT: 400Mi
1259
+ GIT_STRATEGY: none
1260
+ script:
1261
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1262
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
1263
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1264
+ - set +e
1265
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_prod_web_GCLOUD_DEPLOY_credentialsKey")
1266
+ - gcloud run services delete pan-test-app-prod-web --project=google-project-id --region=europe-west6
1267
+ - gcloud run services delete pan-test-app-prod-web-worker --project=google-project-id --region=europe-west6
1268
+ - gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/prod/web --quiet --delete-tags
1269
+ - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/web --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/web@$version --quiet --delete-tags; done
1270
+ - echo 'Disabling component in Dependency Track'
1271
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/web" "https://$(printf %s "pan-test-app-prod-web-$CL_prod_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" || true
1272
+ - set -e
1273
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-prod-web-$CL_prod_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
1274
+ environment:
1275
+ name: prod/web
1276
+ url: $CL_GITLAB_ENVIRONMENT_URL
1277
+ action: stop
1278
+ artifacts:
1279
+ reports:
1280
+ dotenv: gitlab_environment.env
1281
+ rules:
1282
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
1283
+ when: on_success
1284
+ - when: manual
1285
+ if: $CI_COMMIT_TAG
1286
+ needs: []
1287
+ retry: *a1
1288
+ interruptible: true
1289
+ allow_failure: true
1290
+ create release:
1291
+ stage: release
1292
+ image: path/to/docker/semantic-release:the-version
1293
+ script:
1294
+ - semanticRelease
1295
+ after_script:
1296
+ - echo '๐Ÿ‘‰ The project access token might be invald - run \`project-renew-token\` in catladder CLI to fix.'
1297
+ rules:
1298
+ - &a2
1299
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
1300
+ when: never
1301
+ - &a3
1302
+ if: $CI_PIPELINE_SOURCE == "schedule"
1303
+ when: never
1304
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $AUTO_RELEASE == "true"
1305
+ when: on_success
1306
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
1307
+ when: manual
1308
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+.([0-9]+|x).x$/
1309
+ when: manual
1310
+ โš ๏ธ force create release:
1311
+ stage: release
1312
+ image: path/to/docker/semantic-release:the-version
1313
+ script:
1314
+ - semanticRelease
1315
+ after_script:
1316
+ - echo '๐Ÿ‘‰ The project access token might be invald - run \`project-renew-token\` in catladder CLI to fix.'
1317
+ rules:
1318
+ - *a2
1319
+ - *a3
1320
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
1321
+ when: manual
1322
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+.([0-9]+|x).x$/
1323
+ when: manual
1324
+ needs: []
1325
+ "
1326
+ `;
1327
+
3
1328
  exports[`matches snapshot for cloud-run-meteor-with-worker 1`] = `
4
1329
  {
5
1330
  "mainBranch": {