@catladder/pipeline 1.162.0 โ†’ 1.163.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. package/README.md +15 -1
  2. package/dist/build/types.d.ts +6 -0
  3. package/dist/bundles/catladder-gitlab/index.js +2 -2
  4. package/dist/constants.js +1 -1
  5. package/dist/pipeline/generatePipelineFiles.d.ts +38 -0
  6. package/dist/pipeline/generatePipelineFiles.js +44 -23
  7. package/dist/tsconfig.tsbuildinfo +1 -1
  8. package/examples/__snapshots__/cloud-run-memory-limit.test.ts.snap +1341 -0
  9. package/examples/__snapshots__/cloud-run-meteor-with-worker.test.ts.snap +1325 -0
  10. package/examples/__snapshots__/cloud-run-no-cpu-throttling.test.ts.snap +1341 -0
  11. package/examples/__snapshots__/cloud-run-no-service.test.ts.snap +1393 -0
  12. package/examples/__snapshots__/cloud-run-non-public.test.ts.snap +1341 -0
  13. package/examples/__snapshots__/cloud-run-post-stop-job.test.ts.snap +1352 -0
  14. package/examples/__snapshots__/cloud-run-service-gen2.test.ts.snap +1341 -0
  15. package/examples/__snapshots__/cloud-run-service-increase-timout.test.ts.snap +1341 -0
  16. package/examples/__snapshots__/cloud-run-service-with-volumes.test.ts.snap +1385 -0
  17. package/examples/__snapshots__/cloud-run-storybook.test.ts.snap +1233 -4
  18. package/examples/__snapshots__/cloud-run-with-ngnix.test.ts.snap +1349 -4
  19. package/examples/__snapshots__/cloud-run-with-sql-reuse-db.test.ts.snap +2825 -0
  20. package/examples/__snapshots__/cloud-run-with-sql.test.ts.snap +2572 -0
  21. package/examples/__snapshots__/cloud-run-with-worker.test.ts.snap +1349 -0
  22. package/examples/__snapshots__/custom-build-job-with-tests.test.ts.snap +1196 -0
  23. package/examples/__snapshots__/custom-build-job.test.ts.snap +1085 -0
  24. package/examples/__snapshots__/custom-deploy.test.ts.snap +1103 -0
  25. package/examples/__snapshots__/custom-envs.test.ts.snap +709 -0
  26. package/examples/__snapshots__/custom-sbom-java.test.ts.snap +1093 -0
  27. package/examples/__snapshots__/git-submodule.test.ts.snap +1342 -0
  28. package/examples/__snapshots__/kubernetes-application-customization.test.ts.snap +1778 -0
  29. package/examples/__snapshots__/kubernetes-with-cloud-sql-legacy.test.ts.snap +1790 -0
  30. package/examples/__snapshots__/kubernetes-with-cloud-sql.test.ts.snap +1798 -0
  31. package/examples/__snapshots__/kubernetes-with-jobs.test.ts.snap +3352 -0
  32. package/examples/__snapshots__/kubernetes-with-mongodb.test.ts.snap +1902 -0
  33. package/examples/__snapshots__/local-dot-env.test.ts.snap +1341 -0
  34. package/examples/__snapshots__/meteor-kubernetes.test.ts.snap +1839 -0
  35. package/examples/__snapshots__/multiline-var.test.ts.snap +3376 -0
  36. package/examples/__snapshots__/native-app.test.ts.snap +2149 -0
  37. package/examples/__snapshots__/node-build-with-custom-image.test.ts.snap +1341 -0
  38. package/examples/__snapshots__/node-build-with-docker-additions.test.ts.snap +1349 -0
  39. package/examples/__snapshots__/rails-k8s-with-worker.test.ts.snap +1470 -0
  40. package/examples/__snapshots__/wait-for-other-deploy.test.ts.snap +1275 -0
  41. package/examples/__utils__/helpers.ts +14 -1
  42. package/examples/cloud-run-memory-limit.test.ts +9 -1
  43. package/examples/cloud-run-meteor-with-worker.test.ts +9 -1
  44. package/examples/cloud-run-no-cpu-throttling.test.ts +9 -1
  45. package/examples/cloud-run-no-service.test.ts +9 -1
  46. package/examples/cloud-run-non-public.test.ts +9 -1
  47. package/examples/cloud-run-post-stop-job.test.ts +9 -1
  48. package/examples/cloud-run-service-gen2.test.ts +9 -1
  49. package/examples/cloud-run-service-increase-timout.test.ts +9 -1
  50. package/examples/cloud-run-service-with-volumes.test.ts +9 -1
  51. package/examples/cloud-run-storybook.test.ts +9 -1
  52. package/examples/cloud-run-storybook.ts +9 -1
  53. package/examples/cloud-run-with-ngnix.test.ts +9 -1
  54. package/examples/cloud-run-with-ngnix.ts +5 -1
  55. package/examples/cloud-run-with-sql-reuse-db.test.ts +9 -1
  56. package/examples/cloud-run-with-sql.test.ts +9 -1
  57. package/examples/cloud-run-with-worker.test.ts +9 -1
  58. package/examples/custom-build-job-with-tests.test.ts +9 -1
  59. package/examples/custom-build-job.test.ts +9 -1
  60. package/examples/custom-deploy.test.ts +9 -1
  61. package/examples/custom-envs.test.ts +9 -1
  62. package/examples/custom-sbom-java.test.ts +9 -1
  63. package/examples/git-submodule.test.ts +9 -1
  64. package/examples/kubernetes-application-customization.test.ts +9 -1
  65. package/examples/kubernetes-with-cloud-sql-legacy.test.ts +9 -1
  66. package/examples/kubernetes-with-cloud-sql.test.ts +9 -1
  67. package/examples/kubernetes-with-jobs.test.ts +9 -1
  68. package/examples/kubernetes-with-mongodb.test.ts +9 -1
  69. package/examples/local-dot-env.test.ts +9 -1
  70. package/examples/meteor-kubernetes.test.ts +9 -1
  71. package/examples/multiline-var.test.ts +9 -1
  72. package/examples/native-app.test.ts +9 -1
  73. package/examples/node-build-with-custom-image.test.ts +9 -1
  74. package/examples/node-build-with-docker-additions.test.ts +9 -1
  75. package/examples/rails-k8s-with-worker.test.ts +9 -1
  76. package/examples/wait-for-other-deploy.test.ts +9 -1
  77. package/package.json +4 -3
  78. package/scripts/generate-examples-test.ts +7 -5
  79. package/src/build/types.ts +6 -0
  80. package/src/pipeline/generatePipelineFiles.ts +61 -36
@@ -1,5 +1,2577 @@
1
1
  // Jest Snapshot v1, https://goo.gl/fbAQLP
2
2
 
3
+ exports[`matches snapshot for cloud-run-memory-limit local pipeline YAML 1`] = `
4
+ "image: path/to/docker/jobs-default:the-version
5
+ stages:
6
+ - setup
7
+ - setup dev
8
+ - setup review
9
+ - setup stage
10
+ - setup prod
11
+ - test
12
+ - test dev
13
+ - test review
14
+ - test stage
15
+ - test prod
16
+ - build
17
+ - build dev
18
+ - build review
19
+ - build stage
20
+ - build prod
21
+ - deploy
22
+ - deploy dev
23
+ - deploy review
24
+ - deploy stage
25
+ - deploy prod
26
+ - verify
27
+ - verify dev
28
+ - verify review
29
+ - verify stage
30
+ - verify prod
31
+ - rollback
32
+ - rollback dev
33
+ - rollback review
34
+ - rollback stage
35
+ - rollback prod
36
+ - stop
37
+ - stop dev
38
+ - stop review
39
+ - stop stage
40
+ - stop prod
41
+ - release
42
+ variables:
43
+ FF_USE_FASTZIP: 'true'
44
+ ARTIFACT_COMPRESSION_LEVEL: fast
45
+ CACHE_COMPRESSION_LEVEL: fast
46
+ TRANSFER_METER_FREQUENCY: 5s
47
+ GIT_DEPTH: '1'
48
+ ๐Ÿ”ธ myWorkspace ๐Ÿ›ก audit:
49
+ stage: test
50
+ image: path/to/docker/jobs-default:the-version
51
+ variables:
52
+ KUBERNETES_CPU_REQUEST: '0.45'
53
+ KUBERNETES_MEMORY_REQUEST: 1Gi
54
+ KUBERNETES_MEMORY_LIMIT: 4Gi
55
+ script:
56
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
57
+ - export APP_PATH="."
58
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
59
+ - cd .
60
+ - yarn npm audit --environment production
61
+ rules:
62
+ - when: never
63
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
64
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
65
+ - if: $CI_MERGE_REQUEST_ID
66
+ needs: []
67
+ retry: &a1
68
+ max: 2
69
+ when:
70
+ - runner_system_failure
71
+ - stuck_or_timeout_failure
72
+ interruptible: true
73
+ allow_failure: true
74
+ ๐Ÿ”ธ myWorkspace ๐Ÿ‘ฎ lint:
75
+ stage: test
76
+ image: path/to/docker/jobs-default:the-version
77
+ variables:
78
+ KUBERNETES_CPU_REQUEST: '0.45'
79
+ KUBERNETES_MEMORY_REQUEST: 1Gi
80
+ KUBERNETES_MEMORY_LIMIT: 4Gi
81
+ script:
82
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
83
+ - export APP_PATH="."
84
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
85
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
86
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
87
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
88
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
89
+ - cd .
90
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
91
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
92
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
93
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
94
+ - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
95
+ - yarn install --immutable
96
+ - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
97
+ - yarn lint
98
+ cache:
99
+ - key: .-yarn
100
+ policy: pull-push
101
+ paths:
102
+ - .yarn
103
+ - key: .-node-modules
104
+ policy: pull-push
105
+ paths:
106
+ - node_modules
107
+ - key: myWorkspace-turbo
108
+ policy: pull-push
109
+ paths:
110
+ - .turbo
111
+ rules:
112
+ - when: never
113
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
114
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
115
+ - if: $CI_MERGE_REQUEST_ID
116
+ needs: []
117
+ retry: *a1
118
+ interruptible: true
119
+ ๐Ÿ”ธ myWorkspace ๐Ÿงช test:
120
+ stage: test
121
+ image: path/to/docker/jobs-testing-chrome:the-version
122
+ variables:
123
+ KUBERNETES_CPU_REQUEST: '0.45'
124
+ KUBERNETES_MEMORY_REQUEST: 1Gi
125
+ KUBERNETES_MEMORY_LIMIT: 4Gi
126
+ script:
127
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
128
+ - export APP_PATH="."
129
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
130
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
131
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
132
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
133
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
134
+ - cd .
135
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
136
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
137
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
138
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
139
+ - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
140
+ - yarn install --immutable
141
+ - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
142
+ - yarn test
143
+ cache:
144
+ - key: .-yarn
145
+ policy: pull-push
146
+ paths:
147
+ - .yarn
148
+ - key: .-node-modules
149
+ policy: pull-push
150
+ paths:
151
+ - node_modules
152
+ - key: myWorkspace-turbo
153
+ policy: pull-push
154
+ paths:
155
+ - .turbo
156
+ rules:
157
+ - when: never
158
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
159
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
160
+ - if: $CI_MERGE_REQUEST_ID
161
+ needs: []
162
+ retry: *a1
163
+ interruptible: true
164
+ '๐Ÿ”ธ myWorkspace ๐Ÿ”จ app | dev ':
165
+ stage: build
166
+ image: path/to/docker/jobs-default:the-version
167
+ variables:
168
+ KUBERNETES_CPU_REQUEST: '0.45'
169
+ KUBERNETES_MEMORY_REQUEST: 1Gi
170
+ KUBERNETES_MEMORY_LIMIT: 4Gi
171
+ script:
172
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
173
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
174
+ - echo -e "\\e[0Ksection_start:$(date +%s):write-dotenv-api[collapsed=true]\\r\\e[0Kwrite dot env"
175
+ - |-
176
+ cat <<EOF > api/.env
177
+ ENV_SHORT=dev
178
+ APP_DIR=api
179
+ ENV_TYPE=dev
180
+ HOST=$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')
181
+ ROOT_URL=https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')
182
+ HOST_INTERNAL=$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')
183
+ HOST_CANONICAL=$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')
184
+ ROOT_URL_INTERNAL=https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')
185
+ CLOUD_SQL_INSTANCE_CONNECTION_NAME=projectId:region:instancename
186
+ DB_NAME=pan-test-app-dev-api
187
+ DB_USER=my-user
188
+ DB_PASSWORD=$CL_dev_api_DB_PASSWORD
189
+ DATABASE_URL=postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME
190
+ 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
191
+ CLOUD_RUN_JOB_TRIGGER_URL_migration=https://europe-west6-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/google-project-id/jobs/pan-test-app-dev-api-migration:run
192
+ CLOUD_RUN_JOB_TRIGGER_URL_send_reminders=https://europe-west6-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/google-project-id/jobs/pan-test-app-dev-api-send-reminders:run
193
+ DEPLOY_CLOUD_RUN_PROJECT_ID=google-project-id
194
+ DEPLOY_CLOUD_RUN_REGION=europe-west6
195
+ GCLOUD_DEPLOY_credentialsKey=$CL_dev_api_GCLOUD_DEPLOY_credentialsKey
196
+ GCLOUD_RUN_canonicalHostSuffix=$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix
197
+ _ALL_ENV_VAR_KEYS=["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_INTERNAL","HOST_CANONICAL","ROOT_URL_INTERNAL","CLOUD_SQL_INSTANCE_CONNECTION_NAME","DB_NAME","DB_USER","DB_PASSWORD","DATABASE_URL","DATABASE_JDBC_URL","CLOUD_RUN_JOB_TRIGGER_URL_migration","CLOUD_RUN_JOB_TRIGGER_URL_send_reminders","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
198
+ EOF
199
+ - echo -e "\\e[0Ksection_end:$(date +%s):write-dotenv-api\\r\\e[0K"
200
+ - echo -e "\\e[0Ksection_start:$(date +%s):write-dotenv-www[collapsed=true]\\r\\e[0Kwrite dot env"
201
+ - |-
202
+ cat <<EOF > www/.env
203
+ ENV_SHORT=dev
204
+ APP_DIR=www
205
+ ENV_TYPE=dev
206
+ HOST=$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')
207
+ ROOT_URL=https://$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')
208
+ HOST_INTERNAL=$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')
209
+ HOST_CANONICAL=$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')
210
+ ROOT_URL_INTERNAL=https://$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')
211
+ DEPLOY_CLOUD_RUN_PROJECT_ID=google-project-id
212
+ DEPLOY_CLOUD_RUN_REGION=europe-west6
213
+ GCLOUD_DEPLOY_credentialsKey=$CL_dev_www_GCLOUD_DEPLOY_credentialsKey
214
+ GCLOUD_RUN_canonicalHostSuffix=$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix
215
+ API_URL=https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')/graphql
216
+ _ALL_ENV_VAR_KEYS=["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_INTERNAL","HOST_CANONICAL","ROOT_URL_INTERNAL","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix","API_URL"]
217
+ EOF
218
+ - echo -e "\\e[0Ksection_end:$(date +%s):write-dotenv-www\\r\\e[0K"
219
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
220
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
221
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
222
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
223
+ - cd .
224
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
225
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
226
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
227
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
228
+ - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
229
+ - yarn install --immutable
230
+ - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
231
+ - yarn build
232
+ cache:
233
+ - key: .-yarn
234
+ policy: pull-push
235
+ paths:
236
+ - .yarn
237
+ - key: .-node-modules
238
+ policy: pull-push
239
+ paths:
240
+ - node_modules
241
+ - key: myWorkspace-turbo
242
+ policy: pull-push
243
+ paths:
244
+ - .turbo
245
+ - key: myWorkspace-next-cache
246
+ policy: pull-push
247
+ paths:
248
+ - api/.next/cache
249
+ - www/.next/cache
250
+ artifacts:
251
+ paths:
252
+ - api/.next
253
+ - api/dist
254
+ - www/.next
255
+ - www/dist
256
+ exclude:
257
+ - api/.env
258
+ - www/.env
259
+ expire_in: 1 day
260
+ when: always
261
+ reports: {}
262
+ rules:
263
+ - when: never
264
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
265
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
266
+ needs: []
267
+ retry: *a1
268
+ interruptible: true
269
+ '๐Ÿ”ธ myWorkspace ๐Ÿ”จ app | review ':
270
+ stage: build
271
+ image: path/to/docker/jobs-default:the-version
272
+ variables:
273
+ KUBERNETES_CPU_REQUEST: '0.45'
274
+ KUBERNETES_MEMORY_REQUEST: 1Gi
275
+ KUBERNETES_MEMORY_LIMIT: 4Gi
276
+ script:
277
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
278
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
279
+ - echo -e "\\e[0Ksection_start:$(date +%s):write-dotenv-api[collapsed=true]\\r\\e[0Kwrite dot env"
280
+ - |-
281
+ cat <<EOF > api/.env
282
+ ENV_SHORT=review
283
+ APP_DIR=api
284
+ ENV_TYPE=review
285
+ HOST=$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')
286
+ ROOT_URL=https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')
287
+ HOST_INTERNAL=$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')
288
+ HOST_CANONICAL=$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')
289
+ ROOT_URL_INTERNAL=https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')
290
+ CLOUD_SQL_INSTANCE_CONNECTION_NAME=projectId:region:instancename
291
+ DB_NAME=pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api
292
+ DB_USER=my-user
293
+ DB_PASSWORD=$CL_review_api_DB_PASSWORD
294
+ DATABASE_URL=postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME
295
+ 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
296
+ CLOUD_RUN_JOB_TRIGGER_URL_migration=https://europe-west6-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/google-project-id/jobs/$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" | awk '{print tolower($0)}')-migration:run
297
+ CLOUD_RUN_JOB_TRIGGER_URL_send_reminders=https://europe-west6-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/google-project-id/jobs/$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" | awk '{print tolower($0)}')-send-reminders:run
298
+ DEPLOY_CLOUD_RUN_PROJECT_ID=google-project-id
299
+ DEPLOY_CLOUD_RUN_REGION=europe-west6
300
+ GCLOUD_DEPLOY_credentialsKey=$CL_review_api_GCLOUD_DEPLOY_credentialsKey
301
+ GCLOUD_RUN_canonicalHostSuffix=$CL_review_api_GCLOUD_RUN_canonicalHostSuffix
302
+ _ALL_ENV_VAR_KEYS=["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_INTERNAL","HOST_CANONICAL","ROOT_URL_INTERNAL","CLOUD_SQL_INSTANCE_CONNECTION_NAME","DB_NAME","DB_USER","DB_PASSWORD","DATABASE_URL","DATABASE_JDBC_URL","CLOUD_RUN_JOB_TRIGGER_URL_migration","CLOUD_RUN_JOB_TRIGGER_URL_send_reminders","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
303
+ EOF
304
+ - echo -e "\\e[0Ksection_end:$(date +%s):write-dotenv-api\\r\\e[0K"
305
+ - echo -e "\\e[0Ksection_start:$(date +%s):write-dotenv-www[collapsed=true]\\r\\e[0Kwrite dot env"
306
+ - |-
307
+ cat <<EOF > www/.env
308
+ ENV_SHORT=review
309
+ APP_DIR=www
310
+ ENV_TYPE=review
311
+ HOST=$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-www-$CL_review_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')
312
+ ROOT_URL=https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-www-$CL_review_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')
313
+ HOST_INTERNAL=$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-www-$CL_review_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')
314
+ HOST_CANONICAL=$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-www-$CL_review_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')
315
+ ROOT_URL_INTERNAL=https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-www-$CL_review_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')
316
+ DEPLOY_CLOUD_RUN_PROJECT_ID=google-project-id
317
+ DEPLOY_CLOUD_RUN_REGION=europe-west6
318
+ GCLOUD_DEPLOY_credentialsKey=$CL_review_www_GCLOUD_DEPLOY_credentialsKey
319
+ GCLOUD_RUN_canonicalHostSuffix=$CL_review_www_GCLOUD_RUN_canonicalHostSuffix
320
+ API_URL=https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')/graphql
321
+ _ALL_ENV_VAR_KEYS=["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_INTERNAL","HOST_CANONICAL","ROOT_URL_INTERNAL","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix","API_URL"]
322
+ EOF
323
+ - echo -e "\\e[0Ksection_end:$(date +%s):write-dotenv-www\\r\\e[0K"
324
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
325
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
326
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
327
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
328
+ - cd .
329
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
330
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
331
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
332
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
333
+ - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
334
+ - yarn install --immutable
335
+ - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
336
+ - yarn build
337
+ cache:
338
+ - key: .-yarn
339
+ policy: pull-push
340
+ paths:
341
+ - .yarn
342
+ - key: .-node-modules
343
+ policy: pull-push
344
+ paths:
345
+ - node_modules
346
+ - key: myWorkspace-turbo
347
+ policy: pull-push
348
+ paths:
349
+ - .turbo
350
+ - key: myWorkspace-next-cache
351
+ policy: pull-push
352
+ paths:
353
+ - api/.next/cache
354
+ - www/.next/cache
355
+ artifacts:
356
+ paths:
357
+ - api/.next
358
+ - api/dist
359
+ - www/.next
360
+ - www/dist
361
+ exclude:
362
+ - api/.env
363
+ - www/.env
364
+ expire_in: 1 day
365
+ when: always
366
+ reports: {}
367
+ rules:
368
+ - if: $CI_MERGE_REQUEST_ID
369
+ needs: []
370
+ retry: *a1
371
+ interruptible: true
372
+ '๐Ÿ”ธ myWorkspace ๐Ÿ”จ app | stage ':
373
+ stage: build
374
+ image: path/to/docker/jobs-default:the-version
375
+ variables:
376
+ KUBERNETES_CPU_REQUEST: '0.45'
377
+ KUBERNETES_MEMORY_REQUEST: 1Gi
378
+ KUBERNETES_MEMORY_LIMIT: 4Gi
379
+ script:
380
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
381
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
382
+ - echo -e "\\e[0Ksection_start:$(date +%s):write-dotenv-api[collapsed=true]\\r\\e[0Kwrite dot env"
383
+ - |-
384
+ cat <<EOF > api/.env
385
+ ENV_SHORT=stage
386
+ APP_DIR=api
387
+ ENV_TYPE=stage
388
+ HOST=$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')
389
+ ROOT_URL=https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')
390
+ HOST_INTERNAL=$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')
391
+ HOST_CANONICAL=$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')
392
+ ROOT_URL_INTERNAL=https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')
393
+ CLOUD_SQL_INSTANCE_CONNECTION_NAME=projectId:region:instancename
394
+ DB_NAME=pan-test-app-stage-api
395
+ DB_USER=my-user
396
+ DB_PASSWORD=$CL_stage_api_DB_PASSWORD
397
+ DATABASE_URL=postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME
398
+ 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
399
+ CLOUD_RUN_JOB_TRIGGER_URL_migration=https://europe-west6-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/google-project-id/jobs/pan-test-app-stage-api-migration:run
400
+ CLOUD_RUN_JOB_TRIGGER_URL_send_reminders=https://europe-west6-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/google-project-id/jobs/pan-test-app-stage-api-send-reminders:run
401
+ DEPLOY_CLOUD_RUN_PROJECT_ID=google-project-id
402
+ DEPLOY_CLOUD_RUN_REGION=europe-west6
403
+ GCLOUD_DEPLOY_credentialsKey=$CL_stage_api_GCLOUD_DEPLOY_credentialsKey
404
+ GCLOUD_RUN_canonicalHostSuffix=$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix
405
+ _ALL_ENV_VAR_KEYS=["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_INTERNAL","HOST_CANONICAL","ROOT_URL_INTERNAL","CLOUD_SQL_INSTANCE_CONNECTION_NAME","DB_NAME","DB_USER","DB_PASSWORD","DATABASE_URL","DATABASE_JDBC_URL","CLOUD_RUN_JOB_TRIGGER_URL_migration","CLOUD_RUN_JOB_TRIGGER_URL_send_reminders","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
406
+ EOF
407
+ - echo -e "\\e[0Ksection_end:$(date +%s):write-dotenv-api\\r\\e[0K"
408
+ - echo -e "\\e[0Ksection_start:$(date +%s):write-dotenv-www[collapsed=true]\\r\\e[0Kwrite dot env"
409
+ - |-
410
+ cat <<EOF > www/.env
411
+ ENV_SHORT=stage
412
+ APP_DIR=www
413
+ ENV_TYPE=stage
414
+ HOST=$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')
415
+ ROOT_URL=https://$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')
416
+ HOST_INTERNAL=$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')
417
+ HOST_CANONICAL=$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')
418
+ ROOT_URL_INTERNAL=https://$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')
419
+ DEPLOY_CLOUD_RUN_PROJECT_ID=google-project-id
420
+ DEPLOY_CLOUD_RUN_REGION=europe-west6
421
+ GCLOUD_DEPLOY_credentialsKey=$CL_stage_www_GCLOUD_DEPLOY_credentialsKey
422
+ GCLOUD_RUN_canonicalHostSuffix=$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix
423
+ API_URL=https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')/graphql
424
+ _ALL_ENV_VAR_KEYS=["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_INTERNAL","HOST_CANONICAL","ROOT_URL_INTERNAL","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix","API_URL"]
425
+ EOF
426
+ - echo -e "\\e[0Ksection_end:$(date +%s):write-dotenv-www\\r\\e[0K"
427
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
428
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
429
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
430
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
431
+ - cd .
432
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
433
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
434
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
435
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
436
+ - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
437
+ - yarn install --immutable
438
+ - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
439
+ - yarn build
440
+ cache:
441
+ - key: .-yarn
442
+ policy: pull-push
443
+ paths:
444
+ - .yarn
445
+ - key: .-node-modules
446
+ policy: pull-push
447
+ paths:
448
+ - node_modules
449
+ - key: myWorkspace-turbo
450
+ policy: pull-push
451
+ paths:
452
+ - .turbo
453
+ - key: myWorkspace-next-cache
454
+ policy: pull-push
455
+ paths:
456
+ - api/.next/cache
457
+ - www/.next/cache
458
+ artifacts:
459
+ paths:
460
+ - api/.next
461
+ - api/dist
462
+ - www/.next
463
+ - www/dist
464
+ exclude:
465
+ - api/.env
466
+ - www/.env
467
+ expire_in: 1 day
468
+ when: always
469
+ reports: {}
470
+ rules:
471
+ - if: $CI_COMMIT_TAG
472
+ needs: []
473
+ retry: *a1
474
+ interruptible: true
475
+ '๐Ÿ”ธ myWorkspace ๐Ÿ”จ app | prod ':
476
+ stage: build
477
+ image: path/to/docker/jobs-default:the-version
478
+ variables:
479
+ KUBERNETES_CPU_REQUEST: '0.45'
480
+ KUBERNETES_MEMORY_REQUEST: 1Gi
481
+ KUBERNETES_MEMORY_LIMIT: 4Gi
482
+ script:
483
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
484
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
485
+ - echo -e "\\e[0Ksection_start:$(date +%s):write-dotenv-api[collapsed=true]\\r\\e[0Kwrite dot env"
486
+ - |-
487
+ cat <<EOF > api/.env
488
+ ENV_SHORT=prod
489
+ APP_DIR=api
490
+ ENV_TYPE=prod
491
+ HOST=$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')
492
+ ROOT_URL=https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')
493
+ HOST_INTERNAL=$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')
494
+ HOST_CANONICAL=$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')
495
+ ROOT_URL_INTERNAL=https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')
496
+ CLOUD_SQL_INSTANCE_CONNECTION_NAME=projectId:region:instancename
497
+ DB_NAME=pan-test-app-prod-api
498
+ DB_USER=my-user
499
+ DB_PASSWORD=$CL_prod_api_DB_PASSWORD
500
+ DATABASE_URL=postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME
501
+ 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
502
+ CLOUD_RUN_JOB_TRIGGER_URL_migration=https://europe-west6-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/google-project-id/jobs/pan-test-app-prod-api-migration:run
503
+ CLOUD_RUN_JOB_TRIGGER_URL_send_reminders=https://europe-west6-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/google-project-id/jobs/pan-test-app-prod-api-send-reminders:run
504
+ DEPLOY_CLOUD_RUN_PROJECT_ID=google-project-id
505
+ DEPLOY_CLOUD_RUN_REGION=europe-west6
506
+ GCLOUD_DEPLOY_credentialsKey=$CL_prod_api_GCLOUD_DEPLOY_credentialsKey
507
+ GCLOUD_RUN_canonicalHostSuffix=$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix
508
+ _ALL_ENV_VAR_KEYS=["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_INTERNAL","HOST_CANONICAL","ROOT_URL_INTERNAL","CLOUD_SQL_INSTANCE_CONNECTION_NAME","DB_NAME","DB_USER","DB_PASSWORD","DATABASE_URL","DATABASE_JDBC_URL","CLOUD_RUN_JOB_TRIGGER_URL_migration","CLOUD_RUN_JOB_TRIGGER_URL_send_reminders","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
509
+ EOF
510
+ - echo -e "\\e[0Ksection_end:$(date +%s):write-dotenv-api\\r\\e[0K"
511
+ - echo -e "\\e[0Ksection_start:$(date +%s):write-dotenv-www[collapsed=true]\\r\\e[0Kwrite dot env"
512
+ - |-
513
+ cat <<EOF > www/.env
514
+ ENV_SHORT=prod
515
+ APP_DIR=www
516
+ ENV_TYPE=prod
517
+ HOST=$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')
518
+ ROOT_URL=https://$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')
519
+ HOST_INTERNAL=$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')
520
+ HOST_CANONICAL=$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')
521
+ ROOT_URL_INTERNAL=https://$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')
522
+ DEPLOY_CLOUD_RUN_PROJECT_ID=google-project-id
523
+ DEPLOY_CLOUD_RUN_REGION=europe-west6
524
+ GCLOUD_DEPLOY_credentialsKey=$CL_prod_www_GCLOUD_DEPLOY_credentialsKey
525
+ GCLOUD_RUN_canonicalHostSuffix=$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix
526
+ API_URL=https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')/graphql
527
+ _ALL_ENV_VAR_KEYS=["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_INTERNAL","HOST_CANONICAL","ROOT_URL_INTERNAL","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix","API_URL"]
528
+ EOF
529
+ - echo -e "\\e[0Ksection_end:$(date +%s):write-dotenv-www\\r\\e[0K"
530
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
531
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
532
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
533
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
534
+ - cd .
535
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
536
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
537
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
538
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
539
+ - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
540
+ - yarn install --immutable
541
+ - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
542
+ - yarn build
543
+ cache:
544
+ - key: .-yarn
545
+ policy: pull-push
546
+ paths:
547
+ - .yarn
548
+ - key: .-node-modules
549
+ policy: pull-push
550
+ paths:
551
+ - node_modules
552
+ - key: myWorkspace-turbo
553
+ policy: pull-push
554
+ paths:
555
+ - .turbo
556
+ - key: myWorkspace-next-cache
557
+ policy: pull-push
558
+ paths:
559
+ - api/.next/cache
560
+ - www/.next/cache
561
+ artifacts:
562
+ paths:
563
+ - api/.next
564
+ - api/dist
565
+ - www/.next
566
+ - www/dist
567
+ exclude:
568
+ - api/.env
569
+ - www/.env
570
+ expire_in: 1 day
571
+ when: always
572
+ reports: {}
573
+ rules:
574
+ - if: $CI_COMMIT_TAG
575
+ needs: []
576
+ retry: *a1
577
+ interruptible: true
578
+ '๐Ÿ”น api ๐Ÿ”จ docker | dev ':
579
+ stage: build
580
+ image: path/to/docker/docker-build:the-version
581
+ services:
582
+ - name: docker:24.0.6-dind
583
+ command:
584
+ - --tls=false
585
+ variables:
586
+ DOCKER_HOST: tcp://0.0.0.0:2375
587
+ DOCKER_TLS_CERTDIR: ''
588
+ DOCKER_DRIVER: overlay2
589
+ DOCKER_BUILDKIT: '1'
590
+ KUBERNETES_CPU_REQUEST: '0.45'
591
+ KUBERNETES_MEMORY_REQUEST: 1Gi
592
+ KUBERNETES_MEMORY_LIMIT: 2Gi
593
+ script:
594
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
595
+ - export APP_DIR="api"
596
+ - export DOCKER_BUILD_CONTEXT="."
597
+ - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
598
+ - export DOCKER_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/dev/api"
599
+ - export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api"
600
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
601
+ - |-
602
+ export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
603
+ RUN yarn plugin import workspace-tools
604
+ RUN yarn workspaces focus --production && yarn rebuild"
605
+ - |-
606
+ export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node api/package.json /app/api/package.json
607
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
608
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
609
+ COPY --chown=node:node .yarn /app/.yarn"
610
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
611
+ - ensureNodeDockerfile
612
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
613
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_dev_api_GCLOUD_DEPLOY_credentialsKey")
614
+ - gcloud auth configure-docker europe-west6-docker.pkg.dev
615
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
616
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
617
+ - docker build --network host --cache-from $DOCKER_CACHE_IMAGE --tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG -f $APP_DIR/Dockerfile $DOCKER_BUILD_CONTEXT --build-arg BUILDKIT_INLINE_CACHE=1
618
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
619
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
620
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
621
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
622
+ - docker push $DOCKER_CACHE_IMAGE
623
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
624
+ cache:
625
+ - key: api-yarn
626
+ policy: pull
627
+ paths:
628
+ - api/.yarn
629
+ rules:
630
+ - when: never
631
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
632
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
633
+ needs:
634
+ - job: '๐Ÿ”ธ myWorkspace ๐Ÿ”จ app | dev '
635
+ artifacts: true
636
+ retry: *a1
637
+ interruptible: true
638
+ '๐Ÿ”น api ๐Ÿงพ sbom | dev ':
639
+ stage: build
640
+ image: aquasec/trivy:0.38.3
641
+ variables: {}
642
+ script:
643
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
644
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
645
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" api
646
+ artifacts:
647
+ paths:
648
+ - __sbom.json
649
+ rules:
650
+ - when: never
651
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
652
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
653
+ needs: []
654
+ retry: *a1
655
+ interruptible: true
656
+ allow_failure: true
657
+ '๐Ÿ”น api ๐Ÿš€ Deploy | dev ':
658
+ stage: deploy dev
659
+ image: path/to/docker/gcloud:the-version
660
+ variables:
661
+ KUBERNETES_CPU_REQUEST: '0.22'
662
+ KUBERNETES_MEMORY_REQUEST: 200Mi
663
+ KUBERNETES_MEMORY_LIMIT: 400Mi
664
+ script:
665
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
666
+ - export ENV_SHORT="dev"
667
+ - export APP_DIR="api"
668
+ - export ENV_TYPE="dev"
669
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
670
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
671
+ - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
672
+ - export HOST="$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
673
+ - export ROOT_URL="https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
674
+ - export HOST_INTERNAL="$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
675
+ - export HOST_CANONICAL="$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
676
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
677
+ - export CLOUD_SQL_INSTANCE_CONNECTION_NAME="projectId:region:instancename"
678
+ - export DB_NAME="pan-test-app-dev-api"
679
+ - export DB_USER="my-user"
680
+ - export DB_PASSWORD="$CL_dev_api_DB_PASSWORD"
681
+ - export DATABASE_URL="postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME"
682
+ - export 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"
683
+ - export CLOUD_RUN_JOB_TRIGGER_URL_migration="https://europe-west6-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/google-project-id/jobs/pan-test-app-dev-api-migration:run"
684
+ - export CLOUD_RUN_JOB_TRIGGER_URL_send_reminders="https://europe-west6-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/google-project-id/jobs/pan-test-app-dev-api-send-reminders:run"
685
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="google-project-id"
686
+ - export DEPLOY_CLOUD_RUN_REGION="europe-west6"
687
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_dev_api_GCLOUD_DEPLOY_credentialsKey"
688
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix"
689
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"CLOUD_SQL_INSTANCE_CONNECTION_NAME\\",\\"DB_NAME\\",\\"DB_USER\\",\\"DB_PASSWORD\\",\\"DATABASE_URL\\",\\"DATABASE_JDBC_URL\\",\\"CLOUD_RUN_JOB_TRIGGER_URL_migration\\",\\"CLOUD_RUN_JOB_TRIGGER_URL_send_reminders\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
690
+ - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
691
+ - export DOCKER_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/dev/api"
692
+ - export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api"
693
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
694
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
695
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
696
+ - echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."
697
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_dev_api_GCLOUD_DEPLOY_credentialsKey")
698
+ - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe google-project-id --format="value(projectNumber)")
699
+ - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
700
+ - echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"
701
+ - echo -e "\\e[0Ksection_start:$(date +%s):writeenvvars[collapsed=true]\\r\\e[0KWrite env vars to file"
702
+ - |
703
+ cat > ____envvars.yaml <<EOF
704
+ ENV_SHORT: |-
705
+ dev
706
+ APP_DIR: |-
707
+ api
708
+ ENV_TYPE: |-
709
+ dev
710
+ BUILD_INFO_BUILD_ID: |-
711
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
712
+ BUILD_INFO_BUILD_TIME: |-
713
+ $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
714
+ BUILD_INFO_CURRENT_VERSION: |-
715
+ $(printf %s "$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")" | sed 's/^/ /')
716
+ HOST: |-
717
+ $(printf %s "$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
718
+ ROOT_URL: |-
719
+ $(printf %s "https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
720
+ HOST_INTERNAL: |-
721
+ $(printf %s "$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
722
+ HOST_CANONICAL: |-
723
+ $(printf %s "$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
724
+ ROOT_URL_INTERNAL: |-
725
+ $(printf %s "https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
726
+ CLOUD_SQL_INSTANCE_CONNECTION_NAME: |-
727
+ projectId:region:instancename
728
+ DB_NAME: |-
729
+ pan-test-app-dev-api
730
+ DB_USER: |-
731
+ my-user
732
+ DB_PASSWORD: |-
733
+ $(printf %s "$CL_dev_api_DB_PASSWORD" | sed 's/^/ /')
734
+ DATABASE_URL: |-
735
+ postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME
736
+ DATABASE_JDBC_URL: |-
737
+ jdbc:postgresql:///$DB_NAME?cloudSqlInstance=$CLOUD_SQL_INSTANCE_CONNECTION_NAME&socketFactory=com.google.cloud.sql.postgres.SocketFactory&user=$DB_USER&password=$DB_PASSWORD
738
+ CLOUD_RUN_JOB_TRIGGER_URL_migration: |-
739
+ https://europe-west6-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/google-project-id/jobs/pan-test-app-dev-api-migration:run
740
+ CLOUD_RUN_JOB_TRIGGER_URL_send_reminders: |-
741
+ https://europe-west6-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/google-project-id/jobs/pan-test-app-dev-api-send-reminders:run
742
+ DEPLOY_CLOUD_RUN_PROJECT_ID: |-
743
+ google-project-id
744
+ DEPLOY_CLOUD_RUN_REGION: |-
745
+ europe-west6
746
+ GCLOUD_RUN_canonicalHostSuffix: |-
747
+ $(printf %s "$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | sed 's/^/ /')
748
+ _ALL_ENV_VAR_KEYS: |-
749
+ ["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_INTERNAL","HOST_CANONICAL","ROOT_URL_INTERNAL","CLOUD_SQL_INSTANCE_CONNECTION_NAME","DB_NAME","DB_USER","DB_PASSWORD","DATABASE_URL","DATABASE_JDBC_URL","CLOUD_RUN_JOB_TRIGGER_URL_migration","CLOUD_RUN_JOB_TRIGGER_URL_send_reminders","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
750
+
751
+ EOF
752
+ - echo -e "\\e[0Ksection_end:$(date +%s):writeenvvars\\r\\e[0K"
753
+ - echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"
754
+ - set +e
755
+ - echo "ensuring Database..."
756
+ - gcloud sql databases create pan-test-app-dev-api --instance=instancename --project projectId
757
+ - set -e
758
+ - set +e
759
+ - gcloud scheduler jobs create http pan-test-app-dev-api-send-reminders-scheduler --project=google-project-id --location=europe-west6 --schedule="0 * * * *" --max-retry-attempts=0 --uri="https://europe-west6-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/google-project-id/jobs/pan-test-app-dev-api-send-reminders:run" --http-method=POST --oauth-service-account-email=$GCLOUD_PROJECT_NUMBER-compute@developer.gserviceaccount.com
760
+ - set -e
761
+ - gcloud scheduler jobs update http pan-test-app-dev-api-send-reminders-scheduler --project=google-project-id --location=europe-west6 --schedule="0 * * * *" --max-retry-attempts=0 --uri="https://europe-west6-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/google-project-id/jobs/pan-test-app-dev-api-send-reminders:run" --http-method=POST --oauth-service-account-email=$GCLOUD_PROJECT_NUMBER-compute@developer.gserviceaccount.com
762
+ - set +e
763
+ - gcloud run jobs create pan-test-app-dev-api-migration --command="yarn,migrate" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/dev/api:$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --set-cloudsql-instances=projectId:region:instancename --labels=customer-name=pan,component-name=api,app-name=test-app,env-type=dev,env-name=dev,build-type=node,cloud-run-job-name=pan-test-app-dev-api-migration --memory=512Mi --task-timeout=10m --parallelism=1 --env-vars-file=____envvars.yaml --max-retries=0
764
+ - set -e
765
+ - 'gcloud run jobs update pan-test-app-dev-api-migration --command="yarn,migrate" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/dev/api:$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --set-cloudsql-instances=projectId:region:instancename --labels=customer-name=pan,component-name=api,app-name=test-app,env-type=dev,env-name=dev,build-type=node,cloud-run-job-name=pan-test-app-dev-api-migration --memory=512Mi --task-timeout=10m --parallelism=1 --env-vars-file=____envvars.yaml --max-retries=0 '
766
+ - set +e
767
+ - gcloud run jobs create pan-test-app-dev-api-send-reminders --command="yarn,job:send-reminders" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/dev/api:$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --set-cloudsql-instances=projectId:region:instancename --labels=customer-name=pan,component-name=api,app-name=test-app,env-type=dev,env-name=dev,build-type=node,cloud-run-job-name=pan-test-app-dev-api-send-reminders --memory=512Mi --task-timeout=15m --parallelism=1 --env-vars-file=____envvars.yaml --max-retries=0
768
+ - set -e
769
+ - 'gcloud run jobs update pan-test-app-dev-api-send-reminders --command="yarn,job:send-reminders" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/dev/api:$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --set-cloudsql-instances=projectId:region:instancename --labels=customer-name=pan,component-name=api,app-name=test-app,env-type=dev,env-name=dev,build-type=node,cloud-run-job-name=pan-test-app-dev-api-send-reminders --memory=512Mi --task-timeout=15m --parallelism=1 --env-vars-file=____envvars.yaml --max-retries=0 '
770
+ - 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/dev/api:$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --set-cloudsql-instances=projectId:region:instancename --labels=customer-name=pan,component-name=api,app-name=test-app,env-type=dev,env-name=dev,build-type=node,cloud-run-service-name=pan-test-app-dev-api --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=5 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost
771
+ - gcloud run jobs execute pan-test-app-dev-api-migration --project=google-project-id --region=europe-west6
772
+ - echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"
773
+ - echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"
774
+ - gcloud run revisions list --project=google-project-id --region=europe-west6 --service=pan-test-app-dev-api --limit=unlimited --sort-by=metadata.creationTimestamp --format="value(name)" --filter='(status.conditions.status=False OR status.conditions.status=Unknown)' | while read -r revisionname; do gcloud run revisions delete --project=google-project-id --region=europe-west6 --quiet $revisionname ; done
775
+ - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/dev/api --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/dev/api@$version --quiet --delete-tags; done
776
+ - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api@$version --quiet --delete-tags; done
777
+ - echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"
778
+ - echo 'Uploading SBOM to Dependency Track'
779
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/api" "https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" "__sbom.json" vex.json || true
780
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
781
+ environment:
782
+ name: dev/api
783
+ url: $CL_GITLAB_ENVIRONMENT_URL
784
+ on_stop: '๐Ÿ”น api ๐Ÿ›‘ Stop โš ๏ธ | dev '
785
+ auto_stop_in: 4 weeks
786
+ artifacts:
787
+ reports:
788
+ dotenv: gitlab_environment.env
789
+ rules:
790
+ - when: never
791
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
792
+ - when: on_success
793
+ if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
794
+ needs:
795
+ - job: ๐Ÿ”ธ myWorkspace ๐Ÿ‘ฎ lint
796
+ artifacts: false
797
+ - job: ๐Ÿ”ธ myWorkspace ๐Ÿงช test
798
+ artifacts: false
799
+ - job: ๐Ÿ”ธ myWorkspace ๐Ÿ›ก audit
800
+ artifacts: false
801
+ - job: '๐Ÿ”น api ๐Ÿ”จ docker | dev '
802
+ artifacts: false
803
+ - job: '๐Ÿ”น api ๐Ÿงพ sbom | dev '
804
+ artifacts: true
805
+ retry: *a1
806
+ interruptible: true
807
+ allow_failure: false
808
+ '๐Ÿ”น api ๐Ÿ›‘ Stop โš ๏ธ | dev ':
809
+ stage: stop dev
810
+ image: path/to/docker/gcloud:the-version
811
+ variables:
812
+ KUBERNETES_CPU_REQUEST: '0.22'
813
+ KUBERNETES_MEMORY_REQUEST: 200Mi
814
+ KUBERNETES_MEMORY_LIMIT: 400Mi
815
+ GIT_STRATEGY: none
816
+ script:
817
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
818
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
819
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
820
+ - set +e
821
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_dev_api_GCLOUD_DEPLOY_credentialsKey")
822
+ - gcloud run services delete pan-test-app-dev-api --project=google-project-id --region=europe-west6
823
+ - gcloud scheduler jobs delete pan-test-app-dev-api-send-reminders-scheduler --project=google-project-id --location=europe-west6
824
+ - gcloud run jobs executions list --project=google-project-id --region=europe-west6 --job pan-test-app-dev-api-migration --format="value(name)" | xargs -I {} gcloud run jobs executions delete {} --quiet --project=google-project-id --region=europe-west6
825
+ - gcloud run jobs delete pan-test-app-dev-api-migration --project=google-project-id --region=europe-west6
826
+ - gcloud run jobs executions list --project=google-project-id --region=europe-west6 --job pan-test-app-dev-api-send-reminders --format="value(name)" | xargs -I {} gcloud run jobs executions delete {} --quiet --project=google-project-id --region=europe-west6
827
+ - gcloud run jobs delete pan-test-app-dev-api-send-reminders --project=google-project-id --region=europe-west6
828
+ - gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/dev/api --quiet --delete-tags
829
+ - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api@$version --quiet --delete-tags; done
830
+ - echo 'Disabling component in Dependency Track'
831
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/api" "https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" || true
832
+ - set -e
833
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
834
+ environment:
835
+ name: dev/api
836
+ url: $CL_GITLAB_ENVIRONMENT_URL
837
+ action: stop
838
+ artifacts:
839
+ reports:
840
+ dotenv: gitlab_environment.env
841
+ rules:
842
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
843
+ when: on_success
844
+ - when: never
845
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
846
+ - when: manual
847
+ if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
848
+ needs: []
849
+ retry: *a1
850
+ interruptible: true
851
+ allow_failure: true
852
+ '๐Ÿ”น api ๐Ÿ”จ docker | review ':
853
+ stage: build
854
+ image: path/to/docker/docker-build:the-version
855
+ services:
856
+ - name: docker:24.0.6-dind
857
+ command:
858
+ - --tls=false
859
+ variables:
860
+ DOCKER_HOST: tcp://0.0.0.0:2375
861
+ DOCKER_TLS_CERTDIR: ''
862
+ DOCKER_DRIVER: overlay2
863
+ DOCKER_BUILDKIT: '1'
864
+ KUBERNETES_CPU_REQUEST: '0.45'
865
+ KUBERNETES_MEMORY_REQUEST: 1Gi
866
+ KUBERNETES_MEMORY_LIMIT: 2Gi
867
+ script:
868
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
869
+ - export APP_DIR="api"
870
+ - export DOCKER_BUILD_CONTEXT="."
871
+ - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
872
+ - export DOCKER_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/api/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })"
873
+ - export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api"
874
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
875
+ - |-
876
+ export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
877
+ RUN yarn plugin import workspace-tools
878
+ RUN yarn workspaces focus --production && yarn rebuild"
879
+ - |-
880
+ export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node api/package.json /app/api/package.json
881
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
882
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
883
+ COPY --chown=node:node .yarn /app/.yarn"
884
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
885
+ - ensureNodeDockerfile
886
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
887
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_review_api_GCLOUD_DEPLOY_credentialsKey")
888
+ - gcloud auth configure-docker europe-west6-docker.pkg.dev
889
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
890
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
891
+ - docker build --network host --cache-from $DOCKER_CACHE_IMAGE --tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG -f $APP_DIR/Dockerfile $DOCKER_BUILD_CONTEXT --build-arg BUILDKIT_INLINE_CACHE=1
892
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
893
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
894
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
895
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
896
+ - docker push $DOCKER_CACHE_IMAGE
897
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
898
+ cache:
899
+ - key: api-yarn
900
+ policy: pull
901
+ paths:
902
+ - api/.yarn
903
+ rules:
904
+ - if: $CI_MERGE_REQUEST_ID
905
+ needs:
906
+ - job: '๐Ÿ”ธ myWorkspace ๐Ÿ”จ app | review '
907
+ artifacts: true
908
+ retry: *a1
909
+ interruptible: true
910
+ '๐Ÿ”น api ๐Ÿงพ sbom | review ':
911
+ stage: build
912
+ image: aquasec/trivy:0.38.3
913
+ variables: {}
914
+ script:
915
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
916
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
917
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" api
918
+ artifacts:
919
+ paths:
920
+ - __sbom.json
921
+ rules:
922
+ - if: $CI_MERGE_REQUEST_ID
923
+ needs: []
924
+ retry: *a1
925
+ interruptible: true
926
+ allow_failure: true
927
+ '๐Ÿ”น api ๐Ÿš€ Deploy | review ':
928
+ stage: deploy review
929
+ image: path/to/docker/gcloud:the-version
930
+ variables:
931
+ KUBERNETES_CPU_REQUEST: '0.22'
932
+ KUBERNETES_MEMORY_REQUEST: 200Mi
933
+ KUBERNETES_MEMORY_LIMIT: 400Mi
934
+ script:
935
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
936
+ - export ENV_SHORT="review"
937
+ - export APP_DIR="api"
938
+ - export ENV_TYPE="review"
939
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
940
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
941
+ - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
942
+ - export HOST="$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
943
+ - export ROOT_URL="https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
944
+ - export HOST_INTERNAL="$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
945
+ - export HOST_CANONICAL="$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
946
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
947
+ - export CLOUD_SQL_INSTANCE_CONNECTION_NAME="projectId:region:instancename"
948
+ - export DB_NAME="pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api"
949
+ - export DB_USER="my-user"
950
+ - export DB_PASSWORD="$CL_review_api_DB_PASSWORD"
951
+ - export DATABASE_URL="postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME"
952
+ - export 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"
953
+ - export CLOUD_RUN_JOB_TRIGGER_URL_migration="https://europe-west6-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/google-project-id/jobs/$(printf %s \\"pan-test-app-review-$([ -n \\"$CI_MERGE_REQUEST_IID\\" ] && echo \\"mr$CI_MERGE_REQUEST_IID\\" || { [ -n \\"$CI_COMMIT_REF_SLUG\\" ] && echo \\"$CI_COMMIT_REF_SLUG\\" || echo \\"unknown\\"; })-api\\" | awk '{print tolower($0)}')-migration:run"
954
+ - export CLOUD_RUN_JOB_TRIGGER_URL_send_reminders="https://europe-west6-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/google-project-id/jobs/$(printf %s \\"pan-test-app-review-$([ -n \\"$CI_MERGE_REQUEST_IID\\" ] && echo \\"mr$CI_MERGE_REQUEST_IID\\" || { [ -n \\"$CI_COMMIT_REF_SLUG\\" ] && echo \\"$CI_COMMIT_REF_SLUG\\" || echo \\"unknown\\"; })-api\\" | awk '{print tolower($0)}')-send-reminders:run"
955
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="google-project-id"
956
+ - export DEPLOY_CLOUD_RUN_REGION="europe-west6"
957
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_review_api_GCLOUD_DEPLOY_credentialsKey"
958
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_review_api_GCLOUD_RUN_canonicalHostSuffix"
959
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"CLOUD_SQL_INSTANCE_CONNECTION_NAME\\",\\"DB_NAME\\",\\"DB_USER\\",\\"DB_PASSWORD\\",\\"DATABASE_URL\\",\\"DATABASE_JDBC_URL\\",\\"CLOUD_RUN_JOB_TRIGGER_URL_migration\\",\\"CLOUD_RUN_JOB_TRIGGER_URL_send_reminders\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
960
+ - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
961
+ - export DOCKER_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/api/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })"
962
+ - export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api"
963
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
964
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
965
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
966
+ - echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."
967
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_review_api_GCLOUD_DEPLOY_credentialsKey")
968
+ - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe google-project-id --format="value(projectNumber)")
969
+ - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
970
+ - echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"
971
+ - echo -e "\\e[0Ksection_start:$(date +%s):writeenvvars[collapsed=true]\\r\\e[0KWrite env vars to file"
972
+ - |
973
+ cat > ____envvars.yaml <<EOF
974
+ ENV_SHORT: |-
975
+ review
976
+ APP_DIR: |-
977
+ api
978
+ ENV_TYPE: |-
979
+ review
980
+ BUILD_INFO_BUILD_ID: |-
981
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
982
+ BUILD_INFO_BUILD_TIME: |-
983
+ $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
984
+ BUILD_INFO_CURRENT_VERSION: |-
985
+ $(printf %s "$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")" | sed 's/^/ /')
986
+ HOST: |-
987
+ $(printf %s "$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
988
+ ROOT_URL: |-
989
+ $(printf %s "https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
990
+ HOST_INTERNAL: |-
991
+ $(printf %s "$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
992
+ HOST_CANONICAL: |-
993
+ $(printf %s "$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
994
+ ROOT_URL_INTERNAL: |-
995
+ $(printf %s "https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
996
+ CLOUD_SQL_INSTANCE_CONNECTION_NAME: |-
997
+ projectId:region:instancename
998
+ DB_NAME: |-
999
+ $(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" | sed 's/^/ /')
1000
+ DB_USER: |-
1001
+ my-user
1002
+ DB_PASSWORD: |-
1003
+ $(printf %s "$CL_review_api_DB_PASSWORD" | sed 's/^/ /')
1004
+ DATABASE_URL: |-
1005
+ postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME
1006
+ DATABASE_JDBC_URL: |-
1007
+ jdbc:postgresql:///$DB_NAME?cloudSqlInstance=$CLOUD_SQL_INSTANCE_CONNECTION_NAME&socketFactory=com.google.cloud.sql.postgres.SocketFactory&user=$DB_USER&password=$DB_PASSWORD
1008
+ CLOUD_RUN_JOB_TRIGGER_URL_migration: |-
1009
+ https://europe-west6-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/google-project-id/jobs/$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" | awk '{print tolower($0)}')-migration:run
1010
+ CLOUD_RUN_JOB_TRIGGER_URL_send_reminders: |-
1011
+ https://europe-west6-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/google-project-id/jobs/$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" | awk '{print tolower($0)}')-send-reminders:run
1012
+ DEPLOY_CLOUD_RUN_PROJECT_ID: |-
1013
+ google-project-id
1014
+ DEPLOY_CLOUD_RUN_REGION: |-
1015
+ europe-west6
1016
+ GCLOUD_RUN_canonicalHostSuffix: |-
1017
+ $(printf %s "$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | sed 's/^/ /')
1018
+ _ALL_ENV_VAR_KEYS: |-
1019
+ ["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_INTERNAL","HOST_CANONICAL","ROOT_URL_INTERNAL","CLOUD_SQL_INSTANCE_CONNECTION_NAME","DB_NAME","DB_USER","DB_PASSWORD","DATABASE_URL","DATABASE_JDBC_URL","CLOUD_RUN_JOB_TRIGGER_URL_migration","CLOUD_RUN_JOB_TRIGGER_URL_send_reminders","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
1020
+
1021
+ EOF
1022
+ - echo -e "\\e[0Ksection_end:$(date +%s):writeenvvars\\r\\e[0K"
1023
+ - echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"
1024
+ - set +e
1025
+ - echo "ensuring Database..."
1026
+ - gcloud sql databases create pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api --instance=instancename --project projectId
1027
+ - set -e
1028
+ - set +e
1029
+ - gcloud scheduler jobs create http $(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" | awk '{print tolower($0)}')-send-reminders-scheduler --project=google-project-id --location=europe-west6 --schedule="0 * * * *" --max-retry-attempts=0 --uri="https://europe-west6-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/google-project-id/jobs/$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" | awk '{print tolower($0)}')-send-reminders:run" --http-method=POST --oauth-service-account-email=$GCLOUD_PROJECT_NUMBER-compute@developer.gserviceaccount.com
1030
+ - set -e
1031
+ - gcloud scheduler jobs update http $(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" | awk '{print tolower($0)}')-send-reminders-scheduler --project=google-project-id --location=europe-west6 --schedule="0 * * * *" --max-retry-attempts=0 --uri="https://europe-west6-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/google-project-id/jobs/$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" | awk '{print tolower($0)}')-send-reminders:run" --http-method=POST --oauth-service-account-email=$GCLOUD_PROJECT_NUMBER-compute@developer.gserviceaccount.com
1032
+ - set +e
1033
+ - gcloud run jobs create $(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" | awk '{print tolower($0)}')-migration --command="yarn,migrate" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/api/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }):$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --set-cloudsql-instances=projectId:region:instancename --labels=customer-name=pan,component-name=api,app-name=test-app,env-type=review,env-name=review,build-type=node,cloud-run-job-name=$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" | awk '{print tolower($0)}')-migration --memory=512Mi --task-timeout=10m --parallelism=1 --env-vars-file=____envvars.yaml --max-retries=0
1034
+ - set -e
1035
+ - 'gcloud run jobs update $(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" | awk ''{print tolower($0)}'')-migration --command="yarn,migrate" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/api/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }):$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --set-cloudsql-instances=projectId:region:instancename --labels=customer-name=pan,component-name=api,app-name=test-app,env-type=review,env-name=review,build-type=node,cloud-run-job-name=$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" | awk ''{print tolower($0)}'')-migration --memory=512Mi --task-timeout=10m --parallelism=1 --env-vars-file=____envvars.yaml --max-retries=0 '
1036
+ - set +e
1037
+ - gcloud run jobs create $(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" | awk '{print tolower($0)}')-send-reminders --command="yarn,job:send-reminders" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/api/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }):$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --set-cloudsql-instances=projectId:region:instancename --labels=customer-name=pan,component-name=api,app-name=test-app,env-type=review,env-name=review,build-type=node,cloud-run-job-name=$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" | awk '{print tolower($0)}')-send-reminders --memory=512Mi --task-timeout=15m --parallelism=1 --env-vars-file=____envvars.yaml --max-retries=0
1038
+ - set -e
1039
+ - 'gcloud run jobs update $(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" | awk ''{print tolower($0)}'')-send-reminders --command="yarn,job:send-reminders" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/api/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }):$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --set-cloudsql-instances=projectId:region:instancename --labels=customer-name=pan,component-name=api,app-name=test-app,env-type=review,env-name=review,build-type=node,cloud-run-job-name=$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" | awk ''{print tolower($0)}'')-send-reminders --memory=512Mi --task-timeout=15m --parallelism=1 --env-vars-file=____envvars.yaml --max-retries=0 '
1040
+ - gcloud run deploy $(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" | awk '{print tolower($0)}') --command="yarn,start" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/api/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }):$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --set-cloudsql-instances=projectId:region:instancename --labels=customer-name=pan,component-name=api,app-name=test-app,env-type=review,env-name=review,build-type=node,cloud-run-service-name=$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" | awk '{print tolower($0)}') --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=5 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost
1041
+ - gcloud run jobs execute $(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" | awk '{print tolower($0)}')-migration --project=google-project-id --region=europe-west6
1042
+ - echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"
1043
+ - echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"
1044
+ - gcloud run revisions list --project=google-project-id --region=europe-west6 --service=$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" | awk '{print tolower($0)}') --limit=unlimited --sort-by=metadata.creationTimestamp --format="value(name)" --filter='(status.conditions.status=False OR status.conditions.status=Unknown)' | while read -r revisionname; do gcloud run revisions delete --project=google-project-id --region=europe-west6 --quiet $revisionname ; done
1045
+ - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/api/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }) --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/api/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })@$version --quiet --delete-tags; done
1046
+ - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api@$version --quiet --delete-tags; done
1047
+ - set +e
1048
+ - gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/api --quiet --delete-tags
1049
+ - set -e
1050
+ - echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"
1051
+ - echo 'Uploading SBOM to Dependency Track'
1052
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/api" "https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" "__sbom.json" vex.json || true
1053
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
1054
+ environment:
1055
+ name: review/$CI_COMMIT_REF_NAME/api
1056
+ url: $CL_GITLAB_ENVIRONMENT_URL
1057
+ on_stop: '๐Ÿ”น api ๐Ÿ›‘ Stop โš ๏ธ | review '
1058
+ auto_stop_in: 1 week
1059
+ artifacts:
1060
+ reports:
1061
+ dotenv: gitlab_environment.env
1062
+ rules:
1063
+ - when: on_success
1064
+ if: $CI_MERGE_REQUEST_ID
1065
+ needs:
1066
+ - job: ๐Ÿ”ธ myWorkspace ๐Ÿ‘ฎ lint
1067
+ artifacts: false
1068
+ - job: ๐Ÿ”ธ myWorkspace ๐Ÿงช test
1069
+ artifacts: false
1070
+ - job: ๐Ÿ”ธ myWorkspace ๐Ÿ›ก audit
1071
+ artifacts: false
1072
+ - job: '๐Ÿ”น api ๐Ÿ”จ docker | review '
1073
+ artifacts: false
1074
+ - job: '๐Ÿ”น api ๐Ÿงพ sbom | review '
1075
+ artifacts: true
1076
+ retry: *a1
1077
+ interruptible: true
1078
+ allow_failure: false
1079
+ '๐Ÿ”น api ๐Ÿ›‘ Stop โš ๏ธ | review ':
1080
+ stage: stop review
1081
+ image: path/to/docker/gcloud:the-version
1082
+ variables:
1083
+ KUBERNETES_CPU_REQUEST: '0.22'
1084
+ KUBERNETES_MEMORY_REQUEST: 200Mi
1085
+ KUBERNETES_MEMORY_LIMIT: 400Mi
1086
+ GIT_STRATEGY: none
1087
+ script:
1088
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1089
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
1090
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1091
+ - set +e
1092
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_review_api_GCLOUD_DEPLOY_credentialsKey")
1093
+ - gcloud run services delete $(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" | awk '{print tolower($0)}') --project=google-project-id --region=europe-west6
1094
+ - gcloud scheduler jobs delete $(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" | awk '{print tolower($0)}')-send-reminders-scheduler --project=google-project-id --location=europe-west6
1095
+ - gcloud run jobs executions list --project=google-project-id --region=europe-west6 --job $(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" | awk '{print tolower($0)}')-migration --format="value(name)" | xargs -I {} gcloud run jobs executions delete {} --quiet --project=google-project-id --region=europe-west6
1096
+ - gcloud run jobs delete $(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" | awk '{print tolower($0)}')-migration --project=google-project-id --region=europe-west6
1097
+ - gcloud run jobs executions list --project=google-project-id --region=europe-west6 --job $(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" | awk '{print tolower($0)}')-send-reminders --format="value(name)" | xargs -I {} gcloud run jobs executions delete {} --quiet --project=google-project-id --region=europe-west6
1098
+ - gcloud run jobs delete $(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" | awk '{print tolower($0)}')-send-reminders --project=google-project-id --region=europe-west6
1099
+ - echo "deleting database pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api..."
1100
+ - 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"
1101
+ - "\\n until gcloud sql databases delete pan-test-app-review-$([ -n \\"$CI_MERGE_REQUEST_IID\\" ] && echo \\"mr$CI_MERGE_REQUEST_IID\\" || { [ -n \\"$CI_COMMIT_REF_SLUG\\" ] && echo \\"$CI_COMMIT_REF_SLUG\\" || echo \\"unknown\\"; })-api --instance=instancename --project projectId\\n do\\n echo \\"Trying again.\\"\\n sleep 10\\n done\\n "
1102
+ - gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/api/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }) --quiet --delete-tags
1103
+ - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api@$version --quiet --delete-tags; done
1104
+ - set +e
1105
+ - gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/api --quiet --delete-tags
1106
+ - set -e
1107
+ - echo 'Disabling component in Dependency Track'
1108
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/api" "https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" || true
1109
+ - set -e
1110
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
1111
+ environment:
1112
+ name: review/$CI_COMMIT_REF_NAME/api
1113
+ url: $CL_GITLAB_ENVIRONMENT_URL
1114
+ action: stop
1115
+ artifacts:
1116
+ reports:
1117
+ dotenv: gitlab_environment.env
1118
+ rules:
1119
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
1120
+ when: on_success
1121
+ - when: manual
1122
+ if: $CI_MERGE_REQUEST_ID
1123
+ needs: []
1124
+ retry: *a1
1125
+ interruptible: true
1126
+ allow_failure: true
1127
+ '๐Ÿ”น api ๐Ÿ”จ docker | stage ':
1128
+ stage: build
1129
+ image: path/to/docker/docker-build:the-version
1130
+ services:
1131
+ - name: docker:24.0.6-dind
1132
+ command:
1133
+ - --tls=false
1134
+ variables:
1135
+ DOCKER_HOST: tcp://0.0.0.0:2375
1136
+ DOCKER_TLS_CERTDIR: ''
1137
+ DOCKER_DRIVER: overlay2
1138
+ DOCKER_BUILDKIT: '1'
1139
+ KUBERNETES_CPU_REQUEST: '0.45'
1140
+ KUBERNETES_MEMORY_REQUEST: 1Gi
1141
+ KUBERNETES_MEMORY_LIMIT: 2Gi
1142
+ script:
1143
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1144
+ - export APP_DIR="api"
1145
+ - export DOCKER_BUILD_CONTEXT="."
1146
+ - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
1147
+ - export DOCKER_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/stage/api"
1148
+ - export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api"
1149
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
1150
+ - |-
1151
+ export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
1152
+ RUN yarn plugin import workspace-tools
1153
+ RUN yarn workspaces focus --production && yarn rebuild"
1154
+ - |-
1155
+ export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node api/package.json /app/api/package.json
1156
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
1157
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
1158
+ COPY --chown=node:node .yarn /app/.yarn"
1159
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1160
+ - ensureNodeDockerfile
1161
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
1162
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_stage_api_GCLOUD_DEPLOY_credentialsKey")
1163
+ - gcloud auth configure-docker europe-west6-docker.pkg.dev
1164
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
1165
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
1166
+ - docker build --network host --cache-from $DOCKER_CACHE_IMAGE --tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG -f $APP_DIR/Dockerfile $DOCKER_BUILD_CONTEXT --build-arg BUILDKIT_INLINE_CACHE=1
1167
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
1168
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
1169
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
1170
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
1171
+ - docker push $DOCKER_CACHE_IMAGE
1172
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
1173
+ cache:
1174
+ - key: api-yarn
1175
+ policy: pull
1176
+ paths:
1177
+ - api/.yarn
1178
+ rules:
1179
+ - if: $CI_COMMIT_TAG
1180
+ needs:
1181
+ - job: '๐Ÿ”ธ myWorkspace ๐Ÿ”จ app | stage '
1182
+ artifacts: true
1183
+ retry: *a1
1184
+ interruptible: true
1185
+ '๐Ÿ”น api ๐Ÿงพ sbom | stage ':
1186
+ stage: build
1187
+ image: aquasec/trivy:0.38.3
1188
+ variables: {}
1189
+ script:
1190
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1191
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1192
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" api
1193
+ artifacts:
1194
+ paths:
1195
+ - __sbom.json
1196
+ rules:
1197
+ - if: $CI_COMMIT_TAG
1198
+ needs: []
1199
+ retry: *a1
1200
+ interruptible: true
1201
+ allow_failure: true
1202
+ '๐Ÿ”น api ๐Ÿš€ Deploy | stage ':
1203
+ stage: deploy stage
1204
+ image: path/to/docker/gcloud:the-version
1205
+ variables:
1206
+ KUBERNETES_CPU_REQUEST: '0.22'
1207
+ KUBERNETES_MEMORY_REQUEST: 200Mi
1208
+ KUBERNETES_MEMORY_LIMIT: 400Mi
1209
+ script:
1210
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1211
+ - export ENV_SHORT="stage"
1212
+ - export APP_DIR="api"
1213
+ - export ENV_TYPE="stage"
1214
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1215
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1216
+ - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
1217
+ - export HOST="$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1218
+ - export ROOT_URL="https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1219
+ - export HOST_INTERNAL="$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1220
+ - export HOST_CANONICAL="$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1221
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1222
+ - export CLOUD_SQL_INSTANCE_CONNECTION_NAME="projectId:region:instancename"
1223
+ - export DB_NAME="pan-test-app-stage-api"
1224
+ - export DB_USER="my-user"
1225
+ - export DB_PASSWORD="$CL_stage_api_DB_PASSWORD"
1226
+ - export DATABASE_URL="postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME"
1227
+ - export 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"
1228
+ - export CLOUD_RUN_JOB_TRIGGER_URL_migration="https://europe-west6-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/google-project-id/jobs/pan-test-app-stage-api-migration:run"
1229
+ - export CLOUD_RUN_JOB_TRIGGER_URL_send_reminders="https://europe-west6-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/google-project-id/jobs/pan-test-app-stage-api-send-reminders:run"
1230
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="google-project-id"
1231
+ - export DEPLOY_CLOUD_RUN_REGION="europe-west6"
1232
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_stage_api_GCLOUD_DEPLOY_credentialsKey"
1233
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix"
1234
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"CLOUD_SQL_INSTANCE_CONNECTION_NAME\\",\\"DB_NAME\\",\\"DB_USER\\",\\"DB_PASSWORD\\",\\"DATABASE_URL\\",\\"DATABASE_JDBC_URL\\",\\"CLOUD_RUN_JOB_TRIGGER_URL_migration\\",\\"CLOUD_RUN_JOB_TRIGGER_URL_send_reminders\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
1235
+ - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
1236
+ - export DOCKER_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/stage/api"
1237
+ - export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api"
1238
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
1239
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
1240
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1241
+ - echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."
1242
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_stage_api_GCLOUD_DEPLOY_credentialsKey")
1243
+ - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe google-project-id --format="value(projectNumber)")
1244
+ - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
1245
+ - echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"
1246
+ - echo -e "\\e[0Ksection_start:$(date +%s):writeenvvars[collapsed=true]\\r\\e[0KWrite env vars to file"
1247
+ - |
1248
+ cat > ____envvars.yaml <<EOF
1249
+ ENV_SHORT: |-
1250
+ stage
1251
+ APP_DIR: |-
1252
+ api
1253
+ ENV_TYPE: |-
1254
+ stage
1255
+ BUILD_INFO_BUILD_ID: |-
1256
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
1257
+ BUILD_INFO_BUILD_TIME: |-
1258
+ $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
1259
+ BUILD_INFO_CURRENT_VERSION: |-
1260
+ $(printf %s "$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")" | sed 's/^/ /')
1261
+ HOST: |-
1262
+ $(printf %s "$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1263
+ ROOT_URL: |-
1264
+ $(printf %s "https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1265
+ HOST_INTERNAL: |-
1266
+ $(printf %s "$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1267
+ HOST_CANONICAL: |-
1268
+ $(printf %s "$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1269
+ ROOT_URL_INTERNAL: |-
1270
+ $(printf %s "https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1271
+ CLOUD_SQL_INSTANCE_CONNECTION_NAME: |-
1272
+ projectId:region:instancename
1273
+ DB_NAME: |-
1274
+ pan-test-app-stage-api
1275
+ DB_USER: |-
1276
+ my-user
1277
+ DB_PASSWORD: |-
1278
+ $(printf %s "$CL_stage_api_DB_PASSWORD" | sed 's/^/ /')
1279
+ DATABASE_URL: |-
1280
+ postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME
1281
+ DATABASE_JDBC_URL: |-
1282
+ jdbc:postgresql:///$DB_NAME?cloudSqlInstance=$CLOUD_SQL_INSTANCE_CONNECTION_NAME&socketFactory=com.google.cloud.sql.postgres.SocketFactory&user=$DB_USER&password=$DB_PASSWORD
1283
+ CLOUD_RUN_JOB_TRIGGER_URL_migration: |-
1284
+ https://europe-west6-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/google-project-id/jobs/pan-test-app-stage-api-migration:run
1285
+ CLOUD_RUN_JOB_TRIGGER_URL_send_reminders: |-
1286
+ https://europe-west6-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/google-project-id/jobs/pan-test-app-stage-api-send-reminders:run
1287
+ DEPLOY_CLOUD_RUN_PROJECT_ID: |-
1288
+ google-project-id
1289
+ DEPLOY_CLOUD_RUN_REGION: |-
1290
+ europe-west6
1291
+ GCLOUD_RUN_canonicalHostSuffix: |-
1292
+ $(printf %s "$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | sed 's/^/ /')
1293
+ _ALL_ENV_VAR_KEYS: |-
1294
+ ["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_INTERNAL","HOST_CANONICAL","ROOT_URL_INTERNAL","CLOUD_SQL_INSTANCE_CONNECTION_NAME","DB_NAME","DB_USER","DB_PASSWORD","DATABASE_URL","DATABASE_JDBC_URL","CLOUD_RUN_JOB_TRIGGER_URL_migration","CLOUD_RUN_JOB_TRIGGER_URL_send_reminders","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
1295
+
1296
+ EOF
1297
+ - echo -e "\\e[0Ksection_end:$(date +%s):writeenvvars\\r\\e[0K"
1298
+ - echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"
1299
+ - set +e
1300
+ - echo "ensuring Database..."
1301
+ - gcloud sql databases create pan-test-app-stage-api --instance=instancename --project projectId
1302
+ - set -e
1303
+ - set +e
1304
+ - gcloud scheduler jobs create http pan-test-app-stage-api-send-reminders-scheduler --project=google-project-id --location=europe-west6 --schedule="0 * * * *" --max-retry-attempts=0 --uri="https://europe-west6-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/google-project-id/jobs/pan-test-app-stage-api-send-reminders:run" --http-method=POST --oauth-service-account-email=$GCLOUD_PROJECT_NUMBER-compute@developer.gserviceaccount.com
1305
+ - set -e
1306
+ - gcloud scheduler jobs update http pan-test-app-stage-api-send-reminders-scheduler --project=google-project-id --location=europe-west6 --schedule="0 * * * *" --max-retry-attempts=0 --uri="https://europe-west6-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/google-project-id/jobs/pan-test-app-stage-api-send-reminders:run" --http-method=POST --oauth-service-account-email=$GCLOUD_PROJECT_NUMBER-compute@developer.gserviceaccount.com
1307
+ - set +e
1308
+ - gcloud run jobs create pan-test-app-stage-api-migration --command="yarn,migrate" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/stage/api:$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --set-cloudsql-instances=projectId:region:instancename --labels=customer-name=pan,component-name=api,app-name=test-app,env-type=stage,env-name=stage,build-type=node,cloud-run-job-name=pan-test-app-stage-api-migration --memory=512Mi --task-timeout=10m --parallelism=1 --env-vars-file=____envvars.yaml --max-retries=0
1309
+ - set -e
1310
+ - 'gcloud run jobs update pan-test-app-stage-api-migration --command="yarn,migrate" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/stage/api:$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --set-cloudsql-instances=projectId:region:instancename --labels=customer-name=pan,component-name=api,app-name=test-app,env-type=stage,env-name=stage,build-type=node,cloud-run-job-name=pan-test-app-stage-api-migration --memory=512Mi --task-timeout=10m --parallelism=1 --env-vars-file=____envvars.yaml --max-retries=0 '
1311
+ - set +e
1312
+ - gcloud run jobs create pan-test-app-stage-api-send-reminders --command="yarn,job:send-reminders" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/stage/api:$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --set-cloudsql-instances=projectId:region:instancename --labels=customer-name=pan,component-name=api,app-name=test-app,env-type=stage,env-name=stage,build-type=node,cloud-run-job-name=pan-test-app-stage-api-send-reminders --memory=512Mi --task-timeout=15m --parallelism=1 --env-vars-file=____envvars.yaml --max-retries=0
1313
+ - set -e
1314
+ - 'gcloud run jobs update pan-test-app-stage-api-send-reminders --command="yarn,job:send-reminders" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/stage/api:$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --set-cloudsql-instances=projectId:region:instancename --labels=customer-name=pan,component-name=api,app-name=test-app,env-type=stage,env-name=stage,build-type=node,cloud-run-job-name=pan-test-app-stage-api-send-reminders --memory=512Mi --task-timeout=15m --parallelism=1 --env-vars-file=____envvars.yaml --max-retries=0 '
1315
+ - 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/stage/api:$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --set-cloudsql-instances=projectId:region:instancename --labels=customer-name=pan,component-name=api,app-name=test-app,env-type=stage,env-name=stage,build-type=node,cloud-run-service-name=pan-test-app-stage-api --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=5 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost
1316
+ - gcloud run jobs execute pan-test-app-stage-api-migration --project=google-project-id --region=europe-west6
1317
+ - echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"
1318
+ - echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"
1319
+ - gcloud run revisions list --project=google-project-id --region=europe-west6 --service=pan-test-app-stage-api --limit=unlimited --sort-by=metadata.creationTimestamp --format="value(name)" --filter='(status.conditions.status=False OR status.conditions.status=Unknown)' | while read -r revisionname; do gcloud run revisions delete --project=google-project-id --region=europe-west6 --quiet $revisionname ; done
1320
+ - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/stage/api --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/stage/api@$version --quiet --delete-tags; done
1321
+ - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api@$version --quiet --delete-tags; done
1322
+ - echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"
1323
+ - echo 'Uploading SBOM to Dependency Track'
1324
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/api" "https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" "__sbom.json" vex.json || true
1325
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
1326
+ environment:
1327
+ name: stage/api
1328
+ url: $CL_GITLAB_ENVIRONMENT_URL
1329
+ on_stop: '๐Ÿ”น api ๐Ÿ›‘ Stop โš ๏ธ | stage '
1330
+ artifacts:
1331
+ reports:
1332
+ dotenv: gitlab_environment.env
1333
+ rules:
1334
+ - when: on_success
1335
+ if: $CI_COMMIT_TAG
1336
+ needs:
1337
+ - job: '๐Ÿ”น api ๐Ÿ”จ docker | stage '
1338
+ artifacts: false
1339
+ - job: '๐Ÿ”น api ๐Ÿงพ sbom | stage '
1340
+ artifacts: true
1341
+ retry: *a1
1342
+ interruptible: true
1343
+ allow_failure: false
1344
+ '๐Ÿ”น api ๐Ÿ›‘ Stop โš ๏ธ | stage ':
1345
+ stage: stop stage
1346
+ image: path/to/docker/gcloud:the-version
1347
+ variables:
1348
+ KUBERNETES_CPU_REQUEST: '0.22'
1349
+ KUBERNETES_MEMORY_REQUEST: 200Mi
1350
+ KUBERNETES_MEMORY_LIMIT: 400Mi
1351
+ GIT_STRATEGY: none
1352
+ script:
1353
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1354
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
1355
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1356
+ - set +e
1357
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_stage_api_GCLOUD_DEPLOY_credentialsKey")
1358
+ - gcloud run services delete pan-test-app-stage-api --project=google-project-id --region=europe-west6
1359
+ - gcloud scheduler jobs delete pan-test-app-stage-api-send-reminders-scheduler --project=google-project-id --location=europe-west6
1360
+ - gcloud run jobs executions list --project=google-project-id --region=europe-west6 --job pan-test-app-stage-api-migration --format="value(name)" | xargs -I {} gcloud run jobs executions delete {} --quiet --project=google-project-id --region=europe-west6
1361
+ - gcloud run jobs delete pan-test-app-stage-api-migration --project=google-project-id --region=europe-west6
1362
+ - gcloud run jobs executions list --project=google-project-id --region=europe-west6 --job pan-test-app-stage-api-send-reminders --format="value(name)" | xargs -I {} gcloud run jobs executions delete {} --quiet --project=google-project-id --region=europe-west6
1363
+ - gcloud run jobs delete pan-test-app-stage-api-send-reminders --project=google-project-id --region=europe-west6
1364
+ - gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/stage/api --quiet --delete-tags
1365
+ - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api@$version --quiet --delete-tags; done
1366
+ - echo 'Disabling component in Dependency Track'
1367
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/api" "https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" || true
1368
+ - set -e
1369
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
1370
+ environment:
1371
+ name: stage/api
1372
+ url: $CL_GITLAB_ENVIRONMENT_URL
1373
+ action: stop
1374
+ artifacts:
1375
+ reports:
1376
+ dotenv: gitlab_environment.env
1377
+ rules:
1378
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
1379
+ when: on_success
1380
+ - when: manual
1381
+ if: $CI_COMMIT_TAG
1382
+ needs: []
1383
+ retry: *a1
1384
+ interruptible: true
1385
+ allow_failure: true
1386
+ '๐Ÿ”น api ๐Ÿ”จ docker | prod ':
1387
+ stage: build
1388
+ image: path/to/docker/docker-build:the-version
1389
+ services:
1390
+ - name: docker:24.0.6-dind
1391
+ command:
1392
+ - --tls=false
1393
+ variables:
1394
+ DOCKER_HOST: tcp://0.0.0.0:2375
1395
+ DOCKER_TLS_CERTDIR: ''
1396
+ DOCKER_DRIVER: overlay2
1397
+ DOCKER_BUILDKIT: '1'
1398
+ KUBERNETES_CPU_REQUEST: '0.45'
1399
+ KUBERNETES_MEMORY_REQUEST: 1Gi
1400
+ KUBERNETES_MEMORY_LIMIT: 2Gi
1401
+ script:
1402
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1403
+ - export APP_DIR="api"
1404
+ - export DOCKER_BUILD_CONTEXT="."
1405
+ - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
1406
+ - export DOCKER_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/prod/api"
1407
+ - export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api"
1408
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
1409
+ - |-
1410
+ export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
1411
+ RUN yarn plugin import workspace-tools
1412
+ RUN yarn workspaces focus --production && yarn rebuild"
1413
+ - |-
1414
+ export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node api/package.json /app/api/package.json
1415
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
1416
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
1417
+ COPY --chown=node:node .yarn /app/.yarn"
1418
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1419
+ - ensureNodeDockerfile
1420
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
1421
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_prod_api_GCLOUD_DEPLOY_credentialsKey")
1422
+ - gcloud auth configure-docker europe-west6-docker.pkg.dev
1423
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
1424
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
1425
+ - docker build --network host --cache-from $DOCKER_CACHE_IMAGE --tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG -f $APP_DIR/Dockerfile $DOCKER_BUILD_CONTEXT --build-arg BUILDKIT_INLINE_CACHE=1
1426
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
1427
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
1428
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
1429
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
1430
+ - docker push $DOCKER_CACHE_IMAGE
1431
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
1432
+ cache:
1433
+ - key: api-yarn
1434
+ policy: pull
1435
+ paths:
1436
+ - api/.yarn
1437
+ rules:
1438
+ - if: $CI_COMMIT_TAG
1439
+ needs:
1440
+ - job: '๐Ÿ”ธ myWorkspace ๐Ÿ”จ app | prod '
1441
+ artifacts: true
1442
+ retry: *a1
1443
+ interruptible: true
1444
+ '๐Ÿ”น api ๐Ÿงพ sbom | prod ':
1445
+ stage: build
1446
+ image: aquasec/trivy:0.38.3
1447
+ variables: {}
1448
+ script:
1449
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1450
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1451
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" api
1452
+ artifacts:
1453
+ paths:
1454
+ - __sbom.json
1455
+ rules:
1456
+ - if: $CI_COMMIT_TAG
1457
+ needs: []
1458
+ retry: *a1
1459
+ interruptible: true
1460
+ allow_failure: true
1461
+ '๐Ÿ”น api ๐Ÿš€ Deploy | prod ':
1462
+ stage: deploy prod
1463
+ image: path/to/docker/gcloud:the-version
1464
+ variables:
1465
+ KUBERNETES_CPU_REQUEST: '0.22'
1466
+ KUBERNETES_MEMORY_REQUEST: 200Mi
1467
+ KUBERNETES_MEMORY_LIMIT: 400Mi
1468
+ script:
1469
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1470
+ - export ENV_SHORT="prod"
1471
+ - export APP_DIR="api"
1472
+ - export ENV_TYPE="prod"
1473
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1474
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1475
+ - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
1476
+ - export HOST="$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1477
+ - export ROOT_URL="https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1478
+ - export HOST_INTERNAL="$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1479
+ - export HOST_CANONICAL="$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1480
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1481
+ - export CLOUD_SQL_INSTANCE_CONNECTION_NAME="projectId:region:instancename"
1482
+ - export DB_NAME="pan-test-app-prod-api"
1483
+ - export DB_USER="my-user"
1484
+ - export DB_PASSWORD="$CL_prod_api_DB_PASSWORD"
1485
+ - export DATABASE_URL="postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME"
1486
+ - export 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"
1487
+ - export CLOUD_RUN_JOB_TRIGGER_URL_migration="https://europe-west6-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/google-project-id/jobs/pan-test-app-prod-api-migration:run"
1488
+ - export CLOUD_RUN_JOB_TRIGGER_URL_send_reminders="https://europe-west6-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/google-project-id/jobs/pan-test-app-prod-api-send-reminders:run"
1489
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="google-project-id"
1490
+ - export DEPLOY_CLOUD_RUN_REGION="europe-west6"
1491
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_prod_api_GCLOUD_DEPLOY_credentialsKey"
1492
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix"
1493
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"CLOUD_SQL_INSTANCE_CONNECTION_NAME\\",\\"DB_NAME\\",\\"DB_USER\\",\\"DB_PASSWORD\\",\\"DATABASE_URL\\",\\"DATABASE_JDBC_URL\\",\\"CLOUD_RUN_JOB_TRIGGER_URL_migration\\",\\"CLOUD_RUN_JOB_TRIGGER_URL_send_reminders\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
1494
+ - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
1495
+ - export DOCKER_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/prod/api"
1496
+ - export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api"
1497
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
1498
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
1499
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1500
+ - echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."
1501
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_prod_api_GCLOUD_DEPLOY_credentialsKey")
1502
+ - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe google-project-id --format="value(projectNumber)")
1503
+ - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
1504
+ - echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"
1505
+ - echo -e "\\e[0Ksection_start:$(date +%s):writeenvvars[collapsed=true]\\r\\e[0KWrite env vars to file"
1506
+ - |
1507
+ cat > ____envvars.yaml <<EOF
1508
+ ENV_SHORT: |-
1509
+ prod
1510
+ APP_DIR: |-
1511
+ api
1512
+ ENV_TYPE: |-
1513
+ prod
1514
+ BUILD_INFO_BUILD_ID: |-
1515
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
1516
+ BUILD_INFO_BUILD_TIME: |-
1517
+ $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
1518
+ BUILD_INFO_CURRENT_VERSION: |-
1519
+ $(printf %s "$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")" | sed 's/^/ /')
1520
+ HOST: |-
1521
+ $(printf %s "$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1522
+ ROOT_URL: |-
1523
+ $(printf %s "https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1524
+ HOST_INTERNAL: |-
1525
+ $(printf %s "$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1526
+ HOST_CANONICAL: |-
1527
+ $(printf %s "$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1528
+ ROOT_URL_INTERNAL: |-
1529
+ $(printf %s "https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1530
+ CLOUD_SQL_INSTANCE_CONNECTION_NAME: |-
1531
+ projectId:region:instancename
1532
+ DB_NAME: |-
1533
+ pan-test-app-prod-api
1534
+ DB_USER: |-
1535
+ my-user
1536
+ DB_PASSWORD: |-
1537
+ $(printf %s "$CL_prod_api_DB_PASSWORD" | sed 's/^/ /')
1538
+ DATABASE_URL: |-
1539
+ postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME
1540
+ DATABASE_JDBC_URL: |-
1541
+ jdbc:postgresql:///$DB_NAME?cloudSqlInstance=$CLOUD_SQL_INSTANCE_CONNECTION_NAME&socketFactory=com.google.cloud.sql.postgres.SocketFactory&user=$DB_USER&password=$DB_PASSWORD
1542
+ CLOUD_RUN_JOB_TRIGGER_URL_migration: |-
1543
+ https://europe-west6-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/google-project-id/jobs/pan-test-app-prod-api-migration:run
1544
+ CLOUD_RUN_JOB_TRIGGER_URL_send_reminders: |-
1545
+ https://europe-west6-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/google-project-id/jobs/pan-test-app-prod-api-send-reminders:run
1546
+ DEPLOY_CLOUD_RUN_PROJECT_ID: |-
1547
+ google-project-id
1548
+ DEPLOY_CLOUD_RUN_REGION: |-
1549
+ europe-west6
1550
+ GCLOUD_RUN_canonicalHostSuffix: |-
1551
+ $(printf %s "$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | sed 's/^/ /')
1552
+ _ALL_ENV_VAR_KEYS: |-
1553
+ ["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_INTERNAL","HOST_CANONICAL","ROOT_URL_INTERNAL","CLOUD_SQL_INSTANCE_CONNECTION_NAME","DB_NAME","DB_USER","DB_PASSWORD","DATABASE_URL","DATABASE_JDBC_URL","CLOUD_RUN_JOB_TRIGGER_URL_migration","CLOUD_RUN_JOB_TRIGGER_URL_send_reminders","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
1554
+
1555
+ EOF
1556
+ - echo -e "\\e[0Ksection_end:$(date +%s):writeenvvars\\r\\e[0K"
1557
+ - echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"
1558
+ - set +e
1559
+ - echo "ensuring Database..."
1560
+ - gcloud sql databases create pan-test-app-prod-api --instance=instancename --project projectId
1561
+ - set -e
1562
+ - set +e
1563
+ - gcloud scheduler jobs create http pan-test-app-prod-api-send-reminders-scheduler --project=google-project-id --location=europe-west6 --schedule="0 * * * *" --max-retry-attempts=0 --uri="https://europe-west6-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/google-project-id/jobs/pan-test-app-prod-api-send-reminders:run" --http-method=POST --oauth-service-account-email=$GCLOUD_PROJECT_NUMBER-compute@developer.gserviceaccount.com
1564
+ - set -e
1565
+ - gcloud scheduler jobs update http pan-test-app-prod-api-send-reminders-scheduler --project=google-project-id --location=europe-west6 --schedule="0 * * * *" --max-retry-attempts=0 --uri="https://europe-west6-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/google-project-id/jobs/pan-test-app-prod-api-send-reminders:run" --http-method=POST --oauth-service-account-email=$GCLOUD_PROJECT_NUMBER-compute@developer.gserviceaccount.com
1566
+ - set +e
1567
+ - gcloud run jobs create pan-test-app-prod-api-migration --command="yarn,migrate" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/prod/api:$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --set-cloudsql-instances=projectId:region:instancename --labels=customer-name=pan,component-name=api,app-name=test-app,env-type=prod,env-name=prod,build-type=node,cloud-run-job-name=pan-test-app-prod-api-migration --memory=512Mi --task-timeout=10m --parallelism=1 --env-vars-file=____envvars.yaml --max-retries=0
1568
+ - set -e
1569
+ - 'gcloud run jobs update pan-test-app-prod-api-migration --command="yarn,migrate" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/prod/api:$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --set-cloudsql-instances=projectId:region:instancename --labels=customer-name=pan,component-name=api,app-name=test-app,env-type=prod,env-name=prod,build-type=node,cloud-run-job-name=pan-test-app-prod-api-migration --memory=512Mi --task-timeout=10m --parallelism=1 --env-vars-file=____envvars.yaml --max-retries=0 '
1570
+ - set +e
1571
+ - gcloud run jobs create pan-test-app-prod-api-send-reminders --command="yarn,job:send-reminders" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/prod/api:$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --set-cloudsql-instances=projectId:region:instancename --labels=customer-name=pan,component-name=api,app-name=test-app,env-type=prod,env-name=prod,build-type=node,cloud-run-job-name=pan-test-app-prod-api-send-reminders --memory=512Mi --task-timeout=15m --parallelism=1 --env-vars-file=____envvars.yaml --max-retries=0
1572
+ - set -e
1573
+ - 'gcloud run jobs update pan-test-app-prod-api-send-reminders --command="yarn,job:send-reminders" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/prod/api:$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --set-cloudsql-instances=projectId:region:instancename --labels=customer-name=pan,component-name=api,app-name=test-app,env-type=prod,env-name=prod,build-type=node,cloud-run-job-name=pan-test-app-prod-api-send-reminders --memory=512Mi --task-timeout=15m --parallelism=1 --env-vars-file=____envvars.yaml --max-retries=0 '
1574
+ - 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/prod/api:$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --set-cloudsql-instances=projectId:region:instancename --labels=customer-name=pan,component-name=api,app-name=test-app,env-type=prod,env-name=prod,build-type=node,cloud-run-service-name=pan-test-app-prod-api --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=5 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost
1575
+ - gcloud run jobs execute pan-test-app-prod-api-migration --project=google-project-id --region=europe-west6
1576
+ - echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"
1577
+ - echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"
1578
+ - gcloud run revisions list --project=google-project-id --region=europe-west6 --service=pan-test-app-prod-api --limit=unlimited --sort-by=metadata.creationTimestamp --format="value(name)" --filter='(status.conditions.status=False OR status.conditions.status=Unknown)' | tail -n +6 | while read -r revisionname; do gcloud run revisions delete --project=google-project-id --region=europe-west6 --quiet $revisionname ; done
1579
+ - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/prod/api --sort-by=~CREATE_TIME --format="value(version)" | tail -n +7 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/prod/api@$version --quiet --delete-tags; done
1580
+ - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api@$version --quiet --delete-tags; done
1581
+ - echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"
1582
+ - echo 'Uploading SBOM to Dependency Track'
1583
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/api" "https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" "__sbom.json" vex.json || true
1584
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
1585
+ environment:
1586
+ name: prod/api
1587
+ url: $CL_GITLAB_ENVIRONMENT_URL
1588
+ on_stop: '๐Ÿ”น api ๐Ÿ›‘ Stop โš ๏ธ | prod '
1589
+ artifacts:
1590
+ reports:
1591
+ dotenv: gitlab_environment.env
1592
+ rules:
1593
+ - when: manual
1594
+ if: $CI_COMMIT_TAG
1595
+ needs:
1596
+ - job: '๐Ÿ”น api ๐Ÿ”จ docker | prod '
1597
+ artifacts: false
1598
+ - job: '๐Ÿ”น api ๐Ÿงพ sbom | prod '
1599
+ artifacts: true
1600
+ retry: *a1
1601
+ interruptible: true
1602
+ allow_failure: true
1603
+ '๐Ÿ”น api ๐Ÿ›‘ Stop โš ๏ธ | prod ':
1604
+ stage: stop prod
1605
+ image: path/to/docker/gcloud:the-version
1606
+ variables:
1607
+ KUBERNETES_CPU_REQUEST: '0.22'
1608
+ KUBERNETES_MEMORY_REQUEST: 200Mi
1609
+ KUBERNETES_MEMORY_LIMIT: 400Mi
1610
+ GIT_STRATEGY: none
1611
+ script:
1612
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1613
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
1614
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1615
+ - set +e
1616
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_prod_api_GCLOUD_DEPLOY_credentialsKey")
1617
+ - gcloud run services delete pan-test-app-prod-api --project=google-project-id --region=europe-west6
1618
+ - gcloud scheduler jobs delete pan-test-app-prod-api-send-reminders-scheduler --project=google-project-id --location=europe-west6
1619
+ - gcloud run jobs executions list --project=google-project-id --region=europe-west6 --job pan-test-app-prod-api-migration --format="value(name)" | xargs -I {} gcloud run jobs executions delete {} --quiet --project=google-project-id --region=europe-west6
1620
+ - gcloud run jobs delete pan-test-app-prod-api-migration --project=google-project-id --region=europe-west6
1621
+ - gcloud run jobs executions list --project=google-project-id --region=europe-west6 --job pan-test-app-prod-api-send-reminders --format="value(name)" | xargs -I {} gcloud run jobs executions delete {} --quiet --project=google-project-id --region=europe-west6
1622
+ - gcloud run jobs delete pan-test-app-prod-api-send-reminders --project=google-project-id --region=europe-west6
1623
+ - gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/prod/api --quiet --delete-tags
1624
+ - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api@$version --quiet --delete-tags; done
1625
+ - echo 'Disabling component in Dependency Track'
1626
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/api" "https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" || true
1627
+ - set -e
1628
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
1629
+ environment:
1630
+ name: prod/api
1631
+ url: $CL_GITLAB_ENVIRONMENT_URL
1632
+ action: stop
1633
+ artifacts:
1634
+ reports:
1635
+ dotenv: gitlab_environment.env
1636
+ rules:
1637
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
1638
+ when: on_success
1639
+ - when: manual
1640
+ if: $CI_COMMIT_TAG
1641
+ needs: []
1642
+ retry: *a1
1643
+ interruptible: true
1644
+ allow_failure: true
1645
+ '๐Ÿ”น www ๐Ÿ”จ docker | dev ':
1646
+ stage: build
1647
+ image: path/to/docker/docker-build:the-version
1648
+ services:
1649
+ - name: docker:24.0.6-dind
1650
+ command:
1651
+ - --tls=false
1652
+ variables:
1653
+ DOCKER_HOST: tcp://0.0.0.0:2375
1654
+ DOCKER_TLS_CERTDIR: ''
1655
+ DOCKER_DRIVER: overlay2
1656
+ DOCKER_BUILDKIT: '1'
1657
+ KUBERNETES_CPU_REQUEST: '0.45'
1658
+ KUBERNETES_MEMORY_REQUEST: 1Gi
1659
+ KUBERNETES_MEMORY_LIMIT: 2Gi
1660
+ script:
1661
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1662
+ - export APP_DIR="www"
1663
+ - export DOCKER_BUILD_CONTEXT="."
1664
+ - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
1665
+ - export DOCKER_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/dev/www"
1666
+ - export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/www"
1667
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
1668
+ - |-
1669
+ export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
1670
+ RUN yarn plugin import workspace-tools
1671
+ RUN yarn workspaces focus --production && yarn rebuild"
1672
+ - |-
1673
+ export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node www/package.json /app/www/package.json
1674
+ COPY --chown=node:node www/yarn.lock /app/www/yarn.lock
1675
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
1676
+ COPY --chown=node:node .yarn /app/.yarn"
1677
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1678
+ - ensureNodeDockerfile
1679
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
1680
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_dev_www_GCLOUD_DEPLOY_credentialsKey")
1681
+ - gcloud auth configure-docker europe-west6-docker.pkg.dev
1682
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
1683
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
1684
+ - docker build --network host --cache-from $DOCKER_CACHE_IMAGE --tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG -f $APP_DIR/Dockerfile $DOCKER_BUILD_CONTEXT --build-arg BUILDKIT_INLINE_CACHE=1
1685
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
1686
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
1687
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
1688
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
1689
+ - docker push $DOCKER_CACHE_IMAGE
1690
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
1691
+ cache:
1692
+ - key: www-yarn
1693
+ policy: pull
1694
+ paths:
1695
+ - www/.yarn
1696
+ rules:
1697
+ - when: never
1698
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
1699
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
1700
+ needs:
1701
+ - job: '๐Ÿ”ธ myWorkspace ๐Ÿ”จ app | dev '
1702
+ artifacts: true
1703
+ retry: *a1
1704
+ interruptible: true
1705
+ '๐Ÿ”น www ๐Ÿงพ sbom | dev ':
1706
+ stage: build
1707
+ image: aquasec/trivy:0.38.3
1708
+ variables: {}
1709
+ script:
1710
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1711
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1712
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" www
1713
+ artifacts:
1714
+ paths:
1715
+ - __sbom.json
1716
+ rules:
1717
+ - when: never
1718
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
1719
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
1720
+ needs: []
1721
+ retry: *a1
1722
+ interruptible: true
1723
+ allow_failure: true
1724
+ '๐Ÿ”น www ๐Ÿš€ Deploy | dev ':
1725
+ stage: deploy dev
1726
+ image: path/to/docker/gcloud:the-version
1727
+ variables:
1728
+ KUBERNETES_CPU_REQUEST: '0.22'
1729
+ KUBERNETES_MEMORY_REQUEST: 200Mi
1730
+ KUBERNETES_MEMORY_LIMIT: 400Mi
1731
+ script:
1732
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1733
+ - export ENV_SHORT="dev"
1734
+ - export APP_DIR="www"
1735
+ - export ENV_TYPE="dev"
1736
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1737
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1738
+ - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
1739
+ - export HOST="$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1740
+ - export ROOT_URL="https://$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1741
+ - export HOST_INTERNAL="$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1742
+ - export HOST_CANONICAL="$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1743
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1744
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="google-project-id"
1745
+ - export DEPLOY_CLOUD_RUN_REGION="europe-west6"
1746
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_dev_www_GCLOUD_DEPLOY_credentialsKey"
1747
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix"
1748
+ - export API_URL="https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')/graphql"
1749
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\",\\"API_URL\\"]"
1750
+ - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
1751
+ - export DOCKER_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/dev/www"
1752
+ - export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/www"
1753
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
1754
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
1755
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1756
+ - echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."
1757
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_dev_www_GCLOUD_DEPLOY_credentialsKey")
1758
+ - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe google-project-id --format="value(projectNumber)")
1759
+ - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
1760
+ - echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"
1761
+ - echo -e "\\e[0Ksection_start:$(date +%s):writeenvvars[collapsed=true]\\r\\e[0KWrite env vars to file"
1762
+ - |
1763
+ cat > ____envvars.yaml <<EOF
1764
+ ENV_SHORT: |-
1765
+ dev
1766
+ APP_DIR: |-
1767
+ www
1768
+ ENV_TYPE: |-
1769
+ dev
1770
+ BUILD_INFO_BUILD_ID: |-
1771
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
1772
+ BUILD_INFO_BUILD_TIME: |-
1773
+ $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
1774
+ BUILD_INFO_CURRENT_VERSION: |-
1775
+ $(printf %s "$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")" | sed 's/^/ /')
1776
+ HOST: |-
1777
+ $(printf %s "$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1778
+ ROOT_URL: |-
1779
+ $(printf %s "https://$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1780
+ HOST_INTERNAL: |-
1781
+ $(printf %s "$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1782
+ HOST_CANONICAL: |-
1783
+ $(printf %s "$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1784
+ ROOT_URL_INTERNAL: |-
1785
+ $(printf %s "https://$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1786
+ DEPLOY_CLOUD_RUN_PROJECT_ID: |-
1787
+ google-project-id
1788
+ DEPLOY_CLOUD_RUN_REGION: |-
1789
+ europe-west6
1790
+ GCLOUD_RUN_canonicalHostSuffix: |-
1791
+ $(printf %s "$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | sed 's/^/ /')
1792
+ API_URL: |-
1793
+ $(printf %s "https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')/graphql" | sed 's/^/ /')
1794
+ _ALL_ENV_VAR_KEYS: |-
1795
+ ["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_INTERNAL","HOST_CANONICAL","ROOT_URL_INTERNAL","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix","API_URL"]
1796
+
1797
+ EOF
1798
+ - echo -e "\\e[0Ksection_end:$(date +%s):writeenvvars\\r\\e[0K"
1799
+ - echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"
1800
+ - gcloud run deploy pan-test-app-dev-www --command="yarn,start" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/dev/www:$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --labels=customer-name=pan,component-name=www,app-name=test-app,env-type=dev,env-name=dev,build-type=node,cloud-run-service-name=pan-test-app-dev-www --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost
1801
+ - echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"
1802
+ - echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"
1803
+ - gcloud run revisions list --project=google-project-id --region=europe-west6 --service=pan-test-app-dev-www --limit=unlimited --sort-by=metadata.creationTimestamp --format="value(name)" --filter='(status.conditions.status=False OR status.conditions.status=Unknown)' | while read -r revisionname; do gcloud run revisions delete --project=google-project-id --region=europe-west6 --quiet $revisionname ; done
1804
+ - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/dev/www --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/dev/www@$version --quiet --delete-tags; done
1805
+ - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/www --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/www@$version --quiet --delete-tags; done
1806
+ - echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"
1807
+ - echo 'Uploading SBOM to Dependency Track'
1808
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/www" "https://$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" "__sbom.json" vex.json || true
1809
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
1810
+ environment:
1811
+ name: dev/www
1812
+ url: $CL_GITLAB_ENVIRONMENT_URL
1813
+ on_stop: '๐Ÿ”น www ๐Ÿ›‘ Stop โš ๏ธ | dev '
1814
+ auto_stop_in: 4 weeks
1815
+ artifacts:
1816
+ reports:
1817
+ dotenv: gitlab_environment.env
1818
+ rules:
1819
+ - when: never
1820
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
1821
+ - when: on_success
1822
+ if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
1823
+ needs:
1824
+ - job: ๐Ÿ”ธ myWorkspace ๐Ÿ‘ฎ lint
1825
+ artifacts: false
1826
+ - job: ๐Ÿ”ธ myWorkspace ๐Ÿงช test
1827
+ artifacts: false
1828
+ - job: ๐Ÿ”ธ myWorkspace ๐Ÿ›ก audit
1829
+ artifacts: false
1830
+ - job: '๐Ÿ”น www ๐Ÿ”จ docker | dev '
1831
+ artifacts: false
1832
+ - job: '๐Ÿ”น www ๐Ÿงพ sbom | dev '
1833
+ artifacts: true
1834
+ retry: *a1
1835
+ interruptible: true
1836
+ allow_failure: false
1837
+ '๐Ÿ”น www ๐Ÿ›‘ Stop โš ๏ธ | dev ':
1838
+ stage: stop dev
1839
+ image: path/to/docker/gcloud:the-version
1840
+ variables:
1841
+ KUBERNETES_CPU_REQUEST: '0.22'
1842
+ KUBERNETES_MEMORY_REQUEST: 200Mi
1843
+ KUBERNETES_MEMORY_LIMIT: 400Mi
1844
+ GIT_STRATEGY: none
1845
+ script:
1846
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1847
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
1848
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1849
+ - set +e
1850
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_dev_www_GCLOUD_DEPLOY_credentialsKey")
1851
+ - gcloud run services delete pan-test-app-dev-www --project=google-project-id --region=europe-west6
1852
+ - gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/dev/www --quiet --delete-tags
1853
+ - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/www --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/www@$version --quiet --delete-tags; done
1854
+ - echo 'Disabling component in Dependency Track'
1855
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/www" "https://$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" || true
1856
+ - set -e
1857
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
1858
+ environment:
1859
+ name: dev/www
1860
+ url: $CL_GITLAB_ENVIRONMENT_URL
1861
+ action: stop
1862
+ artifacts:
1863
+ reports:
1864
+ dotenv: gitlab_environment.env
1865
+ rules:
1866
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
1867
+ when: on_success
1868
+ - when: never
1869
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
1870
+ - when: manual
1871
+ if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
1872
+ needs: []
1873
+ retry: *a1
1874
+ interruptible: true
1875
+ allow_failure: true
1876
+ '๐Ÿ”น www ๐Ÿ”จ docker | review ':
1877
+ stage: build
1878
+ image: path/to/docker/docker-build:the-version
1879
+ services:
1880
+ - name: docker:24.0.6-dind
1881
+ command:
1882
+ - --tls=false
1883
+ variables:
1884
+ DOCKER_HOST: tcp://0.0.0.0:2375
1885
+ DOCKER_TLS_CERTDIR: ''
1886
+ DOCKER_DRIVER: overlay2
1887
+ DOCKER_BUILDKIT: '1'
1888
+ KUBERNETES_CPU_REQUEST: '0.45'
1889
+ KUBERNETES_MEMORY_REQUEST: 1Gi
1890
+ KUBERNETES_MEMORY_LIMIT: 2Gi
1891
+ script:
1892
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1893
+ - export APP_DIR="www"
1894
+ - export DOCKER_BUILD_CONTEXT="."
1895
+ - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
1896
+ - export DOCKER_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/www/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })"
1897
+ - export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/www"
1898
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
1899
+ - |-
1900
+ export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
1901
+ RUN yarn plugin import workspace-tools
1902
+ RUN yarn workspaces focus --production && yarn rebuild"
1903
+ - |-
1904
+ export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node www/package.json /app/www/package.json
1905
+ COPY --chown=node:node www/yarn.lock /app/www/yarn.lock
1906
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
1907
+ COPY --chown=node:node .yarn /app/.yarn"
1908
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1909
+ - ensureNodeDockerfile
1910
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
1911
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_review_www_GCLOUD_DEPLOY_credentialsKey")
1912
+ - gcloud auth configure-docker europe-west6-docker.pkg.dev
1913
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
1914
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
1915
+ - docker build --network host --cache-from $DOCKER_CACHE_IMAGE --tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG -f $APP_DIR/Dockerfile $DOCKER_BUILD_CONTEXT --build-arg BUILDKIT_INLINE_CACHE=1
1916
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
1917
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
1918
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
1919
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
1920
+ - docker push $DOCKER_CACHE_IMAGE
1921
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
1922
+ cache:
1923
+ - key: www-yarn
1924
+ policy: pull
1925
+ paths:
1926
+ - www/.yarn
1927
+ rules:
1928
+ - if: $CI_MERGE_REQUEST_ID
1929
+ needs:
1930
+ - job: '๐Ÿ”ธ myWorkspace ๐Ÿ”จ app | review '
1931
+ artifacts: true
1932
+ retry: *a1
1933
+ interruptible: true
1934
+ '๐Ÿ”น www ๐Ÿงพ sbom | review ':
1935
+ stage: build
1936
+ image: aquasec/trivy:0.38.3
1937
+ variables: {}
1938
+ script:
1939
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1940
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1941
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" www
1942
+ artifacts:
1943
+ paths:
1944
+ - __sbom.json
1945
+ rules:
1946
+ - if: $CI_MERGE_REQUEST_ID
1947
+ needs: []
1948
+ retry: *a1
1949
+ interruptible: true
1950
+ allow_failure: true
1951
+ '๐Ÿ”น www ๐Ÿš€ Deploy | review ':
1952
+ stage: deploy review
1953
+ image: path/to/docker/gcloud:the-version
1954
+ variables:
1955
+ KUBERNETES_CPU_REQUEST: '0.22'
1956
+ KUBERNETES_MEMORY_REQUEST: 200Mi
1957
+ KUBERNETES_MEMORY_LIMIT: 400Mi
1958
+ script:
1959
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1960
+ - export ENV_SHORT="review"
1961
+ - export APP_DIR="www"
1962
+ - export ENV_TYPE="review"
1963
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1964
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1965
+ - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
1966
+ - export HOST="$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-www-$CL_review_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1967
+ - export ROOT_URL="https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-www-$CL_review_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1968
+ - export HOST_INTERNAL="$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-www-$CL_review_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1969
+ - export HOST_CANONICAL="$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-www-$CL_review_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1970
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-www-$CL_review_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1971
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="google-project-id"
1972
+ - export DEPLOY_CLOUD_RUN_REGION="europe-west6"
1973
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_review_www_GCLOUD_DEPLOY_credentialsKey"
1974
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_review_www_GCLOUD_RUN_canonicalHostSuffix"
1975
+ - export API_URL="https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')/graphql"
1976
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\",\\"API_URL\\"]"
1977
+ - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
1978
+ - export DOCKER_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/www/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })"
1979
+ - export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/www"
1980
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
1981
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
1982
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1983
+ - echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."
1984
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_review_www_GCLOUD_DEPLOY_credentialsKey")
1985
+ - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe google-project-id --format="value(projectNumber)")
1986
+ - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
1987
+ - echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"
1988
+ - echo -e "\\e[0Ksection_start:$(date +%s):writeenvvars[collapsed=true]\\r\\e[0KWrite env vars to file"
1989
+ - |
1990
+ cat > ____envvars.yaml <<EOF
1991
+ ENV_SHORT: |-
1992
+ review
1993
+ APP_DIR: |-
1994
+ www
1995
+ ENV_TYPE: |-
1996
+ review
1997
+ BUILD_INFO_BUILD_ID: |-
1998
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
1999
+ BUILD_INFO_BUILD_TIME: |-
2000
+ $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
2001
+ BUILD_INFO_CURRENT_VERSION: |-
2002
+ $(printf %s "$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")" | sed 's/^/ /')
2003
+ HOST: |-
2004
+ $(printf %s "$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-www-$CL_review_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2005
+ ROOT_URL: |-
2006
+ $(printf %s "https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-www-$CL_review_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2007
+ HOST_INTERNAL: |-
2008
+ $(printf %s "$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-www-$CL_review_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2009
+ HOST_CANONICAL: |-
2010
+ $(printf %s "$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-www-$CL_review_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2011
+ ROOT_URL_INTERNAL: |-
2012
+ $(printf %s "https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-www-$CL_review_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2013
+ DEPLOY_CLOUD_RUN_PROJECT_ID: |-
2014
+ google-project-id
2015
+ DEPLOY_CLOUD_RUN_REGION: |-
2016
+ europe-west6
2017
+ GCLOUD_RUN_canonicalHostSuffix: |-
2018
+ $(printf %s "$CL_review_www_GCLOUD_RUN_canonicalHostSuffix" | sed 's/^/ /')
2019
+ API_URL: |-
2020
+ $(printf %s "https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')/graphql" | sed 's/^/ /')
2021
+ _ALL_ENV_VAR_KEYS: |-
2022
+ ["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_INTERNAL","HOST_CANONICAL","ROOT_URL_INTERNAL","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix","API_URL"]
2023
+
2024
+ EOF
2025
+ - echo -e "\\e[0Ksection_end:$(date +%s):writeenvvars\\r\\e[0K"
2026
+ - echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"
2027
+ - gcloud run deploy $(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-www" | awk '{print tolower($0)}') --command="yarn,start" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/www/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }):$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --labels=customer-name=pan,component-name=www,app-name=test-app,env-type=review,env-name=review,build-type=node,cloud-run-service-name=$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-www" | awk '{print tolower($0)}') --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost
2028
+ - echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"
2029
+ - echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"
2030
+ - gcloud run revisions list --project=google-project-id --region=europe-west6 --service=$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-www" | awk '{print tolower($0)}') --limit=unlimited --sort-by=metadata.creationTimestamp --format="value(name)" --filter='(status.conditions.status=False OR status.conditions.status=Unknown)' | while read -r revisionname; do gcloud run revisions delete --project=google-project-id --region=europe-west6 --quiet $revisionname ; done
2031
+ - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/www/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }) --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/www/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })@$version --quiet --delete-tags; done
2032
+ - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/www --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/www@$version --quiet --delete-tags; done
2033
+ - set +e
2034
+ - gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/www --quiet --delete-tags
2035
+ - set -e
2036
+ - echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"
2037
+ - echo 'Uploading SBOM to Dependency Track'
2038
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/www" "https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-www-$CL_review_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" "__sbom.json" vex.json || true
2039
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-www-$CL_review_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
2040
+ environment:
2041
+ name: review/$CI_COMMIT_REF_NAME/www
2042
+ url: $CL_GITLAB_ENVIRONMENT_URL
2043
+ on_stop: '๐Ÿ”น www ๐Ÿ›‘ Stop โš ๏ธ | review '
2044
+ auto_stop_in: 1 week
2045
+ artifacts:
2046
+ reports:
2047
+ dotenv: gitlab_environment.env
2048
+ rules:
2049
+ - when: on_success
2050
+ if: $CI_MERGE_REQUEST_ID
2051
+ needs:
2052
+ - job: ๐Ÿ”ธ myWorkspace ๐Ÿ‘ฎ lint
2053
+ artifacts: false
2054
+ - job: ๐Ÿ”ธ myWorkspace ๐Ÿงช test
2055
+ artifacts: false
2056
+ - job: ๐Ÿ”ธ myWorkspace ๐Ÿ›ก audit
2057
+ artifacts: false
2058
+ - job: '๐Ÿ”น www ๐Ÿ”จ docker | review '
2059
+ artifacts: false
2060
+ - job: '๐Ÿ”น www ๐Ÿงพ sbom | review '
2061
+ artifacts: true
2062
+ retry: *a1
2063
+ interruptible: true
2064
+ allow_failure: false
2065
+ '๐Ÿ”น www ๐Ÿ›‘ Stop โš ๏ธ | review ':
2066
+ stage: stop review
2067
+ image: path/to/docker/gcloud:the-version
2068
+ variables:
2069
+ KUBERNETES_CPU_REQUEST: '0.22'
2070
+ KUBERNETES_MEMORY_REQUEST: 200Mi
2071
+ KUBERNETES_MEMORY_LIMIT: 400Mi
2072
+ GIT_STRATEGY: none
2073
+ script:
2074
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
2075
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
2076
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
2077
+ - set +e
2078
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_review_www_GCLOUD_DEPLOY_credentialsKey")
2079
+ - gcloud run services delete $(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-www" | awk '{print tolower($0)}') --project=google-project-id --region=europe-west6
2080
+ - gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/www/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }) --quiet --delete-tags
2081
+ - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/www --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/www@$version --quiet --delete-tags; done
2082
+ - set +e
2083
+ - gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/www --quiet --delete-tags
2084
+ - set -e
2085
+ - echo 'Disabling component in Dependency Track'
2086
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/www" "https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-www-$CL_review_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" || true
2087
+ - set -e
2088
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-www-$CL_review_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
2089
+ environment:
2090
+ name: review/$CI_COMMIT_REF_NAME/www
2091
+ url: $CL_GITLAB_ENVIRONMENT_URL
2092
+ action: stop
2093
+ artifacts:
2094
+ reports:
2095
+ dotenv: gitlab_environment.env
2096
+ rules:
2097
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
2098
+ when: on_success
2099
+ - when: manual
2100
+ if: $CI_MERGE_REQUEST_ID
2101
+ needs: []
2102
+ retry: *a1
2103
+ interruptible: true
2104
+ allow_failure: true
2105
+ '๐Ÿ”น www ๐Ÿ”จ docker | stage ':
2106
+ stage: build
2107
+ image: path/to/docker/docker-build:the-version
2108
+ services:
2109
+ - name: docker:24.0.6-dind
2110
+ command:
2111
+ - --tls=false
2112
+ variables:
2113
+ DOCKER_HOST: tcp://0.0.0.0:2375
2114
+ DOCKER_TLS_CERTDIR: ''
2115
+ DOCKER_DRIVER: overlay2
2116
+ DOCKER_BUILDKIT: '1'
2117
+ KUBERNETES_CPU_REQUEST: '0.45'
2118
+ KUBERNETES_MEMORY_REQUEST: 1Gi
2119
+ KUBERNETES_MEMORY_LIMIT: 2Gi
2120
+ script:
2121
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
2122
+ - export APP_DIR="www"
2123
+ - export DOCKER_BUILD_CONTEXT="."
2124
+ - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
2125
+ - export DOCKER_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/stage/www"
2126
+ - export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/www"
2127
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
2128
+ - |-
2129
+ export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
2130
+ RUN yarn plugin import workspace-tools
2131
+ RUN yarn workspaces focus --production && yarn rebuild"
2132
+ - |-
2133
+ export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node www/package.json /app/www/package.json
2134
+ COPY --chown=node:node www/yarn.lock /app/www/yarn.lock
2135
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
2136
+ COPY --chown=node:node .yarn /app/.yarn"
2137
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
2138
+ - ensureNodeDockerfile
2139
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
2140
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_stage_www_GCLOUD_DEPLOY_credentialsKey")
2141
+ - gcloud auth configure-docker europe-west6-docker.pkg.dev
2142
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
2143
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
2144
+ - docker build --network host --cache-from $DOCKER_CACHE_IMAGE --tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG -f $APP_DIR/Dockerfile $DOCKER_BUILD_CONTEXT --build-arg BUILDKIT_INLINE_CACHE=1
2145
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
2146
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
2147
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
2148
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
2149
+ - docker push $DOCKER_CACHE_IMAGE
2150
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
2151
+ cache:
2152
+ - key: www-yarn
2153
+ policy: pull
2154
+ paths:
2155
+ - www/.yarn
2156
+ rules:
2157
+ - if: $CI_COMMIT_TAG
2158
+ needs:
2159
+ - job: '๐Ÿ”ธ myWorkspace ๐Ÿ”จ app | stage '
2160
+ artifacts: true
2161
+ retry: *a1
2162
+ interruptible: true
2163
+ '๐Ÿ”น www ๐Ÿงพ sbom | stage ':
2164
+ stage: build
2165
+ image: aquasec/trivy:0.38.3
2166
+ variables: {}
2167
+ script:
2168
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
2169
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
2170
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" www
2171
+ artifacts:
2172
+ paths:
2173
+ - __sbom.json
2174
+ rules:
2175
+ - if: $CI_COMMIT_TAG
2176
+ needs: []
2177
+ retry: *a1
2178
+ interruptible: true
2179
+ allow_failure: true
2180
+ '๐Ÿ”น www ๐Ÿš€ Deploy | stage ':
2181
+ stage: deploy stage
2182
+ image: path/to/docker/gcloud:the-version
2183
+ variables:
2184
+ KUBERNETES_CPU_REQUEST: '0.22'
2185
+ KUBERNETES_MEMORY_REQUEST: 200Mi
2186
+ KUBERNETES_MEMORY_LIMIT: 400Mi
2187
+ script:
2188
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
2189
+ - export ENV_SHORT="stage"
2190
+ - export APP_DIR="www"
2191
+ - export ENV_TYPE="stage"
2192
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
2193
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
2194
+ - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
2195
+ - export HOST="$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2196
+ - export ROOT_URL="https://$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2197
+ - export HOST_INTERNAL="$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2198
+ - export HOST_CANONICAL="$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2199
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2200
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="google-project-id"
2201
+ - export DEPLOY_CLOUD_RUN_REGION="europe-west6"
2202
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_stage_www_GCLOUD_DEPLOY_credentialsKey"
2203
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix"
2204
+ - export API_URL="https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')/graphql"
2205
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\",\\"API_URL\\"]"
2206
+ - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
2207
+ - export DOCKER_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/stage/www"
2208
+ - export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/www"
2209
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
2210
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
2211
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
2212
+ - echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."
2213
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_stage_www_GCLOUD_DEPLOY_credentialsKey")
2214
+ - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe google-project-id --format="value(projectNumber)")
2215
+ - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
2216
+ - echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"
2217
+ - echo -e "\\e[0Ksection_start:$(date +%s):writeenvvars[collapsed=true]\\r\\e[0KWrite env vars to file"
2218
+ - |
2219
+ cat > ____envvars.yaml <<EOF
2220
+ ENV_SHORT: |-
2221
+ stage
2222
+ APP_DIR: |-
2223
+ www
2224
+ ENV_TYPE: |-
2225
+ stage
2226
+ BUILD_INFO_BUILD_ID: |-
2227
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
2228
+ BUILD_INFO_BUILD_TIME: |-
2229
+ $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
2230
+ BUILD_INFO_CURRENT_VERSION: |-
2231
+ $(printf %s "$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")" | sed 's/^/ /')
2232
+ HOST: |-
2233
+ $(printf %s "$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2234
+ ROOT_URL: |-
2235
+ $(printf %s "https://$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2236
+ HOST_INTERNAL: |-
2237
+ $(printf %s "$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2238
+ HOST_CANONICAL: |-
2239
+ $(printf %s "$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2240
+ ROOT_URL_INTERNAL: |-
2241
+ $(printf %s "https://$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2242
+ DEPLOY_CLOUD_RUN_PROJECT_ID: |-
2243
+ google-project-id
2244
+ DEPLOY_CLOUD_RUN_REGION: |-
2245
+ europe-west6
2246
+ GCLOUD_RUN_canonicalHostSuffix: |-
2247
+ $(printf %s "$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | sed 's/^/ /')
2248
+ API_URL: |-
2249
+ $(printf %s "https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')/graphql" | sed 's/^/ /')
2250
+ _ALL_ENV_VAR_KEYS: |-
2251
+ ["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_INTERNAL","HOST_CANONICAL","ROOT_URL_INTERNAL","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix","API_URL"]
2252
+
2253
+ EOF
2254
+ - echo -e "\\e[0Ksection_end:$(date +%s):writeenvvars\\r\\e[0K"
2255
+ - echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"
2256
+ - gcloud run deploy pan-test-app-stage-www --command="yarn,start" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/stage/www:$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --labels=customer-name=pan,component-name=www,app-name=test-app,env-type=stage,env-name=stage,build-type=node,cloud-run-service-name=pan-test-app-stage-www --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost
2257
+ - echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"
2258
+ - echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"
2259
+ - gcloud run revisions list --project=google-project-id --region=europe-west6 --service=pan-test-app-stage-www --limit=unlimited --sort-by=metadata.creationTimestamp --format="value(name)" --filter='(status.conditions.status=False OR status.conditions.status=Unknown)' | while read -r revisionname; do gcloud run revisions delete --project=google-project-id --region=europe-west6 --quiet $revisionname ; done
2260
+ - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/stage/www --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/stage/www@$version --quiet --delete-tags; done
2261
+ - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/www --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/www@$version --quiet --delete-tags; done
2262
+ - echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"
2263
+ - echo 'Uploading SBOM to Dependency Track'
2264
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/www" "https://$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" "__sbom.json" vex.json || true
2265
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
2266
+ environment:
2267
+ name: stage/www
2268
+ url: $CL_GITLAB_ENVIRONMENT_URL
2269
+ on_stop: '๐Ÿ”น www ๐Ÿ›‘ Stop โš ๏ธ | stage '
2270
+ artifacts:
2271
+ reports:
2272
+ dotenv: gitlab_environment.env
2273
+ rules:
2274
+ - when: on_success
2275
+ if: $CI_COMMIT_TAG
2276
+ needs:
2277
+ - job: '๐Ÿ”น www ๐Ÿ”จ docker | stage '
2278
+ artifacts: false
2279
+ - job: '๐Ÿ”น www ๐Ÿงพ sbom | stage '
2280
+ artifacts: true
2281
+ retry: *a1
2282
+ interruptible: true
2283
+ allow_failure: false
2284
+ '๐Ÿ”น www ๐Ÿ›‘ Stop โš ๏ธ | stage ':
2285
+ stage: stop stage
2286
+ image: path/to/docker/gcloud:the-version
2287
+ variables:
2288
+ KUBERNETES_CPU_REQUEST: '0.22'
2289
+ KUBERNETES_MEMORY_REQUEST: 200Mi
2290
+ KUBERNETES_MEMORY_LIMIT: 400Mi
2291
+ GIT_STRATEGY: none
2292
+ script:
2293
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
2294
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
2295
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
2296
+ - set +e
2297
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_stage_www_GCLOUD_DEPLOY_credentialsKey")
2298
+ - gcloud run services delete pan-test-app-stage-www --project=google-project-id --region=europe-west6
2299
+ - gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/stage/www --quiet --delete-tags
2300
+ - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/www --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/www@$version --quiet --delete-tags; done
2301
+ - echo 'Disabling component in Dependency Track'
2302
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/www" "https://$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" || true
2303
+ - set -e
2304
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
2305
+ environment:
2306
+ name: stage/www
2307
+ url: $CL_GITLAB_ENVIRONMENT_URL
2308
+ action: stop
2309
+ artifacts:
2310
+ reports:
2311
+ dotenv: gitlab_environment.env
2312
+ rules:
2313
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
2314
+ when: on_success
2315
+ - when: manual
2316
+ if: $CI_COMMIT_TAG
2317
+ needs: []
2318
+ retry: *a1
2319
+ interruptible: true
2320
+ allow_failure: true
2321
+ '๐Ÿ”น www ๐Ÿ”จ docker | prod ':
2322
+ stage: build
2323
+ image: path/to/docker/docker-build:the-version
2324
+ services:
2325
+ - name: docker:24.0.6-dind
2326
+ command:
2327
+ - --tls=false
2328
+ variables:
2329
+ DOCKER_HOST: tcp://0.0.0.0:2375
2330
+ DOCKER_TLS_CERTDIR: ''
2331
+ DOCKER_DRIVER: overlay2
2332
+ DOCKER_BUILDKIT: '1'
2333
+ KUBERNETES_CPU_REQUEST: '0.45'
2334
+ KUBERNETES_MEMORY_REQUEST: 1Gi
2335
+ KUBERNETES_MEMORY_LIMIT: 2Gi
2336
+ script:
2337
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
2338
+ - export APP_DIR="www"
2339
+ - export DOCKER_BUILD_CONTEXT="."
2340
+ - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
2341
+ - export DOCKER_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/prod/www"
2342
+ - export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/www"
2343
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
2344
+ - |-
2345
+ export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
2346
+ RUN yarn plugin import workspace-tools
2347
+ RUN yarn workspaces focus --production && yarn rebuild"
2348
+ - |-
2349
+ export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node www/package.json /app/www/package.json
2350
+ COPY --chown=node:node www/yarn.lock /app/www/yarn.lock
2351
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
2352
+ COPY --chown=node:node .yarn /app/.yarn"
2353
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
2354
+ - ensureNodeDockerfile
2355
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
2356
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_prod_www_GCLOUD_DEPLOY_credentialsKey")
2357
+ - gcloud auth configure-docker europe-west6-docker.pkg.dev
2358
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
2359
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
2360
+ - docker build --network host --cache-from $DOCKER_CACHE_IMAGE --tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG -f $APP_DIR/Dockerfile $DOCKER_BUILD_CONTEXT --build-arg BUILDKIT_INLINE_CACHE=1
2361
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
2362
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
2363
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
2364
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
2365
+ - docker push $DOCKER_CACHE_IMAGE
2366
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
2367
+ cache:
2368
+ - key: www-yarn
2369
+ policy: pull
2370
+ paths:
2371
+ - www/.yarn
2372
+ rules:
2373
+ - if: $CI_COMMIT_TAG
2374
+ needs:
2375
+ - job: '๐Ÿ”ธ myWorkspace ๐Ÿ”จ app | prod '
2376
+ artifacts: true
2377
+ retry: *a1
2378
+ interruptible: true
2379
+ '๐Ÿ”น www ๐Ÿงพ sbom | prod ':
2380
+ stage: build
2381
+ image: aquasec/trivy:0.38.3
2382
+ variables: {}
2383
+ script:
2384
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
2385
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
2386
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" www
2387
+ artifacts:
2388
+ paths:
2389
+ - __sbom.json
2390
+ rules:
2391
+ - if: $CI_COMMIT_TAG
2392
+ needs: []
2393
+ retry: *a1
2394
+ interruptible: true
2395
+ allow_failure: true
2396
+ '๐Ÿ”น www ๐Ÿš€ Deploy | prod ':
2397
+ stage: deploy prod
2398
+ image: path/to/docker/gcloud:the-version
2399
+ variables:
2400
+ KUBERNETES_CPU_REQUEST: '0.22'
2401
+ KUBERNETES_MEMORY_REQUEST: 200Mi
2402
+ KUBERNETES_MEMORY_LIMIT: 400Mi
2403
+ script:
2404
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
2405
+ - export ENV_SHORT="prod"
2406
+ - export APP_DIR="www"
2407
+ - export ENV_TYPE="prod"
2408
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
2409
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
2410
+ - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
2411
+ - export HOST="$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2412
+ - export ROOT_URL="https://$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2413
+ - export HOST_INTERNAL="$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2414
+ - export HOST_CANONICAL="$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2415
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2416
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="google-project-id"
2417
+ - export DEPLOY_CLOUD_RUN_REGION="europe-west6"
2418
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_prod_www_GCLOUD_DEPLOY_credentialsKey"
2419
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix"
2420
+ - export API_URL="https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')/graphql"
2421
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\",\\"API_URL\\"]"
2422
+ - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
2423
+ - export DOCKER_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/prod/www"
2424
+ - export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/www"
2425
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
2426
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
2427
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
2428
+ - echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."
2429
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_prod_www_GCLOUD_DEPLOY_credentialsKey")
2430
+ - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe google-project-id --format="value(projectNumber)")
2431
+ - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
2432
+ - echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"
2433
+ - echo -e "\\e[0Ksection_start:$(date +%s):writeenvvars[collapsed=true]\\r\\e[0KWrite env vars to file"
2434
+ - |
2435
+ cat > ____envvars.yaml <<EOF
2436
+ ENV_SHORT: |-
2437
+ prod
2438
+ APP_DIR: |-
2439
+ www
2440
+ ENV_TYPE: |-
2441
+ prod
2442
+ BUILD_INFO_BUILD_ID: |-
2443
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
2444
+ BUILD_INFO_BUILD_TIME: |-
2445
+ $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
2446
+ BUILD_INFO_CURRENT_VERSION: |-
2447
+ $(printf %s "$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")" | sed 's/^/ /')
2448
+ HOST: |-
2449
+ $(printf %s "$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2450
+ ROOT_URL: |-
2451
+ $(printf %s "https://$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2452
+ HOST_INTERNAL: |-
2453
+ $(printf %s "$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2454
+ HOST_CANONICAL: |-
2455
+ $(printf %s "$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2456
+ ROOT_URL_INTERNAL: |-
2457
+ $(printf %s "https://$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2458
+ DEPLOY_CLOUD_RUN_PROJECT_ID: |-
2459
+ google-project-id
2460
+ DEPLOY_CLOUD_RUN_REGION: |-
2461
+ europe-west6
2462
+ GCLOUD_RUN_canonicalHostSuffix: |-
2463
+ $(printf %s "$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | sed 's/^/ /')
2464
+ API_URL: |-
2465
+ $(printf %s "https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')/graphql" | sed 's/^/ /')
2466
+ _ALL_ENV_VAR_KEYS: |-
2467
+ ["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_INTERNAL","HOST_CANONICAL","ROOT_URL_INTERNAL","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix","API_URL"]
2468
+
2469
+ EOF
2470
+ - echo -e "\\e[0Ksection_end:$(date +%s):writeenvvars\\r\\e[0K"
2471
+ - echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"
2472
+ - gcloud run deploy pan-test-app-prod-www --command="yarn,start" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/prod/www:$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --labels=customer-name=pan,component-name=www,app-name=test-app,env-type=prod,env-name=prod,build-type=node,cloud-run-service-name=pan-test-app-prod-www --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost
2473
+ - echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"
2474
+ - echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"
2475
+ - gcloud run revisions list --project=google-project-id --region=europe-west6 --service=pan-test-app-prod-www --limit=unlimited --sort-by=metadata.creationTimestamp --format="value(name)" --filter='(status.conditions.status=False OR status.conditions.status=Unknown)' | tail -n +6 | while read -r revisionname; do gcloud run revisions delete --project=google-project-id --region=europe-west6 --quiet $revisionname ; done
2476
+ - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/prod/www --sort-by=~CREATE_TIME --format="value(version)" | tail -n +7 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/prod/www@$version --quiet --delete-tags; done
2477
+ - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/www --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/www@$version --quiet --delete-tags; done
2478
+ - echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"
2479
+ - echo 'Uploading SBOM to Dependency Track'
2480
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/www" "https://$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" "__sbom.json" vex.json || true
2481
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
2482
+ environment:
2483
+ name: prod/www
2484
+ url: $CL_GITLAB_ENVIRONMENT_URL
2485
+ on_stop: '๐Ÿ”น www ๐Ÿ›‘ Stop โš ๏ธ | prod '
2486
+ artifacts:
2487
+ reports:
2488
+ dotenv: gitlab_environment.env
2489
+ rules:
2490
+ - when: manual
2491
+ if: $CI_COMMIT_TAG
2492
+ needs:
2493
+ - job: '๐Ÿ”น www ๐Ÿ”จ docker | prod '
2494
+ artifacts: false
2495
+ - job: '๐Ÿ”น www ๐Ÿงพ sbom | prod '
2496
+ artifacts: true
2497
+ retry: *a1
2498
+ interruptible: true
2499
+ allow_failure: true
2500
+ '๐Ÿ”น www ๐Ÿ›‘ Stop โš ๏ธ | prod ':
2501
+ stage: stop prod
2502
+ image: path/to/docker/gcloud:the-version
2503
+ variables:
2504
+ KUBERNETES_CPU_REQUEST: '0.22'
2505
+ KUBERNETES_MEMORY_REQUEST: 200Mi
2506
+ KUBERNETES_MEMORY_LIMIT: 400Mi
2507
+ GIT_STRATEGY: none
2508
+ script:
2509
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
2510
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
2511
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
2512
+ - set +e
2513
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_prod_www_GCLOUD_DEPLOY_credentialsKey")
2514
+ - gcloud run services delete pan-test-app-prod-www --project=google-project-id --region=europe-west6
2515
+ - gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/prod/www --quiet --delete-tags
2516
+ - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/www --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/www@$version --quiet --delete-tags; done
2517
+ - echo 'Disabling component in Dependency Track'
2518
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/www" "https://$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" || true
2519
+ - set -e
2520
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
2521
+ environment:
2522
+ name: prod/www
2523
+ url: $CL_GITLAB_ENVIRONMENT_URL
2524
+ action: stop
2525
+ artifacts:
2526
+ reports:
2527
+ dotenv: gitlab_environment.env
2528
+ rules:
2529
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
2530
+ when: on_success
2531
+ - when: manual
2532
+ if: $CI_COMMIT_TAG
2533
+ needs: []
2534
+ retry: *a1
2535
+ interruptible: true
2536
+ allow_failure: true
2537
+ create release:
2538
+ stage: release
2539
+ image: path/to/docker/semantic-release:the-version
2540
+ script:
2541
+ - semanticRelease
2542
+ after_script:
2543
+ - echo '๐Ÿ‘‰ The project access token might be invald - run \`project-renew-token\` in catladder CLI to fix.'
2544
+ rules:
2545
+ - &a2
2546
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
2547
+ when: never
2548
+ - &a3
2549
+ if: $CI_PIPELINE_SOURCE == "schedule"
2550
+ when: never
2551
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $AUTO_RELEASE == "true"
2552
+ when: on_success
2553
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
2554
+ when: manual
2555
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+.([0-9]+|x).x$/
2556
+ when: manual
2557
+ โš ๏ธ force create release:
2558
+ stage: release
2559
+ image: path/to/docker/semantic-release:the-version
2560
+ script:
2561
+ - semanticRelease
2562
+ after_script:
2563
+ - echo '๐Ÿ‘‰ The project access token might be invald - run \`project-renew-token\` in catladder CLI to fix.'
2564
+ rules:
2565
+ - *a2
2566
+ - *a3
2567
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
2568
+ when: manual
2569
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+.([0-9]+|x).x$/
2570
+ when: manual
2571
+ needs: []
2572
+ "
2573
+ `;
2574
+
3
2575
  exports[`matches snapshot for cloud-run-with-sql 1`] = `
4
2576
  {
5
2577
  "mainBranch": {