@catladder/pipeline 0.0.0-update-docker-for-apps-e047cc44 → 0.0.0-update-node-b0c7282d

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 (51) hide show
  1. package/dist/build/custom/buildJob.js +1 -1
  2. package/dist/build/docker.d.ts +26 -6
  3. package/dist/build/docker.js +53 -8
  4. package/dist/build/node/buildJob.js +1 -1
  5. package/dist/build/node/meteor.js +1 -1
  6. package/dist/build/rails/build.js +12 -3
  7. package/dist/bundles/catladder-gitlab/index.js +146 -49
  8. package/dist/constants.js +1 -1
  9. package/dist/deploy/base/deploy.js +1 -1
  10. package/dist/deploy/cloudRun/artifactsRegistry.d.ts +7 -4
  11. package/dist/deploy/cloudRun/artifactsRegistry.js +30 -23
  12. package/dist/deploy/cloudRun/deployJob.js +14 -9
  13. package/dist/deploy/dockerTag/deployJob.js +32 -1
  14. package/dist/deploy/types/googleCloudRun.d.ts +10 -6
  15. package/dist/tsconfig.tsbuildinfo +1 -1
  16. package/examples/__snapshots__/cloud-run-memory-limit.ts.snap +73 -77
  17. package/examples/__snapshots__/cloud-run-meteor-with-worker.ts.snap +1813 -0
  18. package/examples/__snapshots__/cloud-run-no-cpu-throttling.ts.snap +73 -77
  19. package/examples/__snapshots__/cloud-run-non-public.ts.snap +73 -77
  20. package/examples/__snapshots__/cloud-run-post-stop-job.ts.snap +1855 -0
  21. package/examples/__snapshots__/cloud-run-with-sql-reuse-db.ts.snap +146 -154
  22. package/examples/__snapshots__/cloud-run-with-sql.ts.snap +146 -154
  23. package/examples/__snapshots__/cloud-run-with-worker.ts.snap +1853 -0
  24. package/examples/__snapshots__/custom-build-job-with-tests.ts.snap +73 -77
  25. package/examples/__snapshots__/custom-build-job.ts.snap +73 -77
  26. package/examples/__snapshots__/custom-deploy.ts.snap +65 -53
  27. package/examples/__snapshots__/custom-sbom-java.ts.snap +73 -77
  28. package/examples/__snapshots__/kubernetes-application-customization.ts.snap +41 -29
  29. package/examples/__snapshots__/kubernetes-with-cloud-sql-legacy.ts.snap +41 -29
  30. package/examples/__snapshots__/kubernetes-with-cloud-sql.ts.snap +41 -29
  31. package/examples/__snapshots__/kubernetes-with-jobs.ts.snap +82 -58
  32. package/examples/__snapshots__/kubernetes-with-mongodb.ts.snap +41 -29
  33. package/examples/__snapshots__/meteor-kubernetes.ts.snap +41 -29
  34. package/examples/__snapshots__/native-app.ts.snap +73 -77
  35. package/examples/__snapshots__/node-build-with-custom-image.ts.snap +73 -77
  36. package/examples/__snapshots__/rails-k8s-with-worker.ts.snap +58 -54
  37. package/examples/cloud-run-meteor-with-worker.ts +35 -0
  38. package/examples/cloud-run-post-stop-job.ts +40 -0
  39. package/examples/cloud-run-with-worker.ts +35 -0
  40. package/examples/custom-deploy.ts +8 -0
  41. package/package.json +1 -1
  42. package/src/build/custom/buildJob.ts +1 -0
  43. package/src/build/docker.ts +56 -16
  44. package/src/build/node/buildJob.ts +1 -0
  45. package/src/build/node/meteor.ts +1 -1
  46. package/src/build/rails/build.ts +2 -2
  47. package/src/deploy/base/deploy.ts +1 -1
  48. package/src/deploy/cloudRun/artifactsRegistry.ts +35 -32
  49. package/src/deploy/cloudRun/deployJob.ts +30 -15
  50. package/src/deploy/dockerTag/deployJob.ts +1 -1
  51. package/src/deploy/types/googleCloudRun.ts +11 -6
@@ -0,0 +1,1813 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`matches snapshot 1`] = `
4
+ {
5
+ "mainBranch": {
6
+ "image": "path/to/docker/jobs-default:the-version",
7
+ "jobs": {
8
+ "web 👮 lint": {
9
+ "cache": [
10
+ {
11
+ "key": "web-yarn",
12
+ "paths": [
13
+ "web/.yarn",
14
+ ],
15
+ "policy": "pull-push",
16
+ },
17
+ {
18
+ "key": "web-node-modules",
19
+ "paths": [
20
+ "web/node_modules",
21
+ ],
22
+ "policy": "pull-push",
23
+ },
24
+ ],
25
+ "image": "path/to/docker/jobs-default:the-version",
26
+ "interruptible": true,
27
+ "needs": [],
28
+ "retry": {
29
+ "max": 2,
30
+ "when": [
31
+ "runner_system_failure",
32
+ "stuck_or_timeout_failure",
33
+ ],
34
+ },
35
+ "script": [
36
+ "cd web",
37
+ "echo -e "\\e[0Ksection_start:$(date +%s):yarn prepare[collapsed=true]\\r\\e[0KNode and yarn install"",
38
+ "echo -e "\\e[0Ksection_start:$(date +%s):node install[collapsed=true]\\r\\e[0KEnsure node version"",
39
+ "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
40
+ "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
41
+ "echo -e "\\e[0Ksection_end:$(date +%s):node install\\r\\e[0K"",
42
+ "yarn install --immutable",
43
+ "echo -e "\\e[0Ksection_end:$(date +%s):yarn prepare\\r\\e[0K"",
44
+ "yarn lint",
45
+ ],
46
+ "stage": "test",
47
+ "variables": {
48
+ "APP_PATH": "web",
49
+ "KUBERNETES_CPU_LIMIT": "2",
50
+ "KUBERNETES_CPU_REQUEST": "0.5",
51
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
52
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
53
+ },
54
+ },
55
+ "web 🔨 app | dev ": {
56
+ "artifacts": {
57
+ "paths": [
58
+ "web/__build_info.json",
59
+ "web/dist",
60
+ ],
61
+ "reports": {
62
+ "junit": undefined,
63
+ },
64
+ },
65
+ "cache": [
66
+ {
67
+ "key": "web-yarn",
68
+ "paths": [
69
+ "web/.yarn",
70
+ ],
71
+ "policy": "pull-push",
72
+ },
73
+ {
74
+ "key": "web-node-modules",
75
+ "paths": [
76
+ "web/node_modules",
77
+ ],
78
+ "policy": "pull-push",
79
+ },
80
+ {
81
+ "key": "webmeteor-build-cache",
82
+ "paths": [
83
+ "web/.meteor/local/resolver-result-cache.json",
84
+ "web/.meteor/local/plugin-cache",
85
+ "web/.meteor/local/isopacks",
86
+ "web/.meteor/local/bundler-cache/scanner",
87
+ ],
88
+ "policy": "pull-push",
89
+ },
90
+ ],
91
+ "image": "path/to/docker/jobs-meteor:the-version",
92
+ "interruptible": true,
93
+ "needs": [],
94
+ "retry": {
95
+ "max": 2,
96
+ "when": [
97
+ "runner_system_failure",
98
+ "stuck_or_timeout_failure",
99
+ ],
100
+ },
101
+ "script": [
102
+ "echo '{"id":"some-id","time":"01-01-2023 12:13:14"}' > web/__build_info.json",
103
+ "echo -e "\\e[0Ksection_start:$(date +%s):node install[collapsed=true]\\r\\e[0KEnsure node version"",
104
+ "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
105
+ "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
106
+ "echo -e "\\e[0Ksection_end:$(date +%s):node install\\r\\e[0K"",
107
+ "cd web",
108
+ "echo -e "\\e[0Ksection_start:$(date +%s):yarn prepare[collapsed=true]\\r\\e[0KNode and yarn install"",
109
+ "echo -e "\\e[0Ksection_start:$(date +%s):node install[collapsed=true]\\r\\e[0KEnsure node version"",
110
+ "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
111
+ "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
112
+ "echo -e "\\e[0Ksection_end:$(date +%s):node install\\r\\e[0K"",
113
+ "yarn install --immutable",
114
+ "echo -e "\\e[0Ksection_end:$(date +%s):yarn prepare\\r\\e[0K"",
115
+ "echo "add healthcheck package"",
116
+ "meteor add panter:healthroute --allow-superuser",
117
+ "meteor add qualia:prod-shell --allow-superuser",
118
+ "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",
119
+ "cp ./__build_info.json ./dist/bundle/programs/server",
120
+ ],
121
+ "stage": "build",
122
+ "variables": {
123
+ "APP_DIR": "web",
124
+ "BUILD_INFO_BUILD_TIME": "01-01-2023 12:13:14",
125
+ "BUILD_INFO_CURRENT_VERSION": "3.2.1",
126
+ "BUILD_INFO_ID": "some-id",
127
+ "ENV_SHORT": "dev",
128
+ "ENV_TYPE": "dev",
129
+ "GCLOUD_DEPLOY_credentialsKey": "$CL_dev_web_GCLOUD_DEPLOY_credentialsKey",
130
+ "GCLOUD_RUN_canonicalHostSuffix": "$CL_dev_web_GCLOUD_RUN_canonicalHostSuffix",
131
+ "HOST": "pan-test-app-dev-web-unknown-host.example.com",
132
+ "HOST_CANONICAL": "pan-test-app-dev-web-unknown-host.example.com",
133
+ "KUBERNETES_CPU_LIMIT": "2",
134
+ "KUBERNETES_CPU_REQUEST": "0.5",
135
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
136
+ "KUBERNETES_MEMORY_REQUEST": "1Gi",
137
+ "METEOR_DISABLE_OPTIMISTIC_CACHING": "1",
138
+ "ROOT_URL": "https://pan-test-app-dev-web-unknown-host.example.com",
139
+ "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_CANONICAL","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]",
140
+ },
141
+ },
142
+ "web 🔨 docker | dev ": {
143
+ "image": "path/to/docker/docker-build:the-version",
144
+ "interruptible": true,
145
+ "needs": [
146
+ "web 🔨 app | dev ",
147
+ ],
148
+ "retry": {
149
+ "max": 2,
150
+ "when": [
151
+ "runner_system_failure",
152
+ "stuck_or_timeout_failure",
153
+ ],
154
+ },
155
+ "script": [
156
+ "ensureMeteorDockerfile",
157
+ "echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"",
158
+ "echo $CL_dev_web_GCLOUD_DEPLOY_credentialsKey > ./____keyfile.json
159
+ ",
160
+ "gcloud auth activate-service-account --key-file="./____keyfile.json"",
161
+ "gcloud auth configure-docker europe-west6-docker.pkg.dev",
162
+ "echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"",
163
+ "echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"",
164
+ "docker build --network host --cache-from $DOCKER_CACHE_IMAGE --tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG -f $APP_DIR/Dockerfile . --build-arg BUILDKIT_INLINE_CACHE=1",
165
+ "echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"",
166
+ "echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"",
167
+ "docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
168
+ "docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE",
169
+ "docker push $DOCKER_CACHE_IMAGE",
170
+ "echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"",
171
+ ],
172
+ "services": [
173
+ {
174
+ "command": [
175
+ "--tls=false",
176
+ ],
177
+ "name": "docker:24.0.6-dind",
178
+ },
179
+ ],
180
+ "stage": "build",
181
+ "variables": {
182
+ "APP_DIR": "web",
183
+ "DOCKERFILE_ADDITIONS": undefined,
184
+ "DOCKERFILE_ADDITIONS_END": undefined,
185
+ "DOCKER_BUILDKIT": "1",
186
+ "DOCKER_CACHE_IMAGE": "europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/web",
187
+ "DOCKER_DIR": ".",
188
+ "DOCKER_DRIVER": "overlay2",
189
+ "DOCKER_HOST": "tcp://0.0.0.0:2375",
190
+ "DOCKER_IMAGE": "europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/dev/web",
191
+ "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
192
+ "DOCKER_REGISTRY": "europe-west6-docker.pkg.dev",
193
+ "DOCKER_TLS_CERTDIR": "",
194
+ "KUBERNETES_CPU_LIMIT": "1",
195
+ "KUBERNETES_CPU_REQUEST": "0.5",
196
+ "KUBERNETES_MEMORY_LIMIT": "2Gi",
197
+ "KUBERNETES_MEMORY_REQUEST": "1Gi",
198
+ "METEOR_INSTALL_SCRIPTS": "",
199
+ },
200
+ },
201
+ "web 🚀 Deploy | dev ": {
202
+ "allow_failure": false,
203
+ "artifacts": {
204
+ "paths": [
205
+ "____envvars.yaml",
206
+ ],
207
+ },
208
+ "environment": {
209
+ "auto_stop_in": "4 weeks",
210
+ "name": "dev/web",
211
+ "on_stop": "web 🛑 Stop ⚠️ | dev ",
212
+ "url": "https://pan-test-app-dev-web-unknown-host.example.com",
213
+ },
214
+ "image": "path/to/docker/gcloud:the-version",
215
+ "interruptible": true,
216
+ "needs": [
217
+ {
218
+ "artifacts": false,
219
+ "job": "web 👮 lint",
220
+ },
221
+ {
222
+ "artifacts": false,
223
+ "job": "web 🔨 app | dev ",
224
+ },
225
+ {
226
+ "artifacts": false,
227
+ "job": "web 🔨 docker | dev ",
228
+ },
229
+ {
230
+ "artifacts": false,
231
+ "job": "web 🧪 test",
232
+ },
233
+ {
234
+ "artifacts": true,
235
+ "job": "web 🧾 sbom | dev ",
236
+ },
237
+ {
238
+ "artifacts": false,
239
+ "job": "web 🛡 audit",
240
+ },
241
+ ],
242
+ "retry": {
243
+ "max": 2,
244
+ "when": [
245
+ "runner_system_failure",
246
+ "stuck_or_timeout_failure",
247
+ ],
248
+ },
249
+ "rules": [
250
+ {
251
+ "when": "on_success",
252
+ },
253
+ ],
254
+ "script": [
255
+ "echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."",
256
+ "echo $CL_dev_web_GCLOUD_DEPLOY_credentialsKey > ./____keyfile.json
257
+ ",
258
+ "gcloud auth activate-service-account --key-file="./____keyfile.json"",
259
+ "export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe google-project-id --format="value(projectNumber)")",
260
+ "echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"",
261
+ "echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"",
262
+ "echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"",
263
+ "echo "$ENV_VARS" > ____envvars.yaml",
264
+ "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 --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost",
265
+ "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 --env-vars-file=____envvars.yaml --min-instances=1 --max-instances=1 --no-cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost",
266
+ "echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"",
267
+ "echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"",
268
+ "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",
269
+ "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",
270
+ "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",
271
+ "echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"",
272
+ "echo Uploading SBOM to Dependency Track",
273
+ "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/web" "https://pan-test-app-dev-web-unknown-host.example.com" "__sbom.json" vex.json || true",
274
+ ],
275
+ "services": [
276
+ {
277
+ "command": [
278
+ "--tls=false",
279
+ ],
280
+ "name": "docker:24.0.6-dind",
281
+ },
282
+ ],
283
+ "stage": "deploy dev",
284
+ "variables": {
285
+ "APP_DIR": "web",
286
+ "BUILD_INFO_BUILD_TIME": "01-01-2023 12:13:14",
287
+ "BUILD_INFO_CURRENT_VERSION": "3.2.1",
288
+ "BUILD_INFO_ID": "some-id",
289
+ "CLOUDSDK_CORE_DISABLE_PROMPTS": "1",
290
+ "DOCKER_BUILDKIT": "1",
291
+ "DOCKER_CACHE_IMAGE": "europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/web",
292
+ "DOCKER_DRIVER": "overlay2",
293
+ "DOCKER_HOST": "tcp://0.0.0.0:2375",
294
+ "DOCKER_IMAGE": "europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/dev/web",
295
+ "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
296
+ "DOCKER_REGISTRY": "europe-west6-docker.pkg.dev",
297
+ "DOCKER_TLS_CERTDIR": "",
298
+ "ENV_SHORT": "dev",
299
+ "ENV_TYPE": "dev",
300
+ "ENV_VARS": "ENV_SHORT: 'dev'
301
+ APP_DIR: 'web'
302
+ ENV_TYPE: 'dev'
303
+ BUILD_INFO_ID: 'some-id'
304
+ BUILD_INFO_BUILD_TIME: '01-01-2023 12:13:14'
305
+ BUILD_INFO_CURRENT_VERSION: '3.2.1'
306
+ HOST: 'pan-test-app-dev-web-unknown-host.example.com'
307
+ ROOT_URL: 'https://pan-test-app-dev-web-unknown-host.example.com'
308
+ HOST_CANONICAL: 'pan-test-app-dev-web-unknown-host.example.com'
309
+ GCLOUD_RUN_canonicalHostSuffix: '$CL_dev_web_GCLOUD_RUN_canonicalHostSuffix'
310
+ _ALL_ENV_VAR_KEYS: '["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_CANONICAL","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]'
311
+ ",
312
+ "GCLOUD_DEPLOY_credentialsKey": "$CL_dev_web_GCLOUD_DEPLOY_credentialsKey",
313
+ "GCLOUD_RUN_canonicalHostSuffix": "$CL_dev_web_GCLOUD_RUN_canonicalHostSuffix",
314
+ "HOST": "pan-test-app-dev-web-unknown-host.example.com",
315
+ "HOST_CANONICAL": "pan-test-app-dev-web-unknown-host.example.com",
316
+ "KUBERNETES_CPU_LIMIT": "1",
317
+ "KUBERNETES_CPU_REQUEST": "0.5",
318
+ "KUBERNETES_MEMORY_LIMIT": "400Mi",
319
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
320
+ "ROOT_URL": "https://pan-test-app-dev-web-unknown-host.example.com",
321
+ "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_CANONICAL","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]",
322
+ },
323
+ },
324
+ "web 🛑 Stop ⚠️ | dev ": {
325
+ "environment": {
326
+ "action": "stop",
327
+ "name": "dev/web",
328
+ "url": "https://pan-test-app-dev-web-unknown-host.example.com",
329
+ },
330
+ "image": "path/to/docker/gcloud:the-version",
331
+ "interruptible": true,
332
+ "needs": [],
333
+ "retry": {
334
+ "max": 2,
335
+ "when": [
336
+ "runner_system_failure",
337
+ "stuck_or_timeout_failure",
338
+ ],
339
+ },
340
+ "rules": [
341
+ {
342
+ "allow_failure": true,
343
+ "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/",
344
+ "when": "on_success",
345
+ },
346
+ {
347
+ "allow_failure": true,
348
+ "when": "manual",
349
+ },
350
+ ],
351
+ "script": [
352
+ "set +e",
353
+ "echo $CL_dev_web_GCLOUD_DEPLOY_credentialsKey > ./____keyfile.json
354
+ ",
355
+ "gcloud auth activate-service-account --key-file="./____keyfile.json"",
356
+ "gcloud run services delete pan-test-app-dev-web --project=google-project-id --region=europe-west6",
357
+ "gcloud run services delete pan-test-app-dev-web-worker --project=google-project-id --region=europe-west6",
358
+ "gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/dev/web --quiet --delete-tags",
359
+ "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",
360
+ "echo Disabling component in Dependency Track",
361
+ "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/web" "https://pan-test-app-dev-web-unknown-host.example.com" || true",
362
+ "set -e",
363
+ ],
364
+ "stage": "stop dev",
365
+ "variables": {
366
+ "CLOUDSDK_CORE_DISABLE_PROMPTS": "1",
367
+ "GIT_STRATEGY": "none",
368
+ "KUBERNETES_CPU_LIMIT": "1",
369
+ "KUBERNETES_CPU_REQUEST": "0.5",
370
+ "KUBERNETES_MEMORY_LIMIT": "400Mi",
371
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
372
+ },
373
+ },
374
+ "web 🛡 audit": {
375
+ "allow_failure": true,
376
+ "image": "path/to/docker/jobs-default:the-version",
377
+ "interruptible": true,
378
+ "needs": [],
379
+ "retry": {
380
+ "max": 2,
381
+ "when": [
382
+ "runner_system_failure",
383
+ "stuck_or_timeout_failure",
384
+ ],
385
+ },
386
+ "script": [
387
+ "cd web",
388
+ "yarn npm audit --environment production",
389
+ ],
390
+ "stage": "test",
391
+ "variables": {
392
+ "APP_PATH": "web",
393
+ "KUBERNETES_CPU_LIMIT": "2",
394
+ "KUBERNETES_CPU_REQUEST": "0.5",
395
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
396
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
397
+ },
398
+ },
399
+ "web 🧪 test": {
400
+ "cache": [
401
+ {
402
+ "key": "web-yarn",
403
+ "paths": [
404
+ "web/.yarn",
405
+ ],
406
+ "policy": "pull-push",
407
+ },
408
+ {
409
+ "key": "web-node-modules",
410
+ "paths": [
411
+ "web/node_modules",
412
+ ],
413
+ "policy": "pull-push",
414
+ },
415
+ ],
416
+ "image": "path/to/docker/jobs-testing-chrome:the-version",
417
+ "interruptible": true,
418
+ "needs": [],
419
+ "retry": {
420
+ "max": 2,
421
+ "when": [
422
+ "runner_system_failure",
423
+ "stuck_or_timeout_failure",
424
+ ],
425
+ },
426
+ "script": [
427
+ "cd web",
428
+ "echo -e "\\e[0Ksection_start:$(date +%s):yarn prepare[collapsed=true]\\r\\e[0KNode and yarn install"",
429
+ "echo -e "\\e[0Ksection_start:$(date +%s):node install[collapsed=true]\\r\\e[0KEnsure node version"",
430
+ "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
431
+ "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
432
+ "echo -e "\\e[0Ksection_end:$(date +%s):node install\\r\\e[0K"",
433
+ "yarn install --immutable",
434
+ "echo -e "\\e[0Ksection_end:$(date +%s):yarn prepare\\r\\e[0K"",
435
+ "yarn test",
436
+ ],
437
+ "stage": "test",
438
+ "variables": {
439
+ "APP_PATH": "web",
440
+ "KUBERNETES_CPU_LIMIT": "2",
441
+ "KUBERNETES_CPU_REQUEST": "0.5",
442
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
443
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
444
+ },
445
+ },
446
+ "web 🧾 sbom | dev ": {
447
+ "allow_failure": true,
448
+ "artifacts": {
449
+ "paths": [
450
+ "__sbom.json",
451
+ ],
452
+ },
453
+ "image": "aquasec/trivy:0.38.3",
454
+ "interruptible": true,
455
+ "needs": [],
456
+ "retry": {
457
+ "max": 2,
458
+ "when": [
459
+ "runner_system_failure",
460
+ "stuck_or_timeout_failure",
461
+ ],
462
+ },
463
+ "script": [
464
+ "trivy fs --quiet --format cyclonedx --output "__sbom.json" web",
465
+ ],
466
+ "stage": "build",
467
+ "variables": {},
468
+ },
469
+ },
470
+ "stages": [
471
+ "setup",
472
+ "setup dev",
473
+ "setup review",
474
+ "setup stage",
475
+ "setup prod",
476
+ "setup local",
477
+ "test",
478
+ "test dev",
479
+ "test review",
480
+ "test stage",
481
+ "test prod",
482
+ "test local",
483
+ "build",
484
+ "build dev",
485
+ "build review",
486
+ "build stage",
487
+ "build prod",
488
+ "build local",
489
+ "deploy",
490
+ "deploy dev",
491
+ "deploy review",
492
+ "deploy stage",
493
+ "deploy prod",
494
+ "deploy local",
495
+ "verify",
496
+ "verify dev",
497
+ "verify review",
498
+ "verify stage",
499
+ "verify prod",
500
+ "verify local",
501
+ "rollback",
502
+ "rollback dev",
503
+ "rollback review",
504
+ "rollback stage",
505
+ "rollback prod",
506
+ "rollback local",
507
+ "stop",
508
+ "stop dev",
509
+ "stop review",
510
+ "stop stage",
511
+ "stop prod",
512
+ "stop local",
513
+ ],
514
+ "variables": {
515
+ "FF_USE_FASTZIP": "true",
516
+ "GIT_DEPTH": 1,
517
+ },
518
+ "workflow": {
519
+ "rules": [
520
+ {
521
+ "if": "$CI_COMMIT_TAG",
522
+ },
523
+ {
524
+ "if": "$CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/",
525
+ "when": "never",
526
+ },
527
+ {
528
+ "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+.([0-9]+|x).x$/",
529
+ },
530
+ {
531
+ "if": "$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH",
532
+ },
533
+ {
534
+ "if": "$CI_MERGE_REQUEST_ID",
535
+ },
536
+ ],
537
+ },
538
+ },
539
+ "mr": {
540
+ "image": "path/to/docker/jobs-default:the-version",
541
+ "jobs": {
542
+ "web 👮 lint": {
543
+ "cache": [
544
+ {
545
+ "key": "web-yarn",
546
+ "paths": [
547
+ "web/.yarn",
548
+ ],
549
+ "policy": "pull-push",
550
+ },
551
+ {
552
+ "key": "web-node-modules",
553
+ "paths": [
554
+ "web/node_modules",
555
+ ],
556
+ "policy": "pull-push",
557
+ },
558
+ ],
559
+ "image": "path/to/docker/jobs-default:the-version",
560
+ "interruptible": true,
561
+ "needs": [],
562
+ "retry": {
563
+ "max": 2,
564
+ "when": [
565
+ "runner_system_failure",
566
+ "stuck_or_timeout_failure",
567
+ ],
568
+ },
569
+ "script": [
570
+ "cd web",
571
+ "echo -e "\\e[0Ksection_start:$(date +%s):yarn prepare[collapsed=true]\\r\\e[0KNode and yarn install"",
572
+ "echo -e "\\e[0Ksection_start:$(date +%s):node install[collapsed=true]\\r\\e[0KEnsure node version"",
573
+ "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
574
+ "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
575
+ "echo -e "\\e[0Ksection_end:$(date +%s):node install\\r\\e[0K"",
576
+ "yarn install --immutable",
577
+ "echo -e "\\e[0Ksection_end:$(date +%s):yarn prepare\\r\\e[0K"",
578
+ "yarn lint",
579
+ ],
580
+ "stage": "test",
581
+ "variables": {
582
+ "APP_PATH": "web",
583
+ "KUBERNETES_CPU_LIMIT": "2",
584
+ "KUBERNETES_CPU_REQUEST": "0.5",
585
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
586
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
587
+ },
588
+ },
589
+ "web 🔨 app | review ": {
590
+ "artifacts": {
591
+ "paths": [
592
+ "web/__build_info.json",
593
+ "web/dist",
594
+ ],
595
+ "reports": {
596
+ "junit": undefined,
597
+ },
598
+ },
599
+ "cache": [
600
+ {
601
+ "key": "web-yarn",
602
+ "paths": [
603
+ "web/.yarn",
604
+ ],
605
+ "policy": "pull-push",
606
+ },
607
+ {
608
+ "key": "web-node-modules",
609
+ "paths": [
610
+ "web/node_modules",
611
+ ],
612
+ "policy": "pull-push",
613
+ },
614
+ {
615
+ "key": "webmeteor-build-cache",
616
+ "paths": [
617
+ "web/.meteor/local/resolver-result-cache.json",
618
+ "web/.meteor/local/plugin-cache",
619
+ "web/.meteor/local/isopacks",
620
+ "web/.meteor/local/bundler-cache/scanner",
621
+ ],
622
+ "policy": "pull-push",
623
+ },
624
+ ],
625
+ "image": "path/to/docker/jobs-meteor:the-version",
626
+ "interruptible": true,
627
+ "needs": [],
628
+ "retry": {
629
+ "max": 2,
630
+ "when": [
631
+ "runner_system_failure",
632
+ "stuck_or_timeout_failure",
633
+ ],
634
+ },
635
+ "script": [
636
+ "echo '{"id":"some-id","time":"01-01-2023 12:13:14"}' > web/__build_info.json",
637
+ "echo -e "\\e[0Ksection_start:$(date +%s):node install[collapsed=true]\\r\\e[0KEnsure node version"",
638
+ "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
639
+ "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
640
+ "echo -e "\\e[0Ksection_end:$(date +%s):node install\\r\\e[0K"",
641
+ "cd web",
642
+ "echo -e "\\e[0Ksection_start:$(date +%s):yarn prepare[collapsed=true]\\r\\e[0KNode and yarn install"",
643
+ "echo -e "\\e[0Ksection_start:$(date +%s):node install[collapsed=true]\\r\\e[0KEnsure node version"",
644
+ "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
645
+ "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
646
+ "echo -e "\\e[0Ksection_end:$(date +%s):node install\\r\\e[0K"",
647
+ "yarn install --immutable",
648
+ "echo -e "\\e[0Ksection_end:$(date +%s):yarn prepare\\r\\e[0K"",
649
+ "echo "add healthcheck package"",
650
+ "meteor add panter:healthroute --allow-superuser",
651
+ "meteor add qualia:prod-shell --allow-superuser",
652
+ "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",
653
+ "cp ./__build_info.json ./dist/bundle/programs/server",
654
+ ],
655
+ "stage": "build",
656
+ "variables": {
657
+ "APP_DIR": "web",
658
+ "BUILD_INFO_BUILD_TIME": "01-01-2023 12:13:14",
659
+ "BUILD_INFO_CURRENT_VERSION": "3.2.1",
660
+ "BUILD_INFO_ID": "some-id",
661
+ "ENV_SHORT": "review",
662
+ "ENV_TYPE": "review",
663
+ "GCLOUD_DEPLOY_credentialsKey": "$CL_review_web_GCLOUD_DEPLOY_credentialsKey",
664
+ "GCLOUD_RUN_canonicalHostSuffix": "$CL_review_web_GCLOUD_RUN_canonicalHostSuffix",
665
+ "HOST": "pan-test-app-review-mr1234-web-unknown-host.example.com",
666
+ "HOST_CANONICAL": "pan-test-app-review-mr1234-web-unknown-host.example.com",
667
+ "KUBERNETES_CPU_LIMIT": "2",
668
+ "KUBERNETES_CPU_REQUEST": "0.5",
669
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
670
+ "KUBERNETES_MEMORY_REQUEST": "1Gi",
671
+ "METEOR_DISABLE_OPTIMISTIC_CACHING": "1",
672
+ "ROOT_URL": "https://pan-test-app-review-mr1234-web-unknown-host.example.com",
673
+ "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_CANONICAL","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]",
674
+ },
675
+ },
676
+ "web 🔨 docker | review ": {
677
+ "image": "path/to/docker/docker-build:the-version",
678
+ "interruptible": true,
679
+ "needs": [
680
+ "web 🔨 app | review ",
681
+ ],
682
+ "retry": {
683
+ "max": 2,
684
+ "when": [
685
+ "runner_system_failure",
686
+ "stuck_or_timeout_failure",
687
+ ],
688
+ },
689
+ "script": [
690
+ "ensureMeteorDockerfile",
691
+ "echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"",
692
+ "echo $CL_review_web_GCLOUD_DEPLOY_credentialsKey > ./____keyfile.json
693
+ ",
694
+ "gcloud auth activate-service-account --key-file="./____keyfile.json"",
695
+ "gcloud auth configure-docker europe-west6-docker.pkg.dev",
696
+ "echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"",
697
+ "echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"",
698
+ "docker build --network host --cache-from $DOCKER_CACHE_IMAGE --tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG -f $APP_DIR/Dockerfile . --build-arg BUILDKIT_INLINE_CACHE=1",
699
+ "echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"",
700
+ "echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"",
701
+ "docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
702
+ "docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE",
703
+ "docker push $DOCKER_CACHE_IMAGE",
704
+ "echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"",
705
+ ],
706
+ "services": [
707
+ {
708
+ "command": [
709
+ "--tls=false",
710
+ ],
711
+ "name": "docker:24.0.6-dind",
712
+ },
713
+ ],
714
+ "stage": "build",
715
+ "variables": {
716
+ "APP_DIR": "web",
717
+ "DOCKERFILE_ADDITIONS": undefined,
718
+ "DOCKERFILE_ADDITIONS_END": undefined,
719
+ "DOCKER_BUILDKIT": "1",
720
+ "DOCKER_CACHE_IMAGE": "europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/web",
721
+ "DOCKER_DIR": ".",
722
+ "DOCKER_DRIVER": "overlay2",
723
+ "DOCKER_HOST": "tcp://0.0.0.0:2375",
724
+ "DOCKER_IMAGE": "europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/web/mr1234",
725
+ "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
726
+ "DOCKER_REGISTRY": "europe-west6-docker.pkg.dev",
727
+ "DOCKER_TLS_CERTDIR": "",
728
+ "KUBERNETES_CPU_LIMIT": "1",
729
+ "KUBERNETES_CPU_REQUEST": "0.5",
730
+ "KUBERNETES_MEMORY_LIMIT": "2Gi",
731
+ "KUBERNETES_MEMORY_REQUEST": "1Gi",
732
+ "METEOR_INSTALL_SCRIPTS": "",
733
+ },
734
+ },
735
+ "web 🚀 Deploy | review ": {
736
+ "allow_failure": false,
737
+ "artifacts": {
738
+ "paths": [
739
+ "____envvars.yaml",
740
+ ],
741
+ },
742
+ "environment": {
743
+ "auto_stop_in": "1 week",
744
+ "name": "review/some-commit/web",
745
+ "on_stop": "web 🛑 Stop ⚠️ | review ",
746
+ "url": "https://pan-test-app-review-mr1234-web-unknown-host.example.com",
747
+ },
748
+ "image": "path/to/docker/gcloud:the-version",
749
+ "interruptible": true,
750
+ "needs": [
751
+ {
752
+ "artifacts": false,
753
+ "job": "web 👮 lint",
754
+ },
755
+ {
756
+ "artifacts": false,
757
+ "job": "web 🔨 app | review ",
758
+ },
759
+ {
760
+ "artifacts": false,
761
+ "job": "web 🔨 docker | review ",
762
+ },
763
+ {
764
+ "artifacts": false,
765
+ "job": "web 🧪 test",
766
+ },
767
+ {
768
+ "artifacts": true,
769
+ "job": "web 🧾 sbom | review ",
770
+ },
771
+ {
772
+ "artifacts": false,
773
+ "job": "web 🛡 audit",
774
+ },
775
+ ],
776
+ "retry": {
777
+ "max": 2,
778
+ "when": [
779
+ "runner_system_failure",
780
+ "stuck_or_timeout_failure",
781
+ ],
782
+ },
783
+ "rules": [
784
+ {
785
+ "when": "on_success",
786
+ },
787
+ ],
788
+ "script": [
789
+ "echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."",
790
+ "echo $CL_review_web_GCLOUD_DEPLOY_credentialsKey > ./____keyfile.json
791
+ ",
792
+ "gcloud auth activate-service-account --key-file="./____keyfile.json"",
793
+ "export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe google-project-id --format="value(projectNumber)")",
794
+ "echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"",
795
+ "echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"",
796
+ "echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"",
797
+ "echo "$ENV_VARS" > ____envvars.yaml",
798
+ "gcloud run deploy pan-test-app-review-mr1234-web --command="node,main.js" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/web/mr1234:$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 --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost",
799
+ "gcloud run deploy pan-test-app-review-mr1234-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/review/web/mr1234:$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 --env-vars-file=____envvars.yaml --min-instances=1 --max-instances=1 --no-cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost",
800
+ "echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"",
801
+ "echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"",
802
+ "gcloud run revisions list --project=google-project-id --region=europe-west6 --service=pan-test-app-review-mr1234-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",
803
+ "gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/web/mr1234 --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/mr1234@$version --quiet --delete-tags; done",
804
+ "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",
805
+ "set +e",
806
+ "gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/web --quiet --delete-tags",
807
+ "set -e",
808
+ "echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"",
809
+ "echo Uploading SBOM to Dependency Track",
810
+ "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/web" "https://pan-test-app-review-mr1234-web-unknown-host.example.com" "__sbom.json" vex.json || true",
811
+ ],
812
+ "services": [
813
+ {
814
+ "command": [
815
+ "--tls=false",
816
+ ],
817
+ "name": "docker:24.0.6-dind",
818
+ },
819
+ ],
820
+ "stage": "deploy review",
821
+ "variables": {
822
+ "APP_DIR": "web",
823
+ "BUILD_INFO_BUILD_TIME": "01-01-2023 12:13:14",
824
+ "BUILD_INFO_CURRENT_VERSION": "3.2.1",
825
+ "BUILD_INFO_ID": "some-id",
826
+ "CLOUDSDK_CORE_DISABLE_PROMPTS": "1",
827
+ "DOCKER_BUILDKIT": "1",
828
+ "DOCKER_CACHE_IMAGE": "europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/web",
829
+ "DOCKER_DRIVER": "overlay2",
830
+ "DOCKER_HOST": "tcp://0.0.0.0:2375",
831
+ "DOCKER_IMAGE": "europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/web/mr1234",
832
+ "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
833
+ "DOCKER_REGISTRY": "europe-west6-docker.pkg.dev",
834
+ "DOCKER_TLS_CERTDIR": "",
835
+ "ENV_SHORT": "review",
836
+ "ENV_TYPE": "review",
837
+ "ENV_VARS": "ENV_SHORT: 'review'
838
+ APP_DIR: 'web'
839
+ ENV_TYPE: 'review'
840
+ BUILD_INFO_ID: 'some-id'
841
+ BUILD_INFO_BUILD_TIME: '01-01-2023 12:13:14'
842
+ BUILD_INFO_CURRENT_VERSION: '3.2.1'
843
+ HOST: 'pan-test-app-review-mr1234-web-unknown-host.example.com'
844
+ ROOT_URL: 'https://pan-test-app-review-mr1234-web-unknown-host.example.com'
845
+ HOST_CANONICAL: 'pan-test-app-review-mr1234-web-unknown-host.example.com'
846
+ GCLOUD_RUN_canonicalHostSuffix: '$CL_review_web_GCLOUD_RUN_canonicalHostSuffix'
847
+ _ALL_ENV_VAR_KEYS: '["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_CANONICAL","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]'
848
+ ",
849
+ "GCLOUD_DEPLOY_credentialsKey": "$CL_review_web_GCLOUD_DEPLOY_credentialsKey",
850
+ "GCLOUD_RUN_canonicalHostSuffix": "$CL_review_web_GCLOUD_RUN_canonicalHostSuffix",
851
+ "HOST": "pan-test-app-review-mr1234-web-unknown-host.example.com",
852
+ "HOST_CANONICAL": "pan-test-app-review-mr1234-web-unknown-host.example.com",
853
+ "KUBERNETES_CPU_LIMIT": "1",
854
+ "KUBERNETES_CPU_REQUEST": "0.5",
855
+ "KUBERNETES_MEMORY_LIMIT": "400Mi",
856
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
857
+ "ROOT_URL": "https://pan-test-app-review-mr1234-web-unknown-host.example.com",
858
+ "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_CANONICAL","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]",
859
+ },
860
+ },
861
+ "web 🛑 Stop ⚠️ | review ": {
862
+ "environment": {
863
+ "action": "stop",
864
+ "name": "review/some-commit/web",
865
+ "url": "https://pan-test-app-review-mr1234-web-unknown-host.example.com",
866
+ },
867
+ "image": "path/to/docker/gcloud:the-version",
868
+ "interruptible": true,
869
+ "needs": [],
870
+ "retry": {
871
+ "max": 2,
872
+ "when": [
873
+ "runner_system_failure",
874
+ "stuck_or_timeout_failure",
875
+ ],
876
+ },
877
+ "rules": [
878
+ {
879
+ "allow_failure": true,
880
+ "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/",
881
+ "when": "on_success",
882
+ },
883
+ {
884
+ "allow_failure": true,
885
+ "when": "manual",
886
+ },
887
+ ],
888
+ "script": [
889
+ "set +e",
890
+ "echo $CL_review_web_GCLOUD_DEPLOY_credentialsKey > ./____keyfile.json
891
+ ",
892
+ "gcloud auth activate-service-account --key-file="./____keyfile.json"",
893
+ "gcloud run services delete pan-test-app-review-mr1234-web --project=google-project-id --region=europe-west6",
894
+ "gcloud run services delete pan-test-app-review-mr1234-web-worker --project=google-project-id --region=europe-west6",
895
+ "gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/web/mr1234 --quiet --delete-tags",
896
+ "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",
897
+ "set +e",
898
+ "gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/web --quiet --delete-tags",
899
+ "set -e",
900
+ "echo Disabling component in Dependency Track",
901
+ "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/web" "https://pan-test-app-review-mr1234-web-unknown-host.example.com" || true",
902
+ "set -e",
903
+ ],
904
+ "stage": "stop review",
905
+ "variables": {
906
+ "CLOUDSDK_CORE_DISABLE_PROMPTS": "1",
907
+ "GIT_STRATEGY": "none",
908
+ "KUBERNETES_CPU_LIMIT": "1",
909
+ "KUBERNETES_CPU_REQUEST": "0.5",
910
+ "KUBERNETES_MEMORY_LIMIT": "400Mi",
911
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
912
+ },
913
+ },
914
+ "web 🛡 audit": {
915
+ "allow_failure": true,
916
+ "image": "path/to/docker/jobs-default:the-version",
917
+ "interruptible": true,
918
+ "needs": [],
919
+ "retry": {
920
+ "max": 2,
921
+ "when": [
922
+ "runner_system_failure",
923
+ "stuck_or_timeout_failure",
924
+ ],
925
+ },
926
+ "script": [
927
+ "cd web",
928
+ "yarn npm audit --environment production",
929
+ ],
930
+ "stage": "test",
931
+ "variables": {
932
+ "APP_PATH": "web",
933
+ "KUBERNETES_CPU_LIMIT": "2",
934
+ "KUBERNETES_CPU_REQUEST": "0.5",
935
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
936
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
937
+ },
938
+ },
939
+ "web 🧪 test": {
940
+ "cache": [
941
+ {
942
+ "key": "web-yarn",
943
+ "paths": [
944
+ "web/.yarn",
945
+ ],
946
+ "policy": "pull-push",
947
+ },
948
+ {
949
+ "key": "web-node-modules",
950
+ "paths": [
951
+ "web/node_modules",
952
+ ],
953
+ "policy": "pull-push",
954
+ },
955
+ ],
956
+ "image": "path/to/docker/jobs-testing-chrome:the-version",
957
+ "interruptible": true,
958
+ "needs": [],
959
+ "retry": {
960
+ "max": 2,
961
+ "when": [
962
+ "runner_system_failure",
963
+ "stuck_or_timeout_failure",
964
+ ],
965
+ },
966
+ "script": [
967
+ "cd web",
968
+ "echo -e "\\e[0Ksection_start:$(date +%s):yarn prepare[collapsed=true]\\r\\e[0KNode and yarn install"",
969
+ "echo -e "\\e[0Ksection_start:$(date +%s):node install[collapsed=true]\\r\\e[0KEnsure node version"",
970
+ "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
971
+ "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
972
+ "echo -e "\\e[0Ksection_end:$(date +%s):node install\\r\\e[0K"",
973
+ "yarn install --immutable",
974
+ "echo -e "\\e[0Ksection_end:$(date +%s):yarn prepare\\r\\e[0K"",
975
+ "yarn test",
976
+ ],
977
+ "stage": "test",
978
+ "variables": {
979
+ "APP_PATH": "web",
980
+ "KUBERNETES_CPU_LIMIT": "2",
981
+ "KUBERNETES_CPU_REQUEST": "0.5",
982
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
983
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
984
+ },
985
+ },
986
+ "web 🧾 sbom | review ": {
987
+ "allow_failure": true,
988
+ "artifacts": {
989
+ "paths": [
990
+ "__sbom.json",
991
+ ],
992
+ },
993
+ "image": "aquasec/trivy:0.38.3",
994
+ "interruptible": true,
995
+ "needs": [],
996
+ "retry": {
997
+ "max": 2,
998
+ "when": [
999
+ "runner_system_failure",
1000
+ "stuck_or_timeout_failure",
1001
+ ],
1002
+ },
1003
+ "script": [
1004
+ "trivy fs --quiet --format cyclonedx --output "__sbom.json" web",
1005
+ ],
1006
+ "stage": "build",
1007
+ "variables": {},
1008
+ },
1009
+ },
1010
+ "stages": [
1011
+ "setup",
1012
+ "setup dev",
1013
+ "setup review",
1014
+ "setup stage",
1015
+ "setup prod",
1016
+ "setup local",
1017
+ "test",
1018
+ "test dev",
1019
+ "test review",
1020
+ "test stage",
1021
+ "test prod",
1022
+ "test local",
1023
+ "build",
1024
+ "build dev",
1025
+ "build review",
1026
+ "build stage",
1027
+ "build prod",
1028
+ "build local",
1029
+ "deploy",
1030
+ "deploy dev",
1031
+ "deploy review",
1032
+ "deploy stage",
1033
+ "deploy prod",
1034
+ "deploy local",
1035
+ "verify",
1036
+ "verify dev",
1037
+ "verify review",
1038
+ "verify stage",
1039
+ "verify prod",
1040
+ "verify local",
1041
+ "rollback",
1042
+ "rollback dev",
1043
+ "rollback review",
1044
+ "rollback stage",
1045
+ "rollback prod",
1046
+ "rollback local",
1047
+ "stop",
1048
+ "stop dev",
1049
+ "stop review",
1050
+ "stop stage",
1051
+ "stop prod",
1052
+ "stop local",
1053
+ ],
1054
+ "variables": {
1055
+ "FF_USE_FASTZIP": "true",
1056
+ "GIT_DEPTH": 1,
1057
+ },
1058
+ "workflow": {
1059
+ "rules": [
1060
+ {
1061
+ "if": "$CI_COMMIT_TAG",
1062
+ },
1063
+ {
1064
+ "if": "$CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/",
1065
+ "when": "never",
1066
+ },
1067
+ {
1068
+ "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+.([0-9]+|x).x$/",
1069
+ },
1070
+ {
1071
+ "if": "$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH",
1072
+ },
1073
+ {
1074
+ "if": "$CI_MERGE_REQUEST_ID",
1075
+ },
1076
+ ],
1077
+ },
1078
+ },
1079
+ "taggedRelease": {
1080
+ "image": "path/to/docker/jobs-default:the-version",
1081
+ "jobs": {
1082
+ "web 🔨 app | prod ": {
1083
+ "artifacts": {
1084
+ "paths": [
1085
+ "web/__build_info.json",
1086
+ "web/dist",
1087
+ ],
1088
+ "reports": {
1089
+ "junit": undefined,
1090
+ },
1091
+ },
1092
+ "cache": [
1093
+ {
1094
+ "key": "web-yarn",
1095
+ "paths": [
1096
+ "web/.yarn",
1097
+ ],
1098
+ "policy": "pull-push",
1099
+ },
1100
+ {
1101
+ "key": "web-node-modules",
1102
+ "paths": [
1103
+ "web/node_modules",
1104
+ ],
1105
+ "policy": "pull-push",
1106
+ },
1107
+ {
1108
+ "key": "webmeteor-build-cache",
1109
+ "paths": [
1110
+ "web/.meteor/local/resolver-result-cache.json",
1111
+ "web/.meteor/local/plugin-cache",
1112
+ "web/.meteor/local/isopacks",
1113
+ "web/.meteor/local/bundler-cache/scanner",
1114
+ ],
1115
+ "policy": "pull-push",
1116
+ },
1117
+ ],
1118
+ "image": "path/to/docker/jobs-meteor:the-version",
1119
+ "interruptible": true,
1120
+ "needs": [],
1121
+ "retry": {
1122
+ "max": 2,
1123
+ "when": [
1124
+ "runner_system_failure",
1125
+ "stuck_or_timeout_failure",
1126
+ ],
1127
+ },
1128
+ "script": [
1129
+ "echo '{"id":"some-id","time":"01-01-2023 12:13:14"}' > web/__build_info.json",
1130
+ "echo -e "\\e[0Ksection_start:$(date +%s):node install[collapsed=true]\\r\\e[0KEnsure node version"",
1131
+ "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
1132
+ "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
1133
+ "echo -e "\\e[0Ksection_end:$(date +%s):node install\\r\\e[0K"",
1134
+ "cd web",
1135
+ "echo -e "\\e[0Ksection_start:$(date +%s):yarn prepare[collapsed=true]\\r\\e[0KNode and yarn install"",
1136
+ "echo -e "\\e[0Ksection_start:$(date +%s):node install[collapsed=true]\\r\\e[0KEnsure node version"",
1137
+ "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
1138
+ "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
1139
+ "echo -e "\\e[0Ksection_end:$(date +%s):node install\\r\\e[0K"",
1140
+ "yarn install --immutable",
1141
+ "echo -e "\\e[0Ksection_end:$(date +%s):yarn prepare\\r\\e[0K"",
1142
+ "echo "add healthcheck package"",
1143
+ "meteor add panter:healthroute --allow-superuser",
1144
+ "meteor add qualia:prod-shell --allow-superuser",
1145
+ "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",
1146
+ "cp ./__build_info.json ./dist/bundle/programs/server",
1147
+ ],
1148
+ "stage": "build",
1149
+ "variables": {
1150
+ "APP_DIR": "web",
1151
+ "BUILD_INFO_BUILD_TIME": "01-01-2023 12:13:14",
1152
+ "BUILD_INFO_CURRENT_VERSION": "3.2.1",
1153
+ "BUILD_INFO_ID": "some-id",
1154
+ "ENV_SHORT": "prod",
1155
+ "ENV_TYPE": "prod",
1156
+ "GCLOUD_DEPLOY_credentialsKey": "$CL_prod_web_GCLOUD_DEPLOY_credentialsKey",
1157
+ "GCLOUD_RUN_canonicalHostSuffix": "$CL_prod_web_GCLOUD_RUN_canonicalHostSuffix",
1158
+ "HOST": "pan-test-app-prod-web-unknown-host.example.com",
1159
+ "HOST_CANONICAL": "pan-test-app-prod-web-unknown-host.example.com",
1160
+ "KUBERNETES_CPU_LIMIT": "2",
1161
+ "KUBERNETES_CPU_REQUEST": "0.5",
1162
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
1163
+ "KUBERNETES_MEMORY_REQUEST": "1Gi",
1164
+ "METEOR_DISABLE_OPTIMISTIC_CACHING": "1",
1165
+ "ROOT_URL": "https://pan-test-app-prod-web-unknown-host.example.com",
1166
+ "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_CANONICAL","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]",
1167
+ },
1168
+ },
1169
+ "web 🔨 app | stage ": {
1170
+ "artifacts": {
1171
+ "paths": [
1172
+ "web/__build_info.json",
1173
+ "web/dist",
1174
+ ],
1175
+ "reports": {
1176
+ "junit": undefined,
1177
+ },
1178
+ },
1179
+ "cache": [
1180
+ {
1181
+ "key": "web-yarn",
1182
+ "paths": [
1183
+ "web/.yarn",
1184
+ ],
1185
+ "policy": "pull-push",
1186
+ },
1187
+ {
1188
+ "key": "web-node-modules",
1189
+ "paths": [
1190
+ "web/node_modules",
1191
+ ],
1192
+ "policy": "pull-push",
1193
+ },
1194
+ {
1195
+ "key": "webmeteor-build-cache",
1196
+ "paths": [
1197
+ "web/.meteor/local/resolver-result-cache.json",
1198
+ "web/.meteor/local/plugin-cache",
1199
+ "web/.meteor/local/isopacks",
1200
+ "web/.meteor/local/bundler-cache/scanner",
1201
+ ],
1202
+ "policy": "pull-push",
1203
+ },
1204
+ ],
1205
+ "image": "path/to/docker/jobs-meteor:the-version",
1206
+ "interruptible": true,
1207
+ "needs": [],
1208
+ "retry": {
1209
+ "max": 2,
1210
+ "when": [
1211
+ "runner_system_failure",
1212
+ "stuck_or_timeout_failure",
1213
+ ],
1214
+ },
1215
+ "script": [
1216
+ "echo '{"id":"some-id","time":"01-01-2023 12:13:14"}' > web/__build_info.json",
1217
+ "echo -e "\\e[0Ksection_start:$(date +%s):node install[collapsed=true]\\r\\e[0KEnsure node version"",
1218
+ "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
1219
+ "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
1220
+ "echo -e "\\e[0Ksection_end:$(date +%s):node install\\r\\e[0K"",
1221
+ "cd web",
1222
+ "echo -e "\\e[0Ksection_start:$(date +%s):yarn prepare[collapsed=true]\\r\\e[0KNode and yarn install"",
1223
+ "echo -e "\\e[0Ksection_start:$(date +%s):node install[collapsed=true]\\r\\e[0KEnsure node version"",
1224
+ "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
1225
+ "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
1226
+ "echo -e "\\e[0Ksection_end:$(date +%s):node install\\r\\e[0K"",
1227
+ "yarn install --immutable",
1228
+ "echo -e "\\e[0Ksection_end:$(date +%s):yarn prepare\\r\\e[0K"",
1229
+ "echo "add healthcheck package"",
1230
+ "meteor add panter:healthroute --allow-superuser",
1231
+ "meteor add qualia:prod-shell --allow-superuser",
1232
+ "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",
1233
+ "cp ./__build_info.json ./dist/bundle/programs/server",
1234
+ ],
1235
+ "stage": "build",
1236
+ "variables": {
1237
+ "APP_DIR": "web",
1238
+ "BUILD_INFO_BUILD_TIME": "01-01-2023 12:13:14",
1239
+ "BUILD_INFO_CURRENT_VERSION": "3.2.1",
1240
+ "BUILD_INFO_ID": "some-id",
1241
+ "ENV_SHORT": "stage",
1242
+ "ENV_TYPE": "stage",
1243
+ "GCLOUD_DEPLOY_credentialsKey": "$CL_stage_web_GCLOUD_DEPLOY_credentialsKey",
1244
+ "GCLOUD_RUN_canonicalHostSuffix": "$CL_stage_web_GCLOUD_RUN_canonicalHostSuffix",
1245
+ "HOST": "pan-test-app-stage-web-unknown-host.example.com",
1246
+ "HOST_CANONICAL": "pan-test-app-stage-web-unknown-host.example.com",
1247
+ "KUBERNETES_CPU_LIMIT": "2",
1248
+ "KUBERNETES_CPU_REQUEST": "0.5",
1249
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
1250
+ "KUBERNETES_MEMORY_REQUEST": "1Gi",
1251
+ "METEOR_DISABLE_OPTIMISTIC_CACHING": "1",
1252
+ "ROOT_URL": "https://pan-test-app-stage-web-unknown-host.example.com",
1253
+ "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_CANONICAL","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]",
1254
+ },
1255
+ },
1256
+ "web 🔨 docker | prod ": {
1257
+ "image": "path/to/docker/docker-build:the-version",
1258
+ "interruptible": true,
1259
+ "needs": [
1260
+ "web 🔨 app | prod ",
1261
+ ],
1262
+ "retry": {
1263
+ "max": 2,
1264
+ "when": [
1265
+ "runner_system_failure",
1266
+ "stuck_or_timeout_failure",
1267
+ ],
1268
+ },
1269
+ "script": [
1270
+ "ensureMeteorDockerfile",
1271
+ "echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"",
1272
+ "echo $CL_prod_web_GCLOUD_DEPLOY_credentialsKey > ./____keyfile.json
1273
+ ",
1274
+ "gcloud auth activate-service-account --key-file="./____keyfile.json"",
1275
+ "gcloud auth configure-docker europe-west6-docker.pkg.dev",
1276
+ "echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"",
1277
+ "echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"",
1278
+ "docker build --network host --cache-from $DOCKER_CACHE_IMAGE --tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG -f $APP_DIR/Dockerfile . --build-arg BUILDKIT_INLINE_CACHE=1",
1279
+ "echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"",
1280
+ "echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"",
1281
+ "docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
1282
+ "docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE",
1283
+ "docker push $DOCKER_CACHE_IMAGE",
1284
+ "echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"",
1285
+ ],
1286
+ "services": [
1287
+ {
1288
+ "command": [
1289
+ "--tls=false",
1290
+ ],
1291
+ "name": "docker:24.0.6-dind",
1292
+ },
1293
+ ],
1294
+ "stage": "build",
1295
+ "variables": {
1296
+ "APP_DIR": "web",
1297
+ "DOCKERFILE_ADDITIONS": undefined,
1298
+ "DOCKERFILE_ADDITIONS_END": undefined,
1299
+ "DOCKER_BUILDKIT": "1",
1300
+ "DOCKER_CACHE_IMAGE": "europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/web",
1301
+ "DOCKER_DIR": ".",
1302
+ "DOCKER_DRIVER": "overlay2",
1303
+ "DOCKER_HOST": "tcp://0.0.0.0:2375",
1304
+ "DOCKER_IMAGE": "europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/prod/web",
1305
+ "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
1306
+ "DOCKER_REGISTRY": "europe-west6-docker.pkg.dev",
1307
+ "DOCKER_TLS_CERTDIR": "",
1308
+ "KUBERNETES_CPU_LIMIT": "1",
1309
+ "KUBERNETES_CPU_REQUEST": "0.5",
1310
+ "KUBERNETES_MEMORY_LIMIT": "2Gi",
1311
+ "KUBERNETES_MEMORY_REQUEST": "1Gi",
1312
+ "METEOR_INSTALL_SCRIPTS": "",
1313
+ },
1314
+ },
1315
+ "web 🔨 docker | stage ": {
1316
+ "image": "path/to/docker/docker-build:the-version",
1317
+ "interruptible": true,
1318
+ "needs": [
1319
+ "web 🔨 app | stage ",
1320
+ ],
1321
+ "retry": {
1322
+ "max": 2,
1323
+ "when": [
1324
+ "runner_system_failure",
1325
+ "stuck_or_timeout_failure",
1326
+ ],
1327
+ },
1328
+ "script": [
1329
+ "ensureMeteorDockerfile",
1330
+ "echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"",
1331
+ "echo $CL_stage_web_GCLOUD_DEPLOY_credentialsKey > ./____keyfile.json
1332
+ ",
1333
+ "gcloud auth activate-service-account --key-file="./____keyfile.json"",
1334
+ "gcloud auth configure-docker europe-west6-docker.pkg.dev",
1335
+ "echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"",
1336
+ "echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"",
1337
+ "docker build --network host --cache-from $DOCKER_CACHE_IMAGE --tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG -f $APP_DIR/Dockerfile . --build-arg BUILDKIT_INLINE_CACHE=1",
1338
+ "echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"",
1339
+ "echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"",
1340
+ "docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
1341
+ "docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE",
1342
+ "docker push $DOCKER_CACHE_IMAGE",
1343
+ "echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"",
1344
+ ],
1345
+ "services": [
1346
+ {
1347
+ "command": [
1348
+ "--tls=false",
1349
+ ],
1350
+ "name": "docker:24.0.6-dind",
1351
+ },
1352
+ ],
1353
+ "stage": "build",
1354
+ "variables": {
1355
+ "APP_DIR": "web",
1356
+ "DOCKERFILE_ADDITIONS": undefined,
1357
+ "DOCKERFILE_ADDITIONS_END": undefined,
1358
+ "DOCKER_BUILDKIT": "1",
1359
+ "DOCKER_CACHE_IMAGE": "europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/web",
1360
+ "DOCKER_DIR": ".",
1361
+ "DOCKER_DRIVER": "overlay2",
1362
+ "DOCKER_HOST": "tcp://0.0.0.0:2375",
1363
+ "DOCKER_IMAGE": "europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/stage/web",
1364
+ "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
1365
+ "DOCKER_REGISTRY": "europe-west6-docker.pkg.dev",
1366
+ "DOCKER_TLS_CERTDIR": "",
1367
+ "KUBERNETES_CPU_LIMIT": "1",
1368
+ "KUBERNETES_CPU_REQUEST": "0.5",
1369
+ "KUBERNETES_MEMORY_LIMIT": "2Gi",
1370
+ "KUBERNETES_MEMORY_REQUEST": "1Gi",
1371
+ "METEOR_INSTALL_SCRIPTS": "",
1372
+ },
1373
+ },
1374
+ "web 🚀 Deploy | prod ": {
1375
+ "allow_failure": true,
1376
+ "artifacts": {
1377
+ "paths": [
1378
+ "____envvars.yaml",
1379
+ ],
1380
+ },
1381
+ "environment": {
1382
+ "auto_stop_in": undefined,
1383
+ "name": "prod/web",
1384
+ "on_stop": "web 🛑 Stop ⚠️ | prod ",
1385
+ "url": "https://pan-test-app-prod-web-unknown-host.example.com",
1386
+ },
1387
+ "image": "path/to/docker/gcloud:the-version",
1388
+ "interruptible": true,
1389
+ "needs": [
1390
+ {
1391
+ "artifacts": false,
1392
+ "job": "web 🔨 app | prod ",
1393
+ },
1394
+ {
1395
+ "artifacts": false,
1396
+ "job": "web 🔨 docker | prod ",
1397
+ },
1398
+ {
1399
+ "artifacts": true,
1400
+ "job": "web 🧾 sbom | prod ",
1401
+ },
1402
+ ],
1403
+ "retry": {
1404
+ "max": 2,
1405
+ "when": [
1406
+ "runner_system_failure",
1407
+ "stuck_or_timeout_failure",
1408
+ ],
1409
+ },
1410
+ "rules": [
1411
+ {
1412
+ "when": "manual",
1413
+ },
1414
+ ],
1415
+ "script": [
1416
+ "echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."",
1417
+ "echo $CL_prod_web_GCLOUD_DEPLOY_credentialsKey > ./____keyfile.json
1418
+ ",
1419
+ "gcloud auth activate-service-account --key-file="./____keyfile.json"",
1420
+ "export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe google-project-id --format="value(projectNumber)")",
1421
+ "echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"",
1422
+ "echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"",
1423
+ "echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"",
1424
+ "echo "$ENV_VARS" > ____envvars.yaml",
1425
+ "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 --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost",
1426
+ "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 --env-vars-file=____envvars.yaml --min-instances=1 --max-instances=1 --no-cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost",
1427
+ "echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"",
1428
+ "echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"",
1429
+ "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",
1430
+ "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",
1431
+ "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",
1432
+ "echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"",
1433
+ "echo Uploading SBOM to Dependency Track",
1434
+ "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/web" "https://pan-test-app-prod-web-unknown-host.example.com" "__sbom.json" vex.json || true",
1435
+ ],
1436
+ "services": [
1437
+ {
1438
+ "command": [
1439
+ "--tls=false",
1440
+ ],
1441
+ "name": "docker:24.0.6-dind",
1442
+ },
1443
+ ],
1444
+ "stage": "deploy prod",
1445
+ "variables": {
1446
+ "APP_DIR": "web",
1447
+ "BUILD_INFO_BUILD_TIME": "01-01-2023 12:13:14",
1448
+ "BUILD_INFO_CURRENT_VERSION": "3.2.1",
1449
+ "BUILD_INFO_ID": "some-id",
1450
+ "CLOUDSDK_CORE_DISABLE_PROMPTS": "1",
1451
+ "DOCKER_BUILDKIT": "1",
1452
+ "DOCKER_CACHE_IMAGE": "europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/web",
1453
+ "DOCKER_DRIVER": "overlay2",
1454
+ "DOCKER_HOST": "tcp://0.0.0.0:2375",
1455
+ "DOCKER_IMAGE": "europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/prod/web",
1456
+ "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
1457
+ "DOCKER_REGISTRY": "europe-west6-docker.pkg.dev",
1458
+ "DOCKER_TLS_CERTDIR": "",
1459
+ "ENV_SHORT": "prod",
1460
+ "ENV_TYPE": "prod",
1461
+ "ENV_VARS": "ENV_SHORT: 'prod'
1462
+ APP_DIR: 'web'
1463
+ ENV_TYPE: 'prod'
1464
+ BUILD_INFO_ID: 'some-id'
1465
+ BUILD_INFO_BUILD_TIME: '01-01-2023 12:13:14'
1466
+ BUILD_INFO_CURRENT_VERSION: '3.2.1'
1467
+ HOST: 'pan-test-app-prod-web-unknown-host.example.com'
1468
+ ROOT_URL: 'https://pan-test-app-prod-web-unknown-host.example.com'
1469
+ HOST_CANONICAL: 'pan-test-app-prod-web-unknown-host.example.com'
1470
+ GCLOUD_RUN_canonicalHostSuffix: '$CL_prod_web_GCLOUD_RUN_canonicalHostSuffix'
1471
+ _ALL_ENV_VAR_KEYS: '["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_CANONICAL","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]'
1472
+ ",
1473
+ "GCLOUD_DEPLOY_credentialsKey": "$CL_prod_web_GCLOUD_DEPLOY_credentialsKey",
1474
+ "GCLOUD_RUN_canonicalHostSuffix": "$CL_prod_web_GCLOUD_RUN_canonicalHostSuffix",
1475
+ "HOST": "pan-test-app-prod-web-unknown-host.example.com",
1476
+ "HOST_CANONICAL": "pan-test-app-prod-web-unknown-host.example.com",
1477
+ "KUBERNETES_CPU_LIMIT": "1",
1478
+ "KUBERNETES_CPU_REQUEST": "0.5",
1479
+ "KUBERNETES_MEMORY_LIMIT": "400Mi",
1480
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
1481
+ "ROOT_URL": "https://pan-test-app-prod-web-unknown-host.example.com",
1482
+ "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_CANONICAL","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]",
1483
+ },
1484
+ },
1485
+ "web 🚀 Deploy | stage ": {
1486
+ "allow_failure": false,
1487
+ "artifacts": {
1488
+ "paths": [
1489
+ "____envvars.yaml",
1490
+ ],
1491
+ },
1492
+ "environment": {
1493
+ "auto_stop_in": undefined,
1494
+ "name": "stage/web",
1495
+ "on_stop": "web 🛑 Stop ⚠️ | stage ",
1496
+ "url": "https://pan-test-app-stage-web-unknown-host.example.com",
1497
+ },
1498
+ "image": "path/to/docker/gcloud:the-version",
1499
+ "interruptible": true,
1500
+ "needs": [
1501
+ {
1502
+ "artifacts": false,
1503
+ "job": "web 🔨 app | stage ",
1504
+ },
1505
+ {
1506
+ "artifacts": false,
1507
+ "job": "web 🔨 docker | stage ",
1508
+ },
1509
+ {
1510
+ "artifacts": true,
1511
+ "job": "web 🧾 sbom | stage ",
1512
+ },
1513
+ ],
1514
+ "retry": {
1515
+ "max": 2,
1516
+ "when": [
1517
+ "runner_system_failure",
1518
+ "stuck_or_timeout_failure",
1519
+ ],
1520
+ },
1521
+ "rules": [
1522
+ {
1523
+ "when": "on_success",
1524
+ },
1525
+ ],
1526
+ "script": [
1527
+ "echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."",
1528
+ "echo $CL_stage_web_GCLOUD_DEPLOY_credentialsKey > ./____keyfile.json
1529
+ ",
1530
+ "gcloud auth activate-service-account --key-file="./____keyfile.json"",
1531
+ "export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe google-project-id --format="value(projectNumber)")",
1532
+ "echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"",
1533
+ "echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"",
1534
+ "echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"",
1535
+ "echo "$ENV_VARS" > ____envvars.yaml",
1536
+ "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 --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost",
1537
+ "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 --env-vars-file=____envvars.yaml --min-instances=1 --max-instances=1 --no-cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost",
1538
+ "echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"",
1539
+ "echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"",
1540
+ "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",
1541
+ "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",
1542
+ "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",
1543
+ "echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"",
1544
+ "echo Uploading SBOM to Dependency Track",
1545
+ "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/web" "https://pan-test-app-stage-web-unknown-host.example.com" "__sbom.json" vex.json || true",
1546
+ ],
1547
+ "services": [
1548
+ {
1549
+ "command": [
1550
+ "--tls=false",
1551
+ ],
1552
+ "name": "docker:24.0.6-dind",
1553
+ },
1554
+ ],
1555
+ "stage": "deploy stage",
1556
+ "variables": {
1557
+ "APP_DIR": "web",
1558
+ "BUILD_INFO_BUILD_TIME": "01-01-2023 12:13:14",
1559
+ "BUILD_INFO_CURRENT_VERSION": "3.2.1",
1560
+ "BUILD_INFO_ID": "some-id",
1561
+ "CLOUDSDK_CORE_DISABLE_PROMPTS": "1",
1562
+ "DOCKER_BUILDKIT": "1",
1563
+ "DOCKER_CACHE_IMAGE": "europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/web",
1564
+ "DOCKER_DRIVER": "overlay2",
1565
+ "DOCKER_HOST": "tcp://0.0.0.0:2375",
1566
+ "DOCKER_IMAGE": "europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/stage/web",
1567
+ "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
1568
+ "DOCKER_REGISTRY": "europe-west6-docker.pkg.dev",
1569
+ "DOCKER_TLS_CERTDIR": "",
1570
+ "ENV_SHORT": "stage",
1571
+ "ENV_TYPE": "stage",
1572
+ "ENV_VARS": "ENV_SHORT: 'stage'
1573
+ APP_DIR: 'web'
1574
+ ENV_TYPE: 'stage'
1575
+ BUILD_INFO_ID: 'some-id'
1576
+ BUILD_INFO_BUILD_TIME: '01-01-2023 12:13:14'
1577
+ BUILD_INFO_CURRENT_VERSION: '3.2.1'
1578
+ HOST: 'pan-test-app-stage-web-unknown-host.example.com'
1579
+ ROOT_URL: 'https://pan-test-app-stage-web-unknown-host.example.com'
1580
+ HOST_CANONICAL: 'pan-test-app-stage-web-unknown-host.example.com'
1581
+ GCLOUD_RUN_canonicalHostSuffix: '$CL_stage_web_GCLOUD_RUN_canonicalHostSuffix'
1582
+ _ALL_ENV_VAR_KEYS: '["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_CANONICAL","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]'
1583
+ ",
1584
+ "GCLOUD_DEPLOY_credentialsKey": "$CL_stage_web_GCLOUD_DEPLOY_credentialsKey",
1585
+ "GCLOUD_RUN_canonicalHostSuffix": "$CL_stage_web_GCLOUD_RUN_canonicalHostSuffix",
1586
+ "HOST": "pan-test-app-stage-web-unknown-host.example.com",
1587
+ "HOST_CANONICAL": "pan-test-app-stage-web-unknown-host.example.com",
1588
+ "KUBERNETES_CPU_LIMIT": "1",
1589
+ "KUBERNETES_CPU_REQUEST": "0.5",
1590
+ "KUBERNETES_MEMORY_LIMIT": "400Mi",
1591
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
1592
+ "ROOT_URL": "https://pan-test-app-stage-web-unknown-host.example.com",
1593
+ "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_CANONICAL","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]",
1594
+ },
1595
+ },
1596
+ "web 🛑 Stop ⚠️ | prod ": {
1597
+ "environment": {
1598
+ "action": "stop",
1599
+ "name": "prod/web",
1600
+ "url": "https://pan-test-app-prod-web-unknown-host.example.com",
1601
+ },
1602
+ "image": "path/to/docker/gcloud:the-version",
1603
+ "interruptible": true,
1604
+ "needs": [],
1605
+ "retry": {
1606
+ "max": 2,
1607
+ "when": [
1608
+ "runner_system_failure",
1609
+ "stuck_or_timeout_failure",
1610
+ ],
1611
+ },
1612
+ "rules": [
1613
+ {
1614
+ "allow_failure": true,
1615
+ "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/",
1616
+ "when": "on_success",
1617
+ },
1618
+ {
1619
+ "allow_failure": true,
1620
+ "when": "manual",
1621
+ },
1622
+ ],
1623
+ "script": [
1624
+ "set +e",
1625
+ "echo $CL_prod_web_GCLOUD_DEPLOY_credentialsKey > ./____keyfile.json
1626
+ ",
1627
+ "gcloud auth activate-service-account --key-file="./____keyfile.json"",
1628
+ "gcloud run services delete pan-test-app-prod-web --project=google-project-id --region=europe-west6",
1629
+ "gcloud run services delete pan-test-app-prod-web-worker --project=google-project-id --region=europe-west6",
1630
+ "gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/prod/web --quiet --delete-tags",
1631
+ "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",
1632
+ "echo Disabling component in Dependency Track",
1633
+ "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/web" "https://pan-test-app-prod-web-unknown-host.example.com" || true",
1634
+ "set -e",
1635
+ ],
1636
+ "stage": "stop prod",
1637
+ "variables": {
1638
+ "CLOUDSDK_CORE_DISABLE_PROMPTS": "1",
1639
+ "GIT_STRATEGY": "none",
1640
+ "KUBERNETES_CPU_LIMIT": "1",
1641
+ "KUBERNETES_CPU_REQUEST": "0.5",
1642
+ "KUBERNETES_MEMORY_LIMIT": "400Mi",
1643
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
1644
+ },
1645
+ },
1646
+ "web 🛑 Stop ⚠️ | stage ": {
1647
+ "environment": {
1648
+ "action": "stop",
1649
+ "name": "stage/web",
1650
+ "url": "https://pan-test-app-stage-web-unknown-host.example.com",
1651
+ },
1652
+ "image": "path/to/docker/gcloud:the-version",
1653
+ "interruptible": true,
1654
+ "needs": [],
1655
+ "retry": {
1656
+ "max": 2,
1657
+ "when": [
1658
+ "runner_system_failure",
1659
+ "stuck_or_timeout_failure",
1660
+ ],
1661
+ },
1662
+ "rules": [
1663
+ {
1664
+ "allow_failure": true,
1665
+ "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/",
1666
+ "when": "on_success",
1667
+ },
1668
+ {
1669
+ "allow_failure": true,
1670
+ "when": "manual",
1671
+ },
1672
+ ],
1673
+ "script": [
1674
+ "set +e",
1675
+ "echo $CL_stage_web_GCLOUD_DEPLOY_credentialsKey > ./____keyfile.json
1676
+ ",
1677
+ "gcloud auth activate-service-account --key-file="./____keyfile.json"",
1678
+ "gcloud run services delete pan-test-app-stage-web --project=google-project-id --region=europe-west6",
1679
+ "gcloud run services delete pan-test-app-stage-web-worker --project=google-project-id --region=europe-west6",
1680
+ "gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/stage/web --quiet --delete-tags",
1681
+ "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",
1682
+ "echo Disabling component in Dependency Track",
1683
+ "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/web" "https://pan-test-app-stage-web-unknown-host.example.com" || true",
1684
+ "set -e",
1685
+ ],
1686
+ "stage": "stop stage",
1687
+ "variables": {
1688
+ "CLOUDSDK_CORE_DISABLE_PROMPTS": "1",
1689
+ "GIT_STRATEGY": "none",
1690
+ "KUBERNETES_CPU_LIMIT": "1",
1691
+ "KUBERNETES_CPU_REQUEST": "0.5",
1692
+ "KUBERNETES_MEMORY_LIMIT": "400Mi",
1693
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
1694
+ },
1695
+ },
1696
+ "web 🧾 sbom | prod ": {
1697
+ "allow_failure": true,
1698
+ "artifacts": {
1699
+ "paths": [
1700
+ "__sbom.json",
1701
+ ],
1702
+ },
1703
+ "image": "aquasec/trivy:0.38.3",
1704
+ "interruptible": true,
1705
+ "needs": [],
1706
+ "retry": {
1707
+ "max": 2,
1708
+ "when": [
1709
+ "runner_system_failure",
1710
+ "stuck_or_timeout_failure",
1711
+ ],
1712
+ },
1713
+ "script": [
1714
+ "trivy fs --quiet --format cyclonedx --output "__sbom.json" web",
1715
+ ],
1716
+ "stage": "build",
1717
+ "variables": {},
1718
+ },
1719
+ "web 🧾 sbom | stage ": {
1720
+ "allow_failure": true,
1721
+ "artifacts": {
1722
+ "paths": [
1723
+ "__sbom.json",
1724
+ ],
1725
+ },
1726
+ "image": "aquasec/trivy:0.38.3",
1727
+ "interruptible": true,
1728
+ "needs": [],
1729
+ "retry": {
1730
+ "max": 2,
1731
+ "when": [
1732
+ "runner_system_failure",
1733
+ "stuck_or_timeout_failure",
1734
+ ],
1735
+ },
1736
+ "script": [
1737
+ "trivy fs --quiet --format cyclonedx --output "__sbom.json" web",
1738
+ ],
1739
+ "stage": "build",
1740
+ "variables": {},
1741
+ },
1742
+ },
1743
+ "stages": [
1744
+ "setup",
1745
+ "setup dev",
1746
+ "setup review",
1747
+ "setup stage",
1748
+ "setup prod",
1749
+ "setup local",
1750
+ "test",
1751
+ "test dev",
1752
+ "test review",
1753
+ "test stage",
1754
+ "test prod",
1755
+ "test local",
1756
+ "build",
1757
+ "build dev",
1758
+ "build review",
1759
+ "build stage",
1760
+ "build prod",
1761
+ "build local",
1762
+ "deploy",
1763
+ "deploy dev",
1764
+ "deploy review",
1765
+ "deploy stage",
1766
+ "deploy prod",
1767
+ "deploy local",
1768
+ "verify",
1769
+ "verify dev",
1770
+ "verify review",
1771
+ "verify stage",
1772
+ "verify prod",
1773
+ "verify local",
1774
+ "rollback",
1775
+ "rollback dev",
1776
+ "rollback review",
1777
+ "rollback stage",
1778
+ "rollback prod",
1779
+ "rollback local",
1780
+ "stop",
1781
+ "stop dev",
1782
+ "stop review",
1783
+ "stop stage",
1784
+ "stop prod",
1785
+ "stop local",
1786
+ ],
1787
+ "variables": {
1788
+ "FF_USE_FASTZIP": "true",
1789
+ "GIT_DEPTH": 1,
1790
+ },
1791
+ "workflow": {
1792
+ "rules": [
1793
+ {
1794
+ "if": "$CI_COMMIT_TAG",
1795
+ },
1796
+ {
1797
+ "if": "$CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/",
1798
+ "when": "never",
1799
+ },
1800
+ {
1801
+ "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+.([0-9]+|x).x$/",
1802
+ },
1803
+ {
1804
+ "if": "$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH",
1805
+ },
1806
+ {
1807
+ "if": "$CI_MERGE_REQUEST_ID",
1808
+ },
1809
+ ],
1810
+ },
1811
+ },
1812
+ }
1813
+ `;