@catladder/pipeline 1.165.1 โ†’ 1.166.1

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