@catladder/pipeline 0.0.0-fix-command-710f75f1 → 0.0.0-fix-error-sql-db-delete-b3878c2e

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (98) hide show
  1. package/dist/build/custom/buildJob.js +1 -0
  2. package/dist/build/docker.d.ts +4 -18
  3. package/dist/build/docker.js +15 -9
  4. package/dist/build/index.js +7 -1
  5. package/dist/build/rails/build.js +37 -16
  6. package/dist/build/rails/index.d.ts +2 -2
  7. package/dist/build/rails/test.js +1 -2
  8. package/dist/build/types.d.ts +36 -4
  9. package/dist/bundles/catladder-gitlab/index.js +543 -218
  10. package/dist/constants.js +1 -1
  11. package/dist/context/getEnvironment.js +1 -0
  12. package/dist/context/getEnvironmentContext.js +5 -3
  13. package/dist/context/getEnvironmentVariables.d.ts +5 -1
  14. package/dist/context/getEnvironmentVariables.js +7 -2
  15. package/dist/deploy/base.js +1 -1
  16. package/dist/deploy/cloudRun/index.js +14 -6
  17. package/dist/deploy/custom/deployJob.js +6 -3
  18. package/dist/deploy/index.d.ts +2 -1
  19. package/dist/deploy/kubernetes/additionalSecretKeys.d.ts +3 -1
  20. package/dist/deploy/kubernetes/additionalSecretKeys.js +5 -1
  21. package/dist/deploy/kubernetes/deployJob.js +4 -4
  22. package/dist/deploy/kubernetes/kubeValues.d.ts +1 -0
  23. package/dist/deploy/kubernetes/kubeValues.js +9 -6
  24. package/dist/deploy/kubernetes/processSecretsAsFiles.d.ts +1 -0
  25. package/dist/deploy/types/custom.d.ts +2 -1
  26. package/dist/deploy/types/googleCloudRun.d.ts +5 -1
  27. package/dist/deploy/types/kubernetes.d.ts +9 -0
  28. package/dist/pipeline/createAllJobs.d.ts +8 -0
  29. package/dist/pipeline/createAllJobs.js +164 -0
  30. package/dist/pipeline/createChildPipeline.js +24 -48
  31. package/dist/pipeline/createJobsForComponent.d.ts +3 -0
  32. package/dist/pipeline/{createJobs.js → createJobsForComponent.js} +8 -105
  33. package/dist/pipeline/gitlab/createGitlabJobs.d.ts +14 -0
  34. package/dist/pipeline/gitlab/createGitlabJobs.js +260 -0
  35. package/dist/pipeline/index.d.ts +1 -1
  36. package/dist/pipeline/index.js +1 -1
  37. package/dist/tsconfig.tsbuildinfo +1 -1
  38. package/dist/types/config.d.ts +3 -3
  39. package/dist/types/context.d.ts +3 -1
  40. package/dist/types/environmentContext.d.ts +7 -0
  41. package/dist/types/gitlab-types.d.ts +5 -1
  42. package/dist/types/jobs.d.ts +9 -2
  43. package/dist/utils/gitlab.js +1 -1
  44. package/examples/__snapshots__/cloud-run-memory-limit.ts.snap +32 -32
  45. package/examples/__snapshots__/cloud-run-no-cpu-throttling.ts.snap +32 -32
  46. package/examples/__snapshots__/cloud-run-non-public.ts.snap +32 -32
  47. package/examples/__snapshots__/cloud-run-with-sql-reuse-db.ts.snap +3116 -0
  48. package/examples/__snapshots__/cloud-run-with-sql.ts.snap +65 -65
  49. package/examples/__snapshots__/custom-build-job.ts.snap +32 -32
  50. package/examples/__snapshots__/custom-deploy.ts.snap +1384 -0
  51. package/examples/__snapshots__/kubernetes-application-customization.ts.snap +2280 -0
  52. package/examples/__snapshots__/kubernetes-with-cloud-sql-legacy.ts.snap +2204 -0
  53. package/examples/__snapshots__/kubernetes-with-jobs.ts.snap +24 -24
  54. package/examples/__snapshots__/rails-k8s-with-worker.ts.snap +1911 -0
  55. package/examples/cloud-run-with-sql-reuse-db.ts +54 -0
  56. package/examples/custom-deploy.ts +25 -0
  57. package/examples/kubernetes-application-customization.ts +57 -0
  58. package/examples/kubernetes-with-cloud-sql-legacy.ts +33 -0
  59. package/examples/rails-k8s-with-worker.ts +95 -0
  60. package/package.json +1 -1
  61. package/src/build/custom/buildJob.ts +1 -0
  62. package/src/build/docker.ts +13 -6
  63. package/src/build/index.ts +7 -1
  64. package/src/build/node/cache.ts +2 -2
  65. package/src/build/rails/build.ts +20 -10
  66. package/src/build/rails/index.ts +2 -2
  67. package/src/build/rails/test.ts +43 -39
  68. package/src/build/types.ts +40 -5
  69. package/src/config/configruedEnvs.ts +2 -8
  70. package/src/context/getEnvironment.ts +1 -0
  71. package/src/context/getEnvironmentContext.ts +6 -6
  72. package/src/context/getEnvironmentVariables.ts +9 -4
  73. package/src/deploy/base.ts +1 -1
  74. package/src/deploy/cloudRun/deployJob.ts +1 -1
  75. package/src/deploy/cloudRun/index.ts +12 -4
  76. package/src/deploy/custom/deployJob.ts +9 -1
  77. package/src/deploy/index.ts +4 -1
  78. package/src/deploy/kubernetes/additionalSecretKeys.ts +1 -1
  79. package/src/deploy/kubernetes/deployJob.ts +2 -1
  80. package/src/deploy/kubernetes/kubeValues.ts +7 -5
  81. package/src/deploy/types/custom.ts +2 -1
  82. package/src/deploy/types/googleCloudRun.ts +6 -1
  83. package/src/deploy/types/kubernetes.ts +11 -1
  84. package/src/pipeline/createAllJobs.ts +38 -0
  85. package/src/pipeline/createChildPipeline.ts +6 -22
  86. package/src/pipeline/createJobsForComponent.ts +64 -0
  87. package/src/pipeline/gitlab/createGitlabJobs.ts +149 -0
  88. package/src/pipeline/index.ts +1 -1
  89. package/src/types/context.ts +3 -1
  90. package/src/types/environmentContext.ts +7 -0
  91. package/src/types/gitlab-types.ts +10 -3
  92. package/src/types/jobs.ts +11 -2
  93. package/src/utils/gitlab.ts +1 -1
  94. package/dist/pipeline/createJobs.d.ts +0 -3
  95. package/dist/pipeline/gitlab/makeGitlabJob.d.ts +0 -10
  96. package/dist/pipeline/gitlab/makeGitlabJob.js +0 -44
  97. package/src/pipeline/createJobs.ts +0 -199
  98. package/src/pipeline/gitlab/makeGitlabJob.ts +0 -23
@@ -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
+ "GCLOUD_RUN_canonicalHostSuffix": "$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix",
116
+ "HOST": "pan-test-app-dev-api-unknown-host.example.com",
117
+ "HOST_CANONICAL": "pan-test-app-dev-api-unknown-host.example.com",
118
+ "KUBERNETES_CPU_LIMIT": "2",
119
+ "KUBERNETES_CPU_REQUEST": "0.5",
120
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
121
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
122
+ "ROOT_URL": "https://pan-test-app-dev-api-unknown-host.example.com",
123
+ "_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","GCLOUD_RUN_canonicalHostSuffix"]",
124
+ },
125
+ },
126
+ "api 🔨 docker | dev ": {
127
+ "cache": [
128
+ {
129
+ "key": "api-yarn",
130
+ "paths": [
131
+ "api/.yarn",
132
+ ],
133
+ "policy": "pull",
134
+ },
135
+ ],
136
+ "environment": undefined,
137
+ "image": "path/to/docker/docker-build:the-version",
138
+ "interruptible": true,
139
+ "needs": [
140
+ "api 🔨 app | dev ",
141
+ ],
142
+ "retry": {
143
+ "max": 2,
144
+ "when": [
145
+ "runner_system_failure",
146
+ "stuck_or_timeout_failure",
147
+ ],
148
+ },
149
+ "script": [
150
+ "ensureNodeDockerfile",
151
+ "docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY",
152
+ "docker version",
153
+ "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",
154
+ "docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
155
+ "docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE",
156
+ "docker push $DOCKER_CACHE_IMAGE",
157
+ ],
158
+ "services": [
159
+ {
160
+ "command": [
161
+ "--tls=false",
162
+ ],
163
+ "name": "docker:20-dind",
164
+ },
165
+ ],
166
+ "stage": "build",
167
+ "variables": {
168
+ "APP_DIR": "api",
169
+ "DOCKERFILE_ADDITIONS": undefined,
170
+ "DOCKERFILE_ADDITIONS_END": undefined,
171
+ "DOCKER_BUILDKIT": "1",
172
+ "DOCKER_CACHE_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/caches/api",
173
+ "DOCKER_COPY_WORKSPACE_FILES": "COPY --chown=node:node api/package.json /app/api/package.json
174
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock",
175
+ "DOCKER_DIR": ".",
176
+ "DOCKER_DRIVER": "overlay2",
177
+ "DOCKER_HOST": "tcp://0.0.0.0:2375",
178
+ "DOCKER_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/$DOCKER_IMAGE_NAME",
179
+ "DOCKER_IMAGE_NAME": "dev/api",
180
+ "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
181
+ "DOCKER_REGISTRY": "$CI_REGISTRY",
182
+ "DOCKER_REGISTRY_IMAGE_PATH": "$CI_REGISTRY_IMAGE",
183
+ "DOCKER_TLS_CERTDIR": "",
184
+ "KUBERNETES_CPU_LIMIT": "1",
185
+ "KUBERNETES_CPU_REQUEST": "0.5",
186
+ "KUBERNETES_MEMORY_LIMIT": "2Gi",
187
+ "KUBERNETES_MEMORY_REQUEST": "1Gi",
188
+ "YARN_INSTALL": "yarn plugin import workspace-tools && yarn workspaces focus --production && yarn rebuild",
189
+ "YARN_INSTALL_WITHOUT_SCRIPTS": "YARN_ENABLE_SCRIPTS=false yarn plugin import workspace-tools && yarn workspaces focus --production && yarn rebuild",
190
+ },
191
+ },
192
+ "api 🚀 Deploy | dev ": {
193
+ "allow_failure": false,
194
+ "artifacts": {
195
+ "paths": [
196
+ "____envvars.yaml",
197
+ ],
198
+ },
199
+ "environment": {
200
+ "auto_stop_in": "4 weeks",
201
+ "name": "dev/api",
202
+ "on_stop": "api 🛑 Stop ⚠️ | dev ",
203
+ "url": "https://pan-test-app-dev-api-unknown-host.example.com",
204
+ },
205
+ "image": "path/to/docker/gcloud:the-version",
206
+ "interruptible": true,
207
+ "needs": [
208
+ {
209
+ "artifacts": false,
210
+ "job": "api 👮 lint",
211
+ },
212
+ {
213
+ "artifacts": false,
214
+ "job": "api 🔨 app | dev ",
215
+ },
216
+ {
217
+ "artifacts": false,
218
+ "job": "api 🔨 docker | dev ",
219
+ },
220
+ {
221
+ "artifacts": false,
222
+ "job": "api 🧪 test",
223
+ },
224
+ {
225
+ "artifacts": false,
226
+ "job": "api 🛡 audit",
227
+ },
228
+ ],
229
+ "retry": {
230
+ "max": 2,
231
+ "when": [
232
+ "runner_system_failure",
233
+ "stuck_or_timeout_failure",
234
+ ],
235
+ },
236
+ "rules": [
237
+ {
238
+ "when": "on_success",
239
+ },
240
+ ],
241
+ "script": [
242
+ "echo $CL_dev_api_GCLOUD_DEPLOY_credentialsKey > ./____keyfile.json
243
+ ",
244
+ "gcloud auth activate-service-account --key-file="./____keyfile.json"",
245
+ "export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe google-project-id --format="value(projectNumber)")",
246
+ "echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"",
247
+ "docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY",
248
+ "gcloud auth configure-docker europe-west6-docker.pkg.dev",
249
+ "docker pull $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
250
+ "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",
251
+ "docker push europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG",
252
+ "echo "$ENV_VARS" > ____envvars.yaml",
253
+ "set +e",
254
+ "echo "ensuring Database..."",
255
+ "gcloud sql databases create pan-test-app-dev-api --instance=instancename --project projectId",
256
+ "set -e",
257
+ "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",
258
+ "docker image rm europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG",
259
+ ],
260
+ "services": [
261
+ {
262
+ "command": [
263
+ "--tls=false",
264
+ ],
265
+ "name": "docker:20-dind",
266
+ },
267
+ ],
268
+ "stage": "deploy dev",
269
+ "variables": {
270
+ "APP_DIR": "api",
271
+ "CLOUDSDK_CORE_DISABLE_PROMPTS": "1",
272
+ "CLOUD_SQL_INSTANCE_CONNECTION_NAME": "projectId:region:instancename",
273
+ "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",
274
+ "DATABASE_URL": "postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME",
275
+ "DB_NAME": "pan-test-app-dev-api",
276
+ "DB_PASSWORD": "$CL_dev_api_DB_PASSWORD",
277
+ "DB_USER": "my-user",
278
+ "DOCKER_BUILDKIT": "1",
279
+ "DOCKER_CACHE_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/caches/api",
280
+ "DOCKER_DRIVER": "overlay2",
281
+ "DOCKER_HOST": "tcp://0.0.0.0:2375",
282
+ "DOCKER_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/$DOCKER_IMAGE_NAME",
283
+ "DOCKER_IMAGE_NAME": "dev/api",
284
+ "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
285
+ "DOCKER_REGISTRY": "$CI_REGISTRY",
286
+ "DOCKER_REGISTRY_IMAGE_PATH": "$CI_REGISTRY_IMAGE",
287
+ "DOCKER_TLS_CERTDIR": "",
288
+ "ENV_SHORT": "dev",
289
+ "ENV_TYPE": "dev",
290
+ "ENV_VARS": "ENV_SHORT: 'dev'
291
+ APP_DIR: 'api'
292
+ ENV_TYPE: 'dev'
293
+ HOST: 'pan-test-app-dev-api-unknown-host.example.com'
294
+ ROOT_URL: 'https://pan-test-app-dev-api-unknown-host.example.com'
295
+ HOST_CANONICAL: 'pan-test-app-dev-api-unknown-host.example.com'
296
+ CLOUD_SQL_INSTANCE_CONNECTION_NAME: 'projectId:region:instancename'
297
+ DB_NAME: 'pan-test-app-dev-api'
298
+ DB_USER: 'my-user'
299
+ DB_PASSWORD: '$CL_dev_api_DB_PASSWORD'
300
+ DATABASE_URL: 'postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME'
301
+ 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'
302
+ GCLOUD_RUN_canonicalHostSuffix: '$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix'
303
+ _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","GCLOUD_RUN_canonicalHostSuffix"]'
304
+ ",
305
+ "GCLOUD_DEPLOY_credentialsKey": "$CL_dev_api_GCLOUD_DEPLOY_credentialsKey",
306
+ "GCLOUD_RUN_canonicalHostSuffix": "$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix",
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": "500Mi",
312
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
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","GCLOUD_RUN_canonicalHostSuffix"]",
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
+ "GCLOUD_RUN_canonicalHostSuffix": "$CL_dev_worker_GCLOUD_RUN_canonicalHostSuffix",
537
+ "HOST": "pan-test-app-dev-worker-unknown-host.example.com",
538
+ "HOST_CANONICAL": "pan-test-app-dev-worker-unknown-host.example.com",
539
+ "KUBERNETES_CPU_LIMIT": "2",
540
+ "KUBERNETES_CPU_REQUEST": "0.5",
541
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
542
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
543
+ "ROOT_URL": "https://pan-test-app-dev-worker-unknown-host.example.com",
544
+ "_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","GCLOUD_RUN_canonicalHostSuffix"]",
545
+ },
546
+ },
547
+ "worker 🔨 docker | dev ": {
548
+ "cache": [
549
+ {
550
+ "key": "api-yarn",
551
+ "paths": [
552
+ "api/.yarn",
553
+ ],
554
+ "policy": "pull",
555
+ },
556
+ ],
557
+ "environment": undefined,
558
+ "image": "path/to/docker/docker-build:the-version",
559
+ "interruptible": true,
560
+ "needs": [
561
+ "worker 🔨 app | dev ",
562
+ ],
563
+ "retry": {
564
+ "max": 2,
565
+ "when": [
566
+ "runner_system_failure",
567
+ "stuck_or_timeout_failure",
568
+ ],
569
+ },
570
+ "script": [
571
+ "ensureNodeDockerfile",
572
+ "docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY",
573
+ "docker version",
574
+ "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",
575
+ "docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
576
+ "docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE",
577
+ "docker push $DOCKER_CACHE_IMAGE",
578
+ ],
579
+ "services": [
580
+ {
581
+ "command": [
582
+ "--tls=false",
583
+ ],
584
+ "name": "docker:20-dind",
585
+ },
586
+ ],
587
+ "stage": "build",
588
+ "variables": {
589
+ "APP_DIR": "api",
590
+ "DOCKERFILE_ADDITIONS": undefined,
591
+ "DOCKERFILE_ADDITIONS_END": undefined,
592
+ "DOCKER_BUILDKIT": "1",
593
+ "DOCKER_CACHE_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/caches/worker",
594
+ "DOCKER_COPY_WORKSPACE_FILES": "COPY --chown=node:node api/package.json /app/api/package.json
595
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock",
596
+ "DOCKER_DIR": ".",
597
+ "DOCKER_DRIVER": "overlay2",
598
+ "DOCKER_HOST": "tcp://0.0.0.0:2375",
599
+ "DOCKER_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/$DOCKER_IMAGE_NAME",
600
+ "DOCKER_IMAGE_NAME": "dev/worker",
601
+ "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
602
+ "DOCKER_REGISTRY": "$CI_REGISTRY",
603
+ "DOCKER_REGISTRY_IMAGE_PATH": "$CI_REGISTRY_IMAGE",
604
+ "DOCKER_TLS_CERTDIR": "",
605
+ "KUBERNETES_CPU_LIMIT": "1",
606
+ "KUBERNETES_CPU_REQUEST": "0.5",
607
+ "KUBERNETES_MEMORY_LIMIT": "2Gi",
608
+ "KUBERNETES_MEMORY_REQUEST": "1Gi",
609
+ "YARN_INSTALL": "yarn plugin import workspace-tools && yarn workspaces focus --production && yarn rebuild",
610
+ "YARN_INSTALL_WITHOUT_SCRIPTS": "YARN_ENABLE_SCRIPTS=false yarn plugin import workspace-tools && yarn workspaces focus --production && yarn rebuild",
611
+ },
612
+ },
613
+ "worker 🚀 Deploy | dev ": {
614
+ "allow_failure": false,
615
+ "artifacts": {
616
+ "paths": [
617
+ "____envvars.yaml",
618
+ ],
619
+ },
620
+ "environment": {
621
+ "auto_stop_in": "4 weeks",
622
+ "name": "dev/worker",
623
+ "on_stop": "worker 🛑 Stop ⚠️ | dev ",
624
+ "url": "https://pan-test-app-dev-worker-unknown-host.example.com",
625
+ },
626
+ "image": "path/to/docker/gcloud:the-version",
627
+ "interruptible": true,
628
+ "needs": [
629
+ {
630
+ "artifacts": false,
631
+ "job": "worker 👮 lint",
632
+ },
633
+ {
634
+ "artifacts": false,
635
+ "job": "worker 🔨 app | dev ",
636
+ },
637
+ {
638
+ "artifacts": false,
639
+ "job": "worker 🔨 docker | dev ",
640
+ },
641
+ {
642
+ "artifacts": false,
643
+ "job": "worker 🧪 test",
644
+ },
645
+ {
646
+ "artifacts": false,
647
+ "job": "worker 🛡 audit",
648
+ },
649
+ ],
650
+ "retry": {
651
+ "max": 2,
652
+ "when": [
653
+ "runner_system_failure",
654
+ "stuck_or_timeout_failure",
655
+ ],
656
+ },
657
+ "rules": [
658
+ {
659
+ "when": "on_success",
660
+ },
661
+ ],
662
+ "script": [
663
+ "echo $CL_dev_worker_GCLOUD_DEPLOY_credentialsKey > ./____keyfile.json
664
+ ",
665
+ "gcloud auth activate-service-account --key-file="./____keyfile.json"",
666
+ "export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe google-project-id --format="value(projectNumber)")",
667
+ "echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"",
668
+ "docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY",
669
+ "gcloud auth configure-docker europe-west6-docker.pkg.dev",
670
+ "docker pull $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
671
+ "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",
672
+ "docker push europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG",
673
+ "echo "$ENV_VARS" > ____envvars.yaml",
674
+ "set +e",
675
+ "echo "ensuring Database..."",
676
+ "gcloud sql databases create pan-test-app-dev-api --instance=instancename --project projectId",
677
+ "set -e",
678
+ "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",
679
+ "docker image rm europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG",
680
+ ],
681
+ "services": [
682
+ {
683
+ "command": [
684
+ "--tls=false",
685
+ ],
686
+ "name": "docker:20-dind",
687
+ },
688
+ ],
689
+ "stage": "deploy dev",
690
+ "variables": {
691
+ "APP_DIR": "api",
692
+ "CLOUDSDK_CORE_DISABLE_PROMPTS": "1",
693
+ "CLOUD_SQL_INSTANCE_CONNECTION_NAME": "projectId:region:instancename",
694
+ "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",
695
+ "DATABASE_URL": "postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME",
696
+ "DB_NAME": "pan-test-app-dev-api",
697
+ "DB_PASSWORD": "$CL_dev_api_DB_PASSWORD",
698
+ "DB_USER": "my-user",
699
+ "DOCKER_BUILDKIT": "1",
700
+ "DOCKER_CACHE_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/caches/worker",
701
+ "DOCKER_DRIVER": "overlay2",
702
+ "DOCKER_HOST": "tcp://0.0.0.0:2375",
703
+ "DOCKER_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/$DOCKER_IMAGE_NAME",
704
+ "DOCKER_IMAGE_NAME": "dev/worker",
705
+ "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
706
+ "DOCKER_REGISTRY": "$CI_REGISTRY",
707
+ "DOCKER_REGISTRY_IMAGE_PATH": "$CI_REGISTRY_IMAGE",
708
+ "DOCKER_TLS_CERTDIR": "",
709
+ "ENV_SHORT": "dev",
710
+ "ENV_TYPE": "dev",
711
+ "ENV_VARS": "ENV_SHORT: 'dev'
712
+ APP_DIR: 'api'
713
+ ENV_TYPE: 'dev'
714
+ HOST: 'pan-test-app-dev-worker-unknown-host.example.com'
715
+ ROOT_URL: 'https://pan-test-app-dev-worker-unknown-host.example.com'
716
+ HOST_CANONICAL: 'pan-test-app-dev-worker-unknown-host.example.com'
717
+ CLOUD_SQL_INSTANCE_CONNECTION_NAME: 'projectId:region:instancename'
718
+ DB_NAME: 'pan-test-app-dev-api'
719
+ DB_USER: 'my-user'
720
+ DB_PASSWORD: '$CL_dev_api_DB_PASSWORD'
721
+ DATABASE_URL: 'postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME'
722
+ 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'
723
+ GCLOUD_RUN_canonicalHostSuffix: '$CL_dev_worker_GCLOUD_RUN_canonicalHostSuffix'
724
+ _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","GCLOUD_RUN_canonicalHostSuffix"]'
725
+ ",
726
+ "GCLOUD_DEPLOY_credentialsKey": "$CL_dev_worker_GCLOUD_DEPLOY_credentialsKey",
727
+ "GCLOUD_RUN_canonicalHostSuffix": "$CL_dev_worker_GCLOUD_RUN_canonicalHostSuffix",
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": "500Mi",
733
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
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","GCLOUD_RUN_canonicalHostSuffix"]",
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
+ "GCLOUD_RUN_canonicalHostSuffix": "$CL_review_api_GCLOUD_RUN_canonicalHostSuffix",
1030
+ "HOST": "pan-test-app-review-mr1234-api-unknown-host.example.com",
1031
+ "HOST_CANONICAL": "pan-test-app-review-mr1234-api-unknown-host.example.com",
1032
+ "KUBERNETES_CPU_LIMIT": "2",
1033
+ "KUBERNETES_CPU_REQUEST": "0.5",
1034
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
1035
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
1036
+ "ROOT_URL": "https://pan-test-app-review-mr1234-api-unknown-host.example.com",
1037
+ "_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","GCLOUD_RUN_canonicalHostSuffix"]",
1038
+ },
1039
+ },
1040
+ "api 🔨 docker | review ": {
1041
+ "cache": [
1042
+ {
1043
+ "key": "api-yarn",
1044
+ "paths": [
1045
+ "api/.yarn",
1046
+ ],
1047
+ "policy": "pull",
1048
+ },
1049
+ ],
1050
+ "environment": undefined,
1051
+ "image": "path/to/docker/docker-build:the-version",
1052
+ "interruptible": true,
1053
+ "needs": [
1054
+ "api 🔨 app | review ",
1055
+ ],
1056
+ "retry": {
1057
+ "max": 2,
1058
+ "when": [
1059
+ "runner_system_failure",
1060
+ "stuck_or_timeout_failure",
1061
+ ],
1062
+ },
1063
+ "script": [
1064
+ "ensureNodeDockerfile",
1065
+ "docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY",
1066
+ "docker version",
1067
+ "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",
1068
+ "docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
1069
+ "docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE",
1070
+ "docker push $DOCKER_CACHE_IMAGE",
1071
+ ],
1072
+ "services": [
1073
+ {
1074
+ "command": [
1075
+ "--tls=false",
1076
+ ],
1077
+ "name": "docker:20-dind",
1078
+ },
1079
+ ],
1080
+ "stage": "build",
1081
+ "variables": {
1082
+ "APP_DIR": "api",
1083
+ "DOCKERFILE_ADDITIONS": undefined,
1084
+ "DOCKERFILE_ADDITIONS_END": undefined,
1085
+ "DOCKER_BUILDKIT": "1",
1086
+ "DOCKER_CACHE_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/caches/api",
1087
+ "DOCKER_COPY_WORKSPACE_FILES": "COPY --chown=node:node api/package.json /app/api/package.json
1088
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock",
1089
+ "DOCKER_DIR": ".",
1090
+ "DOCKER_DRIVER": "overlay2",
1091
+ "DOCKER_HOST": "tcp://0.0.0.0:2375",
1092
+ "DOCKER_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/$DOCKER_IMAGE_NAME",
1093
+ "DOCKER_IMAGE_NAME": "review/api",
1094
+ "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
1095
+ "DOCKER_REGISTRY": "$CI_REGISTRY",
1096
+ "DOCKER_REGISTRY_IMAGE_PATH": "$CI_REGISTRY_IMAGE",
1097
+ "DOCKER_TLS_CERTDIR": "",
1098
+ "KUBERNETES_CPU_LIMIT": "1",
1099
+ "KUBERNETES_CPU_REQUEST": "0.5",
1100
+ "KUBERNETES_MEMORY_LIMIT": "2Gi",
1101
+ "KUBERNETES_MEMORY_REQUEST": "1Gi",
1102
+ "YARN_INSTALL": "yarn plugin import workspace-tools && yarn workspaces focus --production && yarn rebuild",
1103
+ "YARN_INSTALL_WITHOUT_SCRIPTS": "YARN_ENABLE_SCRIPTS=false yarn plugin import workspace-tools && yarn workspaces focus --production && yarn rebuild",
1104
+ },
1105
+ },
1106
+ "api 🚀 Deploy | review ": {
1107
+ "allow_failure": false,
1108
+ "artifacts": {
1109
+ "paths": [
1110
+ "____envvars.yaml",
1111
+ ],
1112
+ },
1113
+ "environment": {
1114
+ "auto_stop_in": "2 week",
1115
+ "name": "review/some-commit/api",
1116
+ "on_stop": "api 🛑 Stop ⚠️ | review ",
1117
+ "url": "https://pan-test-app-review-mr1234-api-unknown-host.example.com",
1118
+ },
1119
+ "image": "path/to/docker/gcloud:the-version",
1120
+ "interruptible": true,
1121
+ "needs": [
1122
+ {
1123
+ "artifacts": false,
1124
+ "job": "api 👮 lint",
1125
+ },
1126
+ {
1127
+ "artifacts": false,
1128
+ "job": "api 🔨 app | review ",
1129
+ },
1130
+ {
1131
+ "artifacts": false,
1132
+ "job": "api 🔨 docker | review ",
1133
+ },
1134
+ {
1135
+ "artifacts": false,
1136
+ "job": "api 🧪 test",
1137
+ },
1138
+ {
1139
+ "artifacts": false,
1140
+ "job": "api 🛡 audit",
1141
+ },
1142
+ ],
1143
+ "retry": {
1144
+ "max": 2,
1145
+ "when": [
1146
+ "runner_system_failure",
1147
+ "stuck_or_timeout_failure",
1148
+ ],
1149
+ },
1150
+ "rules": [
1151
+ {
1152
+ "when": "on_success",
1153
+ },
1154
+ ],
1155
+ "script": [
1156
+ "echo $CL_review_api_GCLOUD_DEPLOY_credentialsKey > ./____keyfile.json
1157
+ ",
1158
+ "gcloud auth activate-service-account --key-file="./____keyfile.json"",
1159
+ "export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe google-project-id --format="value(projectNumber)")",
1160
+ "echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"",
1161
+ "docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY",
1162
+ "gcloud auth configure-docker europe-west6-docker.pkg.dev",
1163
+ "docker pull $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
1164
+ "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",
1165
+ "docker push europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG",
1166
+ "echo "$ENV_VARS" > ____envvars.yaml",
1167
+ "set +e",
1168
+ "echo "ensuring Database..."",
1169
+ "gcloud sql databases create pan-test-app-review-mr1234-api --instance=instancename --project projectId",
1170
+ "set -e",
1171
+ "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",
1172
+ "docker image rm europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG",
1173
+ ],
1174
+ "services": [
1175
+ {
1176
+ "command": [
1177
+ "--tls=false",
1178
+ ],
1179
+ "name": "docker:20-dind",
1180
+ },
1181
+ ],
1182
+ "stage": "deploy review",
1183
+ "variables": {
1184
+ "APP_DIR": "api",
1185
+ "CLOUDSDK_CORE_DISABLE_PROMPTS": "1",
1186
+ "CLOUD_SQL_INSTANCE_CONNECTION_NAME": "projectId:region:instancename",
1187
+ "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",
1188
+ "DATABASE_URL": "postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME",
1189
+ "DB_NAME": "pan-test-app-review-mr1234-api",
1190
+ "DB_PASSWORD": "$CL_review_api_DB_PASSWORD",
1191
+ "DB_USER": "my-user",
1192
+ "DOCKER_BUILDKIT": "1",
1193
+ "DOCKER_CACHE_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/caches/api",
1194
+ "DOCKER_DRIVER": "overlay2",
1195
+ "DOCKER_HOST": "tcp://0.0.0.0:2375",
1196
+ "DOCKER_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/$DOCKER_IMAGE_NAME",
1197
+ "DOCKER_IMAGE_NAME": "review/api",
1198
+ "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
1199
+ "DOCKER_REGISTRY": "$CI_REGISTRY",
1200
+ "DOCKER_REGISTRY_IMAGE_PATH": "$CI_REGISTRY_IMAGE",
1201
+ "DOCKER_TLS_CERTDIR": "",
1202
+ "ENV_SHORT": "review",
1203
+ "ENV_TYPE": "review",
1204
+ "ENV_VARS": "ENV_SHORT: 'review'
1205
+ APP_DIR: 'api'
1206
+ ENV_TYPE: 'review'
1207
+ HOST: 'pan-test-app-review-mr1234-api-unknown-host.example.com'
1208
+ ROOT_URL: 'https://pan-test-app-review-mr1234-api-unknown-host.example.com'
1209
+ HOST_CANONICAL: 'pan-test-app-review-mr1234-api-unknown-host.example.com'
1210
+ CLOUD_SQL_INSTANCE_CONNECTION_NAME: 'projectId:region:instancename'
1211
+ DB_NAME: 'pan-test-app-review-mr1234-api'
1212
+ DB_USER: 'my-user'
1213
+ DB_PASSWORD: '$CL_review_api_DB_PASSWORD'
1214
+ DATABASE_URL: 'postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME'
1215
+ 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'
1216
+ GCLOUD_RUN_canonicalHostSuffix: '$CL_review_api_GCLOUD_RUN_canonicalHostSuffix'
1217
+ _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","GCLOUD_RUN_canonicalHostSuffix"]'
1218
+ ",
1219
+ "GCLOUD_DEPLOY_credentialsKey": "$CL_review_api_GCLOUD_DEPLOY_credentialsKey",
1220
+ "GCLOUD_RUN_canonicalHostSuffix": "$CL_review_api_GCLOUD_RUN_canonicalHostSuffix",
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": "500Mi",
1226
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
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","GCLOUD_RUN_canonicalHostSuffix"]",
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
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
+ "GCLOUD_RUN_canonicalHostSuffix": "$CL_review_worker_GCLOUD_RUN_canonicalHostSuffix",
1460
+ "HOST": "pan-test-app-review-mr1234-worker-unknown-host.example.com",
1461
+ "HOST_CANONICAL": "pan-test-app-review-mr1234-worker-unknown-host.example.com",
1462
+ "KUBERNETES_CPU_LIMIT": "2",
1463
+ "KUBERNETES_CPU_REQUEST": "0.5",
1464
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
1465
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
1466
+ "ROOT_URL": "https://pan-test-app-review-mr1234-worker-unknown-host.example.com",
1467
+ "_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","GCLOUD_RUN_canonicalHostSuffix"]",
1468
+ },
1469
+ },
1470
+ "worker 🔨 docker | review ": {
1471
+ "cache": [
1472
+ {
1473
+ "key": "api-yarn",
1474
+ "paths": [
1475
+ "api/.yarn",
1476
+ ],
1477
+ "policy": "pull",
1478
+ },
1479
+ ],
1480
+ "environment": undefined,
1481
+ "image": "path/to/docker/docker-build:the-version",
1482
+ "interruptible": true,
1483
+ "needs": [
1484
+ "worker 🔨 app | review ",
1485
+ ],
1486
+ "retry": {
1487
+ "max": 2,
1488
+ "when": [
1489
+ "runner_system_failure",
1490
+ "stuck_or_timeout_failure",
1491
+ ],
1492
+ },
1493
+ "script": [
1494
+ "ensureNodeDockerfile",
1495
+ "docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY",
1496
+ "docker version",
1497
+ "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",
1498
+ "docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
1499
+ "docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE",
1500
+ "docker push $DOCKER_CACHE_IMAGE",
1501
+ ],
1502
+ "services": [
1503
+ {
1504
+ "command": [
1505
+ "--tls=false",
1506
+ ],
1507
+ "name": "docker:20-dind",
1508
+ },
1509
+ ],
1510
+ "stage": "build",
1511
+ "variables": {
1512
+ "APP_DIR": "api",
1513
+ "DOCKERFILE_ADDITIONS": undefined,
1514
+ "DOCKERFILE_ADDITIONS_END": undefined,
1515
+ "DOCKER_BUILDKIT": "1",
1516
+ "DOCKER_CACHE_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/caches/worker",
1517
+ "DOCKER_COPY_WORKSPACE_FILES": "COPY --chown=node:node api/package.json /app/api/package.json
1518
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock",
1519
+ "DOCKER_DIR": ".",
1520
+ "DOCKER_DRIVER": "overlay2",
1521
+ "DOCKER_HOST": "tcp://0.0.0.0:2375",
1522
+ "DOCKER_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/$DOCKER_IMAGE_NAME",
1523
+ "DOCKER_IMAGE_NAME": "review/worker",
1524
+ "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
1525
+ "DOCKER_REGISTRY": "$CI_REGISTRY",
1526
+ "DOCKER_REGISTRY_IMAGE_PATH": "$CI_REGISTRY_IMAGE",
1527
+ "DOCKER_TLS_CERTDIR": "",
1528
+ "KUBERNETES_CPU_LIMIT": "1",
1529
+ "KUBERNETES_CPU_REQUEST": "0.5",
1530
+ "KUBERNETES_MEMORY_LIMIT": "2Gi",
1531
+ "KUBERNETES_MEMORY_REQUEST": "1Gi",
1532
+ "YARN_INSTALL": "yarn plugin import workspace-tools && yarn workspaces focus --production && yarn rebuild",
1533
+ "YARN_INSTALL_WITHOUT_SCRIPTS": "YARN_ENABLE_SCRIPTS=false yarn plugin import workspace-tools && yarn workspaces focus --production && yarn rebuild",
1534
+ },
1535
+ },
1536
+ "worker 🚀 Deploy | review ": {
1537
+ "allow_failure": false,
1538
+ "artifacts": {
1539
+ "paths": [
1540
+ "____envvars.yaml",
1541
+ ],
1542
+ },
1543
+ "environment": {
1544
+ "auto_stop_in": "2 week",
1545
+ "name": "review/some-commit/worker",
1546
+ "on_stop": "worker 🛑 Stop ⚠️ | review ",
1547
+ "url": "https://pan-test-app-review-mr1234-worker-unknown-host.example.com",
1548
+ },
1549
+ "image": "path/to/docker/gcloud:the-version",
1550
+ "interruptible": true,
1551
+ "needs": [
1552
+ {
1553
+ "artifacts": false,
1554
+ "job": "worker 👮 lint",
1555
+ },
1556
+ {
1557
+ "artifacts": false,
1558
+ "job": "worker 🔨 app | review ",
1559
+ },
1560
+ {
1561
+ "artifacts": false,
1562
+ "job": "worker 🔨 docker | review ",
1563
+ },
1564
+ {
1565
+ "artifacts": false,
1566
+ "job": "worker 🧪 test",
1567
+ },
1568
+ {
1569
+ "artifacts": false,
1570
+ "job": "worker 🛡 audit",
1571
+ },
1572
+ ],
1573
+ "retry": {
1574
+ "max": 2,
1575
+ "when": [
1576
+ "runner_system_failure",
1577
+ "stuck_or_timeout_failure",
1578
+ ],
1579
+ },
1580
+ "rules": [
1581
+ {
1582
+ "when": "on_success",
1583
+ },
1584
+ ],
1585
+ "script": [
1586
+ "echo $CL_review_worker_GCLOUD_DEPLOY_credentialsKey > ./____keyfile.json
1587
+ ",
1588
+ "gcloud auth activate-service-account --key-file="./____keyfile.json"",
1589
+ "export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe google-project-id --format="value(projectNumber)")",
1590
+ "echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"",
1591
+ "docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY",
1592
+ "gcloud auth configure-docker europe-west6-docker.pkg.dev",
1593
+ "docker pull $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
1594
+ "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",
1595
+ "docker push europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG",
1596
+ "echo "$ENV_VARS" > ____envvars.yaml",
1597
+ "set +e",
1598
+ "echo "ensuring Database..."",
1599
+ "gcloud sql databases create pan-test-app-review-mr1234-api --instance=instancename --project projectId",
1600
+ "set -e",
1601
+ "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",
1602
+ "docker image rm europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG",
1603
+ ],
1604
+ "services": [
1605
+ {
1606
+ "command": [
1607
+ "--tls=false",
1608
+ ],
1609
+ "name": "docker:20-dind",
1610
+ },
1611
+ ],
1612
+ "stage": "deploy review",
1613
+ "variables": {
1614
+ "APP_DIR": "api",
1615
+ "CLOUDSDK_CORE_DISABLE_PROMPTS": "1",
1616
+ "CLOUD_SQL_INSTANCE_CONNECTION_NAME": "projectId:region:instancename",
1617
+ "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",
1618
+ "DATABASE_URL": "postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME",
1619
+ "DB_NAME": "pan-test-app-review-mr1234-api",
1620
+ "DB_PASSWORD": "$CL_review_api_DB_PASSWORD",
1621
+ "DB_USER": "my-user",
1622
+ "DOCKER_BUILDKIT": "1",
1623
+ "DOCKER_CACHE_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/caches/worker",
1624
+ "DOCKER_DRIVER": "overlay2",
1625
+ "DOCKER_HOST": "tcp://0.0.0.0:2375",
1626
+ "DOCKER_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/$DOCKER_IMAGE_NAME",
1627
+ "DOCKER_IMAGE_NAME": "review/worker",
1628
+ "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
1629
+ "DOCKER_REGISTRY": "$CI_REGISTRY",
1630
+ "DOCKER_REGISTRY_IMAGE_PATH": "$CI_REGISTRY_IMAGE",
1631
+ "DOCKER_TLS_CERTDIR": "",
1632
+ "ENV_SHORT": "review",
1633
+ "ENV_TYPE": "review",
1634
+ "ENV_VARS": "ENV_SHORT: 'review'
1635
+ APP_DIR: 'api'
1636
+ ENV_TYPE: 'review'
1637
+ HOST: 'pan-test-app-review-mr1234-worker-unknown-host.example.com'
1638
+ ROOT_URL: 'https://pan-test-app-review-mr1234-worker-unknown-host.example.com'
1639
+ HOST_CANONICAL: 'pan-test-app-review-mr1234-worker-unknown-host.example.com'
1640
+ CLOUD_SQL_INSTANCE_CONNECTION_NAME: 'projectId:region:instancename'
1641
+ DB_NAME: 'pan-test-app-review-mr1234-api'
1642
+ DB_USER: 'my-user'
1643
+ DB_PASSWORD: '$CL_review_api_DB_PASSWORD'
1644
+ DATABASE_URL: 'postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME'
1645
+ 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'
1646
+ GCLOUD_RUN_canonicalHostSuffix: '$CL_review_worker_GCLOUD_RUN_canonicalHostSuffix'
1647
+ _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","GCLOUD_RUN_canonicalHostSuffix"]'
1648
+ ",
1649
+ "GCLOUD_DEPLOY_credentialsKey": "$CL_review_worker_GCLOUD_DEPLOY_credentialsKey",
1650
+ "GCLOUD_RUN_canonicalHostSuffix": "$CL_review_worker_GCLOUD_RUN_canonicalHostSuffix",
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": "500Mi",
1656
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
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","GCLOUD_RUN_canonicalHostSuffix"]",
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
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
+ "GCLOUD_RUN_canonicalHostSuffix": "$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix",
1920
+ "HOST": "pan-test-app-prod-api-unknown-host.example.com",
1921
+ "HOST_CANONICAL": "pan-test-app-prod-api-unknown-host.example.com",
1922
+ "KUBERNETES_CPU_LIMIT": "2",
1923
+ "KUBERNETES_CPU_REQUEST": "0.5",
1924
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
1925
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
1926
+ "ROOT_URL": "https://pan-test-app-prod-api-unknown-host.example.com",
1927
+ "_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","GCLOUD_RUN_canonicalHostSuffix"]",
1928
+ },
1929
+ },
1930
+ "api 🔨 app | stage ": {
1931
+ "artifacts": {
1932
+ "paths": [
1933
+ "api/__build_info.json",
1934
+ "api/dist",
1935
+ "api/.next",
1936
+ ],
1937
+ "reports": {
1938
+ "junit": undefined,
1939
+ },
1940
+ },
1941
+ "cache": [
1942
+ {
1943
+ "key": "api-yarn",
1944
+ "paths": [
1945
+ "api/.yarn",
1946
+ ],
1947
+ "policy": "pull-push",
1948
+ },
1949
+ {
1950
+ "key": "api-node-modules",
1951
+ "paths": [
1952
+ "api/node_modules",
1953
+ ],
1954
+ "policy": "pull-push",
1955
+ },
1956
+ {
1957
+ "key": "api-next-cache",
1958
+ "paths": [
1959
+ "api/.next/cache/",
1960
+ ],
1961
+ "policy": "pull-push",
1962
+ },
1963
+ ],
1964
+ "environment": undefined,
1965
+ "image": "path/to/docker/jobs-default:the-version",
1966
+ "interruptible": true,
1967
+ "needs": [],
1968
+ "retry": {
1969
+ "max": 2,
1970
+ "when": [
1971
+ "runner_system_failure",
1972
+ "stuck_or_timeout_failure",
1973
+ ],
1974
+ },
1975
+ "script": [
1976
+ "echo '{"id":"some-id","time":"01-01-2023 12:13:14"}' > api/__build_info.json",
1977
+ "if [ -f ./.nvmrc ]; then source /root/.nvm/nvm.sh && nvm install <<< .nvmrc; fi",
1978
+ "cd api",
1979
+ "if [ -f ./.nvmrc ]; then source /root/.nvm/nvm.sh && nvm install <<< .nvmrc; fi",
1980
+ "yarn install --immutable",
1981
+ "yarn build",
1982
+ ],
1983
+ "stage": "build",
1984
+ "variables": {
1985
+ "APP_DIR": "api",
1986
+ "CLOUD_SQL_INSTANCE_CONNECTION_NAME": "projectId:region:instancename",
1987
+ "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",
1988
+ "DATABASE_URL": "postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME",
1989
+ "DB_NAME": "pan-test-app-stage-api",
1990
+ "DB_PASSWORD": "$CL_stage_api_DB_PASSWORD",
1991
+ "DB_USER": "my-user",
1992
+ "ENV_SHORT": "stage",
1993
+ "ENV_TYPE": "stage",
1994
+ "GCLOUD_DEPLOY_credentialsKey": "$CL_stage_api_GCLOUD_DEPLOY_credentialsKey",
1995
+ "GCLOUD_RUN_canonicalHostSuffix": "$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix",
1996
+ "HOST": "pan-test-app-stage-api-unknown-host.example.com",
1997
+ "HOST_CANONICAL": "pan-test-app-stage-api-unknown-host.example.com",
1998
+ "KUBERNETES_CPU_LIMIT": "2",
1999
+ "KUBERNETES_CPU_REQUEST": "0.5",
2000
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
2001
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
2002
+ "ROOT_URL": "https://pan-test-app-stage-api-unknown-host.example.com",
2003
+ "_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","GCLOUD_RUN_canonicalHostSuffix"]",
2004
+ },
2005
+ },
2006
+ "api 🔨 docker | prod ": {
2007
+ "cache": [
2008
+ {
2009
+ "key": "api-yarn",
2010
+ "paths": [
2011
+ "api/.yarn",
2012
+ ],
2013
+ "policy": "pull",
2014
+ },
2015
+ ],
2016
+ "environment": undefined,
2017
+ "image": "path/to/docker/docker-build:the-version",
2018
+ "interruptible": true,
2019
+ "needs": [
2020
+ "api 🔨 app | prod ",
2021
+ ],
2022
+ "retry": {
2023
+ "max": 2,
2024
+ "when": [
2025
+ "runner_system_failure",
2026
+ "stuck_or_timeout_failure",
2027
+ ],
2028
+ },
2029
+ "script": [
2030
+ "ensureNodeDockerfile",
2031
+ "docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY",
2032
+ "docker version",
2033
+ "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",
2034
+ "docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
2035
+ "docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE",
2036
+ "docker push $DOCKER_CACHE_IMAGE",
2037
+ ],
2038
+ "services": [
2039
+ {
2040
+ "command": [
2041
+ "--tls=false",
2042
+ ],
2043
+ "name": "docker:20-dind",
2044
+ },
2045
+ ],
2046
+ "stage": "build",
2047
+ "variables": {
2048
+ "APP_DIR": "api",
2049
+ "DOCKERFILE_ADDITIONS": undefined,
2050
+ "DOCKERFILE_ADDITIONS_END": undefined,
2051
+ "DOCKER_BUILDKIT": "1",
2052
+ "DOCKER_CACHE_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/caches/api",
2053
+ "DOCKER_COPY_WORKSPACE_FILES": "COPY --chown=node:node api/package.json /app/api/package.json
2054
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock",
2055
+ "DOCKER_DIR": ".",
2056
+ "DOCKER_DRIVER": "overlay2",
2057
+ "DOCKER_HOST": "tcp://0.0.0.0:2375",
2058
+ "DOCKER_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/$DOCKER_IMAGE_NAME",
2059
+ "DOCKER_IMAGE_NAME": "prod/api",
2060
+ "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
2061
+ "DOCKER_REGISTRY": "$CI_REGISTRY",
2062
+ "DOCKER_REGISTRY_IMAGE_PATH": "$CI_REGISTRY_IMAGE",
2063
+ "DOCKER_TLS_CERTDIR": "",
2064
+ "KUBERNETES_CPU_LIMIT": "1",
2065
+ "KUBERNETES_CPU_REQUEST": "0.5",
2066
+ "KUBERNETES_MEMORY_LIMIT": "2Gi",
2067
+ "KUBERNETES_MEMORY_REQUEST": "1Gi",
2068
+ "YARN_INSTALL": "yarn plugin import workspace-tools && yarn workspaces focus --production && yarn rebuild",
2069
+ "YARN_INSTALL_WITHOUT_SCRIPTS": "YARN_ENABLE_SCRIPTS=false yarn plugin import workspace-tools && yarn workspaces focus --production && yarn rebuild",
2070
+ },
2071
+ },
2072
+ "api 🔨 docker | stage ": {
2073
+ "cache": [
2074
+ {
2075
+ "key": "api-yarn",
2076
+ "paths": [
2077
+ "api/.yarn",
2078
+ ],
2079
+ "policy": "pull",
2080
+ },
2081
+ ],
2082
+ "environment": undefined,
2083
+ "image": "path/to/docker/docker-build:the-version",
2084
+ "interruptible": true,
2085
+ "needs": [
2086
+ "api 🔨 app | stage ",
2087
+ ],
2088
+ "retry": {
2089
+ "max": 2,
2090
+ "when": [
2091
+ "runner_system_failure",
2092
+ "stuck_or_timeout_failure",
2093
+ ],
2094
+ },
2095
+ "script": [
2096
+ "ensureNodeDockerfile",
2097
+ "docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY",
2098
+ "docker version",
2099
+ "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",
2100
+ "docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
2101
+ "docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE",
2102
+ "docker push $DOCKER_CACHE_IMAGE",
2103
+ ],
2104
+ "services": [
2105
+ {
2106
+ "command": [
2107
+ "--tls=false",
2108
+ ],
2109
+ "name": "docker:20-dind",
2110
+ },
2111
+ ],
2112
+ "stage": "build",
2113
+ "variables": {
2114
+ "APP_DIR": "api",
2115
+ "DOCKERFILE_ADDITIONS": undefined,
2116
+ "DOCKERFILE_ADDITIONS_END": undefined,
2117
+ "DOCKER_BUILDKIT": "1",
2118
+ "DOCKER_CACHE_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/caches/api",
2119
+ "DOCKER_COPY_WORKSPACE_FILES": "COPY --chown=node:node api/package.json /app/api/package.json
2120
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock",
2121
+ "DOCKER_DIR": ".",
2122
+ "DOCKER_DRIVER": "overlay2",
2123
+ "DOCKER_HOST": "tcp://0.0.0.0:2375",
2124
+ "DOCKER_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/$DOCKER_IMAGE_NAME",
2125
+ "DOCKER_IMAGE_NAME": "stage/api",
2126
+ "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
2127
+ "DOCKER_REGISTRY": "$CI_REGISTRY",
2128
+ "DOCKER_REGISTRY_IMAGE_PATH": "$CI_REGISTRY_IMAGE",
2129
+ "DOCKER_TLS_CERTDIR": "",
2130
+ "KUBERNETES_CPU_LIMIT": "1",
2131
+ "KUBERNETES_CPU_REQUEST": "0.5",
2132
+ "KUBERNETES_MEMORY_LIMIT": "2Gi",
2133
+ "KUBERNETES_MEMORY_REQUEST": "1Gi",
2134
+ "YARN_INSTALL": "yarn plugin import workspace-tools && yarn workspaces focus --production && yarn rebuild",
2135
+ "YARN_INSTALL_WITHOUT_SCRIPTS": "YARN_ENABLE_SCRIPTS=false yarn plugin import workspace-tools && yarn workspaces focus --production && yarn rebuild",
2136
+ },
2137
+ },
2138
+ "api 🚀 Deploy | prod ": {
2139
+ "allow_failure": true,
2140
+ "artifacts": {
2141
+ "paths": [
2142
+ "____envvars.yaml",
2143
+ ],
2144
+ },
2145
+ "environment": {
2146
+ "auto_stop_in": undefined,
2147
+ "name": "prod/api",
2148
+ "on_stop": "api 🛑 Stop ⚠️ | prod ",
2149
+ "url": "https://pan-test-app-prod-api-unknown-host.example.com",
2150
+ },
2151
+ "image": "path/to/docker/gcloud:the-version",
2152
+ "interruptible": true,
2153
+ "needs": [
2154
+ {
2155
+ "artifacts": false,
2156
+ "job": "api 🔨 app | prod ",
2157
+ },
2158
+ {
2159
+ "artifacts": false,
2160
+ "job": "api 🔨 docker | prod ",
2161
+ },
2162
+ ],
2163
+ "retry": {
2164
+ "max": 2,
2165
+ "when": [
2166
+ "runner_system_failure",
2167
+ "stuck_or_timeout_failure",
2168
+ ],
2169
+ },
2170
+ "rules": [
2171
+ {
2172
+ "when": "manual",
2173
+ },
2174
+ ],
2175
+ "script": [
2176
+ "echo $CL_prod_api_GCLOUD_DEPLOY_credentialsKey > ./____keyfile.json
2177
+ ",
2178
+ "gcloud auth activate-service-account --key-file="./____keyfile.json"",
2179
+ "export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe google-project-id --format="value(projectNumber)")",
2180
+ "echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"",
2181
+ "docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY",
2182
+ "gcloud auth configure-docker europe-west6-docker.pkg.dev",
2183
+ "docker pull $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
2184
+ "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",
2185
+ "docker push europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG",
2186
+ "echo "$ENV_VARS" > ____envvars.yaml",
2187
+ "set +e",
2188
+ "echo "ensuring Database..."",
2189
+ "gcloud sql databases create pan-test-app-prod-api --instance=instancename --project projectId",
2190
+ "set -e",
2191
+ "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",
2192
+ "docker image rm europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG",
2193
+ ],
2194
+ "services": [
2195
+ {
2196
+ "command": [
2197
+ "--tls=false",
2198
+ ],
2199
+ "name": "docker:20-dind",
2200
+ },
2201
+ ],
2202
+ "stage": "deploy prod",
2203
+ "variables": {
2204
+ "APP_DIR": "api",
2205
+ "CLOUDSDK_CORE_DISABLE_PROMPTS": "1",
2206
+ "CLOUD_SQL_INSTANCE_CONNECTION_NAME": "projectId:region:instancename",
2207
+ "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",
2208
+ "DATABASE_URL": "postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME",
2209
+ "DB_NAME": "pan-test-app-prod-api",
2210
+ "DB_PASSWORD": "$CL_prod_api_DB_PASSWORD",
2211
+ "DB_USER": "my-user",
2212
+ "DOCKER_BUILDKIT": "1",
2213
+ "DOCKER_CACHE_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/caches/api",
2214
+ "DOCKER_DRIVER": "overlay2",
2215
+ "DOCKER_HOST": "tcp://0.0.0.0:2375",
2216
+ "DOCKER_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/$DOCKER_IMAGE_NAME",
2217
+ "DOCKER_IMAGE_NAME": "prod/api",
2218
+ "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
2219
+ "DOCKER_REGISTRY": "$CI_REGISTRY",
2220
+ "DOCKER_REGISTRY_IMAGE_PATH": "$CI_REGISTRY_IMAGE",
2221
+ "DOCKER_TLS_CERTDIR": "",
2222
+ "ENV_SHORT": "prod",
2223
+ "ENV_TYPE": "prod",
2224
+ "ENV_VARS": "ENV_SHORT: 'prod'
2225
+ APP_DIR: 'api'
2226
+ ENV_TYPE: 'prod'
2227
+ HOST: 'pan-test-app-prod-api-unknown-host.example.com'
2228
+ ROOT_URL: 'https://pan-test-app-prod-api-unknown-host.example.com'
2229
+ HOST_CANONICAL: 'pan-test-app-prod-api-unknown-host.example.com'
2230
+ CLOUD_SQL_INSTANCE_CONNECTION_NAME: 'projectId:region:instancename'
2231
+ DB_NAME: 'pan-test-app-prod-api'
2232
+ DB_USER: 'my-user'
2233
+ DB_PASSWORD: '$CL_prod_api_DB_PASSWORD'
2234
+ DATABASE_URL: 'postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME'
2235
+ 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'
2236
+ GCLOUD_RUN_canonicalHostSuffix: '$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix'
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","GCLOUD_RUN_canonicalHostSuffix"]'
2238
+ ",
2239
+ "GCLOUD_DEPLOY_credentialsKey": "$CL_prod_api_GCLOUD_DEPLOY_credentialsKey",
2240
+ "GCLOUD_RUN_canonicalHostSuffix": "$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix",
2241
+ "HOST": "pan-test-app-prod-api-unknown-host.example.com",
2242
+ "HOST_CANONICAL": "pan-test-app-prod-api-unknown-host.example.com",
2243
+ "KUBERNETES_CPU_LIMIT": "1",
2244
+ "KUBERNETES_CPU_REQUEST": "0.5",
2245
+ "KUBERNETES_MEMORY_LIMIT": "500Mi",
2246
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
2247
+ "ROOT_URL": "https://pan-test-app-prod-api-unknown-host.example.com",
2248
+ "_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","GCLOUD_RUN_canonicalHostSuffix"]",
2249
+ },
2250
+ },
2251
+ "api 🚀 Deploy | stage ": {
2252
+ "allow_failure": false,
2253
+ "artifacts": {
2254
+ "paths": [
2255
+ "____envvars.yaml",
2256
+ ],
2257
+ },
2258
+ "environment": {
2259
+ "auto_stop_in": undefined,
2260
+ "name": "stage/api",
2261
+ "on_stop": "api 🛑 Stop ⚠️ | stage ",
2262
+ "url": "https://pan-test-app-stage-api-unknown-host.example.com",
2263
+ },
2264
+ "image": "path/to/docker/gcloud:the-version",
2265
+ "interruptible": true,
2266
+ "needs": [
2267
+ {
2268
+ "artifacts": false,
2269
+ "job": "api 🔨 app | stage ",
2270
+ },
2271
+ {
2272
+ "artifacts": false,
2273
+ "job": "api 🔨 docker | stage ",
2274
+ },
2275
+ ],
2276
+ "retry": {
2277
+ "max": 2,
2278
+ "when": [
2279
+ "runner_system_failure",
2280
+ "stuck_or_timeout_failure",
2281
+ ],
2282
+ },
2283
+ "rules": [
2284
+ {
2285
+ "when": "on_success",
2286
+ },
2287
+ ],
2288
+ "script": [
2289
+ "echo $CL_stage_api_GCLOUD_DEPLOY_credentialsKey > ./____keyfile.json
2290
+ ",
2291
+ "gcloud auth activate-service-account --key-file="./____keyfile.json"",
2292
+ "export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe google-project-id --format="value(projectNumber)")",
2293
+ "echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"",
2294
+ "docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY",
2295
+ "gcloud auth configure-docker europe-west6-docker.pkg.dev",
2296
+ "docker pull $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
2297
+ "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",
2298
+ "docker push europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG",
2299
+ "echo "$ENV_VARS" > ____envvars.yaml",
2300
+ "set +e",
2301
+ "echo "ensuring Database..."",
2302
+ "gcloud sql databases create pan-test-app-stage-api --instance=instancename --project projectId",
2303
+ "set -e",
2304
+ "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",
2305
+ "docker image rm europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG",
2306
+ ],
2307
+ "services": [
2308
+ {
2309
+ "command": [
2310
+ "--tls=false",
2311
+ ],
2312
+ "name": "docker:20-dind",
2313
+ },
2314
+ ],
2315
+ "stage": "deploy stage",
2316
+ "variables": {
2317
+ "APP_DIR": "api",
2318
+ "CLOUDSDK_CORE_DISABLE_PROMPTS": "1",
2319
+ "CLOUD_SQL_INSTANCE_CONNECTION_NAME": "projectId:region:instancename",
2320
+ "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",
2321
+ "DATABASE_URL": "postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME",
2322
+ "DB_NAME": "pan-test-app-stage-api",
2323
+ "DB_PASSWORD": "$CL_stage_api_DB_PASSWORD",
2324
+ "DB_USER": "my-user",
2325
+ "DOCKER_BUILDKIT": "1",
2326
+ "DOCKER_CACHE_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/caches/api",
2327
+ "DOCKER_DRIVER": "overlay2",
2328
+ "DOCKER_HOST": "tcp://0.0.0.0:2375",
2329
+ "DOCKER_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/$DOCKER_IMAGE_NAME",
2330
+ "DOCKER_IMAGE_NAME": "stage/api",
2331
+ "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
2332
+ "DOCKER_REGISTRY": "$CI_REGISTRY",
2333
+ "DOCKER_REGISTRY_IMAGE_PATH": "$CI_REGISTRY_IMAGE",
2334
+ "DOCKER_TLS_CERTDIR": "",
2335
+ "ENV_SHORT": "stage",
2336
+ "ENV_TYPE": "stage",
2337
+ "ENV_VARS": "ENV_SHORT: 'stage'
2338
+ APP_DIR: 'api'
2339
+ ENV_TYPE: 'stage'
2340
+ HOST: 'pan-test-app-stage-api-unknown-host.example.com'
2341
+ ROOT_URL: 'https://pan-test-app-stage-api-unknown-host.example.com'
2342
+ HOST_CANONICAL: 'pan-test-app-stage-api-unknown-host.example.com'
2343
+ CLOUD_SQL_INSTANCE_CONNECTION_NAME: 'projectId:region:instancename'
2344
+ DB_NAME: 'pan-test-app-stage-api'
2345
+ DB_USER: 'my-user'
2346
+ DB_PASSWORD: '$CL_stage_api_DB_PASSWORD'
2347
+ DATABASE_URL: 'postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME'
2348
+ 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'
2349
+ GCLOUD_RUN_canonicalHostSuffix: '$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix'
2350
+ _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","GCLOUD_RUN_canonicalHostSuffix"]'
2351
+ ",
2352
+ "GCLOUD_DEPLOY_credentialsKey": "$CL_stage_api_GCLOUD_DEPLOY_credentialsKey",
2353
+ "GCLOUD_RUN_canonicalHostSuffix": "$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix",
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": "500Mi",
2359
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
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","GCLOUD_RUN_canonicalHostSuffix"]",
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
+ "GCLOUD_RUN_canonicalHostSuffix": "$CL_prod_worker_GCLOUD_RUN_canonicalHostSuffix",
2516
+ "HOST": "pan-test-app-prod-worker-unknown-host.example.com",
2517
+ "HOST_CANONICAL": "pan-test-app-prod-worker-unknown-host.example.com",
2518
+ "KUBERNETES_CPU_LIMIT": "2",
2519
+ "KUBERNETES_CPU_REQUEST": "0.5",
2520
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
2521
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
2522
+ "ROOT_URL": "https://pan-test-app-prod-worker-unknown-host.example.com",
2523
+ "_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","GCLOUD_RUN_canonicalHostSuffix"]",
2524
+ },
2525
+ },
2526
+ "worker 🔨 app | stage ": {
2527
+ "artifacts": {
2528
+ "paths": [
2529
+ "api/__build_info.json",
2530
+ "api/dist",
2531
+ "api/.next",
2532
+ ],
2533
+ "reports": {
2534
+ "junit": undefined,
2535
+ },
2536
+ },
2537
+ "cache": [
2538
+ {
2539
+ "key": "api-yarn",
2540
+ "paths": [
2541
+ "api/.yarn",
2542
+ ],
2543
+ "policy": "pull-push",
2544
+ },
2545
+ {
2546
+ "key": "api-node-modules",
2547
+ "paths": [
2548
+ "api/node_modules",
2549
+ ],
2550
+ "policy": "pull-push",
2551
+ },
2552
+ {
2553
+ "key": "worker-next-cache",
2554
+ "paths": [
2555
+ "api/.next/cache/",
2556
+ ],
2557
+ "policy": "pull-push",
2558
+ },
2559
+ ],
2560
+ "environment": undefined,
2561
+ "image": "path/to/docker/jobs-default:the-version",
2562
+ "interruptible": true,
2563
+ "needs": [],
2564
+ "retry": {
2565
+ "max": 2,
2566
+ "when": [
2567
+ "runner_system_failure",
2568
+ "stuck_or_timeout_failure",
2569
+ ],
2570
+ },
2571
+ "script": [
2572
+ "echo '{"id":"some-id","time":"01-01-2023 12:13:14"}' > api/__build_info.json",
2573
+ "if [ -f ./.nvmrc ]; then source /root/.nvm/nvm.sh && nvm install <<< .nvmrc; fi",
2574
+ "cd api",
2575
+ "if [ -f ./.nvmrc ]; then source /root/.nvm/nvm.sh && nvm install <<< .nvmrc; fi",
2576
+ "yarn install --immutable",
2577
+ "yarn build:worker",
2578
+ ],
2579
+ "stage": "build",
2580
+ "variables": {
2581
+ "APP_DIR": "api",
2582
+ "CLOUD_SQL_INSTANCE_CONNECTION_NAME": "projectId:region:instancename",
2583
+ "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",
2584
+ "DATABASE_URL": "postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME",
2585
+ "DB_NAME": "pan-test-app-stage-api",
2586
+ "DB_PASSWORD": "$CL_stage_api_DB_PASSWORD",
2587
+ "DB_USER": "my-user",
2588
+ "ENV_SHORT": "stage",
2589
+ "ENV_TYPE": "stage",
2590
+ "GCLOUD_DEPLOY_credentialsKey": "$CL_stage_worker_GCLOUD_DEPLOY_credentialsKey",
2591
+ "GCLOUD_RUN_canonicalHostSuffix": "$CL_stage_worker_GCLOUD_RUN_canonicalHostSuffix",
2592
+ "HOST": "pan-test-app-stage-worker-unknown-host.example.com",
2593
+ "HOST_CANONICAL": "pan-test-app-stage-worker-unknown-host.example.com",
2594
+ "KUBERNETES_CPU_LIMIT": "2",
2595
+ "KUBERNETES_CPU_REQUEST": "0.5",
2596
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
2597
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
2598
+ "ROOT_URL": "https://pan-test-app-stage-worker-unknown-host.example.com",
2599
+ "_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","GCLOUD_RUN_canonicalHostSuffix"]",
2600
+ },
2601
+ },
2602
+ "worker 🔨 docker | prod ": {
2603
+ "cache": [
2604
+ {
2605
+ "key": "api-yarn",
2606
+ "paths": [
2607
+ "api/.yarn",
2608
+ ],
2609
+ "policy": "pull",
2610
+ },
2611
+ ],
2612
+ "environment": undefined,
2613
+ "image": "path/to/docker/docker-build:the-version",
2614
+ "interruptible": true,
2615
+ "needs": [
2616
+ "worker 🔨 app | prod ",
2617
+ ],
2618
+ "retry": {
2619
+ "max": 2,
2620
+ "when": [
2621
+ "runner_system_failure",
2622
+ "stuck_or_timeout_failure",
2623
+ ],
2624
+ },
2625
+ "script": [
2626
+ "ensureNodeDockerfile",
2627
+ "docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY",
2628
+ "docker version",
2629
+ "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",
2630
+ "docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
2631
+ "docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE",
2632
+ "docker push $DOCKER_CACHE_IMAGE",
2633
+ ],
2634
+ "services": [
2635
+ {
2636
+ "command": [
2637
+ "--tls=false",
2638
+ ],
2639
+ "name": "docker:20-dind",
2640
+ },
2641
+ ],
2642
+ "stage": "build",
2643
+ "variables": {
2644
+ "APP_DIR": "api",
2645
+ "DOCKERFILE_ADDITIONS": undefined,
2646
+ "DOCKERFILE_ADDITIONS_END": undefined,
2647
+ "DOCKER_BUILDKIT": "1",
2648
+ "DOCKER_CACHE_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/caches/worker",
2649
+ "DOCKER_COPY_WORKSPACE_FILES": "COPY --chown=node:node api/package.json /app/api/package.json
2650
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock",
2651
+ "DOCKER_DIR": ".",
2652
+ "DOCKER_DRIVER": "overlay2",
2653
+ "DOCKER_HOST": "tcp://0.0.0.0:2375",
2654
+ "DOCKER_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/$DOCKER_IMAGE_NAME",
2655
+ "DOCKER_IMAGE_NAME": "prod/worker",
2656
+ "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
2657
+ "DOCKER_REGISTRY": "$CI_REGISTRY",
2658
+ "DOCKER_REGISTRY_IMAGE_PATH": "$CI_REGISTRY_IMAGE",
2659
+ "DOCKER_TLS_CERTDIR": "",
2660
+ "KUBERNETES_CPU_LIMIT": "1",
2661
+ "KUBERNETES_CPU_REQUEST": "0.5",
2662
+ "KUBERNETES_MEMORY_LIMIT": "2Gi",
2663
+ "KUBERNETES_MEMORY_REQUEST": "1Gi",
2664
+ "YARN_INSTALL": "yarn plugin import workspace-tools && yarn workspaces focus --production && yarn rebuild",
2665
+ "YARN_INSTALL_WITHOUT_SCRIPTS": "YARN_ENABLE_SCRIPTS=false yarn plugin import workspace-tools && yarn workspaces focus --production && yarn rebuild",
2666
+ },
2667
+ },
2668
+ "worker 🔨 docker | stage ": {
2669
+ "cache": [
2670
+ {
2671
+ "key": "api-yarn",
2672
+ "paths": [
2673
+ "api/.yarn",
2674
+ ],
2675
+ "policy": "pull",
2676
+ },
2677
+ ],
2678
+ "environment": undefined,
2679
+ "image": "path/to/docker/docker-build:the-version",
2680
+ "interruptible": true,
2681
+ "needs": [
2682
+ "worker 🔨 app | stage ",
2683
+ ],
2684
+ "retry": {
2685
+ "max": 2,
2686
+ "when": [
2687
+ "runner_system_failure",
2688
+ "stuck_or_timeout_failure",
2689
+ ],
2690
+ },
2691
+ "script": [
2692
+ "ensureNodeDockerfile",
2693
+ "docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY",
2694
+ "docker version",
2695
+ "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",
2696
+ "docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
2697
+ "docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE",
2698
+ "docker push $DOCKER_CACHE_IMAGE",
2699
+ ],
2700
+ "services": [
2701
+ {
2702
+ "command": [
2703
+ "--tls=false",
2704
+ ],
2705
+ "name": "docker:20-dind",
2706
+ },
2707
+ ],
2708
+ "stage": "build",
2709
+ "variables": {
2710
+ "APP_DIR": "api",
2711
+ "DOCKERFILE_ADDITIONS": undefined,
2712
+ "DOCKERFILE_ADDITIONS_END": undefined,
2713
+ "DOCKER_BUILDKIT": "1",
2714
+ "DOCKER_CACHE_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/caches/worker",
2715
+ "DOCKER_COPY_WORKSPACE_FILES": "COPY --chown=node:node api/package.json /app/api/package.json
2716
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock",
2717
+ "DOCKER_DIR": ".",
2718
+ "DOCKER_DRIVER": "overlay2",
2719
+ "DOCKER_HOST": "tcp://0.0.0.0:2375",
2720
+ "DOCKER_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/$DOCKER_IMAGE_NAME",
2721
+ "DOCKER_IMAGE_NAME": "stage/worker",
2722
+ "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
2723
+ "DOCKER_REGISTRY": "$CI_REGISTRY",
2724
+ "DOCKER_REGISTRY_IMAGE_PATH": "$CI_REGISTRY_IMAGE",
2725
+ "DOCKER_TLS_CERTDIR": "",
2726
+ "KUBERNETES_CPU_LIMIT": "1",
2727
+ "KUBERNETES_CPU_REQUEST": "0.5",
2728
+ "KUBERNETES_MEMORY_LIMIT": "2Gi",
2729
+ "KUBERNETES_MEMORY_REQUEST": "1Gi",
2730
+ "YARN_INSTALL": "yarn plugin import workspace-tools && yarn workspaces focus --production && yarn rebuild",
2731
+ "YARN_INSTALL_WITHOUT_SCRIPTS": "YARN_ENABLE_SCRIPTS=false yarn plugin import workspace-tools && yarn workspaces focus --production && yarn rebuild",
2732
+ },
2733
+ },
2734
+ "worker 🚀 Deploy | prod ": {
2735
+ "allow_failure": true,
2736
+ "artifacts": {
2737
+ "paths": [
2738
+ "____envvars.yaml",
2739
+ ],
2740
+ },
2741
+ "environment": {
2742
+ "auto_stop_in": undefined,
2743
+ "name": "prod/worker",
2744
+ "on_stop": "worker 🛑 Stop ⚠️ | prod ",
2745
+ "url": "https://pan-test-app-prod-worker-unknown-host.example.com",
2746
+ },
2747
+ "image": "path/to/docker/gcloud:the-version",
2748
+ "interruptible": true,
2749
+ "needs": [
2750
+ {
2751
+ "artifacts": false,
2752
+ "job": "worker 🔨 app | prod ",
2753
+ },
2754
+ {
2755
+ "artifacts": false,
2756
+ "job": "worker 🔨 docker | prod ",
2757
+ },
2758
+ ],
2759
+ "retry": {
2760
+ "max": 2,
2761
+ "when": [
2762
+ "runner_system_failure",
2763
+ "stuck_or_timeout_failure",
2764
+ ],
2765
+ },
2766
+ "rules": [
2767
+ {
2768
+ "when": "manual",
2769
+ },
2770
+ ],
2771
+ "script": [
2772
+ "echo $CL_prod_worker_GCLOUD_DEPLOY_credentialsKey > ./____keyfile.json
2773
+ ",
2774
+ "gcloud auth activate-service-account --key-file="./____keyfile.json"",
2775
+ "export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe google-project-id --format="value(projectNumber)")",
2776
+ "echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"",
2777
+ "docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY",
2778
+ "gcloud auth configure-docker europe-west6-docker.pkg.dev",
2779
+ "docker pull $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
2780
+ "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",
2781
+ "docker push europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG",
2782
+ "echo "$ENV_VARS" > ____envvars.yaml",
2783
+ "set +e",
2784
+ "echo "ensuring Database..."",
2785
+ "gcloud sql databases create pan-test-app-prod-api --instance=instancename --project projectId",
2786
+ "set -e",
2787
+ "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",
2788
+ "docker image rm europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG",
2789
+ ],
2790
+ "services": [
2791
+ {
2792
+ "command": [
2793
+ "--tls=false",
2794
+ ],
2795
+ "name": "docker:20-dind",
2796
+ },
2797
+ ],
2798
+ "stage": "deploy prod",
2799
+ "variables": {
2800
+ "APP_DIR": "api",
2801
+ "CLOUDSDK_CORE_DISABLE_PROMPTS": "1",
2802
+ "CLOUD_SQL_INSTANCE_CONNECTION_NAME": "projectId:region:instancename",
2803
+ "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",
2804
+ "DATABASE_URL": "postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME",
2805
+ "DB_NAME": "pan-test-app-prod-api",
2806
+ "DB_PASSWORD": "$CL_prod_api_DB_PASSWORD",
2807
+ "DB_USER": "my-user",
2808
+ "DOCKER_BUILDKIT": "1",
2809
+ "DOCKER_CACHE_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/caches/worker",
2810
+ "DOCKER_DRIVER": "overlay2",
2811
+ "DOCKER_HOST": "tcp://0.0.0.0:2375",
2812
+ "DOCKER_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/$DOCKER_IMAGE_NAME",
2813
+ "DOCKER_IMAGE_NAME": "prod/worker",
2814
+ "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
2815
+ "DOCKER_REGISTRY": "$CI_REGISTRY",
2816
+ "DOCKER_REGISTRY_IMAGE_PATH": "$CI_REGISTRY_IMAGE",
2817
+ "DOCKER_TLS_CERTDIR": "",
2818
+ "ENV_SHORT": "prod",
2819
+ "ENV_TYPE": "prod",
2820
+ "ENV_VARS": "ENV_SHORT: 'prod'
2821
+ APP_DIR: 'api'
2822
+ ENV_TYPE: 'prod'
2823
+ HOST: 'pan-test-app-prod-worker-unknown-host.example.com'
2824
+ ROOT_URL: 'https://pan-test-app-prod-worker-unknown-host.example.com'
2825
+ HOST_CANONICAL: 'pan-test-app-prod-worker-unknown-host.example.com'
2826
+ CLOUD_SQL_INSTANCE_CONNECTION_NAME: 'projectId:region:instancename'
2827
+ DB_NAME: 'pan-test-app-prod-api'
2828
+ DB_USER: 'my-user'
2829
+ DB_PASSWORD: '$CL_prod_api_DB_PASSWORD'
2830
+ DATABASE_URL: 'postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME'
2831
+ 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'
2832
+ GCLOUD_RUN_canonicalHostSuffix: '$CL_prod_worker_GCLOUD_RUN_canonicalHostSuffix'
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","GCLOUD_RUN_canonicalHostSuffix"]'
2834
+ ",
2835
+ "GCLOUD_DEPLOY_credentialsKey": "$CL_prod_worker_GCLOUD_DEPLOY_credentialsKey",
2836
+ "GCLOUD_RUN_canonicalHostSuffix": "$CL_prod_worker_GCLOUD_RUN_canonicalHostSuffix",
2837
+ "HOST": "pan-test-app-prod-worker-unknown-host.example.com",
2838
+ "HOST_CANONICAL": "pan-test-app-prod-worker-unknown-host.example.com",
2839
+ "KUBERNETES_CPU_LIMIT": "1",
2840
+ "KUBERNETES_CPU_REQUEST": "0.5",
2841
+ "KUBERNETES_MEMORY_LIMIT": "500Mi",
2842
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
2843
+ "ROOT_URL": "https://pan-test-app-prod-worker-unknown-host.example.com",
2844
+ "_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","GCLOUD_RUN_canonicalHostSuffix"]",
2845
+ },
2846
+ },
2847
+ "worker 🚀 Deploy | stage ": {
2848
+ "allow_failure": false,
2849
+ "artifacts": {
2850
+ "paths": [
2851
+ "____envvars.yaml",
2852
+ ],
2853
+ },
2854
+ "environment": {
2855
+ "auto_stop_in": undefined,
2856
+ "name": "stage/worker",
2857
+ "on_stop": "worker 🛑 Stop ⚠️ | stage ",
2858
+ "url": "https://pan-test-app-stage-worker-unknown-host.example.com",
2859
+ },
2860
+ "image": "path/to/docker/gcloud:the-version",
2861
+ "interruptible": true,
2862
+ "needs": [
2863
+ {
2864
+ "artifacts": false,
2865
+ "job": "worker 🔨 app | stage ",
2866
+ },
2867
+ {
2868
+ "artifacts": false,
2869
+ "job": "worker 🔨 docker | stage ",
2870
+ },
2871
+ ],
2872
+ "retry": {
2873
+ "max": 2,
2874
+ "when": [
2875
+ "runner_system_failure",
2876
+ "stuck_or_timeout_failure",
2877
+ ],
2878
+ },
2879
+ "rules": [
2880
+ {
2881
+ "when": "on_success",
2882
+ },
2883
+ ],
2884
+ "script": [
2885
+ "echo $CL_stage_worker_GCLOUD_DEPLOY_credentialsKey > ./____keyfile.json
2886
+ ",
2887
+ "gcloud auth activate-service-account --key-file="./____keyfile.json"",
2888
+ "export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe google-project-id --format="value(projectNumber)")",
2889
+ "echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"",
2890
+ "docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY",
2891
+ "gcloud auth configure-docker europe-west6-docker.pkg.dev",
2892
+ "docker pull $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
2893
+ "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",
2894
+ "docker push europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG",
2895
+ "echo "$ENV_VARS" > ____envvars.yaml",
2896
+ "set +e",
2897
+ "echo "ensuring Database..."",
2898
+ "gcloud sql databases create pan-test-app-stage-api --instance=instancename --project projectId",
2899
+ "set -e",
2900
+ "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",
2901
+ "docker image rm europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG",
2902
+ ],
2903
+ "services": [
2904
+ {
2905
+ "command": [
2906
+ "--tls=false",
2907
+ ],
2908
+ "name": "docker:20-dind",
2909
+ },
2910
+ ],
2911
+ "stage": "deploy stage",
2912
+ "variables": {
2913
+ "APP_DIR": "api",
2914
+ "CLOUDSDK_CORE_DISABLE_PROMPTS": "1",
2915
+ "CLOUD_SQL_INSTANCE_CONNECTION_NAME": "projectId:region:instancename",
2916
+ "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",
2917
+ "DATABASE_URL": "postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME",
2918
+ "DB_NAME": "pan-test-app-stage-api",
2919
+ "DB_PASSWORD": "$CL_stage_api_DB_PASSWORD",
2920
+ "DB_USER": "my-user",
2921
+ "DOCKER_BUILDKIT": "1",
2922
+ "DOCKER_CACHE_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/caches/worker",
2923
+ "DOCKER_DRIVER": "overlay2",
2924
+ "DOCKER_HOST": "tcp://0.0.0.0:2375",
2925
+ "DOCKER_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/$DOCKER_IMAGE_NAME",
2926
+ "DOCKER_IMAGE_NAME": "stage/worker",
2927
+ "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
2928
+ "DOCKER_REGISTRY": "$CI_REGISTRY",
2929
+ "DOCKER_REGISTRY_IMAGE_PATH": "$CI_REGISTRY_IMAGE",
2930
+ "DOCKER_TLS_CERTDIR": "",
2931
+ "ENV_SHORT": "stage",
2932
+ "ENV_TYPE": "stage",
2933
+ "ENV_VARS": "ENV_SHORT: 'stage'
2934
+ APP_DIR: 'api'
2935
+ ENV_TYPE: 'stage'
2936
+ HOST: 'pan-test-app-stage-worker-unknown-host.example.com'
2937
+ ROOT_URL: 'https://pan-test-app-stage-worker-unknown-host.example.com'
2938
+ HOST_CANONICAL: 'pan-test-app-stage-worker-unknown-host.example.com'
2939
+ CLOUD_SQL_INSTANCE_CONNECTION_NAME: 'projectId:region:instancename'
2940
+ DB_NAME: 'pan-test-app-stage-api'
2941
+ DB_USER: 'my-user'
2942
+ DB_PASSWORD: '$CL_stage_api_DB_PASSWORD'
2943
+ DATABASE_URL: 'postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME'
2944
+ 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'
2945
+ GCLOUD_RUN_canonicalHostSuffix: '$CL_stage_worker_GCLOUD_RUN_canonicalHostSuffix'
2946
+ _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","GCLOUD_RUN_canonicalHostSuffix"]'
2947
+ ",
2948
+ "GCLOUD_DEPLOY_credentialsKey": "$CL_stage_worker_GCLOUD_DEPLOY_credentialsKey",
2949
+ "GCLOUD_RUN_canonicalHostSuffix": "$CL_stage_worker_GCLOUD_RUN_canonicalHostSuffix",
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": "500Mi",
2955
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
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","GCLOUD_RUN_canonicalHostSuffix"]",
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
+ `;