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