@catladder/pipeline 1.82.2 → 1.83.0

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,3116 @@
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
+ "api 👮 lint": {
9
+ "cache": [
10
+ {
11
+ "key": "api-yarn",
12
+ "paths": [
13
+ "api/.yarn",
14
+ ],
15
+ "policy": "pull-push",
16
+ },
17
+ {
18
+ "key": "api-node-modules",
19
+ "paths": [
20
+ "api/node_modules",
21
+ ],
22
+ "policy": "pull-push",
23
+ },
24
+ ],
25
+ "environment": undefined,
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 api",
37
+ "if [ -f ./.nvmrc ]; then source /root/.nvm/nvm.sh && nvm install <<< .nvmrc; fi",
38
+ "yarn install --immutable",
39
+ "yarn lint",
40
+ ],
41
+ "stage": "test",
42
+ "variables": {
43
+ "APP_PATH": "api",
44
+ "KUBERNETES_CPU_LIMIT": "2",
45
+ "KUBERNETES_CPU_REQUEST": "0.5",
46
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
47
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
48
+ },
49
+ },
50
+ "api 🔨 app | dev ": {
51
+ "artifacts": {
52
+ "paths": [
53
+ "api/__build_info.json",
54
+ "api/dist",
55
+ "api/.next",
56
+ ],
57
+ "reports": {
58
+ "junit": undefined,
59
+ },
60
+ },
61
+ "cache": [
62
+ {
63
+ "key": "api-yarn",
64
+ "paths": [
65
+ "api/.yarn",
66
+ ],
67
+ "policy": "pull-push",
68
+ },
69
+ {
70
+ "key": "api-node-modules",
71
+ "paths": [
72
+ "api/node_modules",
73
+ ],
74
+ "policy": "pull-push",
75
+ },
76
+ {
77
+ "key": "api-next-cache",
78
+ "paths": [
79
+ "api/.next/cache/",
80
+ ],
81
+ "policy": "pull-push",
82
+ },
83
+ ],
84
+ "environment": undefined,
85
+ "image": "path/to/docker/jobs-default:the-version",
86
+ "interruptible": true,
87
+ "needs": [],
88
+ "retry": {
89
+ "max": 2,
90
+ "when": [
91
+ "runner_system_failure",
92
+ "stuck_or_timeout_failure",
93
+ ],
94
+ },
95
+ "script": [
96
+ "echo '{"id":"some-id","time":"01-01-2023 12:13:14"}' > api/__build_info.json",
97
+ "if [ -f ./.nvmrc ]; then source /root/.nvm/nvm.sh && nvm install <<< .nvmrc; fi",
98
+ "cd api",
99
+ "if [ -f ./.nvmrc ]; then source /root/.nvm/nvm.sh && nvm install <<< .nvmrc; fi",
100
+ "yarn install --immutable",
101
+ "yarn build",
102
+ ],
103
+ "stage": "build",
104
+ "variables": {
105
+ "APP_DIR": "api",
106
+ "CLOUD_SQL_INSTANCE_CONNECTION_NAME": "projectId:region:instancename",
107
+ "DATABASE_JDBC_URL": "jdbc:postgresql:///$DB_NAME?cloudSqlInstance=$CLOUD_SQL_INSTANCE_CONNECTION_NAME&socketFactory=com.google.cloud.sql.postgres.SocketFactory&user=$DB_USER&password=$DB_PASSWORD",
108
+ "DATABASE_URL": "postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME",
109
+ "DB_NAME": "pan-test-app-dev-api",
110
+ "DB_PASSWORD": "$CL_dev_api_DB_PASSWORD",
111
+ "DB_USER": "my-user",
112
+ "ENV_SHORT": "dev",
113
+ "ENV_TYPE": "dev",
114
+ "GCLOUD_DEPLOY_credentialsKey": "$CL_dev_api_GCLOUD_DEPLOY_credentialsKey",
115
+ "HOST": "pan-test-app-dev-api-unknown-host.example.com",
116
+ "HOST_CANONICAL": "pan-test-app-dev-api-unknown-host.example.com",
117
+ "KUBERNETES_CPU_LIMIT": "2",
118
+ "KUBERNETES_CPU_REQUEST": "0.5",
119
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
120
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
121
+ "ROOT_URL": "https://pan-test-app-dev-api-unknown-host.example.com",
122
+ "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","HOST","ROOT_URL","HOST_CANONICAL","CLOUD_SQL_INSTANCE_CONNECTION_NAME","DB_NAME","DB_USER","DB_PASSWORD","DATABASE_URL","DATABASE_JDBC_URL","GCLOUD_DEPLOY_credentialsKey"]",
123
+ },
124
+ },
125
+ "api 🔨 docker | dev ": {
126
+ "cache": [
127
+ {
128
+ "key": "api-yarn",
129
+ "paths": [
130
+ "api/.yarn",
131
+ ],
132
+ "policy": "pull",
133
+ },
134
+ ],
135
+ "environment": undefined,
136
+ "image": "path/to/docker/docker-build:the-version",
137
+ "interruptible": true,
138
+ "needs": [
139
+ "api 🔨 app | dev ",
140
+ ],
141
+ "retry": {
142
+ "max": 2,
143
+ "when": [
144
+ "runner_system_failure",
145
+ "stuck_or_timeout_failure",
146
+ ],
147
+ },
148
+ "script": [
149
+ "ensureNodeDockerfile",
150
+ "docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY",
151
+ "docker version",
152
+ "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",
153
+ "docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
154
+ "docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE",
155
+ "docker push $DOCKER_CACHE_IMAGE",
156
+ ],
157
+ "services": [
158
+ {
159
+ "command": [
160
+ "--tls=false",
161
+ ],
162
+ "name": "docker:20-dind",
163
+ },
164
+ ],
165
+ "stage": "build",
166
+ "variables": {
167
+ "APP_DIR": "api",
168
+ "DOCKERFILE_ADDITIONS": undefined,
169
+ "DOCKERFILE_ADDITIONS_END": undefined,
170
+ "DOCKER_BUILDKIT": "1",
171
+ "DOCKER_CACHE_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/caches/api",
172
+ "DOCKER_COPY_WORKSPACE_FILES": "COPY --chown=node:node api/package.json /app/api/package.json
173
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock",
174
+ "DOCKER_DIR": ".",
175
+ "DOCKER_DRIVER": "overlay2",
176
+ "DOCKER_HOST": "tcp://0.0.0.0:2375",
177
+ "DOCKER_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/$DOCKER_IMAGE_NAME",
178
+ "DOCKER_IMAGE_NAME": "dev/api",
179
+ "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
180
+ "DOCKER_REGISTRY": "$CI_REGISTRY",
181
+ "DOCKER_REGISTRY_IMAGE_PATH": "$CI_REGISTRY_IMAGE",
182
+ "DOCKER_TLS_CERTDIR": "",
183
+ "KUBERNETES_CPU_LIMIT": "1",
184
+ "KUBERNETES_CPU_REQUEST": "0.5",
185
+ "KUBERNETES_MEMORY_LIMIT": "2Gi",
186
+ "KUBERNETES_MEMORY_REQUEST": "1Gi",
187
+ "YARN_INSTALL": "yarn plugin import workspace-tools && yarn workspaces focus --production && yarn rebuild",
188
+ "YARN_INSTALL_WITHOUT_SCRIPTS": "YARN_ENABLE_SCRIPTS=false yarn plugin import workspace-tools && yarn workspaces focus --production && yarn rebuild",
189
+ },
190
+ },
191
+ "api 🚀 Deploy | dev ": {
192
+ "allow_failure": false,
193
+ "artifacts": {
194
+ "paths": [
195
+ "____envvars.yaml",
196
+ ],
197
+ },
198
+ "environment": {
199
+ "auto_stop_in": "4 weeks",
200
+ "name": "dev/api",
201
+ "on_stop": "api 🛑 Stop ⚠️ | dev ",
202
+ "url": "https://pan-test-app-dev-api-unknown-host.example.com",
203
+ },
204
+ "image": "path/to/docker/gcloud:the-version",
205
+ "interruptible": true,
206
+ "needs": [
207
+ {
208
+ "artifacts": false,
209
+ "job": "api 👮 lint",
210
+ },
211
+ {
212
+ "artifacts": false,
213
+ "job": "api 🔨 app | dev ",
214
+ },
215
+ {
216
+ "artifacts": false,
217
+ "job": "api 🔨 docker | dev ",
218
+ },
219
+ {
220
+ "artifacts": false,
221
+ "job": "api 🧪 test",
222
+ },
223
+ {
224
+ "artifacts": false,
225
+ "job": "api 🛡 audit",
226
+ },
227
+ ],
228
+ "retry": {
229
+ "max": 2,
230
+ "when": [
231
+ "runner_system_failure",
232
+ "stuck_or_timeout_failure",
233
+ ],
234
+ },
235
+ "rules": [
236
+ {
237
+ "when": "on_success",
238
+ },
239
+ ],
240
+ "script": [
241
+ "echo $CL_dev_api_GCLOUD_DEPLOY_credentialsKey > ./____keyfile.json
242
+ ",
243
+ "gcloud auth activate-service-account --key-file="./____keyfile.json"",
244
+ "export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe google-project-id --format="value(projectNumber)")",
245
+ "echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"",
246
+ "docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY",
247
+ "gcloud auth configure-docker europe-west6-docker.pkg.dev",
248
+ "docker pull $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
249
+ "docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG",
250
+ "docker push europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG",
251
+ "echo "$ENV_VARS" > ____envvars.yaml",
252
+ "set +e",
253
+ "echo "ensuring Database..."",
254
+ "gcloud sql databases create pan-test-app-dev-api --instance=instancename --project projectId",
255
+ "set -e",
256
+ "gcloud run deploy pan-test-app-dev-api --command="yarn,start" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --set-cloudsql-instances=projectId:region:instancename --labels=customer-name=pan,app-name=test-app,env-type=dev,env-name=dev,build-type=node --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated",
257
+ "docker image rm europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG",
258
+ ],
259
+ "services": [
260
+ {
261
+ "command": [
262
+ "--tls=false",
263
+ ],
264
+ "name": "docker:20-dind",
265
+ },
266
+ ],
267
+ "stage": "deploy dev",
268
+ "variables": {
269
+ "APP_DIR": "api",
270
+ "CLOUDSDK_CORE_DISABLE_PROMPTS": "1",
271
+ "CLOUD_SQL_INSTANCE_CONNECTION_NAME": "projectId:region:instancename",
272
+ "DATABASE_JDBC_URL": "jdbc:postgresql:///$DB_NAME?cloudSqlInstance=$CLOUD_SQL_INSTANCE_CONNECTION_NAME&socketFactory=com.google.cloud.sql.postgres.SocketFactory&user=$DB_USER&password=$DB_PASSWORD",
273
+ "DATABASE_URL": "postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME",
274
+ "DB_NAME": "pan-test-app-dev-api",
275
+ "DB_PASSWORD": "$CL_dev_api_DB_PASSWORD",
276
+ "DB_USER": "my-user",
277
+ "DOCKERFILE_ADDITIONS": undefined,
278
+ "DOCKERFILE_ADDITIONS_END": undefined,
279
+ "DOCKER_BUILDKIT": "1",
280
+ "DOCKER_CACHE_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/caches/api",
281
+ "DOCKER_DIR": ".",
282
+ "DOCKER_DRIVER": "overlay2",
283
+ "DOCKER_HOST": "tcp://0.0.0.0:2375",
284
+ "DOCKER_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/$DOCKER_IMAGE_NAME",
285
+ "DOCKER_IMAGE_NAME": "dev/api",
286
+ "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
287
+ "DOCKER_REGISTRY": "$CI_REGISTRY",
288
+ "DOCKER_REGISTRY_IMAGE_PATH": "$CI_REGISTRY_IMAGE",
289
+ "DOCKER_TLS_CERTDIR": "",
290
+ "ENV_SHORT": "dev",
291
+ "ENV_TYPE": "dev",
292
+ "ENV_VARS": "ENV_SHORT: 'dev'
293
+ APP_DIR: 'api'
294
+ ENV_TYPE: 'dev'
295
+ HOST: 'pan-test-app-dev-api-unknown-host.example.com'
296
+ ROOT_URL: 'https://pan-test-app-dev-api-unknown-host.example.com'
297
+ HOST_CANONICAL: 'pan-test-app-dev-api-unknown-host.example.com'
298
+ CLOUD_SQL_INSTANCE_CONNECTION_NAME: 'projectId:region:instancename'
299
+ DB_NAME: 'pan-test-app-dev-api'
300
+ DB_USER: 'my-user'
301
+ DB_PASSWORD: '$CL_dev_api_DB_PASSWORD'
302
+ DATABASE_URL: 'postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME'
303
+ DATABASE_JDBC_URL: 'jdbc:postgresql:///$DB_NAME?cloudSqlInstance=$CLOUD_SQL_INSTANCE_CONNECTION_NAME&socketFactory=com.google.cloud.sql.postgres.SocketFactory&user=$DB_USER&password=$DB_PASSWORD'
304
+ _ALL_ENV_VAR_KEYS: '["ENV_SHORT","APP_DIR","ENV_TYPE","HOST","ROOT_URL","HOST_CANONICAL","CLOUD_SQL_INSTANCE_CONNECTION_NAME","DB_NAME","DB_USER","DB_PASSWORD","DATABASE_URL","DATABASE_JDBC_URL","GCLOUD_DEPLOY_credentialsKey"]'
305
+ ",
306
+ "GCLOUD_DEPLOY_credentialsKey": "$CL_dev_api_GCLOUD_DEPLOY_credentialsKey",
307
+ "HOST": "pan-test-app-dev-api-unknown-host.example.com",
308
+ "HOST_CANONICAL": "pan-test-app-dev-api-unknown-host.example.com",
309
+ "KUBERNETES_CPU_LIMIT": "1",
310
+ "KUBERNETES_CPU_REQUEST": "0.5",
311
+ "KUBERNETES_MEMORY_LIMIT": "2Gi",
312
+ "KUBERNETES_MEMORY_REQUEST": "1Gi",
313
+ "ROOT_URL": "https://pan-test-app-dev-api-unknown-host.example.com",
314
+ "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","HOST","ROOT_URL","HOST_CANONICAL","CLOUD_SQL_INSTANCE_CONNECTION_NAME","DB_NAME","DB_USER","DB_PASSWORD","DATABASE_URL","DATABASE_JDBC_URL","GCLOUD_DEPLOY_credentialsKey"]",
315
+ },
316
+ },
317
+ "api 🛑 Stop ⚠️ | dev ": {
318
+ "environment": {
319
+ "action": "stop",
320
+ "name": "dev/api",
321
+ "url": "https://pan-test-app-dev-api-unknown-host.example.com",
322
+ },
323
+ "image": "path/to/docker/gcloud:the-version",
324
+ "interruptible": true,
325
+ "needs": [],
326
+ "retry": {
327
+ "max": 2,
328
+ "when": [
329
+ "runner_system_failure",
330
+ "stuck_or_timeout_failure",
331
+ ],
332
+ },
333
+ "rules": [
334
+ {
335
+ "allow_failure": true,
336
+ "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/",
337
+ "when": "on_success",
338
+ },
339
+ {
340
+ "allow_failure": true,
341
+ "when": "manual",
342
+ },
343
+ ],
344
+ "script": [
345
+ "echo $CL_dev_api_GCLOUD_DEPLOY_credentialsKey > ./____keyfile.json
346
+ ",
347
+ "gcloud auth activate-service-account --key-file="./____keyfile.json"",
348
+ "gcloud run services delete pan-test-app-dev-api --project=google-project-id --region=europe-west6",
349
+ ],
350
+ "stage": "stop dev",
351
+ "variables": {
352
+ "CLOUDSDK_CORE_DISABLE_PROMPTS": "1",
353
+ "GIT_STRATEGY": "none",
354
+ "KUBERNETES_CPU_LIMIT": "1",
355
+ "KUBERNETES_CPU_REQUEST": "0.5",
356
+ "KUBERNETES_MEMORY_LIMIT": "500Mi",
357
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
358
+ },
359
+ },
360
+ "api 🛡 audit": {
361
+ "allow_failure": true,
362
+ "cache": undefined,
363
+ "environment": undefined,
364
+ "interruptible": true,
365
+ "needs": [],
366
+ "retry": {
367
+ "max": 2,
368
+ "when": [
369
+ "runner_system_failure",
370
+ "stuck_or_timeout_failure",
371
+ ],
372
+ },
373
+ "script": [
374
+ "cd api",
375
+ "yarn npm audit --environment production",
376
+ ],
377
+ "stage": "test",
378
+ "variables": {
379
+ "APP_PATH": "api",
380
+ "KUBERNETES_CPU_LIMIT": "2",
381
+ "KUBERNETES_CPU_REQUEST": "0.5",
382
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
383
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
384
+ },
385
+ },
386
+ "api 🧪 test": {
387
+ "cache": [
388
+ {
389
+ "key": "api-yarn",
390
+ "paths": [
391
+ "api/.yarn",
392
+ ],
393
+ "policy": "pull-push",
394
+ },
395
+ {
396
+ "key": "api-node-modules",
397
+ "paths": [
398
+ "api/node_modules",
399
+ ],
400
+ "policy": "pull-push",
401
+ },
402
+ ],
403
+ "environment": undefined,
404
+ "image": "path/to/docker/jobs-testing-chrome:the-version",
405
+ "interruptible": true,
406
+ "needs": [],
407
+ "retry": {
408
+ "max": 2,
409
+ "when": [
410
+ "runner_system_failure",
411
+ "stuck_or_timeout_failure",
412
+ ],
413
+ },
414
+ "script": [
415
+ "cd api",
416
+ "if [ -f ./.nvmrc ]; then source /root/.nvm/nvm.sh && nvm install <<< .nvmrc; fi",
417
+ "yarn install --immutable",
418
+ "yarn test",
419
+ ],
420
+ "stage": "test",
421
+ "variables": {
422
+ "APP_PATH": "api",
423
+ "KUBERNETES_CPU_LIMIT": "2",
424
+ "KUBERNETES_CPU_REQUEST": "0.5",
425
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
426
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
427
+ },
428
+ },
429
+ "worker 👮 lint": {
430
+ "cache": [
431
+ {
432
+ "key": "api-yarn",
433
+ "paths": [
434
+ "api/.yarn",
435
+ ],
436
+ "policy": "pull-push",
437
+ },
438
+ {
439
+ "key": "api-node-modules",
440
+ "paths": [
441
+ "api/node_modules",
442
+ ],
443
+ "policy": "pull-push",
444
+ },
445
+ ],
446
+ "environment": undefined,
447
+ "interruptible": true,
448
+ "needs": [],
449
+ "retry": {
450
+ "max": 2,
451
+ "when": [
452
+ "runner_system_failure",
453
+ "stuck_or_timeout_failure",
454
+ ],
455
+ },
456
+ "script": [
457
+ "cd api",
458
+ "if [ -f ./.nvmrc ]; then source /root/.nvm/nvm.sh && nvm install <<< .nvmrc; fi",
459
+ "yarn install --immutable",
460
+ "yarn lint",
461
+ ],
462
+ "stage": "test",
463
+ "variables": {
464
+ "APP_PATH": "api",
465
+ "KUBERNETES_CPU_LIMIT": "2",
466
+ "KUBERNETES_CPU_REQUEST": "0.5",
467
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
468
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
469
+ },
470
+ },
471
+ "worker 🔨 app | dev ": {
472
+ "artifacts": {
473
+ "paths": [
474
+ "api/__build_info.json",
475
+ "api/dist",
476
+ "api/.next",
477
+ ],
478
+ "reports": {
479
+ "junit": undefined,
480
+ },
481
+ },
482
+ "cache": [
483
+ {
484
+ "key": "api-yarn",
485
+ "paths": [
486
+ "api/.yarn",
487
+ ],
488
+ "policy": "pull-push",
489
+ },
490
+ {
491
+ "key": "api-node-modules",
492
+ "paths": [
493
+ "api/node_modules",
494
+ ],
495
+ "policy": "pull-push",
496
+ },
497
+ {
498
+ "key": "worker-next-cache",
499
+ "paths": [
500
+ "api/.next/cache/",
501
+ ],
502
+ "policy": "pull-push",
503
+ },
504
+ ],
505
+ "environment": undefined,
506
+ "image": "path/to/docker/jobs-default:the-version",
507
+ "interruptible": true,
508
+ "needs": [],
509
+ "retry": {
510
+ "max": 2,
511
+ "when": [
512
+ "runner_system_failure",
513
+ "stuck_or_timeout_failure",
514
+ ],
515
+ },
516
+ "script": [
517
+ "echo '{"id":"some-id","time":"01-01-2023 12:13:14"}' > api/__build_info.json",
518
+ "if [ -f ./.nvmrc ]; then source /root/.nvm/nvm.sh && nvm install <<< .nvmrc; fi",
519
+ "cd api",
520
+ "if [ -f ./.nvmrc ]; then source /root/.nvm/nvm.sh && nvm install <<< .nvmrc; fi",
521
+ "yarn install --immutable",
522
+ "yarn build:worker",
523
+ ],
524
+ "stage": "build",
525
+ "variables": {
526
+ "APP_DIR": "api",
527
+ "CLOUD_SQL_INSTANCE_CONNECTION_NAME": "projectId:region:instancename",
528
+ "DATABASE_JDBC_URL": "jdbc:postgresql:///$DB_NAME?cloudSqlInstance=$CLOUD_SQL_INSTANCE_CONNECTION_NAME&socketFactory=com.google.cloud.sql.postgres.SocketFactory&user=$DB_USER&password=$DB_PASSWORD",
529
+ "DATABASE_URL": "postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME",
530
+ "DB_NAME": "pan-test-app-dev-api",
531
+ "DB_PASSWORD": "$CL_dev_api_DB_PASSWORD",
532
+ "DB_USER": "my-user",
533
+ "ENV_SHORT": "dev",
534
+ "ENV_TYPE": "dev",
535
+ "GCLOUD_DEPLOY_credentialsKey": "$CL_dev_worker_GCLOUD_DEPLOY_credentialsKey",
536
+ "HOST": "pan-test-app-dev-worker-unknown-host.example.com",
537
+ "HOST_CANONICAL": "pan-test-app-dev-worker-unknown-host.example.com",
538
+ "KUBERNETES_CPU_LIMIT": "2",
539
+ "KUBERNETES_CPU_REQUEST": "0.5",
540
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
541
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
542
+ "ROOT_URL": "https://pan-test-app-dev-worker-unknown-host.example.com",
543
+ "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","HOST","ROOT_URL","HOST_CANONICAL","CLOUD_SQL_INSTANCE_CONNECTION_NAME","DB_NAME","DB_USER","DB_PASSWORD","DATABASE_URL","DATABASE_JDBC_URL","GCLOUD_DEPLOY_credentialsKey"]",
544
+ },
545
+ },
546
+ "worker 🔨 docker | dev ": {
547
+ "cache": [
548
+ {
549
+ "key": "api-yarn",
550
+ "paths": [
551
+ "api/.yarn",
552
+ ],
553
+ "policy": "pull",
554
+ },
555
+ ],
556
+ "environment": undefined,
557
+ "image": "path/to/docker/docker-build:the-version",
558
+ "interruptible": true,
559
+ "needs": [
560
+ "worker 🔨 app | dev ",
561
+ ],
562
+ "retry": {
563
+ "max": 2,
564
+ "when": [
565
+ "runner_system_failure",
566
+ "stuck_or_timeout_failure",
567
+ ],
568
+ },
569
+ "script": [
570
+ "ensureNodeDockerfile",
571
+ "docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY",
572
+ "docker version",
573
+ "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",
574
+ "docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
575
+ "docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE",
576
+ "docker push $DOCKER_CACHE_IMAGE",
577
+ ],
578
+ "services": [
579
+ {
580
+ "command": [
581
+ "--tls=false",
582
+ ],
583
+ "name": "docker:20-dind",
584
+ },
585
+ ],
586
+ "stage": "build",
587
+ "variables": {
588
+ "APP_DIR": "api",
589
+ "DOCKERFILE_ADDITIONS": undefined,
590
+ "DOCKERFILE_ADDITIONS_END": undefined,
591
+ "DOCKER_BUILDKIT": "1",
592
+ "DOCKER_CACHE_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/caches/worker",
593
+ "DOCKER_COPY_WORKSPACE_FILES": "COPY --chown=node:node api/package.json /app/api/package.json
594
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock",
595
+ "DOCKER_DIR": ".",
596
+ "DOCKER_DRIVER": "overlay2",
597
+ "DOCKER_HOST": "tcp://0.0.0.0:2375",
598
+ "DOCKER_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/$DOCKER_IMAGE_NAME",
599
+ "DOCKER_IMAGE_NAME": "dev/worker",
600
+ "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
601
+ "DOCKER_REGISTRY": "$CI_REGISTRY",
602
+ "DOCKER_REGISTRY_IMAGE_PATH": "$CI_REGISTRY_IMAGE",
603
+ "DOCKER_TLS_CERTDIR": "",
604
+ "KUBERNETES_CPU_LIMIT": "1",
605
+ "KUBERNETES_CPU_REQUEST": "0.5",
606
+ "KUBERNETES_MEMORY_LIMIT": "2Gi",
607
+ "KUBERNETES_MEMORY_REQUEST": "1Gi",
608
+ "YARN_INSTALL": "yarn plugin import workspace-tools && yarn workspaces focus --production && yarn rebuild",
609
+ "YARN_INSTALL_WITHOUT_SCRIPTS": "YARN_ENABLE_SCRIPTS=false yarn plugin import workspace-tools && yarn workspaces focus --production && yarn rebuild",
610
+ },
611
+ },
612
+ "worker 🚀 Deploy | dev ": {
613
+ "allow_failure": false,
614
+ "artifacts": {
615
+ "paths": [
616
+ "____envvars.yaml",
617
+ ],
618
+ },
619
+ "environment": {
620
+ "auto_stop_in": "4 weeks",
621
+ "name": "dev/worker",
622
+ "on_stop": "worker 🛑 Stop ⚠️ | dev ",
623
+ "url": "https://pan-test-app-dev-worker-unknown-host.example.com",
624
+ },
625
+ "image": "path/to/docker/gcloud:the-version",
626
+ "interruptible": true,
627
+ "needs": [
628
+ {
629
+ "artifacts": false,
630
+ "job": "worker 👮 lint",
631
+ },
632
+ {
633
+ "artifacts": false,
634
+ "job": "worker 🔨 app | dev ",
635
+ },
636
+ {
637
+ "artifacts": false,
638
+ "job": "worker 🔨 docker | dev ",
639
+ },
640
+ {
641
+ "artifacts": false,
642
+ "job": "worker 🧪 test",
643
+ },
644
+ {
645
+ "artifacts": false,
646
+ "job": "worker 🛡 audit",
647
+ },
648
+ ],
649
+ "retry": {
650
+ "max": 2,
651
+ "when": [
652
+ "runner_system_failure",
653
+ "stuck_or_timeout_failure",
654
+ ],
655
+ },
656
+ "rules": [
657
+ {
658
+ "when": "on_success",
659
+ },
660
+ ],
661
+ "script": [
662
+ "echo $CL_dev_worker_GCLOUD_DEPLOY_credentialsKey > ./____keyfile.json
663
+ ",
664
+ "gcloud auth activate-service-account --key-file="./____keyfile.json"",
665
+ "export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe google-project-id --format="value(projectNumber)")",
666
+ "echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"",
667
+ "docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY",
668
+ "gcloud auth configure-docker europe-west6-docker.pkg.dev",
669
+ "docker pull $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
670
+ "docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG",
671
+ "docker push europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG",
672
+ "echo "$ENV_VARS" > ____envvars.yaml",
673
+ "set +e",
674
+ "echo "ensuring Database..."",
675
+ "gcloud sql databases create pan-test-app-dev-api --instance=instancename --project projectId",
676
+ "set -e",
677
+ "gcloud run deploy pan-test-app-dev-worker --command="yarn,start" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --set-cloudsql-instances=projectId:region:instancename --labels=customer-name=pan,app-name=test-app,env-type=dev,env-name=dev,build-type=node --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated",
678
+ "docker image rm europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG",
679
+ ],
680
+ "services": [
681
+ {
682
+ "command": [
683
+ "--tls=false",
684
+ ],
685
+ "name": "docker:20-dind",
686
+ },
687
+ ],
688
+ "stage": "deploy dev",
689
+ "variables": {
690
+ "APP_DIR": "api",
691
+ "CLOUDSDK_CORE_DISABLE_PROMPTS": "1",
692
+ "CLOUD_SQL_INSTANCE_CONNECTION_NAME": "projectId:region:instancename",
693
+ "DATABASE_JDBC_URL": "jdbc:postgresql:///$DB_NAME?cloudSqlInstance=$CLOUD_SQL_INSTANCE_CONNECTION_NAME&socketFactory=com.google.cloud.sql.postgres.SocketFactory&user=$DB_USER&password=$DB_PASSWORD",
694
+ "DATABASE_URL": "postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME",
695
+ "DB_NAME": "pan-test-app-dev-api",
696
+ "DB_PASSWORD": "$CL_dev_api_DB_PASSWORD",
697
+ "DB_USER": "my-user",
698
+ "DOCKERFILE_ADDITIONS": undefined,
699
+ "DOCKERFILE_ADDITIONS_END": undefined,
700
+ "DOCKER_BUILDKIT": "1",
701
+ "DOCKER_CACHE_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/caches/worker",
702
+ "DOCKER_DIR": ".",
703
+ "DOCKER_DRIVER": "overlay2",
704
+ "DOCKER_HOST": "tcp://0.0.0.0:2375",
705
+ "DOCKER_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/$DOCKER_IMAGE_NAME",
706
+ "DOCKER_IMAGE_NAME": "dev/worker",
707
+ "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
708
+ "DOCKER_REGISTRY": "$CI_REGISTRY",
709
+ "DOCKER_REGISTRY_IMAGE_PATH": "$CI_REGISTRY_IMAGE",
710
+ "DOCKER_TLS_CERTDIR": "",
711
+ "ENV_SHORT": "dev",
712
+ "ENV_TYPE": "dev",
713
+ "ENV_VARS": "ENV_SHORT: 'dev'
714
+ APP_DIR: 'api'
715
+ ENV_TYPE: 'dev'
716
+ HOST: 'pan-test-app-dev-worker-unknown-host.example.com'
717
+ ROOT_URL: 'https://pan-test-app-dev-worker-unknown-host.example.com'
718
+ HOST_CANONICAL: 'pan-test-app-dev-worker-unknown-host.example.com'
719
+ CLOUD_SQL_INSTANCE_CONNECTION_NAME: 'projectId:region:instancename'
720
+ DB_NAME: 'pan-test-app-dev-api'
721
+ DB_USER: 'my-user'
722
+ DB_PASSWORD: '$CL_dev_api_DB_PASSWORD'
723
+ DATABASE_URL: 'postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME'
724
+ DATABASE_JDBC_URL: 'jdbc:postgresql:///$DB_NAME?cloudSqlInstance=$CLOUD_SQL_INSTANCE_CONNECTION_NAME&socketFactory=com.google.cloud.sql.postgres.SocketFactory&user=$DB_USER&password=$DB_PASSWORD'
725
+ _ALL_ENV_VAR_KEYS: '["ENV_SHORT","APP_DIR","ENV_TYPE","HOST","ROOT_URL","HOST_CANONICAL","CLOUD_SQL_INSTANCE_CONNECTION_NAME","DB_NAME","DB_USER","DB_PASSWORD","DATABASE_URL","DATABASE_JDBC_URL","GCLOUD_DEPLOY_credentialsKey"]'
726
+ ",
727
+ "GCLOUD_DEPLOY_credentialsKey": "$CL_dev_worker_GCLOUD_DEPLOY_credentialsKey",
728
+ "HOST": "pan-test-app-dev-worker-unknown-host.example.com",
729
+ "HOST_CANONICAL": "pan-test-app-dev-worker-unknown-host.example.com",
730
+ "KUBERNETES_CPU_LIMIT": "1",
731
+ "KUBERNETES_CPU_REQUEST": "0.5",
732
+ "KUBERNETES_MEMORY_LIMIT": "2Gi",
733
+ "KUBERNETES_MEMORY_REQUEST": "1Gi",
734
+ "ROOT_URL": "https://pan-test-app-dev-worker-unknown-host.example.com",
735
+ "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","HOST","ROOT_URL","HOST_CANONICAL","CLOUD_SQL_INSTANCE_CONNECTION_NAME","DB_NAME","DB_USER","DB_PASSWORD","DATABASE_URL","DATABASE_JDBC_URL","GCLOUD_DEPLOY_credentialsKey"]",
736
+ },
737
+ },
738
+ "worker 🛑 Stop ⚠️ | dev ": {
739
+ "environment": {
740
+ "action": "stop",
741
+ "name": "dev/worker",
742
+ "url": "https://pan-test-app-dev-worker-unknown-host.example.com",
743
+ },
744
+ "image": "path/to/docker/gcloud:the-version",
745
+ "interruptible": true,
746
+ "needs": [],
747
+ "retry": {
748
+ "max": 2,
749
+ "when": [
750
+ "runner_system_failure",
751
+ "stuck_or_timeout_failure",
752
+ ],
753
+ },
754
+ "rules": [
755
+ {
756
+ "allow_failure": true,
757
+ "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/",
758
+ "when": "on_success",
759
+ },
760
+ {
761
+ "allow_failure": true,
762
+ "when": "manual",
763
+ },
764
+ ],
765
+ "script": [
766
+ "echo $CL_dev_worker_GCLOUD_DEPLOY_credentialsKey > ./____keyfile.json
767
+ ",
768
+ "gcloud auth activate-service-account --key-file="./____keyfile.json"",
769
+ "gcloud run services delete pan-test-app-dev-worker --project=google-project-id --region=europe-west6",
770
+ ],
771
+ "stage": "stop dev",
772
+ "variables": {
773
+ "CLOUDSDK_CORE_DISABLE_PROMPTS": "1",
774
+ "GIT_STRATEGY": "none",
775
+ "KUBERNETES_CPU_LIMIT": "1",
776
+ "KUBERNETES_CPU_REQUEST": "0.5",
777
+ "KUBERNETES_MEMORY_LIMIT": "500Mi",
778
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
779
+ },
780
+ },
781
+ "worker 🛡 audit": {
782
+ "allow_failure": true,
783
+ "cache": undefined,
784
+ "environment": undefined,
785
+ "interruptible": true,
786
+ "needs": [],
787
+ "retry": {
788
+ "max": 2,
789
+ "when": [
790
+ "runner_system_failure",
791
+ "stuck_or_timeout_failure",
792
+ ],
793
+ },
794
+ "script": [
795
+ "cd api",
796
+ "yarn npm audit --environment production",
797
+ ],
798
+ "stage": "test",
799
+ "variables": {
800
+ "APP_PATH": "api",
801
+ "KUBERNETES_CPU_LIMIT": "2",
802
+ "KUBERNETES_CPU_REQUEST": "0.5",
803
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
804
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
805
+ },
806
+ },
807
+ "worker 🧪 test": {
808
+ "cache": [
809
+ {
810
+ "key": "api-yarn",
811
+ "paths": [
812
+ "api/.yarn",
813
+ ],
814
+ "policy": "pull-push",
815
+ },
816
+ {
817
+ "key": "api-node-modules",
818
+ "paths": [
819
+ "api/node_modules",
820
+ ],
821
+ "policy": "pull-push",
822
+ },
823
+ ],
824
+ "environment": undefined,
825
+ "image": "path/to/docker/jobs-testing-chrome:the-version",
826
+ "interruptible": true,
827
+ "needs": [],
828
+ "retry": {
829
+ "max": 2,
830
+ "when": [
831
+ "runner_system_failure",
832
+ "stuck_or_timeout_failure",
833
+ ],
834
+ },
835
+ "script": [
836
+ "cd api",
837
+ "if [ -f ./.nvmrc ]; then source /root/.nvm/nvm.sh && nvm install <<< .nvmrc; fi",
838
+ "yarn install --immutable",
839
+ "yarn test",
840
+ ],
841
+ "stage": "test",
842
+ "variables": {
843
+ "APP_PATH": "api",
844
+ "KUBERNETES_CPU_LIMIT": "2",
845
+ "KUBERNETES_CPU_REQUEST": "0.5",
846
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
847
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
848
+ },
849
+ },
850
+ },
851
+ "stages": [
852
+ "setup",
853
+ "setup dev",
854
+ "setup review",
855
+ "setup stage",
856
+ "setup prod",
857
+ "setup local",
858
+ "test",
859
+ "test dev",
860
+ "test review",
861
+ "test stage",
862
+ "test prod",
863
+ "test local",
864
+ "build",
865
+ "build dev",
866
+ "build review",
867
+ "build stage",
868
+ "build prod",
869
+ "build local",
870
+ "deploy",
871
+ "deploy dev",
872
+ "deploy review",
873
+ "deploy stage",
874
+ "deploy prod",
875
+ "deploy local",
876
+ "verify",
877
+ "verify dev",
878
+ "verify review",
879
+ "verify stage",
880
+ "verify prod",
881
+ "verify local",
882
+ "rollback",
883
+ "rollback dev",
884
+ "rollback review",
885
+ "rollback stage",
886
+ "rollback prod",
887
+ "rollback local",
888
+ "stop",
889
+ "stop dev",
890
+ "stop review",
891
+ "stop stage",
892
+ "stop prod",
893
+ "stop local",
894
+ ],
895
+ "variables": {
896
+ "FF_USE_FASTZIP": "true",
897
+ },
898
+ "workflow": {
899
+ "rules": [
900
+ {
901
+ "if": "$CI_COMMIT_TAG",
902
+ },
903
+ {
904
+ "if": "$CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/",
905
+ "when": "never",
906
+ },
907
+ {
908
+ "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+.([0-9]+|x).x$/",
909
+ },
910
+ {
911
+ "if": "$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH",
912
+ },
913
+ {
914
+ "if": "$CI_MERGE_REQUEST_ID",
915
+ },
916
+ ],
917
+ },
918
+ },
919
+ "mr": {
920
+ "image": "path/to/docker/jobs-default:the-version",
921
+ "jobs": {
922
+ "api 👮 lint": {
923
+ "cache": [
924
+ {
925
+ "key": "api-yarn",
926
+ "paths": [
927
+ "api/.yarn",
928
+ ],
929
+ "policy": "pull-push",
930
+ },
931
+ {
932
+ "key": "api-node-modules",
933
+ "paths": [
934
+ "api/node_modules",
935
+ ],
936
+ "policy": "pull-push",
937
+ },
938
+ ],
939
+ "environment": undefined,
940
+ "interruptible": true,
941
+ "needs": [],
942
+ "retry": {
943
+ "max": 2,
944
+ "when": [
945
+ "runner_system_failure",
946
+ "stuck_or_timeout_failure",
947
+ ],
948
+ },
949
+ "script": [
950
+ "cd api",
951
+ "if [ -f ./.nvmrc ]; then source /root/.nvm/nvm.sh && nvm install <<< .nvmrc; fi",
952
+ "yarn install --immutable",
953
+ "yarn lint",
954
+ ],
955
+ "stage": "test",
956
+ "variables": {
957
+ "APP_PATH": "api",
958
+ "KUBERNETES_CPU_LIMIT": "2",
959
+ "KUBERNETES_CPU_REQUEST": "0.5",
960
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
961
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
962
+ },
963
+ },
964
+ "api 🔨 app | review ": {
965
+ "artifacts": {
966
+ "paths": [
967
+ "api/__build_info.json",
968
+ "api/dist",
969
+ "api/.next",
970
+ ],
971
+ "reports": {
972
+ "junit": undefined,
973
+ },
974
+ },
975
+ "cache": [
976
+ {
977
+ "key": "api-yarn",
978
+ "paths": [
979
+ "api/.yarn",
980
+ ],
981
+ "policy": "pull-push",
982
+ },
983
+ {
984
+ "key": "api-node-modules",
985
+ "paths": [
986
+ "api/node_modules",
987
+ ],
988
+ "policy": "pull-push",
989
+ },
990
+ {
991
+ "key": "api-next-cache",
992
+ "paths": [
993
+ "api/.next/cache/",
994
+ ],
995
+ "policy": "pull-push",
996
+ },
997
+ ],
998
+ "environment": undefined,
999
+ "image": "path/to/docker/jobs-default:the-version",
1000
+ "interruptible": true,
1001
+ "needs": [],
1002
+ "retry": {
1003
+ "max": 2,
1004
+ "when": [
1005
+ "runner_system_failure",
1006
+ "stuck_or_timeout_failure",
1007
+ ],
1008
+ },
1009
+ "script": [
1010
+ "echo '{"id":"some-id","time":"01-01-2023 12:13:14"}' > api/__build_info.json",
1011
+ "if [ -f ./.nvmrc ]; then source /root/.nvm/nvm.sh && nvm install <<< .nvmrc; fi",
1012
+ "cd api",
1013
+ "if [ -f ./.nvmrc ]; then source /root/.nvm/nvm.sh && nvm install <<< .nvmrc; fi",
1014
+ "yarn install --immutable",
1015
+ "yarn build",
1016
+ ],
1017
+ "stage": "build",
1018
+ "variables": {
1019
+ "APP_DIR": "api",
1020
+ "CLOUD_SQL_INSTANCE_CONNECTION_NAME": "projectId:region:instancename",
1021
+ "DATABASE_JDBC_URL": "jdbc:postgresql:///$DB_NAME?cloudSqlInstance=$CLOUD_SQL_INSTANCE_CONNECTION_NAME&socketFactory=com.google.cloud.sql.postgres.SocketFactory&user=$DB_USER&password=$DB_PASSWORD",
1022
+ "DATABASE_URL": "postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME",
1023
+ "DB_NAME": "pan-test-app-review-mr1234-api",
1024
+ "DB_PASSWORD": "$CL_review_api_DB_PASSWORD",
1025
+ "DB_USER": "my-user",
1026
+ "ENV_SHORT": "review",
1027
+ "ENV_TYPE": "review",
1028
+ "GCLOUD_DEPLOY_credentialsKey": "$CL_review_api_GCLOUD_DEPLOY_credentialsKey",
1029
+ "HOST": "pan-test-app-review-mr1234-api-unknown-host.example.com",
1030
+ "HOST_CANONICAL": "pan-test-app-review-mr1234-api-unknown-host.example.com",
1031
+ "KUBERNETES_CPU_LIMIT": "2",
1032
+ "KUBERNETES_CPU_REQUEST": "0.5",
1033
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
1034
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
1035
+ "ROOT_URL": "https://pan-test-app-review-mr1234-api-unknown-host.example.com",
1036
+ "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","HOST","ROOT_URL","HOST_CANONICAL","CLOUD_SQL_INSTANCE_CONNECTION_NAME","DB_NAME","DB_USER","DB_PASSWORD","DATABASE_URL","DATABASE_JDBC_URL","GCLOUD_DEPLOY_credentialsKey"]",
1037
+ },
1038
+ },
1039
+ "api 🔨 docker | review ": {
1040
+ "cache": [
1041
+ {
1042
+ "key": "api-yarn",
1043
+ "paths": [
1044
+ "api/.yarn",
1045
+ ],
1046
+ "policy": "pull",
1047
+ },
1048
+ ],
1049
+ "environment": undefined,
1050
+ "image": "path/to/docker/docker-build:the-version",
1051
+ "interruptible": true,
1052
+ "needs": [
1053
+ "api 🔨 app | review ",
1054
+ ],
1055
+ "retry": {
1056
+ "max": 2,
1057
+ "when": [
1058
+ "runner_system_failure",
1059
+ "stuck_or_timeout_failure",
1060
+ ],
1061
+ },
1062
+ "script": [
1063
+ "ensureNodeDockerfile",
1064
+ "docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY",
1065
+ "docker version",
1066
+ "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",
1067
+ "docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
1068
+ "docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE",
1069
+ "docker push $DOCKER_CACHE_IMAGE",
1070
+ ],
1071
+ "services": [
1072
+ {
1073
+ "command": [
1074
+ "--tls=false",
1075
+ ],
1076
+ "name": "docker:20-dind",
1077
+ },
1078
+ ],
1079
+ "stage": "build",
1080
+ "variables": {
1081
+ "APP_DIR": "api",
1082
+ "DOCKERFILE_ADDITIONS": undefined,
1083
+ "DOCKERFILE_ADDITIONS_END": undefined,
1084
+ "DOCKER_BUILDKIT": "1",
1085
+ "DOCKER_CACHE_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/caches/api",
1086
+ "DOCKER_COPY_WORKSPACE_FILES": "COPY --chown=node:node api/package.json /app/api/package.json
1087
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock",
1088
+ "DOCKER_DIR": ".",
1089
+ "DOCKER_DRIVER": "overlay2",
1090
+ "DOCKER_HOST": "tcp://0.0.0.0:2375",
1091
+ "DOCKER_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/$DOCKER_IMAGE_NAME",
1092
+ "DOCKER_IMAGE_NAME": "review/api",
1093
+ "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
1094
+ "DOCKER_REGISTRY": "$CI_REGISTRY",
1095
+ "DOCKER_REGISTRY_IMAGE_PATH": "$CI_REGISTRY_IMAGE",
1096
+ "DOCKER_TLS_CERTDIR": "",
1097
+ "KUBERNETES_CPU_LIMIT": "1",
1098
+ "KUBERNETES_CPU_REQUEST": "0.5",
1099
+ "KUBERNETES_MEMORY_LIMIT": "2Gi",
1100
+ "KUBERNETES_MEMORY_REQUEST": "1Gi",
1101
+ "YARN_INSTALL": "yarn plugin import workspace-tools && yarn workspaces focus --production && yarn rebuild",
1102
+ "YARN_INSTALL_WITHOUT_SCRIPTS": "YARN_ENABLE_SCRIPTS=false yarn plugin import workspace-tools && yarn workspaces focus --production && yarn rebuild",
1103
+ },
1104
+ },
1105
+ "api 🚀 Deploy | review ": {
1106
+ "allow_failure": false,
1107
+ "artifacts": {
1108
+ "paths": [
1109
+ "____envvars.yaml",
1110
+ ],
1111
+ },
1112
+ "environment": {
1113
+ "auto_stop_in": "2 week",
1114
+ "name": "review/some-commit/api",
1115
+ "on_stop": "api 🛑 Stop ⚠️ | review ",
1116
+ "url": "https://pan-test-app-review-mr1234-api-unknown-host.example.com",
1117
+ },
1118
+ "image": "path/to/docker/gcloud:the-version",
1119
+ "interruptible": true,
1120
+ "needs": [
1121
+ {
1122
+ "artifacts": false,
1123
+ "job": "api 👮 lint",
1124
+ },
1125
+ {
1126
+ "artifacts": false,
1127
+ "job": "api 🔨 app | review ",
1128
+ },
1129
+ {
1130
+ "artifacts": false,
1131
+ "job": "api 🔨 docker | review ",
1132
+ },
1133
+ {
1134
+ "artifacts": false,
1135
+ "job": "api 🧪 test",
1136
+ },
1137
+ {
1138
+ "artifacts": false,
1139
+ "job": "api 🛡 audit",
1140
+ },
1141
+ ],
1142
+ "retry": {
1143
+ "max": 2,
1144
+ "when": [
1145
+ "runner_system_failure",
1146
+ "stuck_or_timeout_failure",
1147
+ ],
1148
+ },
1149
+ "rules": [
1150
+ {
1151
+ "when": "on_success",
1152
+ },
1153
+ ],
1154
+ "script": [
1155
+ "echo $CL_review_api_GCLOUD_DEPLOY_credentialsKey > ./____keyfile.json
1156
+ ",
1157
+ "gcloud auth activate-service-account --key-file="./____keyfile.json"",
1158
+ "export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe google-project-id --format="value(projectNumber)")",
1159
+ "echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"",
1160
+ "docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY",
1161
+ "gcloud auth configure-docker europe-west6-docker.pkg.dev",
1162
+ "docker pull $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
1163
+ "docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG",
1164
+ "docker push europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG",
1165
+ "echo "$ENV_VARS" > ____envvars.yaml",
1166
+ "set +e",
1167
+ "echo "ensuring Database..."",
1168
+ "gcloud sql databases create pan-test-app-review-mr1234-api --instance=instancename --project projectId",
1169
+ "set -e",
1170
+ "gcloud run deploy pan-test-app-review-mr1234-api --command="yarn,start" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --set-cloudsql-instances=projectId:region:instancename --labels=customer-name=pan,app-name=test-app,env-type=review,env-name=review,build-type=node --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated",
1171
+ "docker image rm europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG",
1172
+ ],
1173
+ "services": [
1174
+ {
1175
+ "command": [
1176
+ "--tls=false",
1177
+ ],
1178
+ "name": "docker:20-dind",
1179
+ },
1180
+ ],
1181
+ "stage": "deploy review",
1182
+ "variables": {
1183
+ "APP_DIR": "api",
1184
+ "CLOUDSDK_CORE_DISABLE_PROMPTS": "1",
1185
+ "CLOUD_SQL_INSTANCE_CONNECTION_NAME": "projectId:region:instancename",
1186
+ "DATABASE_JDBC_URL": "jdbc:postgresql:///$DB_NAME?cloudSqlInstance=$CLOUD_SQL_INSTANCE_CONNECTION_NAME&socketFactory=com.google.cloud.sql.postgres.SocketFactory&user=$DB_USER&password=$DB_PASSWORD",
1187
+ "DATABASE_URL": "postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME",
1188
+ "DB_NAME": "pan-test-app-review-mr1234-api",
1189
+ "DB_PASSWORD": "$CL_review_api_DB_PASSWORD",
1190
+ "DB_USER": "my-user",
1191
+ "DOCKERFILE_ADDITIONS": undefined,
1192
+ "DOCKERFILE_ADDITIONS_END": undefined,
1193
+ "DOCKER_BUILDKIT": "1",
1194
+ "DOCKER_CACHE_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/caches/api",
1195
+ "DOCKER_DIR": ".",
1196
+ "DOCKER_DRIVER": "overlay2",
1197
+ "DOCKER_HOST": "tcp://0.0.0.0:2375",
1198
+ "DOCKER_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/$DOCKER_IMAGE_NAME",
1199
+ "DOCKER_IMAGE_NAME": "review/api",
1200
+ "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
1201
+ "DOCKER_REGISTRY": "$CI_REGISTRY",
1202
+ "DOCKER_REGISTRY_IMAGE_PATH": "$CI_REGISTRY_IMAGE",
1203
+ "DOCKER_TLS_CERTDIR": "",
1204
+ "ENV_SHORT": "review",
1205
+ "ENV_TYPE": "review",
1206
+ "ENV_VARS": "ENV_SHORT: 'review'
1207
+ APP_DIR: 'api'
1208
+ ENV_TYPE: 'review'
1209
+ HOST: 'pan-test-app-review-mr1234-api-unknown-host.example.com'
1210
+ ROOT_URL: 'https://pan-test-app-review-mr1234-api-unknown-host.example.com'
1211
+ HOST_CANONICAL: 'pan-test-app-review-mr1234-api-unknown-host.example.com'
1212
+ CLOUD_SQL_INSTANCE_CONNECTION_NAME: 'projectId:region:instancename'
1213
+ DB_NAME: 'pan-test-app-review-mr1234-api'
1214
+ DB_USER: 'my-user'
1215
+ DB_PASSWORD: '$CL_review_api_DB_PASSWORD'
1216
+ DATABASE_URL: 'postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME'
1217
+ DATABASE_JDBC_URL: 'jdbc:postgresql:///$DB_NAME?cloudSqlInstance=$CLOUD_SQL_INSTANCE_CONNECTION_NAME&socketFactory=com.google.cloud.sql.postgres.SocketFactory&user=$DB_USER&password=$DB_PASSWORD'
1218
+ _ALL_ENV_VAR_KEYS: '["ENV_SHORT","APP_DIR","ENV_TYPE","HOST","ROOT_URL","HOST_CANONICAL","CLOUD_SQL_INSTANCE_CONNECTION_NAME","DB_NAME","DB_USER","DB_PASSWORD","DATABASE_URL","DATABASE_JDBC_URL","GCLOUD_DEPLOY_credentialsKey"]'
1219
+ ",
1220
+ "GCLOUD_DEPLOY_credentialsKey": "$CL_review_api_GCLOUD_DEPLOY_credentialsKey",
1221
+ "HOST": "pan-test-app-review-mr1234-api-unknown-host.example.com",
1222
+ "HOST_CANONICAL": "pan-test-app-review-mr1234-api-unknown-host.example.com",
1223
+ "KUBERNETES_CPU_LIMIT": "1",
1224
+ "KUBERNETES_CPU_REQUEST": "0.5",
1225
+ "KUBERNETES_MEMORY_LIMIT": "2Gi",
1226
+ "KUBERNETES_MEMORY_REQUEST": "1Gi",
1227
+ "ROOT_URL": "https://pan-test-app-review-mr1234-api-unknown-host.example.com",
1228
+ "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","HOST","ROOT_URL","HOST_CANONICAL","CLOUD_SQL_INSTANCE_CONNECTION_NAME","DB_NAME","DB_USER","DB_PASSWORD","DATABASE_URL","DATABASE_JDBC_URL","GCLOUD_DEPLOY_credentialsKey"]",
1229
+ },
1230
+ },
1231
+ "api 🛑 Stop ⚠️ | review ": {
1232
+ "environment": {
1233
+ "action": "stop",
1234
+ "name": "review/some-commit/api",
1235
+ "url": "https://pan-test-app-review-mr1234-api-unknown-host.example.com",
1236
+ },
1237
+ "image": "path/to/docker/gcloud:the-version",
1238
+ "interruptible": true,
1239
+ "needs": [],
1240
+ "retry": {
1241
+ "max": 2,
1242
+ "when": [
1243
+ "runner_system_failure",
1244
+ "stuck_or_timeout_failure",
1245
+ ],
1246
+ },
1247
+ "rules": [
1248
+ {
1249
+ "allow_failure": true,
1250
+ "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/",
1251
+ "when": "on_success",
1252
+ },
1253
+ {
1254
+ "allow_failure": true,
1255
+ "when": "manual",
1256
+ },
1257
+ ],
1258
+ "script": [
1259
+ "echo $CL_review_api_GCLOUD_DEPLOY_credentialsKey > ./____keyfile.json
1260
+ ",
1261
+ "gcloud auth activate-service-account --key-file="./____keyfile.json"",
1262
+ "gcloud run services delete pan-test-app-review-mr1234-api --project=google-project-id --region=europe-west6",
1263
+ "echo "deleting database pan-test-app-review-mr1234-api..."",
1264
+ "echo "👆 this can take multiple attemps (3-5min), because google cloud run may still have a connection to the database after the cloud run service is shut down"",
1265
+ "
1266
+ until gcloud sql databases delete pan-test-app-review-mr1234-api --instance=instancename --project projectId &> /dev/null
1267
+ do
1268
+ echo "Trying again."
1269
+ sleep 10
1270
+ done
1271
+ ",
1272
+ ],
1273
+ "stage": "stop review",
1274
+ "variables": {
1275
+ "CLOUDSDK_CORE_DISABLE_PROMPTS": "1",
1276
+ "GIT_STRATEGY": "none",
1277
+ "KUBERNETES_CPU_LIMIT": "1",
1278
+ "KUBERNETES_CPU_REQUEST": "0.5",
1279
+ "KUBERNETES_MEMORY_LIMIT": "500Mi",
1280
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
1281
+ },
1282
+ },
1283
+ "api 🛡 audit": {
1284
+ "allow_failure": true,
1285
+ "cache": undefined,
1286
+ "environment": undefined,
1287
+ "interruptible": true,
1288
+ "needs": [],
1289
+ "retry": {
1290
+ "max": 2,
1291
+ "when": [
1292
+ "runner_system_failure",
1293
+ "stuck_or_timeout_failure",
1294
+ ],
1295
+ },
1296
+ "script": [
1297
+ "cd api",
1298
+ "yarn npm audit --environment production",
1299
+ ],
1300
+ "stage": "test",
1301
+ "variables": {
1302
+ "APP_PATH": "api",
1303
+ "KUBERNETES_CPU_LIMIT": "2",
1304
+ "KUBERNETES_CPU_REQUEST": "0.5",
1305
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
1306
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
1307
+ },
1308
+ },
1309
+ "api 🧪 test": {
1310
+ "cache": [
1311
+ {
1312
+ "key": "api-yarn",
1313
+ "paths": [
1314
+ "api/.yarn",
1315
+ ],
1316
+ "policy": "pull-push",
1317
+ },
1318
+ {
1319
+ "key": "api-node-modules",
1320
+ "paths": [
1321
+ "api/node_modules",
1322
+ ],
1323
+ "policy": "pull-push",
1324
+ },
1325
+ ],
1326
+ "environment": undefined,
1327
+ "image": "path/to/docker/jobs-testing-chrome:the-version",
1328
+ "interruptible": true,
1329
+ "needs": [],
1330
+ "retry": {
1331
+ "max": 2,
1332
+ "when": [
1333
+ "runner_system_failure",
1334
+ "stuck_or_timeout_failure",
1335
+ ],
1336
+ },
1337
+ "script": [
1338
+ "cd api",
1339
+ "if [ -f ./.nvmrc ]; then source /root/.nvm/nvm.sh && nvm install <<< .nvmrc; fi",
1340
+ "yarn install --immutable",
1341
+ "yarn test",
1342
+ ],
1343
+ "stage": "test",
1344
+ "variables": {
1345
+ "APP_PATH": "api",
1346
+ "KUBERNETES_CPU_LIMIT": "2",
1347
+ "KUBERNETES_CPU_REQUEST": "0.5",
1348
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
1349
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
1350
+ },
1351
+ },
1352
+ "worker 👮 lint": {
1353
+ "cache": [
1354
+ {
1355
+ "key": "api-yarn",
1356
+ "paths": [
1357
+ "api/.yarn",
1358
+ ],
1359
+ "policy": "pull-push",
1360
+ },
1361
+ {
1362
+ "key": "api-node-modules",
1363
+ "paths": [
1364
+ "api/node_modules",
1365
+ ],
1366
+ "policy": "pull-push",
1367
+ },
1368
+ ],
1369
+ "environment": undefined,
1370
+ "interruptible": true,
1371
+ "needs": [],
1372
+ "retry": {
1373
+ "max": 2,
1374
+ "when": [
1375
+ "runner_system_failure",
1376
+ "stuck_or_timeout_failure",
1377
+ ],
1378
+ },
1379
+ "script": [
1380
+ "cd api",
1381
+ "if [ -f ./.nvmrc ]; then source /root/.nvm/nvm.sh && nvm install <<< .nvmrc; fi",
1382
+ "yarn install --immutable",
1383
+ "yarn lint",
1384
+ ],
1385
+ "stage": "test",
1386
+ "variables": {
1387
+ "APP_PATH": "api",
1388
+ "KUBERNETES_CPU_LIMIT": "2",
1389
+ "KUBERNETES_CPU_REQUEST": "0.5",
1390
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
1391
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
1392
+ },
1393
+ },
1394
+ "worker 🔨 app | review ": {
1395
+ "artifacts": {
1396
+ "paths": [
1397
+ "api/__build_info.json",
1398
+ "api/dist",
1399
+ "api/.next",
1400
+ ],
1401
+ "reports": {
1402
+ "junit": undefined,
1403
+ },
1404
+ },
1405
+ "cache": [
1406
+ {
1407
+ "key": "api-yarn",
1408
+ "paths": [
1409
+ "api/.yarn",
1410
+ ],
1411
+ "policy": "pull-push",
1412
+ },
1413
+ {
1414
+ "key": "api-node-modules",
1415
+ "paths": [
1416
+ "api/node_modules",
1417
+ ],
1418
+ "policy": "pull-push",
1419
+ },
1420
+ {
1421
+ "key": "worker-next-cache",
1422
+ "paths": [
1423
+ "api/.next/cache/",
1424
+ ],
1425
+ "policy": "pull-push",
1426
+ },
1427
+ ],
1428
+ "environment": undefined,
1429
+ "image": "path/to/docker/jobs-default:the-version",
1430
+ "interruptible": true,
1431
+ "needs": [],
1432
+ "retry": {
1433
+ "max": 2,
1434
+ "when": [
1435
+ "runner_system_failure",
1436
+ "stuck_or_timeout_failure",
1437
+ ],
1438
+ },
1439
+ "script": [
1440
+ "echo '{"id":"some-id","time":"01-01-2023 12:13:14"}' > api/__build_info.json",
1441
+ "if [ -f ./.nvmrc ]; then source /root/.nvm/nvm.sh && nvm install <<< .nvmrc; fi",
1442
+ "cd api",
1443
+ "if [ -f ./.nvmrc ]; then source /root/.nvm/nvm.sh && nvm install <<< .nvmrc; fi",
1444
+ "yarn install --immutable",
1445
+ "yarn build:worker",
1446
+ ],
1447
+ "stage": "build",
1448
+ "variables": {
1449
+ "APP_DIR": "api",
1450
+ "CLOUD_SQL_INSTANCE_CONNECTION_NAME": "projectId:region:instancename",
1451
+ "DATABASE_JDBC_URL": "jdbc:postgresql:///$DB_NAME?cloudSqlInstance=$CLOUD_SQL_INSTANCE_CONNECTION_NAME&socketFactory=com.google.cloud.sql.postgres.SocketFactory&user=$DB_USER&password=$DB_PASSWORD",
1452
+ "DATABASE_URL": "postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME",
1453
+ "DB_NAME": "pan-test-app-review-mr1234-api",
1454
+ "DB_PASSWORD": "$CL_review_api_DB_PASSWORD",
1455
+ "DB_USER": "my-user",
1456
+ "ENV_SHORT": "review",
1457
+ "ENV_TYPE": "review",
1458
+ "GCLOUD_DEPLOY_credentialsKey": "$CL_review_worker_GCLOUD_DEPLOY_credentialsKey",
1459
+ "HOST": "pan-test-app-review-mr1234-worker-unknown-host.example.com",
1460
+ "HOST_CANONICAL": "pan-test-app-review-mr1234-worker-unknown-host.example.com",
1461
+ "KUBERNETES_CPU_LIMIT": "2",
1462
+ "KUBERNETES_CPU_REQUEST": "0.5",
1463
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
1464
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
1465
+ "ROOT_URL": "https://pan-test-app-review-mr1234-worker-unknown-host.example.com",
1466
+ "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","HOST","ROOT_URL","HOST_CANONICAL","CLOUD_SQL_INSTANCE_CONNECTION_NAME","DB_NAME","DB_USER","DB_PASSWORD","DATABASE_URL","DATABASE_JDBC_URL","GCLOUD_DEPLOY_credentialsKey"]",
1467
+ },
1468
+ },
1469
+ "worker 🔨 docker | review ": {
1470
+ "cache": [
1471
+ {
1472
+ "key": "api-yarn",
1473
+ "paths": [
1474
+ "api/.yarn",
1475
+ ],
1476
+ "policy": "pull",
1477
+ },
1478
+ ],
1479
+ "environment": undefined,
1480
+ "image": "path/to/docker/docker-build:the-version",
1481
+ "interruptible": true,
1482
+ "needs": [
1483
+ "worker 🔨 app | review ",
1484
+ ],
1485
+ "retry": {
1486
+ "max": 2,
1487
+ "when": [
1488
+ "runner_system_failure",
1489
+ "stuck_or_timeout_failure",
1490
+ ],
1491
+ },
1492
+ "script": [
1493
+ "ensureNodeDockerfile",
1494
+ "docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY",
1495
+ "docker version",
1496
+ "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",
1497
+ "docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
1498
+ "docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE",
1499
+ "docker push $DOCKER_CACHE_IMAGE",
1500
+ ],
1501
+ "services": [
1502
+ {
1503
+ "command": [
1504
+ "--tls=false",
1505
+ ],
1506
+ "name": "docker:20-dind",
1507
+ },
1508
+ ],
1509
+ "stage": "build",
1510
+ "variables": {
1511
+ "APP_DIR": "api",
1512
+ "DOCKERFILE_ADDITIONS": undefined,
1513
+ "DOCKERFILE_ADDITIONS_END": undefined,
1514
+ "DOCKER_BUILDKIT": "1",
1515
+ "DOCKER_CACHE_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/caches/worker",
1516
+ "DOCKER_COPY_WORKSPACE_FILES": "COPY --chown=node:node api/package.json /app/api/package.json
1517
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock",
1518
+ "DOCKER_DIR": ".",
1519
+ "DOCKER_DRIVER": "overlay2",
1520
+ "DOCKER_HOST": "tcp://0.0.0.0:2375",
1521
+ "DOCKER_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/$DOCKER_IMAGE_NAME",
1522
+ "DOCKER_IMAGE_NAME": "review/worker",
1523
+ "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
1524
+ "DOCKER_REGISTRY": "$CI_REGISTRY",
1525
+ "DOCKER_REGISTRY_IMAGE_PATH": "$CI_REGISTRY_IMAGE",
1526
+ "DOCKER_TLS_CERTDIR": "",
1527
+ "KUBERNETES_CPU_LIMIT": "1",
1528
+ "KUBERNETES_CPU_REQUEST": "0.5",
1529
+ "KUBERNETES_MEMORY_LIMIT": "2Gi",
1530
+ "KUBERNETES_MEMORY_REQUEST": "1Gi",
1531
+ "YARN_INSTALL": "yarn plugin import workspace-tools && yarn workspaces focus --production && yarn rebuild",
1532
+ "YARN_INSTALL_WITHOUT_SCRIPTS": "YARN_ENABLE_SCRIPTS=false yarn plugin import workspace-tools && yarn workspaces focus --production && yarn rebuild",
1533
+ },
1534
+ },
1535
+ "worker 🚀 Deploy | review ": {
1536
+ "allow_failure": false,
1537
+ "artifacts": {
1538
+ "paths": [
1539
+ "____envvars.yaml",
1540
+ ],
1541
+ },
1542
+ "environment": {
1543
+ "auto_stop_in": "2 week",
1544
+ "name": "review/some-commit/worker",
1545
+ "on_stop": "worker 🛑 Stop ⚠️ | review ",
1546
+ "url": "https://pan-test-app-review-mr1234-worker-unknown-host.example.com",
1547
+ },
1548
+ "image": "path/to/docker/gcloud:the-version",
1549
+ "interruptible": true,
1550
+ "needs": [
1551
+ {
1552
+ "artifacts": false,
1553
+ "job": "worker 👮 lint",
1554
+ },
1555
+ {
1556
+ "artifacts": false,
1557
+ "job": "worker 🔨 app | review ",
1558
+ },
1559
+ {
1560
+ "artifacts": false,
1561
+ "job": "worker 🔨 docker | review ",
1562
+ },
1563
+ {
1564
+ "artifacts": false,
1565
+ "job": "worker 🧪 test",
1566
+ },
1567
+ {
1568
+ "artifacts": false,
1569
+ "job": "worker 🛡 audit",
1570
+ },
1571
+ ],
1572
+ "retry": {
1573
+ "max": 2,
1574
+ "when": [
1575
+ "runner_system_failure",
1576
+ "stuck_or_timeout_failure",
1577
+ ],
1578
+ },
1579
+ "rules": [
1580
+ {
1581
+ "when": "on_success",
1582
+ },
1583
+ ],
1584
+ "script": [
1585
+ "echo $CL_review_worker_GCLOUD_DEPLOY_credentialsKey > ./____keyfile.json
1586
+ ",
1587
+ "gcloud auth activate-service-account --key-file="./____keyfile.json"",
1588
+ "export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe google-project-id --format="value(projectNumber)")",
1589
+ "echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"",
1590
+ "docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY",
1591
+ "gcloud auth configure-docker europe-west6-docker.pkg.dev",
1592
+ "docker pull $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
1593
+ "docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG",
1594
+ "docker push europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG",
1595
+ "echo "$ENV_VARS" > ____envvars.yaml",
1596
+ "set +e",
1597
+ "echo "ensuring Database..."",
1598
+ "gcloud sql databases create pan-test-app-review-mr1234-api --instance=instancename --project projectId",
1599
+ "set -e",
1600
+ "gcloud run deploy pan-test-app-review-mr1234-worker --command="yarn,start" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --set-cloudsql-instances=projectId:region:instancename --labels=customer-name=pan,app-name=test-app,env-type=review,env-name=review,build-type=node --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated",
1601
+ "docker image rm europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG",
1602
+ ],
1603
+ "services": [
1604
+ {
1605
+ "command": [
1606
+ "--tls=false",
1607
+ ],
1608
+ "name": "docker:20-dind",
1609
+ },
1610
+ ],
1611
+ "stage": "deploy review",
1612
+ "variables": {
1613
+ "APP_DIR": "api",
1614
+ "CLOUDSDK_CORE_DISABLE_PROMPTS": "1",
1615
+ "CLOUD_SQL_INSTANCE_CONNECTION_NAME": "projectId:region:instancename",
1616
+ "DATABASE_JDBC_URL": "jdbc:postgresql:///$DB_NAME?cloudSqlInstance=$CLOUD_SQL_INSTANCE_CONNECTION_NAME&socketFactory=com.google.cloud.sql.postgres.SocketFactory&user=$DB_USER&password=$DB_PASSWORD",
1617
+ "DATABASE_URL": "postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME",
1618
+ "DB_NAME": "pan-test-app-review-mr1234-api",
1619
+ "DB_PASSWORD": "$CL_review_api_DB_PASSWORD",
1620
+ "DB_USER": "my-user",
1621
+ "DOCKERFILE_ADDITIONS": undefined,
1622
+ "DOCKERFILE_ADDITIONS_END": undefined,
1623
+ "DOCKER_BUILDKIT": "1",
1624
+ "DOCKER_CACHE_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/caches/worker",
1625
+ "DOCKER_DIR": ".",
1626
+ "DOCKER_DRIVER": "overlay2",
1627
+ "DOCKER_HOST": "tcp://0.0.0.0:2375",
1628
+ "DOCKER_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/$DOCKER_IMAGE_NAME",
1629
+ "DOCKER_IMAGE_NAME": "review/worker",
1630
+ "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
1631
+ "DOCKER_REGISTRY": "$CI_REGISTRY",
1632
+ "DOCKER_REGISTRY_IMAGE_PATH": "$CI_REGISTRY_IMAGE",
1633
+ "DOCKER_TLS_CERTDIR": "",
1634
+ "ENV_SHORT": "review",
1635
+ "ENV_TYPE": "review",
1636
+ "ENV_VARS": "ENV_SHORT: 'review'
1637
+ APP_DIR: 'api'
1638
+ ENV_TYPE: 'review'
1639
+ HOST: 'pan-test-app-review-mr1234-worker-unknown-host.example.com'
1640
+ ROOT_URL: 'https://pan-test-app-review-mr1234-worker-unknown-host.example.com'
1641
+ HOST_CANONICAL: 'pan-test-app-review-mr1234-worker-unknown-host.example.com'
1642
+ CLOUD_SQL_INSTANCE_CONNECTION_NAME: 'projectId:region:instancename'
1643
+ DB_NAME: 'pan-test-app-review-mr1234-api'
1644
+ DB_USER: 'my-user'
1645
+ DB_PASSWORD: '$CL_review_api_DB_PASSWORD'
1646
+ DATABASE_URL: 'postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME'
1647
+ DATABASE_JDBC_URL: 'jdbc:postgresql:///$DB_NAME?cloudSqlInstance=$CLOUD_SQL_INSTANCE_CONNECTION_NAME&socketFactory=com.google.cloud.sql.postgres.SocketFactory&user=$DB_USER&password=$DB_PASSWORD'
1648
+ _ALL_ENV_VAR_KEYS: '["ENV_SHORT","APP_DIR","ENV_TYPE","HOST","ROOT_URL","HOST_CANONICAL","CLOUD_SQL_INSTANCE_CONNECTION_NAME","DB_NAME","DB_USER","DB_PASSWORD","DATABASE_URL","DATABASE_JDBC_URL","GCLOUD_DEPLOY_credentialsKey"]'
1649
+ ",
1650
+ "GCLOUD_DEPLOY_credentialsKey": "$CL_review_worker_GCLOUD_DEPLOY_credentialsKey",
1651
+ "HOST": "pan-test-app-review-mr1234-worker-unknown-host.example.com",
1652
+ "HOST_CANONICAL": "pan-test-app-review-mr1234-worker-unknown-host.example.com",
1653
+ "KUBERNETES_CPU_LIMIT": "1",
1654
+ "KUBERNETES_CPU_REQUEST": "0.5",
1655
+ "KUBERNETES_MEMORY_LIMIT": "2Gi",
1656
+ "KUBERNETES_MEMORY_REQUEST": "1Gi",
1657
+ "ROOT_URL": "https://pan-test-app-review-mr1234-worker-unknown-host.example.com",
1658
+ "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","HOST","ROOT_URL","HOST_CANONICAL","CLOUD_SQL_INSTANCE_CONNECTION_NAME","DB_NAME","DB_USER","DB_PASSWORD","DATABASE_URL","DATABASE_JDBC_URL","GCLOUD_DEPLOY_credentialsKey"]",
1659
+ },
1660
+ },
1661
+ "worker 🛑 Stop ⚠️ | review ": {
1662
+ "environment": {
1663
+ "action": "stop",
1664
+ "name": "review/some-commit/worker",
1665
+ "url": "https://pan-test-app-review-mr1234-worker-unknown-host.example.com",
1666
+ },
1667
+ "image": "path/to/docker/gcloud:the-version",
1668
+ "interruptible": true,
1669
+ "needs": [],
1670
+ "retry": {
1671
+ "max": 2,
1672
+ "when": [
1673
+ "runner_system_failure",
1674
+ "stuck_or_timeout_failure",
1675
+ ],
1676
+ },
1677
+ "rules": [
1678
+ {
1679
+ "allow_failure": true,
1680
+ "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/",
1681
+ "when": "on_success",
1682
+ },
1683
+ {
1684
+ "allow_failure": true,
1685
+ "when": "manual",
1686
+ },
1687
+ ],
1688
+ "script": [
1689
+ "echo $CL_review_worker_GCLOUD_DEPLOY_credentialsKey > ./____keyfile.json
1690
+ ",
1691
+ "gcloud auth activate-service-account --key-file="./____keyfile.json"",
1692
+ "gcloud run services delete pan-test-app-review-mr1234-worker --project=google-project-id --region=europe-west6",
1693
+ "echo "deleting database pan-test-app-review-mr1234-api..."",
1694
+ "echo "👆 this can take multiple attemps (3-5min), because google cloud run may still have a connection to the database after the cloud run service is shut down"",
1695
+ "
1696
+ until gcloud sql databases delete pan-test-app-review-mr1234-api --instance=instancename --project projectId &> /dev/null
1697
+ do
1698
+ echo "Trying again."
1699
+ sleep 10
1700
+ done
1701
+ ",
1702
+ ],
1703
+ "stage": "stop review",
1704
+ "variables": {
1705
+ "CLOUDSDK_CORE_DISABLE_PROMPTS": "1",
1706
+ "GIT_STRATEGY": "none",
1707
+ "KUBERNETES_CPU_LIMIT": "1",
1708
+ "KUBERNETES_CPU_REQUEST": "0.5",
1709
+ "KUBERNETES_MEMORY_LIMIT": "500Mi",
1710
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
1711
+ },
1712
+ },
1713
+ "worker 🛡 audit": {
1714
+ "allow_failure": true,
1715
+ "cache": undefined,
1716
+ "environment": undefined,
1717
+ "interruptible": true,
1718
+ "needs": [],
1719
+ "retry": {
1720
+ "max": 2,
1721
+ "when": [
1722
+ "runner_system_failure",
1723
+ "stuck_or_timeout_failure",
1724
+ ],
1725
+ },
1726
+ "script": [
1727
+ "cd api",
1728
+ "yarn npm audit --environment production",
1729
+ ],
1730
+ "stage": "test",
1731
+ "variables": {
1732
+ "APP_PATH": "api",
1733
+ "KUBERNETES_CPU_LIMIT": "2",
1734
+ "KUBERNETES_CPU_REQUEST": "0.5",
1735
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
1736
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
1737
+ },
1738
+ },
1739
+ "worker 🧪 test": {
1740
+ "cache": [
1741
+ {
1742
+ "key": "api-yarn",
1743
+ "paths": [
1744
+ "api/.yarn",
1745
+ ],
1746
+ "policy": "pull-push",
1747
+ },
1748
+ {
1749
+ "key": "api-node-modules",
1750
+ "paths": [
1751
+ "api/node_modules",
1752
+ ],
1753
+ "policy": "pull-push",
1754
+ },
1755
+ ],
1756
+ "environment": undefined,
1757
+ "image": "path/to/docker/jobs-testing-chrome:the-version",
1758
+ "interruptible": true,
1759
+ "needs": [],
1760
+ "retry": {
1761
+ "max": 2,
1762
+ "when": [
1763
+ "runner_system_failure",
1764
+ "stuck_or_timeout_failure",
1765
+ ],
1766
+ },
1767
+ "script": [
1768
+ "cd api",
1769
+ "if [ -f ./.nvmrc ]; then source /root/.nvm/nvm.sh && nvm install <<< .nvmrc; fi",
1770
+ "yarn install --immutable",
1771
+ "yarn test",
1772
+ ],
1773
+ "stage": "test",
1774
+ "variables": {
1775
+ "APP_PATH": "api",
1776
+ "KUBERNETES_CPU_LIMIT": "2",
1777
+ "KUBERNETES_CPU_REQUEST": "0.5",
1778
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
1779
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
1780
+ },
1781
+ },
1782
+ },
1783
+ "stages": [
1784
+ "setup",
1785
+ "setup dev",
1786
+ "setup review",
1787
+ "setup stage",
1788
+ "setup prod",
1789
+ "setup local",
1790
+ "test",
1791
+ "test dev",
1792
+ "test review",
1793
+ "test stage",
1794
+ "test prod",
1795
+ "test local",
1796
+ "build",
1797
+ "build dev",
1798
+ "build review",
1799
+ "build stage",
1800
+ "build prod",
1801
+ "build local",
1802
+ "deploy",
1803
+ "deploy dev",
1804
+ "deploy review",
1805
+ "deploy stage",
1806
+ "deploy prod",
1807
+ "deploy local",
1808
+ "verify",
1809
+ "verify dev",
1810
+ "verify review",
1811
+ "verify stage",
1812
+ "verify prod",
1813
+ "verify local",
1814
+ "rollback",
1815
+ "rollback dev",
1816
+ "rollback review",
1817
+ "rollback stage",
1818
+ "rollback prod",
1819
+ "rollback local",
1820
+ "stop",
1821
+ "stop dev",
1822
+ "stop review",
1823
+ "stop stage",
1824
+ "stop prod",
1825
+ "stop local",
1826
+ ],
1827
+ "variables": {
1828
+ "FF_USE_FASTZIP": "true",
1829
+ },
1830
+ "workflow": {
1831
+ "rules": [
1832
+ {
1833
+ "if": "$CI_COMMIT_TAG",
1834
+ },
1835
+ {
1836
+ "if": "$CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/",
1837
+ "when": "never",
1838
+ },
1839
+ {
1840
+ "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+.([0-9]+|x).x$/",
1841
+ },
1842
+ {
1843
+ "if": "$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH",
1844
+ },
1845
+ {
1846
+ "if": "$CI_MERGE_REQUEST_ID",
1847
+ },
1848
+ ],
1849
+ },
1850
+ },
1851
+ "taggedRelease": {
1852
+ "image": "path/to/docker/jobs-default:the-version",
1853
+ "jobs": {
1854
+ "api 🔨 app | prod ": {
1855
+ "artifacts": {
1856
+ "paths": [
1857
+ "api/__build_info.json",
1858
+ "api/dist",
1859
+ "api/.next",
1860
+ ],
1861
+ "reports": {
1862
+ "junit": undefined,
1863
+ },
1864
+ },
1865
+ "cache": [
1866
+ {
1867
+ "key": "api-yarn",
1868
+ "paths": [
1869
+ "api/.yarn",
1870
+ ],
1871
+ "policy": "pull-push",
1872
+ },
1873
+ {
1874
+ "key": "api-node-modules",
1875
+ "paths": [
1876
+ "api/node_modules",
1877
+ ],
1878
+ "policy": "pull-push",
1879
+ },
1880
+ {
1881
+ "key": "api-next-cache",
1882
+ "paths": [
1883
+ "api/.next/cache/",
1884
+ ],
1885
+ "policy": "pull-push",
1886
+ },
1887
+ ],
1888
+ "environment": undefined,
1889
+ "image": "path/to/docker/jobs-default:the-version",
1890
+ "interruptible": true,
1891
+ "needs": [],
1892
+ "retry": {
1893
+ "max": 2,
1894
+ "when": [
1895
+ "runner_system_failure",
1896
+ "stuck_or_timeout_failure",
1897
+ ],
1898
+ },
1899
+ "script": [
1900
+ "echo '{"id":"some-id","time":"01-01-2023 12:13:14"}' > api/__build_info.json",
1901
+ "if [ -f ./.nvmrc ]; then source /root/.nvm/nvm.sh && nvm install <<< .nvmrc; fi",
1902
+ "cd api",
1903
+ "if [ -f ./.nvmrc ]; then source /root/.nvm/nvm.sh && nvm install <<< .nvmrc; fi",
1904
+ "yarn install --immutable",
1905
+ "yarn build",
1906
+ ],
1907
+ "stage": "build",
1908
+ "variables": {
1909
+ "APP_DIR": "api",
1910
+ "CLOUD_SQL_INSTANCE_CONNECTION_NAME": "projectId:region:instancename",
1911
+ "DATABASE_JDBC_URL": "jdbc:postgresql:///$DB_NAME?cloudSqlInstance=$CLOUD_SQL_INSTANCE_CONNECTION_NAME&socketFactory=com.google.cloud.sql.postgres.SocketFactory&user=$DB_USER&password=$DB_PASSWORD",
1912
+ "DATABASE_URL": "postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME",
1913
+ "DB_NAME": "pan-test-app-prod-api",
1914
+ "DB_PASSWORD": "$CL_prod_api_DB_PASSWORD",
1915
+ "DB_USER": "my-user",
1916
+ "ENV_SHORT": "prod",
1917
+ "ENV_TYPE": "prod",
1918
+ "GCLOUD_DEPLOY_credentialsKey": "$CL_prod_api_GCLOUD_DEPLOY_credentialsKey",
1919
+ "HOST": "pan-test-app-prod-api-unknown-host.example.com",
1920
+ "HOST_CANONICAL": "pan-test-app-prod-api-unknown-host.example.com",
1921
+ "KUBERNETES_CPU_LIMIT": "2",
1922
+ "KUBERNETES_CPU_REQUEST": "0.5",
1923
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
1924
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
1925
+ "ROOT_URL": "https://pan-test-app-prod-api-unknown-host.example.com",
1926
+ "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","HOST","ROOT_URL","HOST_CANONICAL","CLOUD_SQL_INSTANCE_CONNECTION_NAME","DB_NAME","DB_USER","DB_PASSWORD","DATABASE_URL","DATABASE_JDBC_URL","GCLOUD_DEPLOY_credentialsKey"]",
1927
+ },
1928
+ },
1929
+ "api 🔨 app | stage ": {
1930
+ "artifacts": {
1931
+ "paths": [
1932
+ "api/__build_info.json",
1933
+ "api/dist",
1934
+ "api/.next",
1935
+ ],
1936
+ "reports": {
1937
+ "junit": undefined,
1938
+ },
1939
+ },
1940
+ "cache": [
1941
+ {
1942
+ "key": "api-yarn",
1943
+ "paths": [
1944
+ "api/.yarn",
1945
+ ],
1946
+ "policy": "pull-push",
1947
+ },
1948
+ {
1949
+ "key": "api-node-modules",
1950
+ "paths": [
1951
+ "api/node_modules",
1952
+ ],
1953
+ "policy": "pull-push",
1954
+ },
1955
+ {
1956
+ "key": "api-next-cache",
1957
+ "paths": [
1958
+ "api/.next/cache/",
1959
+ ],
1960
+ "policy": "pull-push",
1961
+ },
1962
+ ],
1963
+ "environment": undefined,
1964
+ "image": "path/to/docker/jobs-default:the-version",
1965
+ "interruptible": true,
1966
+ "needs": [],
1967
+ "retry": {
1968
+ "max": 2,
1969
+ "when": [
1970
+ "runner_system_failure",
1971
+ "stuck_or_timeout_failure",
1972
+ ],
1973
+ },
1974
+ "script": [
1975
+ "echo '{"id":"some-id","time":"01-01-2023 12:13:14"}' > api/__build_info.json",
1976
+ "if [ -f ./.nvmrc ]; then source /root/.nvm/nvm.sh && nvm install <<< .nvmrc; fi",
1977
+ "cd api",
1978
+ "if [ -f ./.nvmrc ]; then source /root/.nvm/nvm.sh && nvm install <<< .nvmrc; fi",
1979
+ "yarn install --immutable",
1980
+ "yarn build",
1981
+ ],
1982
+ "stage": "build",
1983
+ "variables": {
1984
+ "APP_DIR": "api",
1985
+ "CLOUD_SQL_INSTANCE_CONNECTION_NAME": "projectId:region:instancename",
1986
+ "DATABASE_JDBC_URL": "jdbc:postgresql:///$DB_NAME?cloudSqlInstance=$CLOUD_SQL_INSTANCE_CONNECTION_NAME&socketFactory=com.google.cloud.sql.postgres.SocketFactory&user=$DB_USER&password=$DB_PASSWORD",
1987
+ "DATABASE_URL": "postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME",
1988
+ "DB_NAME": "pan-test-app-stage-api",
1989
+ "DB_PASSWORD": "$CL_stage_api_DB_PASSWORD",
1990
+ "DB_USER": "my-user",
1991
+ "ENV_SHORT": "stage",
1992
+ "ENV_TYPE": "stage",
1993
+ "GCLOUD_DEPLOY_credentialsKey": "$CL_stage_api_GCLOUD_DEPLOY_credentialsKey",
1994
+ "HOST": "pan-test-app-stage-api-unknown-host.example.com",
1995
+ "HOST_CANONICAL": "pan-test-app-stage-api-unknown-host.example.com",
1996
+ "KUBERNETES_CPU_LIMIT": "2",
1997
+ "KUBERNETES_CPU_REQUEST": "0.5",
1998
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
1999
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
2000
+ "ROOT_URL": "https://pan-test-app-stage-api-unknown-host.example.com",
2001
+ "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","HOST","ROOT_URL","HOST_CANONICAL","CLOUD_SQL_INSTANCE_CONNECTION_NAME","DB_NAME","DB_USER","DB_PASSWORD","DATABASE_URL","DATABASE_JDBC_URL","GCLOUD_DEPLOY_credentialsKey"]",
2002
+ },
2003
+ },
2004
+ "api 🔨 docker | prod ": {
2005
+ "cache": [
2006
+ {
2007
+ "key": "api-yarn",
2008
+ "paths": [
2009
+ "api/.yarn",
2010
+ ],
2011
+ "policy": "pull",
2012
+ },
2013
+ ],
2014
+ "environment": undefined,
2015
+ "image": "path/to/docker/docker-build:the-version",
2016
+ "interruptible": true,
2017
+ "needs": [
2018
+ "api 🔨 app | prod ",
2019
+ ],
2020
+ "retry": {
2021
+ "max": 2,
2022
+ "when": [
2023
+ "runner_system_failure",
2024
+ "stuck_or_timeout_failure",
2025
+ ],
2026
+ },
2027
+ "script": [
2028
+ "ensureNodeDockerfile",
2029
+ "docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY",
2030
+ "docker version",
2031
+ "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",
2032
+ "docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
2033
+ "docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE",
2034
+ "docker push $DOCKER_CACHE_IMAGE",
2035
+ ],
2036
+ "services": [
2037
+ {
2038
+ "command": [
2039
+ "--tls=false",
2040
+ ],
2041
+ "name": "docker:20-dind",
2042
+ },
2043
+ ],
2044
+ "stage": "build",
2045
+ "variables": {
2046
+ "APP_DIR": "api",
2047
+ "DOCKERFILE_ADDITIONS": undefined,
2048
+ "DOCKERFILE_ADDITIONS_END": undefined,
2049
+ "DOCKER_BUILDKIT": "1",
2050
+ "DOCKER_CACHE_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/caches/api",
2051
+ "DOCKER_COPY_WORKSPACE_FILES": "COPY --chown=node:node api/package.json /app/api/package.json
2052
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock",
2053
+ "DOCKER_DIR": ".",
2054
+ "DOCKER_DRIVER": "overlay2",
2055
+ "DOCKER_HOST": "tcp://0.0.0.0:2375",
2056
+ "DOCKER_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/$DOCKER_IMAGE_NAME",
2057
+ "DOCKER_IMAGE_NAME": "prod/api",
2058
+ "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
2059
+ "DOCKER_REGISTRY": "$CI_REGISTRY",
2060
+ "DOCKER_REGISTRY_IMAGE_PATH": "$CI_REGISTRY_IMAGE",
2061
+ "DOCKER_TLS_CERTDIR": "",
2062
+ "KUBERNETES_CPU_LIMIT": "1",
2063
+ "KUBERNETES_CPU_REQUEST": "0.5",
2064
+ "KUBERNETES_MEMORY_LIMIT": "2Gi",
2065
+ "KUBERNETES_MEMORY_REQUEST": "1Gi",
2066
+ "YARN_INSTALL": "yarn plugin import workspace-tools && yarn workspaces focus --production && yarn rebuild",
2067
+ "YARN_INSTALL_WITHOUT_SCRIPTS": "YARN_ENABLE_SCRIPTS=false yarn plugin import workspace-tools && yarn workspaces focus --production && yarn rebuild",
2068
+ },
2069
+ },
2070
+ "api 🔨 docker | stage ": {
2071
+ "cache": [
2072
+ {
2073
+ "key": "api-yarn",
2074
+ "paths": [
2075
+ "api/.yarn",
2076
+ ],
2077
+ "policy": "pull",
2078
+ },
2079
+ ],
2080
+ "environment": undefined,
2081
+ "image": "path/to/docker/docker-build:the-version",
2082
+ "interruptible": true,
2083
+ "needs": [
2084
+ "api 🔨 app | stage ",
2085
+ ],
2086
+ "retry": {
2087
+ "max": 2,
2088
+ "when": [
2089
+ "runner_system_failure",
2090
+ "stuck_or_timeout_failure",
2091
+ ],
2092
+ },
2093
+ "script": [
2094
+ "ensureNodeDockerfile",
2095
+ "docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY",
2096
+ "docker version",
2097
+ "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",
2098
+ "docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
2099
+ "docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE",
2100
+ "docker push $DOCKER_CACHE_IMAGE",
2101
+ ],
2102
+ "services": [
2103
+ {
2104
+ "command": [
2105
+ "--tls=false",
2106
+ ],
2107
+ "name": "docker:20-dind",
2108
+ },
2109
+ ],
2110
+ "stage": "build",
2111
+ "variables": {
2112
+ "APP_DIR": "api",
2113
+ "DOCKERFILE_ADDITIONS": undefined,
2114
+ "DOCKERFILE_ADDITIONS_END": undefined,
2115
+ "DOCKER_BUILDKIT": "1",
2116
+ "DOCKER_CACHE_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/caches/api",
2117
+ "DOCKER_COPY_WORKSPACE_FILES": "COPY --chown=node:node api/package.json /app/api/package.json
2118
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock",
2119
+ "DOCKER_DIR": ".",
2120
+ "DOCKER_DRIVER": "overlay2",
2121
+ "DOCKER_HOST": "tcp://0.0.0.0:2375",
2122
+ "DOCKER_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/$DOCKER_IMAGE_NAME",
2123
+ "DOCKER_IMAGE_NAME": "stage/api",
2124
+ "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
2125
+ "DOCKER_REGISTRY": "$CI_REGISTRY",
2126
+ "DOCKER_REGISTRY_IMAGE_PATH": "$CI_REGISTRY_IMAGE",
2127
+ "DOCKER_TLS_CERTDIR": "",
2128
+ "KUBERNETES_CPU_LIMIT": "1",
2129
+ "KUBERNETES_CPU_REQUEST": "0.5",
2130
+ "KUBERNETES_MEMORY_LIMIT": "2Gi",
2131
+ "KUBERNETES_MEMORY_REQUEST": "1Gi",
2132
+ "YARN_INSTALL": "yarn plugin import workspace-tools && yarn workspaces focus --production && yarn rebuild",
2133
+ "YARN_INSTALL_WITHOUT_SCRIPTS": "YARN_ENABLE_SCRIPTS=false yarn plugin import workspace-tools && yarn workspaces focus --production && yarn rebuild",
2134
+ },
2135
+ },
2136
+ "api 🚀 Deploy | prod ": {
2137
+ "allow_failure": true,
2138
+ "artifacts": {
2139
+ "paths": [
2140
+ "____envvars.yaml",
2141
+ ],
2142
+ },
2143
+ "environment": {
2144
+ "auto_stop_in": undefined,
2145
+ "name": "prod/api",
2146
+ "on_stop": "api 🛑 Stop ⚠️ | prod ",
2147
+ "url": "https://pan-test-app-prod-api-unknown-host.example.com",
2148
+ },
2149
+ "image": "path/to/docker/gcloud:the-version",
2150
+ "interruptible": true,
2151
+ "needs": [
2152
+ {
2153
+ "artifacts": false,
2154
+ "job": "api 🔨 app | prod ",
2155
+ },
2156
+ {
2157
+ "artifacts": false,
2158
+ "job": "api 🔨 docker | prod ",
2159
+ },
2160
+ ],
2161
+ "retry": {
2162
+ "max": 2,
2163
+ "when": [
2164
+ "runner_system_failure",
2165
+ "stuck_or_timeout_failure",
2166
+ ],
2167
+ },
2168
+ "rules": [
2169
+ {
2170
+ "when": "manual",
2171
+ },
2172
+ ],
2173
+ "script": [
2174
+ "echo $CL_prod_api_GCLOUD_DEPLOY_credentialsKey > ./____keyfile.json
2175
+ ",
2176
+ "gcloud auth activate-service-account --key-file="./____keyfile.json"",
2177
+ "export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe google-project-id --format="value(projectNumber)")",
2178
+ "echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"",
2179
+ "docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY",
2180
+ "gcloud auth configure-docker europe-west6-docker.pkg.dev",
2181
+ "docker pull $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
2182
+ "docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG",
2183
+ "docker push europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG",
2184
+ "echo "$ENV_VARS" > ____envvars.yaml",
2185
+ "set +e",
2186
+ "echo "ensuring Database..."",
2187
+ "gcloud sql databases create pan-test-app-prod-api --instance=instancename --project projectId",
2188
+ "set -e",
2189
+ "gcloud run deploy pan-test-app-prod-api --command="yarn,start" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --set-cloudsql-instances=projectId:region:instancename --labels=customer-name=pan,app-name=test-app,env-type=prod,env-name=prod,build-type=node --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated",
2190
+ "docker image rm europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG",
2191
+ ],
2192
+ "services": [
2193
+ {
2194
+ "command": [
2195
+ "--tls=false",
2196
+ ],
2197
+ "name": "docker:20-dind",
2198
+ },
2199
+ ],
2200
+ "stage": "deploy prod",
2201
+ "variables": {
2202
+ "APP_DIR": "api",
2203
+ "CLOUDSDK_CORE_DISABLE_PROMPTS": "1",
2204
+ "CLOUD_SQL_INSTANCE_CONNECTION_NAME": "projectId:region:instancename",
2205
+ "DATABASE_JDBC_URL": "jdbc:postgresql:///$DB_NAME?cloudSqlInstance=$CLOUD_SQL_INSTANCE_CONNECTION_NAME&socketFactory=com.google.cloud.sql.postgres.SocketFactory&user=$DB_USER&password=$DB_PASSWORD",
2206
+ "DATABASE_URL": "postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME",
2207
+ "DB_NAME": "pan-test-app-prod-api",
2208
+ "DB_PASSWORD": "$CL_prod_api_DB_PASSWORD",
2209
+ "DB_USER": "my-user",
2210
+ "DOCKERFILE_ADDITIONS": undefined,
2211
+ "DOCKERFILE_ADDITIONS_END": undefined,
2212
+ "DOCKER_BUILDKIT": "1",
2213
+ "DOCKER_CACHE_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/caches/api",
2214
+ "DOCKER_DIR": ".",
2215
+ "DOCKER_DRIVER": "overlay2",
2216
+ "DOCKER_HOST": "tcp://0.0.0.0:2375",
2217
+ "DOCKER_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/$DOCKER_IMAGE_NAME",
2218
+ "DOCKER_IMAGE_NAME": "prod/api",
2219
+ "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
2220
+ "DOCKER_REGISTRY": "$CI_REGISTRY",
2221
+ "DOCKER_REGISTRY_IMAGE_PATH": "$CI_REGISTRY_IMAGE",
2222
+ "DOCKER_TLS_CERTDIR": "",
2223
+ "ENV_SHORT": "prod",
2224
+ "ENV_TYPE": "prod",
2225
+ "ENV_VARS": "ENV_SHORT: 'prod'
2226
+ APP_DIR: 'api'
2227
+ ENV_TYPE: 'prod'
2228
+ HOST: 'pan-test-app-prod-api-unknown-host.example.com'
2229
+ ROOT_URL: 'https://pan-test-app-prod-api-unknown-host.example.com'
2230
+ HOST_CANONICAL: 'pan-test-app-prod-api-unknown-host.example.com'
2231
+ CLOUD_SQL_INSTANCE_CONNECTION_NAME: 'projectId:region:instancename'
2232
+ DB_NAME: 'pan-test-app-prod-api'
2233
+ DB_USER: 'my-user'
2234
+ DB_PASSWORD: '$CL_prod_api_DB_PASSWORD'
2235
+ DATABASE_URL: 'postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME'
2236
+ DATABASE_JDBC_URL: 'jdbc:postgresql:///$DB_NAME?cloudSqlInstance=$CLOUD_SQL_INSTANCE_CONNECTION_NAME&socketFactory=com.google.cloud.sql.postgres.SocketFactory&user=$DB_USER&password=$DB_PASSWORD'
2237
+ _ALL_ENV_VAR_KEYS: '["ENV_SHORT","APP_DIR","ENV_TYPE","HOST","ROOT_URL","HOST_CANONICAL","CLOUD_SQL_INSTANCE_CONNECTION_NAME","DB_NAME","DB_USER","DB_PASSWORD","DATABASE_URL","DATABASE_JDBC_URL","GCLOUD_DEPLOY_credentialsKey"]'
2238
+ ",
2239
+ "GCLOUD_DEPLOY_credentialsKey": "$CL_prod_api_GCLOUD_DEPLOY_credentialsKey",
2240
+ "HOST": "pan-test-app-prod-api-unknown-host.example.com",
2241
+ "HOST_CANONICAL": "pan-test-app-prod-api-unknown-host.example.com",
2242
+ "KUBERNETES_CPU_LIMIT": "1",
2243
+ "KUBERNETES_CPU_REQUEST": "0.5",
2244
+ "KUBERNETES_MEMORY_LIMIT": "2Gi",
2245
+ "KUBERNETES_MEMORY_REQUEST": "1Gi",
2246
+ "ROOT_URL": "https://pan-test-app-prod-api-unknown-host.example.com",
2247
+ "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","HOST","ROOT_URL","HOST_CANONICAL","CLOUD_SQL_INSTANCE_CONNECTION_NAME","DB_NAME","DB_USER","DB_PASSWORD","DATABASE_URL","DATABASE_JDBC_URL","GCLOUD_DEPLOY_credentialsKey"]",
2248
+ },
2249
+ },
2250
+ "api 🚀 Deploy | stage ": {
2251
+ "allow_failure": false,
2252
+ "artifacts": {
2253
+ "paths": [
2254
+ "____envvars.yaml",
2255
+ ],
2256
+ },
2257
+ "environment": {
2258
+ "auto_stop_in": undefined,
2259
+ "name": "stage/api",
2260
+ "on_stop": "api 🛑 Stop ⚠️ | stage ",
2261
+ "url": "https://pan-test-app-stage-api-unknown-host.example.com",
2262
+ },
2263
+ "image": "path/to/docker/gcloud:the-version",
2264
+ "interruptible": true,
2265
+ "needs": [
2266
+ {
2267
+ "artifacts": false,
2268
+ "job": "api 🔨 app | stage ",
2269
+ },
2270
+ {
2271
+ "artifacts": false,
2272
+ "job": "api 🔨 docker | stage ",
2273
+ },
2274
+ ],
2275
+ "retry": {
2276
+ "max": 2,
2277
+ "when": [
2278
+ "runner_system_failure",
2279
+ "stuck_or_timeout_failure",
2280
+ ],
2281
+ },
2282
+ "rules": [
2283
+ {
2284
+ "when": "on_success",
2285
+ },
2286
+ ],
2287
+ "script": [
2288
+ "echo $CL_stage_api_GCLOUD_DEPLOY_credentialsKey > ./____keyfile.json
2289
+ ",
2290
+ "gcloud auth activate-service-account --key-file="./____keyfile.json"",
2291
+ "export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe google-project-id --format="value(projectNumber)")",
2292
+ "echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"",
2293
+ "docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY",
2294
+ "gcloud auth configure-docker europe-west6-docker.pkg.dev",
2295
+ "docker pull $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
2296
+ "docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG",
2297
+ "docker push europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG",
2298
+ "echo "$ENV_VARS" > ____envvars.yaml",
2299
+ "set +e",
2300
+ "echo "ensuring Database..."",
2301
+ "gcloud sql databases create pan-test-app-stage-api --instance=instancename --project projectId",
2302
+ "set -e",
2303
+ "gcloud run deploy pan-test-app-stage-api --command="yarn,start" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --set-cloudsql-instances=projectId:region:instancename --labels=customer-name=pan,app-name=test-app,env-type=stage,env-name=stage,build-type=node --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated",
2304
+ "docker image rm europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG",
2305
+ ],
2306
+ "services": [
2307
+ {
2308
+ "command": [
2309
+ "--tls=false",
2310
+ ],
2311
+ "name": "docker:20-dind",
2312
+ },
2313
+ ],
2314
+ "stage": "deploy stage",
2315
+ "variables": {
2316
+ "APP_DIR": "api",
2317
+ "CLOUDSDK_CORE_DISABLE_PROMPTS": "1",
2318
+ "CLOUD_SQL_INSTANCE_CONNECTION_NAME": "projectId:region:instancename",
2319
+ "DATABASE_JDBC_URL": "jdbc:postgresql:///$DB_NAME?cloudSqlInstance=$CLOUD_SQL_INSTANCE_CONNECTION_NAME&socketFactory=com.google.cloud.sql.postgres.SocketFactory&user=$DB_USER&password=$DB_PASSWORD",
2320
+ "DATABASE_URL": "postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME",
2321
+ "DB_NAME": "pan-test-app-stage-api",
2322
+ "DB_PASSWORD": "$CL_stage_api_DB_PASSWORD",
2323
+ "DB_USER": "my-user",
2324
+ "DOCKERFILE_ADDITIONS": undefined,
2325
+ "DOCKERFILE_ADDITIONS_END": undefined,
2326
+ "DOCKER_BUILDKIT": "1",
2327
+ "DOCKER_CACHE_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/caches/api",
2328
+ "DOCKER_DIR": ".",
2329
+ "DOCKER_DRIVER": "overlay2",
2330
+ "DOCKER_HOST": "tcp://0.0.0.0:2375",
2331
+ "DOCKER_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/$DOCKER_IMAGE_NAME",
2332
+ "DOCKER_IMAGE_NAME": "stage/api",
2333
+ "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
2334
+ "DOCKER_REGISTRY": "$CI_REGISTRY",
2335
+ "DOCKER_REGISTRY_IMAGE_PATH": "$CI_REGISTRY_IMAGE",
2336
+ "DOCKER_TLS_CERTDIR": "",
2337
+ "ENV_SHORT": "stage",
2338
+ "ENV_TYPE": "stage",
2339
+ "ENV_VARS": "ENV_SHORT: 'stage'
2340
+ APP_DIR: 'api'
2341
+ ENV_TYPE: 'stage'
2342
+ HOST: 'pan-test-app-stage-api-unknown-host.example.com'
2343
+ ROOT_URL: 'https://pan-test-app-stage-api-unknown-host.example.com'
2344
+ HOST_CANONICAL: 'pan-test-app-stage-api-unknown-host.example.com'
2345
+ CLOUD_SQL_INSTANCE_CONNECTION_NAME: 'projectId:region:instancename'
2346
+ DB_NAME: 'pan-test-app-stage-api'
2347
+ DB_USER: 'my-user'
2348
+ DB_PASSWORD: '$CL_stage_api_DB_PASSWORD'
2349
+ DATABASE_URL: 'postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME'
2350
+ DATABASE_JDBC_URL: 'jdbc:postgresql:///$DB_NAME?cloudSqlInstance=$CLOUD_SQL_INSTANCE_CONNECTION_NAME&socketFactory=com.google.cloud.sql.postgres.SocketFactory&user=$DB_USER&password=$DB_PASSWORD'
2351
+ _ALL_ENV_VAR_KEYS: '["ENV_SHORT","APP_DIR","ENV_TYPE","HOST","ROOT_URL","HOST_CANONICAL","CLOUD_SQL_INSTANCE_CONNECTION_NAME","DB_NAME","DB_USER","DB_PASSWORD","DATABASE_URL","DATABASE_JDBC_URL","GCLOUD_DEPLOY_credentialsKey"]'
2352
+ ",
2353
+ "GCLOUD_DEPLOY_credentialsKey": "$CL_stage_api_GCLOUD_DEPLOY_credentialsKey",
2354
+ "HOST": "pan-test-app-stage-api-unknown-host.example.com",
2355
+ "HOST_CANONICAL": "pan-test-app-stage-api-unknown-host.example.com",
2356
+ "KUBERNETES_CPU_LIMIT": "1",
2357
+ "KUBERNETES_CPU_REQUEST": "0.5",
2358
+ "KUBERNETES_MEMORY_LIMIT": "2Gi",
2359
+ "KUBERNETES_MEMORY_REQUEST": "1Gi",
2360
+ "ROOT_URL": "https://pan-test-app-stage-api-unknown-host.example.com",
2361
+ "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","HOST","ROOT_URL","HOST_CANONICAL","CLOUD_SQL_INSTANCE_CONNECTION_NAME","DB_NAME","DB_USER","DB_PASSWORD","DATABASE_URL","DATABASE_JDBC_URL","GCLOUD_DEPLOY_credentialsKey"]",
2362
+ },
2363
+ },
2364
+ "api 🛑 Stop ⚠️ | prod ": {
2365
+ "environment": {
2366
+ "action": "stop",
2367
+ "name": "prod/api",
2368
+ "url": "https://pan-test-app-prod-api-unknown-host.example.com",
2369
+ },
2370
+ "image": "path/to/docker/gcloud:the-version",
2371
+ "interruptible": true,
2372
+ "needs": [],
2373
+ "retry": {
2374
+ "max": 2,
2375
+ "when": [
2376
+ "runner_system_failure",
2377
+ "stuck_or_timeout_failure",
2378
+ ],
2379
+ },
2380
+ "rules": [
2381
+ {
2382
+ "allow_failure": true,
2383
+ "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/",
2384
+ "when": "on_success",
2385
+ },
2386
+ {
2387
+ "allow_failure": true,
2388
+ "when": "manual",
2389
+ },
2390
+ ],
2391
+ "script": [
2392
+ "echo $CL_prod_api_GCLOUD_DEPLOY_credentialsKey > ./____keyfile.json
2393
+ ",
2394
+ "gcloud auth activate-service-account --key-file="./____keyfile.json"",
2395
+ "gcloud run services delete pan-test-app-prod-api --project=google-project-id --region=europe-west6",
2396
+ ],
2397
+ "stage": "stop prod",
2398
+ "variables": {
2399
+ "CLOUDSDK_CORE_DISABLE_PROMPTS": "1",
2400
+ "GIT_STRATEGY": "none",
2401
+ "KUBERNETES_CPU_LIMIT": "1",
2402
+ "KUBERNETES_CPU_REQUEST": "0.5",
2403
+ "KUBERNETES_MEMORY_LIMIT": "500Mi",
2404
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
2405
+ },
2406
+ },
2407
+ "api 🛑 Stop ⚠️ | stage ": {
2408
+ "environment": {
2409
+ "action": "stop",
2410
+ "name": "stage/api",
2411
+ "url": "https://pan-test-app-stage-api-unknown-host.example.com",
2412
+ },
2413
+ "image": "path/to/docker/gcloud:the-version",
2414
+ "interruptible": true,
2415
+ "needs": [],
2416
+ "retry": {
2417
+ "max": 2,
2418
+ "when": [
2419
+ "runner_system_failure",
2420
+ "stuck_or_timeout_failure",
2421
+ ],
2422
+ },
2423
+ "rules": [
2424
+ {
2425
+ "allow_failure": true,
2426
+ "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/",
2427
+ "when": "on_success",
2428
+ },
2429
+ {
2430
+ "allow_failure": true,
2431
+ "when": "manual",
2432
+ },
2433
+ ],
2434
+ "script": [
2435
+ "echo $CL_stage_api_GCLOUD_DEPLOY_credentialsKey > ./____keyfile.json
2436
+ ",
2437
+ "gcloud auth activate-service-account --key-file="./____keyfile.json"",
2438
+ "gcloud run services delete pan-test-app-stage-api --project=google-project-id --region=europe-west6",
2439
+ ],
2440
+ "stage": "stop stage",
2441
+ "variables": {
2442
+ "CLOUDSDK_CORE_DISABLE_PROMPTS": "1",
2443
+ "GIT_STRATEGY": "none",
2444
+ "KUBERNETES_CPU_LIMIT": "1",
2445
+ "KUBERNETES_CPU_REQUEST": "0.5",
2446
+ "KUBERNETES_MEMORY_LIMIT": "500Mi",
2447
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
2448
+ },
2449
+ },
2450
+ "worker 🔨 app | prod ": {
2451
+ "artifacts": {
2452
+ "paths": [
2453
+ "api/__build_info.json",
2454
+ "api/dist",
2455
+ "api/.next",
2456
+ ],
2457
+ "reports": {
2458
+ "junit": undefined,
2459
+ },
2460
+ },
2461
+ "cache": [
2462
+ {
2463
+ "key": "api-yarn",
2464
+ "paths": [
2465
+ "api/.yarn",
2466
+ ],
2467
+ "policy": "pull-push",
2468
+ },
2469
+ {
2470
+ "key": "api-node-modules",
2471
+ "paths": [
2472
+ "api/node_modules",
2473
+ ],
2474
+ "policy": "pull-push",
2475
+ },
2476
+ {
2477
+ "key": "worker-next-cache",
2478
+ "paths": [
2479
+ "api/.next/cache/",
2480
+ ],
2481
+ "policy": "pull-push",
2482
+ },
2483
+ ],
2484
+ "environment": undefined,
2485
+ "image": "path/to/docker/jobs-default:the-version",
2486
+ "interruptible": true,
2487
+ "needs": [],
2488
+ "retry": {
2489
+ "max": 2,
2490
+ "when": [
2491
+ "runner_system_failure",
2492
+ "stuck_or_timeout_failure",
2493
+ ],
2494
+ },
2495
+ "script": [
2496
+ "echo '{"id":"some-id","time":"01-01-2023 12:13:14"}' > api/__build_info.json",
2497
+ "if [ -f ./.nvmrc ]; then source /root/.nvm/nvm.sh && nvm install <<< .nvmrc; fi",
2498
+ "cd api",
2499
+ "if [ -f ./.nvmrc ]; then source /root/.nvm/nvm.sh && nvm install <<< .nvmrc; fi",
2500
+ "yarn install --immutable",
2501
+ "yarn build:worker",
2502
+ ],
2503
+ "stage": "build",
2504
+ "variables": {
2505
+ "APP_DIR": "api",
2506
+ "CLOUD_SQL_INSTANCE_CONNECTION_NAME": "projectId:region:instancename",
2507
+ "DATABASE_JDBC_URL": "jdbc:postgresql:///$DB_NAME?cloudSqlInstance=$CLOUD_SQL_INSTANCE_CONNECTION_NAME&socketFactory=com.google.cloud.sql.postgres.SocketFactory&user=$DB_USER&password=$DB_PASSWORD",
2508
+ "DATABASE_URL": "postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME",
2509
+ "DB_NAME": "pan-test-app-prod-api",
2510
+ "DB_PASSWORD": "$CL_prod_api_DB_PASSWORD",
2511
+ "DB_USER": "my-user",
2512
+ "ENV_SHORT": "prod",
2513
+ "ENV_TYPE": "prod",
2514
+ "GCLOUD_DEPLOY_credentialsKey": "$CL_prod_worker_GCLOUD_DEPLOY_credentialsKey",
2515
+ "HOST": "pan-test-app-prod-worker-unknown-host.example.com",
2516
+ "HOST_CANONICAL": "pan-test-app-prod-worker-unknown-host.example.com",
2517
+ "KUBERNETES_CPU_LIMIT": "2",
2518
+ "KUBERNETES_CPU_REQUEST": "0.5",
2519
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
2520
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
2521
+ "ROOT_URL": "https://pan-test-app-prod-worker-unknown-host.example.com",
2522
+ "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","HOST","ROOT_URL","HOST_CANONICAL","CLOUD_SQL_INSTANCE_CONNECTION_NAME","DB_NAME","DB_USER","DB_PASSWORD","DATABASE_URL","DATABASE_JDBC_URL","GCLOUD_DEPLOY_credentialsKey"]",
2523
+ },
2524
+ },
2525
+ "worker 🔨 app | stage ": {
2526
+ "artifacts": {
2527
+ "paths": [
2528
+ "api/__build_info.json",
2529
+ "api/dist",
2530
+ "api/.next",
2531
+ ],
2532
+ "reports": {
2533
+ "junit": undefined,
2534
+ },
2535
+ },
2536
+ "cache": [
2537
+ {
2538
+ "key": "api-yarn",
2539
+ "paths": [
2540
+ "api/.yarn",
2541
+ ],
2542
+ "policy": "pull-push",
2543
+ },
2544
+ {
2545
+ "key": "api-node-modules",
2546
+ "paths": [
2547
+ "api/node_modules",
2548
+ ],
2549
+ "policy": "pull-push",
2550
+ },
2551
+ {
2552
+ "key": "worker-next-cache",
2553
+ "paths": [
2554
+ "api/.next/cache/",
2555
+ ],
2556
+ "policy": "pull-push",
2557
+ },
2558
+ ],
2559
+ "environment": undefined,
2560
+ "image": "path/to/docker/jobs-default:the-version",
2561
+ "interruptible": true,
2562
+ "needs": [],
2563
+ "retry": {
2564
+ "max": 2,
2565
+ "when": [
2566
+ "runner_system_failure",
2567
+ "stuck_or_timeout_failure",
2568
+ ],
2569
+ },
2570
+ "script": [
2571
+ "echo '{"id":"some-id","time":"01-01-2023 12:13:14"}' > api/__build_info.json",
2572
+ "if [ -f ./.nvmrc ]; then source /root/.nvm/nvm.sh && nvm install <<< .nvmrc; fi",
2573
+ "cd api",
2574
+ "if [ -f ./.nvmrc ]; then source /root/.nvm/nvm.sh && nvm install <<< .nvmrc; fi",
2575
+ "yarn install --immutable",
2576
+ "yarn build:worker",
2577
+ ],
2578
+ "stage": "build",
2579
+ "variables": {
2580
+ "APP_DIR": "api",
2581
+ "CLOUD_SQL_INSTANCE_CONNECTION_NAME": "projectId:region:instancename",
2582
+ "DATABASE_JDBC_URL": "jdbc:postgresql:///$DB_NAME?cloudSqlInstance=$CLOUD_SQL_INSTANCE_CONNECTION_NAME&socketFactory=com.google.cloud.sql.postgres.SocketFactory&user=$DB_USER&password=$DB_PASSWORD",
2583
+ "DATABASE_URL": "postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME",
2584
+ "DB_NAME": "pan-test-app-stage-api",
2585
+ "DB_PASSWORD": "$CL_stage_api_DB_PASSWORD",
2586
+ "DB_USER": "my-user",
2587
+ "ENV_SHORT": "stage",
2588
+ "ENV_TYPE": "stage",
2589
+ "GCLOUD_DEPLOY_credentialsKey": "$CL_stage_worker_GCLOUD_DEPLOY_credentialsKey",
2590
+ "HOST": "pan-test-app-stage-worker-unknown-host.example.com",
2591
+ "HOST_CANONICAL": "pan-test-app-stage-worker-unknown-host.example.com",
2592
+ "KUBERNETES_CPU_LIMIT": "2",
2593
+ "KUBERNETES_CPU_REQUEST": "0.5",
2594
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
2595
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
2596
+ "ROOT_URL": "https://pan-test-app-stage-worker-unknown-host.example.com",
2597
+ "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","HOST","ROOT_URL","HOST_CANONICAL","CLOUD_SQL_INSTANCE_CONNECTION_NAME","DB_NAME","DB_USER","DB_PASSWORD","DATABASE_URL","DATABASE_JDBC_URL","GCLOUD_DEPLOY_credentialsKey"]",
2598
+ },
2599
+ },
2600
+ "worker 🔨 docker | prod ": {
2601
+ "cache": [
2602
+ {
2603
+ "key": "api-yarn",
2604
+ "paths": [
2605
+ "api/.yarn",
2606
+ ],
2607
+ "policy": "pull",
2608
+ },
2609
+ ],
2610
+ "environment": undefined,
2611
+ "image": "path/to/docker/docker-build:the-version",
2612
+ "interruptible": true,
2613
+ "needs": [
2614
+ "worker 🔨 app | prod ",
2615
+ ],
2616
+ "retry": {
2617
+ "max": 2,
2618
+ "when": [
2619
+ "runner_system_failure",
2620
+ "stuck_or_timeout_failure",
2621
+ ],
2622
+ },
2623
+ "script": [
2624
+ "ensureNodeDockerfile",
2625
+ "docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY",
2626
+ "docker version",
2627
+ "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",
2628
+ "docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
2629
+ "docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE",
2630
+ "docker push $DOCKER_CACHE_IMAGE",
2631
+ ],
2632
+ "services": [
2633
+ {
2634
+ "command": [
2635
+ "--tls=false",
2636
+ ],
2637
+ "name": "docker:20-dind",
2638
+ },
2639
+ ],
2640
+ "stage": "build",
2641
+ "variables": {
2642
+ "APP_DIR": "api",
2643
+ "DOCKERFILE_ADDITIONS": undefined,
2644
+ "DOCKERFILE_ADDITIONS_END": undefined,
2645
+ "DOCKER_BUILDKIT": "1",
2646
+ "DOCKER_CACHE_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/caches/worker",
2647
+ "DOCKER_COPY_WORKSPACE_FILES": "COPY --chown=node:node api/package.json /app/api/package.json
2648
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock",
2649
+ "DOCKER_DIR": ".",
2650
+ "DOCKER_DRIVER": "overlay2",
2651
+ "DOCKER_HOST": "tcp://0.0.0.0:2375",
2652
+ "DOCKER_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/$DOCKER_IMAGE_NAME",
2653
+ "DOCKER_IMAGE_NAME": "prod/worker",
2654
+ "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
2655
+ "DOCKER_REGISTRY": "$CI_REGISTRY",
2656
+ "DOCKER_REGISTRY_IMAGE_PATH": "$CI_REGISTRY_IMAGE",
2657
+ "DOCKER_TLS_CERTDIR": "",
2658
+ "KUBERNETES_CPU_LIMIT": "1",
2659
+ "KUBERNETES_CPU_REQUEST": "0.5",
2660
+ "KUBERNETES_MEMORY_LIMIT": "2Gi",
2661
+ "KUBERNETES_MEMORY_REQUEST": "1Gi",
2662
+ "YARN_INSTALL": "yarn plugin import workspace-tools && yarn workspaces focus --production && yarn rebuild",
2663
+ "YARN_INSTALL_WITHOUT_SCRIPTS": "YARN_ENABLE_SCRIPTS=false yarn plugin import workspace-tools && yarn workspaces focus --production && yarn rebuild",
2664
+ },
2665
+ },
2666
+ "worker 🔨 docker | stage ": {
2667
+ "cache": [
2668
+ {
2669
+ "key": "api-yarn",
2670
+ "paths": [
2671
+ "api/.yarn",
2672
+ ],
2673
+ "policy": "pull",
2674
+ },
2675
+ ],
2676
+ "environment": undefined,
2677
+ "image": "path/to/docker/docker-build:the-version",
2678
+ "interruptible": true,
2679
+ "needs": [
2680
+ "worker 🔨 app | stage ",
2681
+ ],
2682
+ "retry": {
2683
+ "max": 2,
2684
+ "when": [
2685
+ "runner_system_failure",
2686
+ "stuck_or_timeout_failure",
2687
+ ],
2688
+ },
2689
+ "script": [
2690
+ "ensureNodeDockerfile",
2691
+ "docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY",
2692
+ "docker version",
2693
+ "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",
2694
+ "docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
2695
+ "docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE",
2696
+ "docker push $DOCKER_CACHE_IMAGE",
2697
+ ],
2698
+ "services": [
2699
+ {
2700
+ "command": [
2701
+ "--tls=false",
2702
+ ],
2703
+ "name": "docker:20-dind",
2704
+ },
2705
+ ],
2706
+ "stage": "build",
2707
+ "variables": {
2708
+ "APP_DIR": "api",
2709
+ "DOCKERFILE_ADDITIONS": undefined,
2710
+ "DOCKERFILE_ADDITIONS_END": undefined,
2711
+ "DOCKER_BUILDKIT": "1",
2712
+ "DOCKER_CACHE_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/caches/worker",
2713
+ "DOCKER_COPY_WORKSPACE_FILES": "COPY --chown=node:node api/package.json /app/api/package.json
2714
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock",
2715
+ "DOCKER_DIR": ".",
2716
+ "DOCKER_DRIVER": "overlay2",
2717
+ "DOCKER_HOST": "tcp://0.0.0.0:2375",
2718
+ "DOCKER_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/$DOCKER_IMAGE_NAME",
2719
+ "DOCKER_IMAGE_NAME": "stage/worker",
2720
+ "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
2721
+ "DOCKER_REGISTRY": "$CI_REGISTRY",
2722
+ "DOCKER_REGISTRY_IMAGE_PATH": "$CI_REGISTRY_IMAGE",
2723
+ "DOCKER_TLS_CERTDIR": "",
2724
+ "KUBERNETES_CPU_LIMIT": "1",
2725
+ "KUBERNETES_CPU_REQUEST": "0.5",
2726
+ "KUBERNETES_MEMORY_LIMIT": "2Gi",
2727
+ "KUBERNETES_MEMORY_REQUEST": "1Gi",
2728
+ "YARN_INSTALL": "yarn plugin import workspace-tools && yarn workspaces focus --production && yarn rebuild",
2729
+ "YARN_INSTALL_WITHOUT_SCRIPTS": "YARN_ENABLE_SCRIPTS=false yarn plugin import workspace-tools && yarn workspaces focus --production && yarn rebuild",
2730
+ },
2731
+ },
2732
+ "worker 🚀 Deploy | prod ": {
2733
+ "allow_failure": true,
2734
+ "artifacts": {
2735
+ "paths": [
2736
+ "____envvars.yaml",
2737
+ ],
2738
+ },
2739
+ "environment": {
2740
+ "auto_stop_in": undefined,
2741
+ "name": "prod/worker",
2742
+ "on_stop": "worker 🛑 Stop ⚠️ | prod ",
2743
+ "url": "https://pan-test-app-prod-worker-unknown-host.example.com",
2744
+ },
2745
+ "image": "path/to/docker/gcloud:the-version",
2746
+ "interruptible": true,
2747
+ "needs": [
2748
+ {
2749
+ "artifacts": false,
2750
+ "job": "worker 🔨 app | prod ",
2751
+ },
2752
+ {
2753
+ "artifacts": false,
2754
+ "job": "worker 🔨 docker | prod ",
2755
+ },
2756
+ ],
2757
+ "retry": {
2758
+ "max": 2,
2759
+ "when": [
2760
+ "runner_system_failure",
2761
+ "stuck_or_timeout_failure",
2762
+ ],
2763
+ },
2764
+ "rules": [
2765
+ {
2766
+ "when": "manual",
2767
+ },
2768
+ ],
2769
+ "script": [
2770
+ "echo $CL_prod_worker_GCLOUD_DEPLOY_credentialsKey > ./____keyfile.json
2771
+ ",
2772
+ "gcloud auth activate-service-account --key-file="./____keyfile.json"",
2773
+ "export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe google-project-id --format="value(projectNumber)")",
2774
+ "echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"",
2775
+ "docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY",
2776
+ "gcloud auth configure-docker europe-west6-docker.pkg.dev",
2777
+ "docker pull $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
2778
+ "docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG",
2779
+ "docker push europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG",
2780
+ "echo "$ENV_VARS" > ____envvars.yaml",
2781
+ "set +e",
2782
+ "echo "ensuring Database..."",
2783
+ "gcloud sql databases create pan-test-app-prod-api --instance=instancename --project projectId",
2784
+ "set -e",
2785
+ "gcloud run deploy pan-test-app-prod-worker --command="yarn,start" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --set-cloudsql-instances=projectId:region:instancename --labels=customer-name=pan,app-name=test-app,env-type=prod,env-name=prod,build-type=node --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated",
2786
+ "docker image rm europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG",
2787
+ ],
2788
+ "services": [
2789
+ {
2790
+ "command": [
2791
+ "--tls=false",
2792
+ ],
2793
+ "name": "docker:20-dind",
2794
+ },
2795
+ ],
2796
+ "stage": "deploy prod",
2797
+ "variables": {
2798
+ "APP_DIR": "api",
2799
+ "CLOUDSDK_CORE_DISABLE_PROMPTS": "1",
2800
+ "CLOUD_SQL_INSTANCE_CONNECTION_NAME": "projectId:region:instancename",
2801
+ "DATABASE_JDBC_URL": "jdbc:postgresql:///$DB_NAME?cloudSqlInstance=$CLOUD_SQL_INSTANCE_CONNECTION_NAME&socketFactory=com.google.cloud.sql.postgres.SocketFactory&user=$DB_USER&password=$DB_PASSWORD",
2802
+ "DATABASE_URL": "postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME",
2803
+ "DB_NAME": "pan-test-app-prod-api",
2804
+ "DB_PASSWORD": "$CL_prod_api_DB_PASSWORD",
2805
+ "DB_USER": "my-user",
2806
+ "DOCKERFILE_ADDITIONS": undefined,
2807
+ "DOCKERFILE_ADDITIONS_END": undefined,
2808
+ "DOCKER_BUILDKIT": "1",
2809
+ "DOCKER_CACHE_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/caches/worker",
2810
+ "DOCKER_DIR": ".",
2811
+ "DOCKER_DRIVER": "overlay2",
2812
+ "DOCKER_HOST": "tcp://0.0.0.0:2375",
2813
+ "DOCKER_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/$DOCKER_IMAGE_NAME",
2814
+ "DOCKER_IMAGE_NAME": "prod/worker",
2815
+ "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
2816
+ "DOCKER_REGISTRY": "$CI_REGISTRY",
2817
+ "DOCKER_REGISTRY_IMAGE_PATH": "$CI_REGISTRY_IMAGE",
2818
+ "DOCKER_TLS_CERTDIR": "",
2819
+ "ENV_SHORT": "prod",
2820
+ "ENV_TYPE": "prod",
2821
+ "ENV_VARS": "ENV_SHORT: 'prod'
2822
+ APP_DIR: 'api'
2823
+ ENV_TYPE: 'prod'
2824
+ HOST: 'pan-test-app-prod-worker-unknown-host.example.com'
2825
+ ROOT_URL: 'https://pan-test-app-prod-worker-unknown-host.example.com'
2826
+ HOST_CANONICAL: 'pan-test-app-prod-worker-unknown-host.example.com'
2827
+ CLOUD_SQL_INSTANCE_CONNECTION_NAME: 'projectId:region:instancename'
2828
+ DB_NAME: 'pan-test-app-prod-api'
2829
+ DB_USER: 'my-user'
2830
+ DB_PASSWORD: '$CL_prod_api_DB_PASSWORD'
2831
+ DATABASE_URL: 'postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME'
2832
+ DATABASE_JDBC_URL: 'jdbc:postgresql:///$DB_NAME?cloudSqlInstance=$CLOUD_SQL_INSTANCE_CONNECTION_NAME&socketFactory=com.google.cloud.sql.postgres.SocketFactory&user=$DB_USER&password=$DB_PASSWORD'
2833
+ _ALL_ENV_VAR_KEYS: '["ENV_SHORT","APP_DIR","ENV_TYPE","HOST","ROOT_URL","HOST_CANONICAL","CLOUD_SQL_INSTANCE_CONNECTION_NAME","DB_NAME","DB_USER","DB_PASSWORD","DATABASE_URL","DATABASE_JDBC_URL","GCLOUD_DEPLOY_credentialsKey"]'
2834
+ ",
2835
+ "GCLOUD_DEPLOY_credentialsKey": "$CL_prod_worker_GCLOUD_DEPLOY_credentialsKey",
2836
+ "HOST": "pan-test-app-prod-worker-unknown-host.example.com",
2837
+ "HOST_CANONICAL": "pan-test-app-prod-worker-unknown-host.example.com",
2838
+ "KUBERNETES_CPU_LIMIT": "1",
2839
+ "KUBERNETES_CPU_REQUEST": "0.5",
2840
+ "KUBERNETES_MEMORY_LIMIT": "2Gi",
2841
+ "KUBERNETES_MEMORY_REQUEST": "1Gi",
2842
+ "ROOT_URL": "https://pan-test-app-prod-worker-unknown-host.example.com",
2843
+ "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","HOST","ROOT_URL","HOST_CANONICAL","CLOUD_SQL_INSTANCE_CONNECTION_NAME","DB_NAME","DB_USER","DB_PASSWORD","DATABASE_URL","DATABASE_JDBC_URL","GCLOUD_DEPLOY_credentialsKey"]",
2844
+ },
2845
+ },
2846
+ "worker 🚀 Deploy | stage ": {
2847
+ "allow_failure": false,
2848
+ "artifacts": {
2849
+ "paths": [
2850
+ "____envvars.yaml",
2851
+ ],
2852
+ },
2853
+ "environment": {
2854
+ "auto_stop_in": undefined,
2855
+ "name": "stage/worker",
2856
+ "on_stop": "worker 🛑 Stop ⚠️ | stage ",
2857
+ "url": "https://pan-test-app-stage-worker-unknown-host.example.com",
2858
+ },
2859
+ "image": "path/to/docker/gcloud:the-version",
2860
+ "interruptible": true,
2861
+ "needs": [
2862
+ {
2863
+ "artifacts": false,
2864
+ "job": "worker 🔨 app | stage ",
2865
+ },
2866
+ {
2867
+ "artifacts": false,
2868
+ "job": "worker 🔨 docker | stage ",
2869
+ },
2870
+ ],
2871
+ "retry": {
2872
+ "max": 2,
2873
+ "when": [
2874
+ "runner_system_failure",
2875
+ "stuck_or_timeout_failure",
2876
+ ],
2877
+ },
2878
+ "rules": [
2879
+ {
2880
+ "when": "on_success",
2881
+ },
2882
+ ],
2883
+ "script": [
2884
+ "echo $CL_stage_worker_GCLOUD_DEPLOY_credentialsKey > ./____keyfile.json
2885
+ ",
2886
+ "gcloud auth activate-service-account --key-file="./____keyfile.json"",
2887
+ "export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe google-project-id --format="value(projectNumber)")",
2888
+ "echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"",
2889
+ "docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY",
2890
+ "gcloud auth configure-docker europe-west6-docker.pkg.dev",
2891
+ "docker pull $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
2892
+ "docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG",
2893
+ "docker push europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG",
2894
+ "echo "$ENV_VARS" > ____envvars.yaml",
2895
+ "set +e",
2896
+ "echo "ensuring Database..."",
2897
+ "gcloud sql databases create pan-test-app-stage-api --instance=instancename --project projectId",
2898
+ "set -e",
2899
+ "gcloud run deploy pan-test-app-stage-worker --command="yarn,start" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --set-cloudsql-instances=projectId:region:instancename --labels=customer-name=pan,app-name=test-app,env-type=stage,env-name=stage,build-type=node --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated",
2900
+ "docker image rm europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG",
2901
+ ],
2902
+ "services": [
2903
+ {
2904
+ "command": [
2905
+ "--tls=false",
2906
+ ],
2907
+ "name": "docker:20-dind",
2908
+ },
2909
+ ],
2910
+ "stage": "deploy stage",
2911
+ "variables": {
2912
+ "APP_DIR": "api",
2913
+ "CLOUDSDK_CORE_DISABLE_PROMPTS": "1",
2914
+ "CLOUD_SQL_INSTANCE_CONNECTION_NAME": "projectId:region:instancename",
2915
+ "DATABASE_JDBC_URL": "jdbc:postgresql:///$DB_NAME?cloudSqlInstance=$CLOUD_SQL_INSTANCE_CONNECTION_NAME&socketFactory=com.google.cloud.sql.postgres.SocketFactory&user=$DB_USER&password=$DB_PASSWORD",
2916
+ "DATABASE_URL": "postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME",
2917
+ "DB_NAME": "pan-test-app-stage-api",
2918
+ "DB_PASSWORD": "$CL_stage_api_DB_PASSWORD",
2919
+ "DB_USER": "my-user",
2920
+ "DOCKERFILE_ADDITIONS": undefined,
2921
+ "DOCKERFILE_ADDITIONS_END": undefined,
2922
+ "DOCKER_BUILDKIT": "1",
2923
+ "DOCKER_CACHE_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/caches/worker",
2924
+ "DOCKER_DIR": ".",
2925
+ "DOCKER_DRIVER": "overlay2",
2926
+ "DOCKER_HOST": "tcp://0.0.0.0:2375",
2927
+ "DOCKER_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/$DOCKER_IMAGE_NAME",
2928
+ "DOCKER_IMAGE_NAME": "stage/worker",
2929
+ "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
2930
+ "DOCKER_REGISTRY": "$CI_REGISTRY",
2931
+ "DOCKER_REGISTRY_IMAGE_PATH": "$CI_REGISTRY_IMAGE",
2932
+ "DOCKER_TLS_CERTDIR": "",
2933
+ "ENV_SHORT": "stage",
2934
+ "ENV_TYPE": "stage",
2935
+ "ENV_VARS": "ENV_SHORT: 'stage'
2936
+ APP_DIR: 'api'
2937
+ ENV_TYPE: 'stage'
2938
+ HOST: 'pan-test-app-stage-worker-unknown-host.example.com'
2939
+ ROOT_URL: 'https://pan-test-app-stage-worker-unknown-host.example.com'
2940
+ HOST_CANONICAL: 'pan-test-app-stage-worker-unknown-host.example.com'
2941
+ CLOUD_SQL_INSTANCE_CONNECTION_NAME: 'projectId:region:instancename'
2942
+ DB_NAME: 'pan-test-app-stage-api'
2943
+ DB_USER: 'my-user'
2944
+ DB_PASSWORD: '$CL_stage_api_DB_PASSWORD'
2945
+ DATABASE_URL: 'postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME'
2946
+ DATABASE_JDBC_URL: 'jdbc:postgresql:///$DB_NAME?cloudSqlInstance=$CLOUD_SQL_INSTANCE_CONNECTION_NAME&socketFactory=com.google.cloud.sql.postgres.SocketFactory&user=$DB_USER&password=$DB_PASSWORD'
2947
+ _ALL_ENV_VAR_KEYS: '["ENV_SHORT","APP_DIR","ENV_TYPE","HOST","ROOT_URL","HOST_CANONICAL","CLOUD_SQL_INSTANCE_CONNECTION_NAME","DB_NAME","DB_USER","DB_PASSWORD","DATABASE_URL","DATABASE_JDBC_URL","GCLOUD_DEPLOY_credentialsKey"]'
2948
+ ",
2949
+ "GCLOUD_DEPLOY_credentialsKey": "$CL_stage_worker_GCLOUD_DEPLOY_credentialsKey",
2950
+ "HOST": "pan-test-app-stage-worker-unknown-host.example.com",
2951
+ "HOST_CANONICAL": "pan-test-app-stage-worker-unknown-host.example.com",
2952
+ "KUBERNETES_CPU_LIMIT": "1",
2953
+ "KUBERNETES_CPU_REQUEST": "0.5",
2954
+ "KUBERNETES_MEMORY_LIMIT": "2Gi",
2955
+ "KUBERNETES_MEMORY_REQUEST": "1Gi",
2956
+ "ROOT_URL": "https://pan-test-app-stage-worker-unknown-host.example.com",
2957
+ "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","HOST","ROOT_URL","HOST_CANONICAL","CLOUD_SQL_INSTANCE_CONNECTION_NAME","DB_NAME","DB_USER","DB_PASSWORD","DATABASE_URL","DATABASE_JDBC_URL","GCLOUD_DEPLOY_credentialsKey"]",
2958
+ },
2959
+ },
2960
+ "worker 🛑 Stop ⚠️ | prod ": {
2961
+ "environment": {
2962
+ "action": "stop",
2963
+ "name": "prod/worker",
2964
+ "url": "https://pan-test-app-prod-worker-unknown-host.example.com",
2965
+ },
2966
+ "image": "path/to/docker/gcloud:the-version",
2967
+ "interruptible": true,
2968
+ "needs": [],
2969
+ "retry": {
2970
+ "max": 2,
2971
+ "when": [
2972
+ "runner_system_failure",
2973
+ "stuck_or_timeout_failure",
2974
+ ],
2975
+ },
2976
+ "rules": [
2977
+ {
2978
+ "allow_failure": true,
2979
+ "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/",
2980
+ "when": "on_success",
2981
+ },
2982
+ {
2983
+ "allow_failure": true,
2984
+ "when": "manual",
2985
+ },
2986
+ ],
2987
+ "script": [
2988
+ "echo $CL_prod_worker_GCLOUD_DEPLOY_credentialsKey > ./____keyfile.json
2989
+ ",
2990
+ "gcloud auth activate-service-account --key-file="./____keyfile.json"",
2991
+ "gcloud run services delete pan-test-app-prod-worker --project=google-project-id --region=europe-west6",
2992
+ ],
2993
+ "stage": "stop prod",
2994
+ "variables": {
2995
+ "CLOUDSDK_CORE_DISABLE_PROMPTS": "1",
2996
+ "GIT_STRATEGY": "none",
2997
+ "KUBERNETES_CPU_LIMIT": "1",
2998
+ "KUBERNETES_CPU_REQUEST": "0.5",
2999
+ "KUBERNETES_MEMORY_LIMIT": "500Mi",
3000
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
3001
+ },
3002
+ },
3003
+ "worker 🛑 Stop ⚠️ | stage ": {
3004
+ "environment": {
3005
+ "action": "stop",
3006
+ "name": "stage/worker",
3007
+ "url": "https://pan-test-app-stage-worker-unknown-host.example.com",
3008
+ },
3009
+ "image": "path/to/docker/gcloud:the-version",
3010
+ "interruptible": true,
3011
+ "needs": [],
3012
+ "retry": {
3013
+ "max": 2,
3014
+ "when": [
3015
+ "runner_system_failure",
3016
+ "stuck_or_timeout_failure",
3017
+ ],
3018
+ },
3019
+ "rules": [
3020
+ {
3021
+ "allow_failure": true,
3022
+ "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/",
3023
+ "when": "on_success",
3024
+ },
3025
+ {
3026
+ "allow_failure": true,
3027
+ "when": "manual",
3028
+ },
3029
+ ],
3030
+ "script": [
3031
+ "echo $CL_stage_worker_GCLOUD_DEPLOY_credentialsKey > ./____keyfile.json
3032
+ ",
3033
+ "gcloud auth activate-service-account --key-file="./____keyfile.json"",
3034
+ "gcloud run services delete pan-test-app-stage-worker --project=google-project-id --region=europe-west6",
3035
+ ],
3036
+ "stage": "stop stage",
3037
+ "variables": {
3038
+ "CLOUDSDK_CORE_DISABLE_PROMPTS": "1",
3039
+ "GIT_STRATEGY": "none",
3040
+ "KUBERNETES_CPU_LIMIT": "1",
3041
+ "KUBERNETES_CPU_REQUEST": "0.5",
3042
+ "KUBERNETES_MEMORY_LIMIT": "500Mi",
3043
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
3044
+ },
3045
+ },
3046
+ },
3047
+ "stages": [
3048
+ "setup",
3049
+ "setup dev",
3050
+ "setup review",
3051
+ "setup stage",
3052
+ "setup prod",
3053
+ "setup local",
3054
+ "test",
3055
+ "test dev",
3056
+ "test review",
3057
+ "test stage",
3058
+ "test prod",
3059
+ "test local",
3060
+ "build",
3061
+ "build dev",
3062
+ "build review",
3063
+ "build stage",
3064
+ "build prod",
3065
+ "build local",
3066
+ "deploy",
3067
+ "deploy dev",
3068
+ "deploy review",
3069
+ "deploy stage",
3070
+ "deploy prod",
3071
+ "deploy local",
3072
+ "verify",
3073
+ "verify dev",
3074
+ "verify review",
3075
+ "verify stage",
3076
+ "verify prod",
3077
+ "verify local",
3078
+ "rollback",
3079
+ "rollback dev",
3080
+ "rollback review",
3081
+ "rollback stage",
3082
+ "rollback prod",
3083
+ "rollback local",
3084
+ "stop",
3085
+ "stop dev",
3086
+ "stop review",
3087
+ "stop stage",
3088
+ "stop prod",
3089
+ "stop local",
3090
+ ],
3091
+ "variables": {
3092
+ "FF_USE_FASTZIP": "true",
3093
+ },
3094
+ "workflow": {
3095
+ "rules": [
3096
+ {
3097
+ "if": "$CI_COMMIT_TAG",
3098
+ },
3099
+ {
3100
+ "if": "$CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/",
3101
+ "when": "never",
3102
+ },
3103
+ {
3104
+ "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+.([0-9]+|x).x$/",
3105
+ },
3106
+ {
3107
+ "if": "$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH",
3108
+ },
3109
+ {
3110
+ "if": "$CI_MERGE_REQUEST_ID",
3111
+ },
3112
+ ],
3113
+ },
3114
+ },
3115
+ }
3116
+ `;