@catladder/pipeline 1.165.0 โ†’ 1.166.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/dist/build/base/createAppBuildJob.d.ts +3 -1
  2. package/dist/build/base/createAppBuildJob.js +6 -4
  3. package/dist/build/base/createBuildJobDefinition.d.ts +7 -0
  4. package/dist/build/base/createBuildJobDefinition.js +58 -0
  5. package/dist/build/cache/createJobCache.d.ts +6 -0
  6. package/dist/build/cache/createJobCache.js +109 -0
  7. package/dist/build/cache/getAllCacheConfigsFromConfig.d.ts +3 -0
  8. package/dist/build/cache/getAllCacheConfigsFromConfig.js +66 -0
  9. package/dist/build/cache/transformLegacyJobCache.d.ts +3 -0
  10. package/dist/build/cache/transformLegacyJobCache.js +29 -0
  11. package/dist/build/custom/buildJob.js +2 -45
  12. package/dist/build/custom/testJob.d.ts +1 -1
  13. package/dist/build/custom/testJob.js +12 -11
  14. package/dist/build/docker.d.ts +4 -3
  15. package/dist/build/docker.js +5 -2
  16. package/dist/build/node/buildJob.js +5 -17
  17. package/dist/build/node/cache.d.ts +6 -6
  18. package/dist/build/node/cache.js +8 -9
  19. package/dist/build/node/meteor.js +2 -3
  20. package/dist/build/node/testJob.js +6 -5
  21. package/dist/build/node/yarn.js +1 -2
  22. package/dist/build/rails/test.js +3 -3
  23. package/dist/build/sbom.js +1 -1
  24. package/dist/build/types.d.ts +43 -4
  25. package/dist/bundles/catladder-gitlab/index.js +2 -2
  26. package/dist/constants.js +1 -1
  27. package/dist/tsconfig.tsbuildinfo +1 -1
  28. package/dist/types/gitlab-types.d.ts +2 -2
  29. package/dist/types/index.d.ts +1 -0
  30. package/dist/types/index.js +1 -0
  31. package/dist/types/jobDefinition.d.ts +5 -0
  32. package/dist/types/jobDefinition.js +5 -0
  33. package/dist/types/jobs.d.ts +3 -2
  34. package/dist/utils/index.d.ts +2 -1
  35. package/dist/utils/index.js +7 -2
  36. package/examples/__snapshots__/cloud-run-meteor-with-worker.test.ts.snap +4 -4
  37. package/examples/__snapshots__/cloud-run-with-sql.test.ts.snap +817 -1717
  38. package/examples/__snapshots__/custom-build-job-with-tests.test.ts.snap +0 -4
  39. package/examples/__snapshots__/custom-build-job.test.ts.snap +0 -4
  40. package/examples/__snapshots__/custom-sbom-java.test.ts.snap +0 -4
  41. package/examples/__snapshots__/meteor-kubernetes.test.ts.snap +4 -4
  42. package/examples/__snapshots__/native-app.test.ts.snap +24 -20
  43. package/examples/__snapshots__/workspace-api-www-custom-cache.test.ts.snap +2374 -0
  44. package/examples/__snapshots__/workspace-api-www.test.ts.snap +2354 -0
  45. package/examples/cloud-run-with-sql.ts +1 -23
  46. package/examples/workspace-api-www-custom-cache.test.ts +11 -0
  47. package/examples/workspace-api-www-custom-cache.ts +51 -0
  48. package/examples/workspace-api-www.test.ts +11 -0
  49. package/examples/workspace-api-www.ts +45 -0
  50. package/package.json +1 -1
  51. package/src/build/base/createAppBuildJob.ts +6 -4
  52. package/src/build/base/createBuildJobDefinition.ts +38 -0
  53. package/src/build/cache/createJobCache.ts +85 -0
  54. package/src/build/cache/getAllCacheConfigsFromConfig.ts +33 -0
  55. package/src/build/cache/transformLegacyJobCache.ts +14 -0
  56. package/src/build/custom/buildJob.ts +2 -14
  57. package/src/build/custom/testJob.ts +7 -6
  58. package/src/build/docker.ts +5 -3
  59. package/src/build/node/buildJob.ts +6 -29
  60. package/src/build/node/cache.ts +20 -21
  61. package/src/build/node/meteor.ts +7 -8
  62. package/src/build/node/testJob.ts +7 -6
  63. package/src/build/node/yarn.ts +1 -1
  64. package/src/build/rails/test.ts +4 -4
  65. package/src/build/sbom.ts +2 -2
  66. package/src/build/types.ts +54 -4
  67. package/src/types/gitlab-types.ts +2 -2
  68. package/src/types/index.ts +1 -0
  69. package/src/types/jobDefinition.ts +9 -0
  70. package/src/types/jobs.ts +5 -8
  71. package/src/utils/index.ts +4 -1
@@ -45,7 +45,7 @@ variables:
45
45
  CACHE_COMPRESSION_LEVEL: fast
46
46
  TRANSFER_METER_FREQUENCY: 5s
47
47
  GIT_DEPTH: '1'
48
- ๐Ÿ”ธ myWorkspace ๐Ÿ›ก audit:
48
+ api ๐Ÿ›ก audit:
49
49
  stage: test
50
50
  image: path/to/docker/jobs-default:the-version
51
51
  variables:
@@ -54,9 +54,9 @@ variables:
54
54
  KUBERNETES_MEMORY_LIMIT: 4Gi
55
55
  script:
56
56
  - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
57
- - export APP_PATH="."
57
+ - export APP_PATH="api"
58
58
  - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
59
- - cd .
59
+ - cd api
60
60
  - yarn npm audit --environment production
61
61
  rules:
62
62
  - when: never
@@ -71,7 +71,7 @@ variables:
71
71
  - stuck_or_timeout_failure
72
72
  interruptible: true
73
73
  allow_failure: true
74
- ๐Ÿ”ธ myWorkspace ๐Ÿ‘ฎ lint:
74
+ api ๐Ÿ‘ฎ lint:
75
75
  stage: test
76
76
  image: path/to/docker/jobs-default:the-version
77
77
  variables:
@@ -80,13 +80,13 @@ variables:
80
80
  KUBERNETES_MEMORY_LIMIT: 4Gi
81
81
  script:
82
82
  - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
83
- - export APP_PATH="."
83
+ - export APP_PATH="api"
84
84
  - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
85
85
  - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
86
86
  - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
87
87
  - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
88
88
  - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
89
- - cd .
89
+ - cd api
90
90
  - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
91
91
  - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
92
92
  - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
@@ -96,18 +96,14 @@ variables:
96
96
  - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
97
97
  - yarn lint
98
98
  cache:
99
- - key: .-yarn
100
- policy: pull-push
101
- paths:
102
- - .yarn
103
- - key: .-node-modules
99
+ - key: api-yarn
104
100
  policy: pull-push
105
101
  paths:
106
- - node_modules
107
- - key: myWorkspace-turbo
102
+ - api/.yarn
103
+ - key: api-node-modules
108
104
  policy: pull-push
109
105
  paths:
110
- - .turbo
106
+ - api/node_modules
111
107
  rules:
112
108
  - when: never
113
109
  if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
@@ -116,7 +112,7 @@ variables:
116
112
  needs: []
117
113
  retry: *a1
118
114
  interruptible: true
119
- ๐Ÿ”ธ myWorkspace ๐Ÿงช test:
115
+ api ๐Ÿงช test:
120
116
  stage: test
121
117
  image: path/to/docker/jobs-testing-chrome:the-version
122
118
  variables:
@@ -125,13 +121,13 @@ variables:
125
121
  KUBERNETES_MEMORY_LIMIT: 4Gi
126
122
  script:
127
123
  - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
128
- - export APP_PATH="."
124
+ - export APP_PATH="api"
129
125
  - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
130
126
  - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
131
127
  - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
132
128
  - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
133
129
  - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
134
- - cd .
130
+ - cd api
135
131
  - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
136
132
  - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
137
133
  - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
@@ -141,526 +137,29 @@ variables:
141
137
  - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
142
138
  - yarn test
143
139
  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
140
+ - key: api-yarn
242
141
  policy: pull-push
243
142
  paths:
244
- - .turbo
245
- - key: myWorkspace-next-cache
143
+ - api/.yarn
144
+ - key: api-node-modules
246
145
  policy: pull-push
247
146
  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: {}
147
+ - api/node_modules
262
148
  rules:
263
149
  - when: never
264
150
  if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
265
151
  - 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
152
  - if: $CI_MERGE_REQUEST_ID
369
153
  needs: []
370
154
  retry: *a1
371
155
  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 ':
156
+ 'api ๐Ÿ”จ app | dev ':
476
157
  stage: build
477
158
  image: path/to/docker/jobs-default:the-version
478
159
  variables:
479
160
  KUBERNETES_CPU_REQUEST: '0.45'
480
161
  KUBERNETES_MEMORY_REQUEST: 1Gi
481
162
  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
163
  script:
665
164
  - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
666
165
  - export ENV_SHORT="dev"
@@ -675,974 +174,90 @@ variables:
675
174
  - export HOST_CANONICAL="$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
676
175
  - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
677
176
  - 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"
177
+ - export DB_NAME="pan-test-app-dev-api"
178
+ - export DB_USER="my-user"
179
+ - export DB_PASSWORD="$CL_dev_api_DB_PASSWORD"
180
+ - export DATABASE_URL="postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME"
181
+ - 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"
182
+ - 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"
183
+ - 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"
184
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="google-project-id"
185
+ - export DEPLOY_CLOUD_RUN_REGION="europe-west6"
186
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_dev_api_GCLOUD_DEPLOY_credentialsKey"
187
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix"
188
+ - 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\\"]"
1614
189
  - 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
190
+ - echo -e "\\e[0Ksection_start:$(date +%s):write-dotenv-api[collapsed=true]\\r\\e[0Kwrite dot env"
191
+ - |-
192
+ cat <<EOF > api/.env
193
+ ENV_SHORT=dev
194
+ APP_DIR=api
195
+ ENV_TYPE=dev
196
+ HOST=$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')
197
+ ROOT_URL=https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')
198
+ HOST_INTERNAL=$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')
199
+ HOST_CANONICAL=$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')
200
+ ROOT_URL_INTERNAL=https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')
201
+ CLOUD_SQL_INSTANCE_CONNECTION_NAME=projectId:region:instancename
202
+ DB_NAME=pan-test-app-dev-api
203
+ DB_USER=my-user
204
+ DB_PASSWORD=$CL_dev_api_DB_PASSWORD
205
+ DATABASE_URL=postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME
206
+ 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
207
+ 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
208
+ 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
209
+ DEPLOY_CLOUD_RUN_PROJECT_ID=google-project-id
210
+ DEPLOY_CLOUD_RUN_REGION=europe-west6
211
+ GCLOUD_DEPLOY_credentialsKey=$CL_dev_api_GCLOUD_DEPLOY_credentialsKey
212
+ GCLOUD_RUN_canonicalHostSuffix=$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix
213
+ _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"]
214
+ EOF
215
+ - echo -e "\\e[0Ksection_end:$(date +%s):write-dotenv-api\\r\\e[0K"
216
+ - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > api/__build_info.json
217
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
218
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
219
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
220
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
221
+ - cd api
222
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
223
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
224
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
225
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
226
+ - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
227
+ - yarn install --immutable
228
+ - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
229
+ - yarn build
230
+ cache:
231
+ - key: api-yarn
232
+ policy: pull-push
233
+ paths:
234
+ - api/.yarn
235
+ - key: api-node-modules
236
+ policy: pull-push
237
+ paths:
238
+ - api/node_modules
239
+ - key: api-next-cache
240
+ policy: pull-push
241
+ paths:
242
+ - api/.next/cache
1633
243
  artifacts:
1634
- reports:
1635
- dotenv: gitlab_environment.env
244
+ paths:
245
+ - api/__build_info.json
246
+ - api/.next
247
+ - api/dist
248
+ exclude:
249
+ - api/.env
250
+ expire_in: 1 day
251
+ when: always
252
+ reports: {}
1636
253
  rules:
1637
- - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
1638
- when: on_success
1639
- - when: manual
1640
- if: $CI_COMMIT_TAG
254
+ - when: never
255
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
256
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
1641
257
  needs: []
1642
258
  retry: *a1
1643
259
  interruptible: true
1644
- allow_failure: true
1645
- '๐Ÿ”น www ๐Ÿ”จ docker | dev ':
260
+ 'api ๐Ÿ”จ docker | dev ':
1646
261
  stage: build
1647
262
  image: path/to/docker/docker-build:the-version
1648
263
  services:
@@ -1659,25 +274,25 @@ variables:
1659
274
  KUBERNETES_MEMORY_LIMIT: 2Gi
1660
275
  script:
1661
276
  - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1662
- - export APP_DIR="www"
277
+ - export APP_DIR="api"
1663
278
  - export DOCKER_BUILD_CONTEXT="."
1664
279
  - 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"
280
+ - export DOCKER_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/dev/api"
281
+ - export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api"
1667
282
  - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
1668
283
  - |-
1669
284
  export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
1670
285
  RUN yarn plugin import workspace-tools
1671
286
  RUN yarn workspaces focus --production && yarn rebuild"
1672
287
  - |-
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
288
+ export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node api/package.json /app/api/package.json
289
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
1675
290
  COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
1676
291
  COPY --chown=node:node .yarn /app/.yarn"
1677
292
  - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1678
293
  - ensureNodeDockerfile
1679
294
  - 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")
295
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_dev_api_GCLOUD_DEPLOY_credentialsKey")
1681
296
  - gcloud auth configure-docker europe-west6-docker.pkg.dev
1682
297
  - echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
1683
298
  - echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
@@ -1689,27 +304,26 @@ variables:
1689
304
  - docker push $DOCKER_CACHE_IMAGE
1690
305
  - echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
1691
306
  cache:
1692
- - key: www-yarn
307
+ - key: api-yarn
1693
308
  policy: pull
1694
309
  paths:
1695
- - www/.yarn
310
+ - api/.yarn
1696
311
  rules:
1697
312
  - when: never
1698
313
  if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
1699
314
  - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
1700
315
  needs:
1701
- - job: '๐Ÿ”ธ myWorkspace ๐Ÿ”จ app | dev '
1702
- artifacts: true
316
+ - 'api ๐Ÿ”จ app | dev '
1703
317
  retry: *a1
1704
318
  interruptible: true
1705
- '๐Ÿ”น www ๐Ÿงพ sbom | dev ':
319
+ 'api ๐Ÿงพ sbom | dev ':
1706
320
  stage: build
1707
321
  image: aquasec/trivy:0.38.3
1708
322
  variables: {}
1709
323
  script:
1710
324
  - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1711
325
  - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1712
- - trivy fs --quiet --format cyclonedx --output "__sbom.json" www
326
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" api
1713
327
  artifacts:
1714
328
  paths:
1715
329
  - __sbom.json
@@ -1721,7 +335,7 @@ variables:
1721
335
  retry: *a1
1722
336
  interruptible: true
1723
337
  allow_failure: true
1724
- '๐Ÿ”น www ๐Ÿš€ Deploy | dev ':
338
+ 'api ๐Ÿš€ Deploy | dev ':
1725
339
  stage: deploy dev
1726
340
  image: path/to/docker/gcloud:the-version
1727
341
  variables:
@@ -1731,30 +345,37 @@ variables:
1731
345
  script:
1732
346
  - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1733
347
  - export ENV_SHORT="dev"
1734
- - export APP_DIR="www"
348
+ - export APP_DIR="api"
1735
349
  - export ENV_TYPE="dev"
1736
350
  - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1737
351
  - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1738
352
  - 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)}')"
353
+ - export HOST="$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
354
+ - export ROOT_URL="https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
355
+ - export HOST_INTERNAL="$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
356
+ - export HOST_CANONICAL="$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
357
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
358
+ - export CLOUD_SQL_INSTANCE_CONNECTION_NAME="projectId:region:instancename"
359
+ - export DB_NAME="pan-test-app-dev-api"
360
+ - export DB_USER="my-user"
361
+ - export DB_PASSWORD="$CL_dev_api_DB_PASSWORD"
362
+ - export DATABASE_URL="postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME"
363
+ - 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"
364
+ - 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"
365
+ - 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"
1744
366
  - export DEPLOY_CLOUD_RUN_PROJECT_ID="google-project-id"
1745
367
  - 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\\"]"
368
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_dev_api_GCLOUD_DEPLOY_credentialsKey"
369
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix"
370
+ - 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\\"]"
1750
371
  - 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"
372
+ - export DOCKER_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/dev/api"
373
+ - export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api"
1753
374
  - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
1754
375
  - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
1755
376
  - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1756
377
  - 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")
378
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_dev_api_GCLOUD_DEPLOY_credentialsKey")
1758
379
  - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe google-project-id --format="value(projectNumber)")
1759
380
  - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
1760
381
  - echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"
@@ -1764,7 +385,7 @@ variables:
1764
385
  ENV_SHORT: |-
1765
386
  dev
1766
387
  APP_DIR: |-
1767
- www
388
+ api
1768
389
  ENV_TYPE: |-
1769
390
  dev
1770
391
  BUILD_INFO_BUILD_ID: |-
@@ -1774,43 +395,74 @@ variables:
1774
395
  BUILD_INFO_CURRENT_VERSION: |-
1775
396
  $(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
397
  HOST: |-
1777
- $(printf %s "$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
398
+ $(printf %s "$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1778
399
  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/^/ /')
400
+ $(printf %s "https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1780
401
  HOST_INTERNAL: |-
1781
- $(printf %s "$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
402
+ $(printf %s "$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1782
403
  HOST_CANONICAL: |-
1783
- $(printf %s "$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
404
+ $(printf %s "$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1784
405
  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/^/ /')
406
+ $(printf %s "https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
407
+ CLOUD_SQL_INSTANCE_CONNECTION_NAME: |-
408
+ projectId:region:instancename
409
+ DB_NAME: |-
410
+ pan-test-app-dev-api
411
+ DB_USER: |-
412
+ my-user
413
+ DB_PASSWORD: |-
414
+ $(printf %s "$CL_dev_api_DB_PASSWORD" | sed 's/^/ /')
415
+ DATABASE_URL: |-
416
+ postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME
417
+ DATABASE_JDBC_URL: |-
418
+ jdbc:postgresql:///$DB_NAME?cloudSqlInstance=$CLOUD_SQL_INSTANCE_CONNECTION_NAME&socketFactory=com.google.cloud.sql.postgres.SocketFactory&user=$DB_USER&password=$DB_PASSWORD
419
+ CLOUD_RUN_JOB_TRIGGER_URL_migration: |-
420
+ https://europe-west6-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/google-project-id/jobs/pan-test-app-dev-api-migration:run
421
+ CLOUD_RUN_JOB_TRIGGER_URL_send_reminders: |-
422
+ https://europe-west6-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/google-project-id/jobs/pan-test-app-dev-api-send-reminders:run
1786
423
  DEPLOY_CLOUD_RUN_PROJECT_ID: |-
1787
424
  google-project-id
1788
425
  DEPLOY_CLOUD_RUN_REGION: |-
1789
426
  europe-west6
1790
427
  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/^/ /')
428
+ $(printf %s "$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | sed 's/^/ /')
1794
429
  _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"]
430
+ ["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"]
1796
431
 
1797
432
  EOF
1798
433
  - echo -e "\\e[0Ksection_end:$(date +%s):writeenvvars\\r\\e[0K"
1799
434
  - 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
435
+ - set +e
436
+ - echo "ensuring Database..."
437
+ - gcloud sql databases create pan-test-app-dev-api --instance=instancename --project projectId
438
+ - set -e
439
+ - set +e
440
+ - 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
441
+ - set -e
442
+ - 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
443
+ - set +e
444
+ - 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
445
+ - set -e
446
+ - '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 '
447
+ - set +e
448
+ - 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
449
+ - set -e
450
+ - '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 '
451
+ - 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
452
+ - gcloud run jobs execute pan-test-app-dev-api-migration --project=google-project-id --region=europe-west6
1801
453
  - echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"
1802
454
  - 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
455
+ - 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
456
+ - 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
457
+ - 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
1806
458
  - echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"
1807
459
  - 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
460
+ - /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
461
+ - 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
1810
462
  environment:
1811
- name: dev/www
463
+ name: dev/api
1812
464
  url: $CL_GITLAB_ENVIRONMENT_URL
1813
- on_stop: '๐Ÿ”น www ๐Ÿ›‘ Stop โš ๏ธ | dev '
465
+ on_stop: 'api ๐Ÿ›‘ Stop โš ๏ธ | dev '
1814
466
  auto_stop_in: 4 weeks
1815
467
  artifacts:
1816
468
  reports:
@@ -1821,20 +473,22 @@ variables:
1821
473
  - when: on_success
1822
474
  if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
1823
475
  needs:
1824
- - job: ๐Ÿ”ธ myWorkspace ๐Ÿ‘ฎ lint
476
+ - job: api ๐Ÿ‘ฎ lint
1825
477
  artifacts: false
1826
- - job: ๐Ÿ”ธ myWorkspace ๐Ÿงช test
478
+ - job: 'api ๐Ÿ”จ app | dev '
1827
479
  artifacts: false
1828
- - job: ๐Ÿ”ธ myWorkspace ๐Ÿ›ก audit
480
+ - job: 'api ๐Ÿ”จ docker | dev '
1829
481
  artifacts: false
1830
- - job: '๐Ÿ”น www ๐Ÿ”จ docker | dev '
482
+ - job: api ๐Ÿงช test
1831
483
  artifacts: false
1832
- - job: '๐Ÿ”น www ๐Ÿงพ sbom | dev '
484
+ - job: 'api ๐Ÿงพ sbom | dev '
1833
485
  artifacts: true
486
+ - job: api ๐Ÿ›ก audit
487
+ artifacts: false
1834
488
  retry: *a1
1835
489
  interruptible: true
1836
490
  allow_failure: false
1837
- '๐Ÿ”น www ๐Ÿ›‘ Stop โš ๏ธ | dev ':
491
+ 'api ๐Ÿ›‘ Stop โš ๏ธ | dev ':
1838
492
  stage: stop dev
1839
493
  image: path/to/docker/gcloud:the-version
1840
494
  variables:
@@ -1847,33 +501,140 @@ variables:
1847
501
  - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
1848
502
  - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1849
503
  - 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
504
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_dev_api_GCLOUD_DEPLOY_credentialsKey")
505
+ - gcloud run services delete pan-test-app-dev-api --project=google-project-id --region=europe-west6
506
+ - gcloud scheduler jobs delete pan-test-app-dev-api-send-reminders-scheduler --project=google-project-id --location=europe-west6
507
+ - 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
508
+ - gcloud run jobs delete pan-test-app-dev-api-migration --project=google-project-id --region=europe-west6
509
+ - 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
510
+ - gcloud run jobs delete pan-test-app-dev-api-send-reminders --project=google-project-id --region=europe-west6
511
+ - gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/dev/api --quiet --delete-tags
512
+ - 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
1854
513
  - 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
514
+ - /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
1856
515
  - 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
516
+ - 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
1858
517
  environment:
1859
- name: dev/www
518
+ name: dev/api
1860
519
  url: $CL_GITLAB_ENVIRONMENT_URL
1861
520
  action: stop
1862
521
  artifacts:
1863
- reports:
1864
- dotenv: gitlab_environment.env
522
+ reports:
523
+ dotenv: gitlab_environment.env
524
+ rules:
525
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
526
+ when: on_success
527
+ - when: never
528
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
529
+ - when: manual
530
+ if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
531
+ needs: []
532
+ retry: *a1
533
+ interruptible: true
534
+ allow_failure: true
535
+ 'api ๐Ÿ”จ app | review ':
536
+ stage: build
537
+ image: path/to/docker/jobs-default:the-version
538
+ variables:
539
+ KUBERNETES_CPU_REQUEST: '0.45'
540
+ KUBERNETES_MEMORY_REQUEST: 1Gi
541
+ KUBERNETES_MEMORY_LIMIT: 4Gi
542
+ script:
543
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
544
+ - export ENV_SHORT="review"
545
+ - export APP_DIR="api"
546
+ - export ENV_TYPE="review"
547
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
548
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
549
+ - 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")"
550
+ - 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)}')"
551
+ - 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)}')"
552
+ - 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)}')"
553
+ - 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)}')"
554
+ - 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)}')"
555
+ - export CLOUD_SQL_INSTANCE_CONNECTION_NAME="projectId:region:instancename"
556
+ - 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"
557
+ - export DB_USER="my-user"
558
+ - export DB_PASSWORD="$CL_review_api_DB_PASSWORD"
559
+ - export DATABASE_URL="postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME"
560
+ - 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"
561
+ - 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"
562
+ - 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"
563
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="google-project-id"
564
+ - export DEPLOY_CLOUD_RUN_REGION="europe-west6"
565
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_review_api_GCLOUD_DEPLOY_credentialsKey"
566
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_review_api_GCLOUD_RUN_canonicalHostSuffix"
567
+ - 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\\"]"
568
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
569
+ - echo -e "\\e[0Ksection_start:$(date +%s):write-dotenv-api[collapsed=true]\\r\\e[0Kwrite dot env"
570
+ - |-
571
+ cat <<EOF > api/.env
572
+ ENV_SHORT=review
573
+ APP_DIR=api
574
+ ENV_TYPE=review
575
+ 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)}')
576
+ 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)}')
577
+ 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)}')
578
+ 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)}')
579
+ 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)}')
580
+ CLOUD_SQL_INSTANCE_CONNECTION_NAME=projectId:region:instancename
581
+ 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
582
+ DB_USER=my-user
583
+ DB_PASSWORD=$CL_review_api_DB_PASSWORD
584
+ DATABASE_URL=postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME
585
+ 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
586
+ 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
587
+ 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
588
+ DEPLOY_CLOUD_RUN_PROJECT_ID=google-project-id
589
+ DEPLOY_CLOUD_RUN_REGION=europe-west6
590
+ GCLOUD_DEPLOY_credentialsKey=$CL_review_api_GCLOUD_DEPLOY_credentialsKey
591
+ GCLOUD_RUN_canonicalHostSuffix=$CL_review_api_GCLOUD_RUN_canonicalHostSuffix
592
+ _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"]
593
+ EOF
594
+ - echo -e "\\e[0Ksection_end:$(date +%s):write-dotenv-api\\r\\e[0K"
595
+ - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > api/__build_info.json
596
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
597
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
598
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
599
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
600
+ - cd api
601
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
602
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
603
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
604
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
605
+ - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
606
+ - yarn install --immutable
607
+ - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
608
+ - yarn build
609
+ cache:
610
+ - key: api-yarn
611
+ policy: pull-push
612
+ paths:
613
+ - api/.yarn
614
+ - key: api-node-modules
615
+ policy: pull-push
616
+ paths:
617
+ - api/node_modules
618
+ - key: api-next-cache
619
+ policy: pull-push
620
+ paths:
621
+ - api/.next/cache
622
+ artifacts:
623
+ paths:
624
+ - api/__build_info.json
625
+ - api/.next
626
+ - api/dist
627
+ exclude:
628
+ - api/.env
629
+ expire_in: 1 day
630
+ when: always
631
+ reports: {}
1865
632
  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
633
+ - if: $CI_MERGE_REQUEST_ID
1872
634
  needs: []
1873
635
  retry: *a1
1874
636
  interruptible: true
1875
- allow_failure: true
1876
- '๐Ÿ”น www ๐Ÿ”จ docker | review ':
637
+ 'api ๐Ÿ”จ docker | review ':
1877
638
  stage: build
1878
639
  image: path/to/docker/docker-build:the-version
1879
640
  services:
@@ -1890,25 +651,25 @@ variables:
1890
651
  KUBERNETES_MEMORY_LIMIT: 2Gi
1891
652
  script:
1892
653
  - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1893
- - export APP_DIR="www"
654
+ - export APP_DIR="api"
1894
655
  - export DOCKER_BUILD_CONTEXT="."
1895
656
  - 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"
657
+ - 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"; })"
658
+ - export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api"
1898
659
  - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
1899
660
  - |-
1900
661
  export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
1901
662
  RUN yarn plugin import workspace-tools
1902
663
  RUN yarn workspaces focus --production && yarn rebuild"
1903
664
  - |-
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
665
+ export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node api/package.json /app/api/package.json
666
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
1906
667
  COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
1907
668
  COPY --chown=node:node .yarn /app/.yarn"
1908
669
  - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1909
670
  - ensureNodeDockerfile
1910
671
  - 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")
672
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_review_api_GCLOUD_DEPLOY_credentialsKey")
1912
673
  - gcloud auth configure-docker europe-west6-docker.pkg.dev
1913
674
  - echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
1914
675
  - echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
@@ -1920,25 +681,24 @@ variables:
1920
681
  - docker push $DOCKER_CACHE_IMAGE
1921
682
  - echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
1922
683
  cache:
1923
- - key: www-yarn
684
+ - key: api-yarn
1924
685
  policy: pull
1925
686
  paths:
1926
- - www/.yarn
687
+ - api/.yarn
1927
688
  rules:
1928
689
  - if: $CI_MERGE_REQUEST_ID
1929
690
  needs:
1930
- - job: '๐Ÿ”ธ myWorkspace ๐Ÿ”จ app | review '
1931
- artifacts: true
691
+ - 'api ๐Ÿ”จ app | review '
1932
692
  retry: *a1
1933
693
  interruptible: true
1934
- '๐Ÿ”น www ๐Ÿงพ sbom | review ':
694
+ 'api ๐Ÿงพ sbom | review ':
1935
695
  stage: build
1936
696
  image: aquasec/trivy:0.38.3
1937
697
  variables: {}
1938
698
  script:
1939
699
  - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1940
700
  - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1941
- - trivy fs --quiet --format cyclonedx --output "__sbom.json" www
701
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" api
1942
702
  artifacts:
1943
703
  paths:
1944
704
  - __sbom.json
@@ -1948,7 +708,7 @@ variables:
1948
708
  retry: *a1
1949
709
  interruptible: true
1950
710
  allow_failure: true
1951
- '๐Ÿ”น www ๐Ÿš€ Deploy | review ':
711
+ 'api ๐Ÿš€ Deploy | review ':
1952
712
  stage: deploy review
1953
713
  image: path/to/docker/gcloud:the-version
1954
714
  variables:
@@ -1958,30 +718,37 @@ variables:
1958
718
  script:
1959
719
  - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1960
720
  - export ENV_SHORT="review"
1961
- - export APP_DIR="www"
721
+ - export APP_DIR="api"
1962
722
  - export ENV_TYPE="review"
1963
723
  - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1964
724
  - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1965
725
  - 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)}')"
726
+ - 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)}')"
727
+ - 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)}')"
728
+ - 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)}')"
729
+ - 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)}')"
730
+ - 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)}')"
731
+ - export CLOUD_SQL_INSTANCE_CONNECTION_NAME="projectId:region:instancename"
732
+ - 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"
733
+ - export DB_USER="my-user"
734
+ - export DB_PASSWORD="$CL_review_api_DB_PASSWORD"
735
+ - export DATABASE_URL="postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME"
736
+ - 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"
737
+ - 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"
738
+ - 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"
1971
739
  - export DEPLOY_CLOUD_RUN_PROJECT_ID="google-project-id"
1972
740
  - 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\\"]"
741
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_review_api_GCLOUD_DEPLOY_credentialsKey"
742
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_review_api_GCLOUD_RUN_canonicalHostSuffix"
743
+ - 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\\"]"
1977
744
  - 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"
745
+ - 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"; })"
746
+ - export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api"
1980
747
  - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
1981
748
  - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
1982
749
  - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1983
750
  - 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")
751
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_review_api_GCLOUD_DEPLOY_credentialsKey")
1985
752
  - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe google-project-id --format="value(projectNumber)")
1986
753
  - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
1987
754
  - echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"
@@ -1991,7 +758,7 @@ variables:
1991
758
  ENV_SHORT: |-
1992
759
  review
1993
760
  APP_DIR: |-
1994
- www
761
+ api
1995
762
  ENV_TYPE: |-
1996
763
  review
1997
764
  BUILD_INFO_BUILD_ID: |-
@@ -2001,46 +768,77 @@ variables:
2001
768
  BUILD_INFO_CURRENT_VERSION: |-
2002
769
  $(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
770
  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/^/ /')
771
+ $(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/^/ /')
2005
772
  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/^/ /')
773
+ $(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/^/ /')
2007
774
  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/^/ /')
775
+ $(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/^/ /')
2009
776
  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/^/ /')
777
+ $(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/^/ /')
2011
778
  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/^/ /')
779
+ $(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/^/ /')
780
+ CLOUD_SQL_INSTANCE_CONNECTION_NAME: |-
781
+ projectId:region:instancename
782
+ DB_NAME: |-
783
+ $(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/^/ /')
784
+ DB_USER: |-
785
+ my-user
786
+ DB_PASSWORD: |-
787
+ $(printf %s "$CL_review_api_DB_PASSWORD" | sed 's/^/ /')
788
+ DATABASE_URL: |-
789
+ postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME
790
+ DATABASE_JDBC_URL: |-
791
+ jdbc:postgresql:///$DB_NAME?cloudSqlInstance=$CLOUD_SQL_INSTANCE_CONNECTION_NAME&socketFactory=com.google.cloud.sql.postgres.SocketFactory&user=$DB_USER&password=$DB_PASSWORD
792
+ CLOUD_RUN_JOB_TRIGGER_URL_migration: |-
793
+ 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
794
+ CLOUD_RUN_JOB_TRIGGER_URL_send_reminders: |-
795
+ 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
2013
796
  DEPLOY_CLOUD_RUN_PROJECT_ID: |-
2014
797
  google-project-id
2015
798
  DEPLOY_CLOUD_RUN_REGION: |-
2016
799
  europe-west6
2017
800
  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/^/ /')
801
+ $(printf %s "$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | sed 's/^/ /')
2021
802
  _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"]
803
+ ["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"]
2023
804
 
2024
805
  EOF
2025
806
  - echo -e "\\e[0Ksection_end:$(date +%s):writeenvvars\\r\\e[0K"
2026
807
  - 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
808
+ - set +e
809
+ - echo "ensuring Database..."
810
+ - 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
811
+ - set -e
812
+ - set +e
813
+ - 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
814
+ - set -e
815
+ - 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
816
+ - set +e
817
+ - 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
818
+ - set -e
819
+ - '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 '
820
+ - set +e
821
+ - 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
822
+ - set -e
823
+ - '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 '
824
+ - 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
825
+ - 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
2028
826
  - echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"
2029
827
  - 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
828
+ - 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
829
+ - 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
830
+ - 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
2033
831
  - 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
832
+ - gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/api --quiet --delete-tags
2035
833
  - set -e
2036
834
  - echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"
2037
835
  - 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
836
+ - /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
837
+ - 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
2040
838
  environment:
2041
- name: review/$CI_COMMIT_REF_NAME/www
839
+ name: review/$CI_COMMIT_REF_NAME/api
2042
840
  url: $CL_GITLAB_ENVIRONMENT_URL
2043
- on_stop: '๐Ÿ”น www ๐Ÿ›‘ Stop โš ๏ธ | review '
841
+ on_stop: 'api ๐Ÿ›‘ Stop โš ๏ธ | review '
2044
842
  auto_stop_in: 1 week
2045
843
  artifacts:
2046
844
  reports:
@@ -2049,20 +847,22 @@ variables:
2049
847
  - when: on_success
2050
848
  if: $CI_MERGE_REQUEST_ID
2051
849
  needs:
2052
- - job: ๐Ÿ”ธ myWorkspace ๐Ÿ‘ฎ lint
850
+ - job: api ๐Ÿ‘ฎ lint
2053
851
  artifacts: false
2054
- - job: ๐Ÿ”ธ myWorkspace ๐Ÿงช test
852
+ - job: 'api ๐Ÿ”จ app | review '
2055
853
  artifacts: false
2056
- - job: ๐Ÿ”ธ myWorkspace ๐Ÿ›ก audit
854
+ - job: 'api ๐Ÿ”จ docker | review '
2057
855
  artifacts: false
2058
- - job: '๐Ÿ”น www ๐Ÿ”จ docker | review '
856
+ - job: api ๐Ÿงช test
2059
857
  artifacts: false
2060
- - job: '๐Ÿ”น www ๐Ÿงพ sbom | review '
858
+ - job: 'api ๐Ÿงพ sbom | review '
2061
859
  artifacts: true
860
+ - job: api ๐Ÿ›ก audit
861
+ artifacts: false
2062
862
  retry: *a1
2063
863
  interruptible: true
2064
864
  allow_failure: false
2065
- '๐Ÿ”น www ๐Ÿ›‘ Stop โš ๏ธ | review ':
865
+ 'api ๐Ÿ›‘ Stop โš ๏ธ | review ':
2066
866
  stage: stop review
2067
867
  image: path/to/docker/gcloud:the-version
2068
868
  variables:
@@ -2075,19 +875,27 @@ variables:
2075
875
  - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
2076
876
  - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
2077
877
  - 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
878
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_review_api_GCLOUD_DEPLOY_credentialsKey")
879
+ - 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
880
+ - 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
881
+ - 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
882
+ - 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
883
+ - 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
884
+ - 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
885
+ - 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..."
886
+ - 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"
887
+ - "\\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 "
888
+ - 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
889
+ - 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
2082
890
  - 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
891
+ - gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/api --quiet --delete-tags
2084
892
  - set -e
2085
893
  - 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
894
+ - /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
2087
895
  - 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
896
+ - 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
2089
897
  environment:
2090
- name: review/$CI_COMMIT_REF_NAME/www
898
+ name: review/$CI_COMMIT_REF_NAME/api
2091
899
  url: $CL_GITLAB_ENVIRONMENT_URL
2092
900
  action: stop
2093
901
  artifacts:
@@ -2102,7 +910,109 @@ variables:
2102
910
  retry: *a1
2103
911
  interruptible: true
2104
912
  allow_failure: true
2105
- '๐Ÿ”น www ๐Ÿ”จ docker | stage ':
913
+ 'api ๐Ÿ”จ app | stage ':
914
+ stage: build
915
+ image: path/to/docker/jobs-default:the-version
916
+ variables:
917
+ KUBERNETES_CPU_REQUEST: '0.45'
918
+ KUBERNETES_MEMORY_REQUEST: 1Gi
919
+ KUBERNETES_MEMORY_LIMIT: 4Gi
920
+ script:
921
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
922
+ - export ENV_SHORT="stage"
923
+ - export APP_DIR="api"
924
+ - export ENV_TYPE="stage"
925
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
926
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
927
+ - 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")"
928
+ - export HOST="$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
929
+ - export ROOT_URL="https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
930
+ - export HOST_INTERNAL="$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
931
+ - export HOST_CANONICAL="$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
932
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
933
+ - export CLOUD_SQL_INSTANCE_CONNECTION_NAME="projectId:region:instancename"
934
+ - export DB_NAME="pan-test-app-stage-api"
935
+ - export DB_USER="my-user"
936
+ - export DB_PASSWORD="$CL_stage_api_DB_PASSWORD"
937
+ - export DATABASE_URL="postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME"
938
+ - 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"
939
+ - 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"
940
+ - 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"
941
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="google-project-id"
942
+ - export DEPLOY_CLOUD_RUN_REGION="europe-west6"
943
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_stage_api_GCLOUD_DEPLOY_credentialsKey"
944
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix"
945
+ - 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\\"]"
946
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
947
+ - echo -e "\\e[0Ksection_start:$(date +%s):write-dotenv-api[collapsed=true]\\r\\e[0Kwrite dot env"
948
+ - |-
949
+ cat <<EOF > api/.env
950
+ ENV_SHORT=stage
951
+ APP_DIR=api
952
+ ENV_TYPE=stage
953
+ HOST=$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')
954
+ ROOT_URL=https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')
955
+ HOST_INTERNAL=$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')
956
+ HOST_CANONICAL=$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')
957
+ ROOT_URL_INTERNAL=https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')
958
+ CLOUD_SQL_INSTANCE_CONNECTION_NAME=projectId:region:instancename
959
+ DB_NAME=pan-test-app-stage-api
960
+ DB_USER=my-user
961
+ DB_PASSWORD=$CL_stage_api_DB_PASSWORD
962
+ DATABASE_URL=postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME
963
+ 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
964
+ 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
965
+ 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
966
+ DEPLOY_CLOUD_RUN_PROJECT_ID=google-project-id
967
+ DEPLOY_CLOUD_RUN_REGION=europe-west6
968
+ GCLOUD_DEPLOY_credentialsKey=$CL_stage_api_GCLOUD_DEPLOY_credentialsKey
969
+ GCLOUD_RUN_canonicalHostSuffix=$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix
970
+ _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"]
971
+ EOF
972
+ - echo -e "\\e[0Ksection_end:$(date +%s):write-dotenv-api\\r\\e[0K"
973
+ - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > api/__build_info.json
974
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
975
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
976
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
977
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
978
+ - cd api
979
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
980
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
981
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
982
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
983
+ - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
984
+ - yarn install --immutable
985
+ - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
986
+ - yarn build
987
+ cache:
988
+ - key: api-yarn
989
+ policy: pull-push
990
+ paths:
991
+ - api/.yarn
992
+ - key: api-node-modules
993
+ policy: pull-push
994
+ paths:
995
+ - api/node_modules
996
+ - key: api-next-cache
997
+ policy: pull-push
998
+ paths:
999
+ - api/.next/cache
1000
+ artifacts:
1001
+ paths:
1002
+ - api/__build_info.json
1003
+ - api/.next
1004
+ - api/dist
1005
+ exclude:
1006
+ - api/.env
1007
+ expire_in: 1 day
1008
+ when: always
1009
+ reports: {}
1010
+ rules:
1011
+ - if: $CI_COMMIT_TAG
1012
+ needs: []
1013
+ retry: *a1
1014
+ interruptible: true
1015
+ 'api ๐Ÿ”จ docker | stage ':
2106
1016
  stage: build
2107
1017
  image: path/to/docker/docker-build:the-version
2108
1018
  services:
@@ -2119,25 +1029,25 @@ variables:
2119
1029
  KUBERNETES_MEMORY_LIMIT: 2Gi
2120
1030
  script:
2121
1031
  - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
2122
- - export APP_DIR="www"
1032
+ - export APP_DIR="api"
2123
1033
  - export DOCKER_BUILD_CONTEXT="."
2124
1034
  - 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"
1035
+ - export DOCKER_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/stage/api"
1036
+ - export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api"
2127
1037
  - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
2128
1038
  - |-
2129
1039
  export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
2130
1040
  RUN yarn plugin import workspace-tools
2131
1041
  RUN yarn workspaces focus --production && yarn rebuild"
2132
1042
  - |-
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
1043
+ export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node api/package.json /app/api/package.json
1044
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
2135
1045
  COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
2136
1046
  COPY --chown=node:node .yarn /app/.yarn"
2137
1047
  - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
2138
1048
  - ensureNodeDockerfile
2139
1049
  - 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")
1050
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_stage_api_GCLOUD_DEPLOY_credentialsKey")
2141
1051
  - gcloud auth configure-docker europe-west6-docker.pkg.dev
2142
1052
  - echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
2143
1053
  - echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
@@ -2149,25 +1059,24 @@ variables:
2149
1059
  - docker push $DOCKER_CACHE_IMAGE
2150
1060
  - echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
2151
1061
  cache:
2152
- - key: www-yarn
1062
+ - key: api-yarn
2153
1063
  policy: pull
2154
1064
  paths:
2155
- - www/.yarn
1065
+ - api/.yarn
2156
1066
  rules:
2157
1067
  - if: $CI_COMMIT_TAG
2158
1068
  needs:
2159
- - job: '๐Ÿ”ธ myWorkspace ๐Ÿ”จ app | stage '
2160
- artifacts: true
1069
+ - 'api ๐Ÿ”จ app | stage '
2161
1070
  retry: *a1
2162
1071
  interruptible: true
2163
- '๐Ÿ”น www ๐Ÿงพ sbom | stage ':
1072
+ 'api ๐Ÿงพ sbom | stage ':
2164
1073
  stage: build
2165
1074
  image: aquasec/trivy:0.38.3
2166
1075
  variables: {}
2167
1076
  script:
2168
1077
  - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
2169
1078
  - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
2170
- - trivy fs --quiet --format cyclonedx --output "__sbom.json" www
1079
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" api
2171
1080
  artifacts:
2172
1081
  paths:
2173
1082
  - __sbom.json
@@ -2177,7 +1086,7 @@ variables:
2177
1086
  retry: *a1
2178
1087
  interruptible: true
2179
1088
  allow_failure: true
2180
- '๐Ÿ”น www ๐Ÿš€ Deploy | stage ':
1089
+ 'api ๐Ÿš€ Deploy | stage ':
2181
1090
  stage: deploy stage
2182
1091
  image: path/to/docker/gcloud:the-version
2183
1092
  variables:
@@ -2187,30 +1096,37 @@ variables:
2187
1096
  script:
2188
1097
  - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
2189
1098
  - export ENV_SHORT="stage"
2190
- - export APP_DIR="www"
1099
+ - export APP_DIR="api"
2191
1100
  - export ENV_TYPE="stage"
2192
1101
  - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
2193
1102
  - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
2194
1103
  - 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)}')"
1104
+ - export HOST="$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1105
+ - export ROOT_URL="https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1106
+ - export HOST_INTERNAL="$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1107
+ - export HOST_CANONICAL="$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1108
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1109
+ - export CLOUD_SQL_INSTANCE_CONNECTION_NAME="projectId:region:instancename"
1110
+ - export DB_NAME="pan-test-app-stage-api"
1111
+ - export DB_USER="my-user"
1112
+ - export DB_PASSWORD="$CL_stage_api_DB_PASSWORD"
1113
+ - export DATABASE_URL="postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME"
1114
+ - 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"
1115
+ - 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"
1116
+ - 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"
2200
1117
  - export DEPLOY_CLOUD_RUN_PROJECT_ID="google-project-id"
2201
1118
  - 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\\"]"
1119
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_stage_api_GCLOUD_DEPLOY_credentialsKey"
1120
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix"
1121
+ - 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\\"]"
2206
1122
  - 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"
1123
+ - export DOCKER_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/stage/api"
1124
+ - export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api"
2209
1125
  - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
2210
1126
  - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
2211
1127
  - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
2212
1128
  - 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")
1129
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_stage_api_GCLOUD_DEPLOY_credentialsKey")
2214
1130
  - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe google-project-id --format="value(projectNumber)")
2215
1131
  - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
2216
1132
  - echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"
@@ -2220,7 +1136,7 @@ variables:
2220
1136
  ENV_SHORT: |-
2221
1137
  stage
2222
1138
  APP_DIR: |-
2223
- www
1139
+ api
2224
1140
  ENV_TYPE: |-
2225
1141
  stage
2226
1142
  BUILD_INFO_BUILD_ID: |-
@@ -2230,43 +1146,74 @@ variables:
2230
1146
  BUILD_INFO_CURRENT_VERSION: |-
2231
1147
  $(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
1148
  HOST: |-
2233
- $(printf %s "$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1149
+ $(printf %s "$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2234
1150
  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/^/ /')
1151
+ $(printf %s "https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2236
1152
  HOST_INTERNAL: |-
2237
- $(printf %s "$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1153
+ $(printf %s "$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2238
1154
  HOST_CANONICAL: |-
2239
- $(printf %s "$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1155
+ $(printf %s "$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2240
1156
  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/^/ /')
1157
+ $(printf %s "https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1158
+ CLOUD_SQL_INSTANCE_CONNECTION_NAME: |-
1159
+ projectId:region:instancename
1160
+ DB_NAME: |-
1161
+ pan-test-app-stage-api
1162
+ DB_USER: |-
1163
+ my-user
1164
+ DB_PASSWORD: |-
1165
+ $(printf %s "$CL_stage_api_DB_PASSWORD" | sed 's/^/ /')
1166
+ DATABASE_URL: |-
1167
+ postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME
1168
+ DATABASE_JDBC_URL: |-
1169
+ jdbc:postgresql:///$DB_NAME?cloudSqlInstance=$CLOUD_SQL_INSTANCE_CONNECTION_NAME&socketFactory=com.google.cloud.sql.postgres.SocketFactory&user=$DB_USER&password=$DB_PASSWORD
1170
+ CLOUD_RUN_JOB_TRIGGER_URL_migration: |-
1171
+ https://europe-west6-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/google-project-id/jobs/pan-test-app-stage-api-migration:run
1172
+ CLOUD_RUN_JOB_TRIGGER_URL_send_reminders: |-
1173
+ https://europe-west6-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/google-project-id/jobs/pan-test-app-stage-api-send-reminders:run
2242
1174
  DEPLOY_CLOUD_RUN_PROJECT_ID: |-
2243
1175
  google-project-id
2244
1176
  DEPLOY_CLOUD_RUN_REGION: |-
2245
1177
  europe-west6
2246
1178
  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/^/ /')
1179
+ $(printf %s "$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | sed 's/^/ /')
2250
1180
  _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"]
1181
+ ["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"]
2252
1182
 
2253
1183
  EOF
2254
1184
  - echo -e "\\e[0Ksection_end:$(date +%s):writeenvvars\\r\\e[0K"
2255
1185
  - 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
1186
+ - set +e
1187
+ - echo "ensuring Database..."
1188
+ - gcloud sql databases create pan-test-app-stage-api --instance=instancename --project projectId
1189
+ - set -e
1190
+ - set +e
1191
+ - 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
1192
+ - set -e
1193
+ - 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
1194
+ - set +e
1195
+ - 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
1196
+ - set -e
1197
+ - '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 '
1198
+ - set +e
1199
+ - 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
1200
+ - set -e
1201
+ - '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 '
1202
+ - 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
1203
+ - gcloud run jobs execute pan-test-app-stage-api-migration --project=google-project-id --region=europe-west6
2257
1204
  - echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"
2258
1205
  - 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
1206
+ - 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
1207
+ - 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
1208
+ - 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
2262
1209
  - echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"
2263
1210
  - 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
1211
+ - /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
1212
+ - 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
2266
1213
  environment:
2267
- name: stage/www
1214
+ name: stage/api
2268
1215
  url: $CL_GITLAB_ENVIRONMENT_URL
2269
- on_stop: '๐Ÿ”น www ๐Ÿ›‘ Stop โš ๏ธ | stage '
1216
+ on_stop: 'api ๐Ÿ›‘ Stop โš ๏ธ | stage '
2270
1217
  artifacts:
2271
1218
  reports:
2272
1219
  dotenv: gitlab_environment.env
@@ -2274,14 +1221,16 @@ variables:
2274
1221
  - when: on_success
2275
1222
  if: $CI_COMMIT_TAG
2276
1223
  needs:
2277
- - job: '๐Ÿ”น www ๐Ÿ”จ docker | stage '
1224
+ - job: 'api ๐Ÿ”จ app | stage '
1225
+ artifacts: false
1226
+ - job: 'api ๐Ÿ”จ docker | stage '
2278
1227
  artifacts: false
2279
- - job: '๐Ÿ”น www ๐Ÿงพ sbom | stage '
1228
+ - job: 'api ๐Ÿงพ sbom | stage '
2280
1229
  artifacts: true
2281
1230
  retry: *a1
2282
1231
  interruptible: true
2283
1232
  allow_failure: false
2284
- '๐Ÿ”น www ๐Ÿ›‘ Stop โš ๏ธ | stage ':
1233
+ 'api ๐Ÿ›‘ Stop โš ๏ธ | stage ':
2285
1234
  stage: stop stage
2286
1235
  image: path/to/docker/gcloud:the-version
2287
1236
  variables:
@@ -2294,16 +1243,21 @@ variables:
2294
1243
  - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
2295
1244
  - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
2296
1245
  - 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
1246
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_stage_api_GCLOUD_DEPLOY_credentialsKey")
1247
+ - gcloud run services delete pan-test-app-stage-api --project=google-project-id --region=europe-west6
1248
+ - gcloud scheduler jobs delete pan-test-app-stage-api-send-reminders-scheduler --project=google-project-id --location=europe-west6
1249
+ - 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
1250
+ - gcloud run jobs delete pan-test-app-stage-api-migration --project=google-project-id --region=europe-west6
1251
+ - 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
1252
+ - gcloud run jobs delete pan-test-app-stage-api-send-reminders --project=google-project-id --region=europe-west6
1253
+ - gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/stage/api --quiet --delete-tags
1254
+ - 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
2301
1255
  - 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
1256
+ - /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
2303
1257
  - 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
1258
+ - 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
2305
1259
  environment:
2306
- name: stage/www
1260
+ name: stage/api
2307
1261
  url: $CL_GITLAB_ENVIRONMENT_URL
2308
1262
  action: stop
2309
1263
  artifacts:
@@ -2318,7 +1272,109 @@ variables:
2318
1272
  retry: *a1
2319
1273
  interruptible: true
2320
1274
  allow_failure: true
2321
- '๐Ÿ”น www ๐Ÿ”จ docker | prod ':
1275
+ 'api ๐Ÿ”จ app | prod ':
1276
+ stage: build
1277
+ image: path/to/docker/jobs-default:the-version
1278
+ variables:
1279
+ KUBERNETES_CPU_REQUEST: '0.45'
1280
+ KUBERNETES_MEMORY_REQUEST: 1Gi
1281
+ KUBERNETES_MEMORY_LIMIT: 4Gi
1282
+ script:
1283
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1284
+ - export ENV_SHORT="prod"
1285
+ - export APP_DIR="api"
1286
+ - export ENV_TYPE="prod"
1287
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1288
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1289
+ - 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")"
1290
+ - export HOST="$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1291
+ - export ROOT_URL="https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1292
+ - export HOST_INTERNAL="$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1293
+ - export HOST_CANONICAL="$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1294
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1295
+ - export CLOUD_SQL_INSTANCE_CONNECTION_NAME="projectId:region:instancename"
1296
+ - export DB_NAME="pan-test-app-prod-api"
1297
+ - export DB_USER="my-user"
1298
+ - export DB_PASSWORD="$CL_prod_api_DB_PASSWORD"
1299
+ - export DATABASE_URL="postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME"
1300
+ - 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"
1301
+ - 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"
1302
+ - 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"
1303
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="google-project-id"
1304
+ - export DEPLOY_CLOUD_RUN_REGION="europe-west6"
1305
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_prod_api_GCLOUD_DEPLOY_credentialsKey"
1306
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix"
1307
+ - 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\\"]"
1308
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1309
+ - echo -e "\\e[0Ksection_start:$(date +%s):write-dotenv-api[collapsed=true]\\r\\e[0Kwrite dot env"
1310
+ - |-
1311
+ cat <<EOF > api/.env
1312
+ ENV_SHORT=prod
1313
+ APP_DIR=api
1314
+ ENV_TYPE=prod
1315
+ HOST=$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')
1316
+ ROOT_URL=https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')
1317
+ HOST_INTERNAL=$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')
1318
+ HOST_CANONICAL=$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')
1319
+ ROOT_URL_INTERNAL=https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')
1320
+ CLOUD_SQL_INSTANCE_CONNECTION_NAME=projectId:region:instancename
1321
+ DB_NAME=pan-test-app-prod-api
1322
+ DB_USER=my-user
1323
+ DB_PASSWORD=$CL_prod_api_DB_PASSWORD
1324
+ DATABASE_URL=postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME
1325
+ 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
1326
+ 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
1327
+ 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
1328
+ DEPLOY_CLOUD_RUN_PROJECT_ID=google-project-id
1329
+ DEPLOY_CLOUD_RUN_REGION=europe-west6
1330
+ GCLOUD_DEPLOY_credentialsKey=$CL_prod_api_GCLOUD_DEPLOY_credentialsKey
1331
+ GCLOUD_RUN_canonicalHostSuffix=$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix
1332
+ _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"]
1333
+ EOF
1334
+ - echo -e "\\e[0Ksection_end:$(date +%s):write-dotenv-api\\r\\e[0K"
1335
+ - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > api/__build_info.json
1336
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
1337
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1338
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1339
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
1340
+ - cd api
1341
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
1342
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1343
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1344
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
1345
+ - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
1346
+ - yarn install --immutable
1347
+ - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
1348
+ - yarn build
1349
+ cache:
1350
+ - key: api-yarn
1351
+ policy: pull-push
1352
+ paths:
1353
+ - api/.yarn
1354
+ - key: api-node-modules
1355
+ policy: pull-push
1356
+ paths:
1357
+ - api/node_modules
1358
+ - key: api-next-cache
1359
+ policy: pull-push
1360
+ paths:
1361
+ - api/.next/cache
1362
+ artifacts:
1363
+ paths:
1364
+ - api/__build_info.json
1365
+ - api/.next
1366
+ - api/dist
1367
+ exclude:
1368
+ - api/.env
1369
+ expire_in: 1 day
1370
+ when: always
1371
+ reports: {}
1372
+ rules:
1373
+ - if: $CI_COMMIT_TAG
1374
+ needs: []
1375
+ retry: *a1
1376
+ interruptible: true
1377
+ 'api ๐Ÿ”จ docker | prod ':
2322
1378
  stage: build
2323
1379
  image: path/to/docker/docker-build:the-version
2324
1380
  services:
@@ -2335,25 +1391,25 @@ variables:
2335
1391
  KUBERNETES_MEMORY_LIMIT: 2Gi
2336
1392
  script:
2337
1393
  - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
2338
- - export APP_DIR="www"
1394
+ - export APP_DIR="api"
2339
1395
  - export DOCKER_BUILD_CONTEXT="."
2340
1396
  - 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"
1397
+ - export DOCKER_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/prod/api"
1398
+ - export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api"
2343
1399
  - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
2344
1400
  - |-
2345
1401
  export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
2346
1402
  RUN yarn plugin import workspace-tools
2347
1403
  RUN yarn workspaces focus --production && yarn rebuild"
2348
1404
  - |-
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
1405
+ export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node api/package.json /app/api/package.json
1406
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
2351
1407
  COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
2352
1408
  COPY --chown=node:node .yarn /app/.yarn"
2353
1409
  - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
2354
1410
  - ensureNodeDockerfile
2355
1411
  - 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")
1412
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_prod_api_GCLOUD_DEPLOY_credentialsKey")
2357
1413
  - gcloud auth configure-docker europe-west6-docker.pkg.dev
2358
1414
  - echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
2359
1415
  - echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
@@ -2365,25 +1421,24 @@ variables:
2365
1421
  - docker push $DOCKER_CACHE_IMAGE
2366
1422
  - echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
2367
1423
  cache:
2368
- - key: www-yarn
1424
+ - key: api-yarn
2369
1425
  policy: pull
2370
1426
  paths:
2371
- - www/.yarn
1427
+ - api/.yarn
2372
1428
  rules:
2373
1429
  - if: $CI_COMMIT_TAG
2374
1430
  needs:
2375
- - job: '๐Ÿ”ธ myWorkspace ๐Ÿ”จ app | prod '
2376
- artifacts: true
1431
+ - 'api ๐Ÿ”จ app | prod '
2377
1432
  retry: *a1
2378
1433
  interruptible: true
2379
- '๐Ÿ”น www ๐Ÿงพ sbom | prod ':
1434
+ 'api ๐Ÿงพ sbom | prod ':
2380
1435
  stage: build
2381
1436
  image: aquasec/trivy:0.38.3
2382
1437
  variables: {}
2383
1438
  script:
2384
1439
  - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
2385
1440
  - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
2386
- - trivy fs --quiet --format cyclonedx --output "__sbom.json" www
1441
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" api
2387
1442
  artifacts:
2388
1443
  paths:
2389
1444
  - __sbom.json
@@ -2393,7 +1448,7 @@ variables:
2393
1448
  retry: *a1
2394
1449
  interruptible: true
2395
1450
  allow_failure: true
2396
- '๐Ÿ”น www ๐Ÿš€ Deploy | prod ':
1451
+ 'api ๐Ÿš€ Deploy | prod ':
2397
1452
  stage: deploy prod
2398
1453
  image: path/to/docker/gcloud:the-version
2399
1454
  variables:
@@ -2403,30 +1458,37 @@ variables:
2403
1458
  script:
2404
1459
  - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
2405
1460
  - export ENV_SHORT="prod"
2406
- - export APP_DIR="www"
1461
+ - export APP_DIR="api"
2407
1462
  - export ENV_TYPE="prod"
2408
1463
  - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
2409
1464
  - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
2410
1465
  - 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)}')"
1466
+ - export HOST="$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1467
+ - export ROOT_URL="https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1468
+ - export HOST_INTERNAL="$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1469
+ - export HOST_CANONICAL="$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1470
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1471
+ - export CLOUD_SQL_INSTANCE_CONNECTION_NAME="projectId:region:instancename"
1472
+ - export DB_NAME="pan-test-app-prod-api"
1473
+ - export DB_USER="my-user"
1474
+ - export DB_PASSWORD="$CL_prod_api_DB_PASSWORD"
1475
+ - export DATABASE_URL="postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME"
1476
+ - 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"
1477
+ - 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"
1478
+ - 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"
2416
1479
  - export DEPLOY_CLOUD_RUN_PROJECT_ID="google-project-id"
2417
1480
  - 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\\"]"
1481
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_prod_api_GCLOUD_DEPLOY_credentialsKey"
1482
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix"
1483
+ - 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\\"]"
2422
1484
  - 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"
1485
+ - export DOCKER_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/prod/api"
1486
+ - export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api"
2425
1487
  - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
2426
1488
  - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
2427
1489
  - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
2428
1490
  - 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")
1491
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_prod_api_GCLOUD_DEPLOY_credentialsKey")
2430
1492
  - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe google-project-id --format="value(projectNumber)")
2431
1493
  - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
2432
1494
  - echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"
@@ -2436,7 +1498,7 @@ variables:
2436
1498
  ENV_SHORT: |-
2437
1499
  prod
2438
1500
  APP_DIR: |-
2439
- www
1501
+ api
2440
1502
  ENV_TYPE: |-
2441
1503
  prod
2442
1504
  BUILD_INFO_BUILD_ID: |-
@@ -2446,43 +1508,74 @@ variables:
2446
1508
  BUILD_INFO_CURRENT_VERSION: |-
2447
1509
  $(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
1510
  HOST: |-
2449
- $(printf %s "$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1511
+ $(printf %s "$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2450
1512
  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/^/ /')
1513
+ $(printf %s "https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2452
1514
  HOST_INTERNAL: |-
2453
- $(printf %s "$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1515
+ $(printf %s "$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2454
1516
  HOST_CANONICAL: |-
2455
- $(printf %s "$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1517
+ $(printf %s "$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2456
1518
  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/^/ /')
1519
+ $(printf %s "https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1520
+ CLOUD_SQL_INSTANCE_CONNECTION_NAME: |-
1521
+ projectId:region:instancename
1522
+ DB_NAME: |-
1523
+ pan-test-app-prod-api
1524
+ DB_USER: |-
1525
+ my-user
1526
+ DB_PASSWORD: |-
1527
+ $(printf %s "$CL_prod_api_DB_PASSWORD" | sed 's/^/ /')
1528
+ DATABASE_URL: |-
1529
+ postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME
1530
+ DATABASE_JDBC_URL: |-
1531
+ jdbc:postgresql:///$DB_NAME?cloudSqlInstance=$CLOUD_SQL_INSTANCE_CONNECTION_NAME&socketFactory=com.google.cloud.sql.postgres.SocketFactory&user=$DB_USER&password=$DB_PASSWORD
1532
+ CLOUD_RUN_JOB_TRIGGER_URL_migration: |-
1533
+ https://europe-west6-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/google-project-id/jobs/pan-test-app-prod-api-migration:run
1534
+ CLOUD_RUN_JOB_TRIGGER_URL_send_reminders: |-
1535
+ https://europe-west6-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/google-project-id/jobs/pan-test-app-prod-api-send-reminders:run
2458
1536
  DEPLOY_CLOUD_RUN_PROJECT_ID: |-
2459
1537
  google-project-id
2460
1538
  DEPLOY_CLOUD_RUN_REGION: |-
2461
1539
  europe-west6
2462
1540
  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/^/ /')
1541
+ $(printf %s "$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | sed 's/^/ /')
2466
1542
  _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"]
1543
+ ["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"]
2468
1544
 
2469
1545
  EOF
2470
1546
  - echo -e "\\e[0Ksection_end:$(date +%s):writeenvvars\\r\\e[0K"
2471
1547
  - 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
1548
+ - set +e
1549
+ - echo "ensuring Database..."
1550
+ - gcloud sql databases create pan-test-app-prod-api --instance=instancename --project projectId
1551
+ - set -e
1552
+ - set +e
1553
+ - 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
1554
+ - set -e
1555
+ - 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
1556
+ - set +e
1557
+ - 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
1558
+ - set -e
1559
+ - '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 '
1560
+ - set +e
1561
+ - 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
1562
+ - set -e
1563
+ - '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 '
1564
+ - 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
1565
+ - gcloud run jobs execute pan-test-app-prod-api-migration --project=google-project-id --region=europe-west6
2473
1566
  - echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"
2474
1567
  - 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
1568
+ - 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
1569
+ - 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
1570
+ - 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
2478
1571
  - echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"
2479
1572
  - 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
1573
+ - /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
1574
+ - 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
2482
1575
  environment:
2483
- name: prod/www
1576
+ name: prod/api
2484
1577
  url: $CL_GITLAB_ENVIRONMENT_URL
2485
- on_stop: '๐Ÿ”น www ๐Ÿ›‘ Stop โš ๏ธ | prod '
1578
+ on_stop: 'api ๐Ÿ›‘ Stop โš ๏ธ | prod '
2486
1579
  artifacts:
2487
1580
  reports:
2488
1581
  dotenv: gitlab_environment.env
@@ -2490,14 +1583,16 @@ variables:
2490
1583
  - when: manual
2491
1584
  if: $CI_COMMIT_TAG
2492
1585
  needs:
2493
- - job: '๐Ÿ”น www ๐Ÿ”จ docker | prod '
1586
+ - job: 'api ๐Ÿ”จ app | prod '
1587
+ artifacts: false
1588
+ - job: 'api ๐Ÿ”จ docker | prod '
2494
1589
  artifacts: false
2495
- - job: '๐Ÿ”น www ๐Ÿงพ sbom | prod '
1590
+ - job: 'api ๐Ÿงพ sbom | prod '
2496
1591
  artifacts: true
2497
1592
  retry: *a1
2498
1593
  interruptible: true
2499
1594
  allow_failure: true
2500
- '๐Ÿ”น www ๐Ÿ›‘ Stop โš ๏ธ | prod ':
1595
+ 'api ๐Ÿ›‘ Stop โš ๏ธ | prod ':
2501
1596
  stage: stop prod
2502
1597
  image: path/to/docker/gcloud:the-version
2503
1598
  variables:
@@ -2510,16 +1605,21 @@ variables:
2510
1605
  - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
2511
1606
  - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
2512
1607
  - 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
1608
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_prod_api_GCLOUD_DEPLOY_credentialsKey")
1609
+ - gcloud run services delete pan-test-app-prod-api --project=google-project-id --region=europe-west6
1610
+ - gcloud scheduler jobs delete pan-test-app-prod-api-send-reminders-scheduler --project=google-project-id --location=europe-west6
1611
+ - 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
1612
+ - gcloud run jobs delete pan-test-app-prod-api-migration --project=google-project-id --region=europe-west6
1613
+ - 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
1614
+ - gcloud run jobs delete pan-test-app-prod-api-send-reminders --project=google-project-id --region=europe-west6
1615
+ - gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/prod/api --quiet --delete-tags
1616
+ - 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
2517
1617
  - 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
1618
+ - /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
2519
1619
  - 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
1620
+ - 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
2521
1621
  environment:
2522
- name: prod/www
1622
+ name: prod/api
2523
1623
  url: $CL_GITLAB_ENVIRONMENT_URL
2524
1624
  action: stop
2525
1625
  artifacts: