@catladder/pipeline 1.133.7 โ†’ 1.133.9

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