@catladder/pipeline 2.2.4 โ†’ 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/dist/constants.js +1 -1
  2. package/dist/deploy/base/deploy.js +1 -1
  3. package/dist/deploy/sbom.js +3 -2
  4. package/dist/pipeline/gitlab/createGitlabJobs.js +6 -4
  5. package/dist/tsconfig.tsbuildinfo +1 -1
  6. package/examples/__snapshots__/cloud-run-http2.test.ts.snap +16 -20
  7. package/examples/__snapshots__/cloud-run-memory-limit.test.ts.snap +16 -20
  8. package/examples/__snapshots__/cloud-run-meteor-with-worker.test.ts.snap +16 -20
  9. package/examples/__snapshots__/cloud-run-nextjs.test.ts.snap +16 -20
  10. package/examples/__snapshots__/cloud-run-no-cpu-throttling.test.ts.snap +16 -20
  11. package/examples/__snapshots__/cloud-run-no-service.test.ts.snap +16 -20
  12. package/examples/__snapshots__/cloud-run-non-public.test.ts.snap +16 -20
  13. package/examples/__snapshots__/cloud-run-post-stop-job.test.ts.snap +16 -20
  14. package/examples/__snapshots__/cloud-run-service-custom-vpc-connector.test.ts.snap +16 -20
  15. package/examples/__snapshots__/cloud-run-service-custom-vpc.test.ts.snap +16 -20
  16. package/examples/__snapshots__/cloud-run-service-gen2.test.ts.snap +16 -20
  17. package/examples/__snapshots__/cloud-run-service-increase-timout.test.ts.snap +16 -20
  18. package/examples/__snapshots__/cloud-run-service-with-volumes.test.ts.snap +16 -20
  19. package/examples/__snapshots__/cloud-run-storybook.test.ts.snap +16 -20
  20. package/examples/__snapshots__/cloud-run-with-ngnix.test.ts.snap +16 -20
  21. package/examples/__snapshots__/cloud-run-with-sql-reuse-db.test.ts.snap +32 -40
  22. package/examples/__snapshots__/cloud-run-with-sql.test.ts.snap +16 -20
  23. package/examples/__snapshots__/cloud-run-with-worker.test.ts.snap +16 -20
  24. package/examples/__snapshots__/custom-build-job-with-tests.test.ts.snap +16 -20
  25. package/examples/__snapshots__/custom-build-job.test.ts.snap +16 -20
  26. package/examples/__snapshots__/custom-deploy.test.ts.snap +11 -113
  27. package/examples/__snapshots__/custom-sbom-java.test.ts.snap +16 -20
  28. package/examples/__snapshots__/custom-verify-job.test.ts.snap +1632 -0
  29. package/examples/__snapshots__/git-submodule.test.ts.snap +16 -20
  30. package/examples/__snapshots__/kubernetes-application-customization.test.ts.snap +20 -28
  31. package/examples/__snapshots__/kubernetes-with-cloud-sql.test.ts.snap +20 -28
  32. package/examples/__snapshots__/kubernetes-with-jobs.test.ts.snap +40 -56
  33. package/examples/__snapshots__/kubernetes-with-mongodb.test.ts.snap +20 -28
  34. package/examples/__snapshots__/local-dot-env.test.ts.snap +16 -20
  35. package/examples/__snapshots__/meteor-kubernetes.test.ts.snap +20 -28
  36. package/examples/__snapshots__/multiline-var.test.ts.snap +52 -68
  37. package/examples/__snapshots__/native-app.test.ts.snap +48 -24
  38. package/examples/__snapshots__/node-build-with-custom-image.test.ts.snap +16 -20
  39. package/examples/__snapshots__/node-build-with-docker-additions.test.ts.snap +16 -20
  40. package/examples/__snapshots__/rails-k8s-with-worker-dockerfile.test.ts.snap +20 -28
  41. package/examples/__snapshots__/rails-k8s-with-worker.test.ts.snap +20 -28
  42. package/examples/__snapshots__/referencing-other-vars.test.ts.snap +52 -68
  43. package/examples/__snapshots__/wait-for-other-deploy.test.ts.snap +64 -8
  44. package/examples/__snapshots__/workspace-api-www-turbo-cache.test.ts.snap +32 -40
  45. package/examples/__snapshots__/workspace-api-www.test.ts.snap +32 -40
  46. package/examples/custom-deploy.ts +8 -1
  47. package/examples/custom-verify-job.test.ts +11 -0
  48. package/examples/custom-verify-job.ts +64 -0
  49. package/package.json +1 -1
  50. package/src/deploy/base/deploy.ts +1 -1
  51. package/src/deploy/sbom.ts +3 -2
  52. package/src/pipeline/gitlab/createGitlabJobs.ts +6 -2
@@ -0,0 +1,1632 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`matches snapshot for custom-verify-job 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
+ before_script:
49
+ - |-
50
+ function escapeForDotEnv () {
51
+ input="\${1:-$(cat)}"
52
+ input="\${input//$'\\n'/\\\\n}"
53
+ if [[ "$input" == *\\\\n* ]]; then
54
+ if [[ "$input" == *\\"* && "$input" == *\\'* && "$input" == *\\\`* ]]; then
55
+ printf "\\"%s\\"\\n" "$input"
56
+ elif [[ "$input" == *\\"* && "$input" == *\\'* ]]; then
57
+ printf "\`%s\`\\n" "$input"
58
+ elif [[ "$input" == *\\"* ]]; then
59
+ printf "'%s'\\n" "$input"
60
+ else
61
+ printf "\\"%s\\"\\n" "$input"
62
+ fi
63
+ else
64
+ printf "%s\\n" "$input"
65
+ fi
66
+ }
67
+ - |-
68
+ function collapseable_section_start () {
69
+ local section_title="\${1}"
70
+ local section_description="\${2:-$section_title}"
71
+ echo -e "section_start:\`date +%s\`:\${section_title}[collapsed=true]\\r\\e[0K\${section_description}"
72
+ }
73
+ - |-
74
+ function collapseable_section_end () {
75
+ local section_title="\${1}"
76
+ echo -e "section_end:\`date +%s\`:\${section_title}\\r\\e[0K"
77
+ }
78
+ www ๐Ÿ›ก audit:
79
+ stage: test
80
+ image: path/to/docker/jobs-default:the-version
81
+ variables:
82
+ KUBERNETES_CPU_REQUEST: '0.45'
83
+ KUBERNETES_MEMORY_REQUEST: 1Gi
84
+ KUBERNETES_MEMORY_LIMIT: 4Gi
85
+ script:
86
+ - collapseable_section_start "injectvars" "Injecting variables"
87
+ - export APP_PATH="www"
88
+ - collapseable_section_end "injectvars"
89
+ - cd www
90
+ - yarn npm audit --environment production
91
+ rules:
92
+ - when: never
93
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
94
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
95
+ - if: $CI_MERGE_REQUEST_ID
96
+ needs: []
97
+ retry: &a1
98
+ max: 2
99
+ when:
100
+ - runner_system_failure
101
+ - stuck_or_timeout_failure
102
+ interruptible: true
103
+ allow_failure: true
104
+ www ๐Ÿ‘ฎ lint:
105
+ stage: test
106
+ image: path/to/docker/jobs-default:the-version
107
+ variables:
108
+ KUBERNETES_CPU_REQUEST: '0.45'
109
+ KUBERNETES_MEMORY_REQUEST: 1Gi
110
+ KUBERNETES_MEMORY_LIMIT: 4Gi
111
+ script:
112
+ - collapseable_section_start "injectvars" "Injecting variables"
113
+ - export APP_PATH="www"
114
+ - collapseable_section_end "injectvars"
115
+ - collapseable_section_start "nodeinstall" "Ensure node version"
116
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
117
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
118
+ - collapseable_section_end "nodeinstall"
119
+ - cd www
120
+ - collapseable_section_start "nodeinstall" "Ensure node version"
121
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
122
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
123
+ - collapseable_section_end "nodeinstall"
124
+ - collapseable_section_start "yarninstall" "Yarn install"
125
+ - yarn install --immutable
126
+ - collapseable_section_end "yarninstall"
127
+ - yarn lint
128
+ cache:
129
+ - key: www-yarn
130
+ policy: pull-push
131
+ paths:
132
+ - www/.yarn
133
+ - key: www-node-modules
134
+ policy: pull-push
135
+ paths:
136
+ - www/node_modules
137
+ rules:
138
+ - when: never
139
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
140
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
141
+ - if: $CI_MERGE_REQUEST_ID
142
+ needs: []
143
+ retry: *a1
144
+ interruptible: true
145
+ www ๐Ÿงช test:
146
+ stage: test
147
+ image: path/to/docker/jobs-testing-chrome:the-version
148
+ variables:
149
+ KUBERNETES_CPU_REQUEST: '0.45'
150
+ KUBERNETES_MEMORY_REQUEST: 1Gi
151
+ KUBERNETES_MEMORY_LIMIT: 4Gi
152
+ script:
153
+ - collapseable_section_start "injectvars" "Injecting variables"
154
+ - export APP_PATH="www"
155
+ - collapseable_section_end "injectvars"
156
+ - collapseable_section_start "nodeinstall" "Ensure node version"
157
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
158
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
159
+ - collapseable_section_end "nodeinstall"
160
+ - cd www
161
+ - collapseable_section_start "nodeinstall" "Ensure node version"
162
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
163
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
164
+ - collapseable_section_end "nodeinstall"
165
+ - collapseable_section_start "yarninstall" "Yarn install"
166
+ - yarn install --immutable
167
+ - collapseable_section_end "yarninstall"
168
+ - yarn test
169
+ cache:
170
+ - key: www-yarn
171
+ policy: pull-push
172
+ paths:
173
+ - www/.yarn
174
+ - key: www-node-modules
175
+ policy: pull-push
176
+ paths:
177
+ - www/node_modules
178
+ rules:
179
+ - when: never
180
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
181
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
182
+ - if: $CI_MERGE_REQUEST_ID
183
+ needs: []
184
+ retry: *a1
185
+ interruptible: true
186
+ 'www ๐Ÿ”จ app | dev ':
187
+ stage: build
188
+ image: path/to/docker/jobs-default:the-version
189
+ variables:
190
+ KUBERNETES_CPU_REQUEST: '0.45'
191
+ KUBERNETES_MEMORY_REQUEST: 1Gi
192
+ KUBERNETES_MEMORY_LIMIT: 4Gi
193
+ script:
194
+ - collapseable_section_start "injectvars" "Injecting variables"
195
+ - export ENV_SHORT="dev"
196
+ - export APP_DIR="www"
197
+ - export ENV_TYPE="dev"
198
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
199
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
200
+ - 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")"
201
+ - export HOSTNAME="$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
202
+ - export ROOT_URL="https://$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
203
+ - export HOSTNAME_INTERNAL="$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
204
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
205
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
206
+ - export DEPLOY_CLOUD_RUN_REGION="asia-east1"
207
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_dev_www_GCLOUD_DEPLOY_credentialsKey"
208
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix"
209
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
210
+ - collapseable_section_end "injectvars"
211
+ - collapseable_section_start "write-dotenv-www" "write dot env for www"
212
+ - |-
213
+ cat <<EOF > www/.env
214
+ ENV_SHORT=dev
215
+ APP_DIR=www
216
+ ENV_TYPE=dev
217
+ HOSTNAME=$(printf %s "$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
218
+ ROOT_URL=$(printf %s "https://$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
219
+ HOSTNAME_INTERNAL=$(printf %s "$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
220
+ ROOT_URL_INTERNAL=$(printf %s "https://$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
221
+ DEPLOY_CLOUD_RUN_PROJECT_ID=asdf
222
+ DEPLOY_CLOUD_RUN_REGION=asia-east1
223
+ GCLOUD_DEPLOY_credentialsKey=$(printf %s "$CL_dev_www_GCLOUD_DEPLOY_credentialsKey" | escapeForDotEnv)
224
+ GCLOUD_RUN_canonicalHostSuffix=$(printf %s "$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | escapeForDotEnv)
225
+ _ALL_ENV_VAR_KEYS=["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOSTNAME","ROOT_URL","HOSTNAME_INTERNAL","ROOT_URL_INTERNAL","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
226
+ EOF
227
+ - collapseable_section_end "write-dotenv-www"
228
+ - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > www/__build_info.json
229
+ - collapseable_section_start "nodeinstall" "Ensure node version"
230
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
231
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
232
+ - collapseable_section_end "nodeinstall"
233
+ - cd www
234
+ - collapseable_section_start "nodeinstall" "Ensure node version"
235
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
236
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
237
+ - collapseable_section_end "nodeinstall"
238
+ - collapseable_section_start "yarninstall" "Yarn install"
239
+ - yarn install --immutable
240
+ - collapseable_section_end "yarninstall"
241
+ - yarn build
242
+ cache:
243
+ - key: www-yarn
244
+ policy: pull-push
245
+ paths:
246
+ - www/.yarn
247
+ - key: www-node-modules
248
+ policy: pull-push
249
+ paths:
250
+ - www/node_modules
251
+ artifacts:
252
+ paths:
253
+ - www/__build_info.json
254
+ - www/.next
255
+ - www/dist
256
+ exclude:
257
+ - www/.env
258
+ expire_in: 1 day
259
+ when: always
260
+ reports: {}
261
+ rules:
262
+ - when: never
263
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
264
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
265
+ needs: []
266
+ retry: *a1
267
+ interruptible: true
268
+ 'www ๐Ÿ”จ docker | dev ':
269
+ stage: build
270
+ image: path/to/docker/docker-build:the-version
271
+ services:
272
+ - name: docker:24.0.6-dind
273
+ command:
274
+ - --tls=false
275
+ - --registry-mirror=https://mirror.gcr.io
276
+ variables:
277
+ DOCKER_HOST: tcp://0.0.0.0:2375
278
+ DOCKER_TLS_CERTDIR: ''
279
+ DOCKER_DRIVER: overlay2
280
+ DOCKER_BUILDKIT: '1'
281
+ KUBERNETES_CPU_REQUEST: '0.45'
282
+ KUBERNETES_MEMORY_REQUEST: 1Gi
283
+ KUBERNETES_MEMORY_LIMIT: 2Gi
284
+ script:
285
+ - collapseable_section_start "injectvars" "Injecting variables"
286
+ - export APP_DIR="www"
287
+ - export DOCKER_BUILD_CONTEXT="."
288
+ - export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
289
+ - export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/dev/www"
290
+ - export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/www"
291
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
292
+ - |-
293
+ export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
294
+ RUN yarn plugin import workspace-tools
295
+ RUN yarn workspaces focus --production && yarn rebuild"
296
+ - |-
297
+ export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node www/package.json /app/www/package.json
298
+ COPY --chown=node:node www/yarn.lock /app/www/yarn.lock
299
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
300
+ COPY --chown=node:node .yarn /app/.yarn"
301
+ - collapseable_section_end "injectvars"
302
+ - ensureNodeDockerfile
303
+ - collapseable_section_start "docker-login" "Docker Login"
304
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_dev_www_GCLOUD_DEPLOY_credentialsKey")
305
+ - gcloud auth configure-docker asia-east1-docker.pkg.dev
306
+ - collapseable_section_end "docker-login"
307
+ - collapseable_section_start "docker-build" "Docker build"
308
+ - 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
309
+ - collapseable_section_end "docker-build"
310
+ - collapseable_section_start "docker-push" "Docker push and tag"
311
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
312
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
313
+ - docker push $DOCKER_CACHE_IMAGE
314
+ - collapseable_section_end "docker-push"
315
+ cache:
316
+ - key: www-yarn
317
+ policy: pull
318
+ paths:
319
+ - www/.yarn
320
+ rules:
321
+ - when: never
322
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
323
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
324
+ needs:
325
+ - 'www ๐Ÿ”จ app | dev '
326
+ retry: *a1
327
+ interruptible: true
328
+ 'www ๐Ÿงพ sbom | dev ':
329
+ stage: build
330
+ image: aquasec/trivy:0.38.3
331
+ variables: {}
332
+ script:
333
+ - collapseable_section_start "injectvars" "Injecting variables"
334
+ - collapseable_section_end "injectvars"
335
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" www
336
+ artifacts:
337
+ paths:
338
+ - __sbom.json
339
+ rules:
340
+ - when: never
341
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
342
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
343
+ needs: []
344
+ retry: *a1
345
+ interruptible: true
346
+ allow_failure: true
347
+ 'www ๐Ÿš€ Deploy | dev ':
348
+ stage: deploy dev
349
+ image: path/to/docker/gcloud:the-version
350
+ variables:
351
+ KUBERNETES_CPU_REQUEST: '0.22'
352
+ KUBERNETES_MEMORY_REQUEST: 200Mi
353
+ KUBERNETES_MEMORY_LIMIT: 400Mi
354
+ script:
355
+ - collapseable_section_start "injectvars" "Injecting variables"
356
+ - export ENV_SHORT="dev"
357
+ - export APP_DIR="www"
358
+ - export ENV_TYPE="dev"
359
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
360
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
361
+ - 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")"
362
+ - export HOSTNAME="$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
363
+ - export ROOT_URL="https://$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
364
+ - export HOSTNAME_INTERNAL="$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
365
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
366
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
367
+ - export DEPLOY_CLOUD_RUN_REGION="asia-east1"
368
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_dev_www_GCLOUD_DEPLOY_credentialsKey"
369
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix"
370
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
371
+ - export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
372
+ - export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/dev/www"
373
+ - export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/www"
374
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
375
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
376
+ - collapseable_section_end "injectvars"
377
+ - collapseable_section_start "prepare" "Prepare..."
378
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_dev_www_GCLOUD_DEPLOY_credentialsKey")
379
+ - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe asdf --format="value(projectNumber)")
380
+ - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
381
+ - collapseable_section_end "prepare"
382
+ - collapseable_section_start "writeenvvars" "Write env vars to file"
383
+ - |
384
+ cat > ____envvars.yaml <<EOF
385
+ ENV_SHORT: |-
386
+ dev
387
+ APP_DIR: |-
388
+ www
389
+ ENV_TYPE: |-
390
+ dev
391
+ BUILD_INFO_BUILD_ID: |-
392
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed '1!s/^/ /')
393
+ BUILD_INFO_BUILD_TIME: |-
394
+ $(printf %s "$CI_JOB_STARTED_AT" | sed '1!s/^/ /')
395
+ BUILD_INFO_CURRENT_VERSION: |-
396
+ $(printf %s "$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")" | sed '1!s/^/ /')
397
+ HOSTNAME: |-
398
+ $(printf %s "$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
399
+ ROOT_URL: |-
400
+ $(printf %s "https://$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
401
+ HOSTNAME_INTERNAL: |-
402
+ $(printf %s "$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
403
+ ROOT_URL_INTERNAL: |-
404
+ $(printf %s "https://$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
405
+ DEPLOY_CLOUD_RUN_PROJECT_ID: |-
406
+ asdf
407
+ DEPLOY_CLOUD_RUN_REGION: |-
408
+ asia-east1
409
+ GCLOUD_RUN_canonicalHostSuffix: |-
410
+ $(printf %s "$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | sed '1!s/^/ /')
411
+ _ALL_ENV_VAR_KEYS: |-
412
+ ["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOSTNAME","ROOT_URL","HOSTNAME_INTERNAL","ROOT_URL_INTERNAL","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
413
+
414
+ EOF
415
+ - collapseable_section_end "writeenvvars"
416
+ - collapseable_section_start "deploy" "Deploy to cloud run"
417
+ - gcloud run deploy pan-test-app-dev-www --command="yarn,start" --image=asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/dev/www:$DOCKER_IMAGE_TAG --project=asdf --region=asia-east1 --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
418
+ - collapseable_section_end "deploy"
419
+ - collapseable_section_start "cleanup" "Cleanup"
420
+ - gcloud run revisions list --project=asdf --region=asia-east1 --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=asdf --region=asia-east1 --quiet $revisionname ; done
421
+ - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/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 asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/dev/www@$version --quiet --delete-tags; done
422
+ - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/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 asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/www@$version --quiet --delete-tags; done
423
+ - collapseable_section_end "cleanup"
424
+ - echo 'Uploading SBOM to Dependency Track'
425
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/www" "$ROOT_URL" "__sbom.json" vex.json || true
426
+ - echo "CL_GITLAB_ENVIRONMENT_URL=$ROOT_URL" >> gitlab_environment.env
427
+ environment:
428
+ name: dev/www
429
+ url: $CL_GITLAB_ENVIRONMENT_URL
430
+ on_stop: 'www ๐Ÿ›‘ Stop โš ๏ธ | dev '
431
+ auto_stop_in: 4 weeks
432
+ artifacts:
433
+ reports:
434
+ dotenv: gitlab_environment.env
435
+ rules:
436
+ - when: never
437
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
438
+ - when: on_success
439
+ if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
440
+ needs:
441
+ - job: www ๐Ÿ‘ฎ lint
442
+ artifacts: false
443
+ - job: 'www ๐Ÿ”จ app | dev '
444
+ artifacts: false
445
+ - job: 'www ๐Ÿ”จ docker | dev '
446
+ artifacts: false
447
+ - job: www ๐Ÿงช test
448
+ artifacts: false
449
+ - job: 'www ๐Ÿงพ sbom | dev '
450
+ artifacts: true
451
+ - job: www ๐Ÿ›ก audit
452
+ artifacts: false
453
+ retry: *a1
454
+ interruptible: true
455
+ allow_failure: false
456
+ 'www ๐Ÿ›‘ Stop โš ๏ธ | dev ':
457
+ stage: stop dev
458
+ image: path/to/docker/gcloud:the-version
459
+ variables:
460
+ KUBERNETES_CPU_REQUEST: '0.22'
461
+ KUBERNETES_MEMORY_REQUEST: 200Mi
462
+ KUBERNETES_MEMORY_LIMIT: 400Mi
463
+ GIT_STRATEGY: none
464
+ script:
465
+ - collapseable_section_start "injectvars" "Injecting variables"
466
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
467
+ - collapseable_section_end "injectvars"
468
+ - set +e
469
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_dev_www_GCLOUD_DEPLOY_credentialsKey")
470
+ - gcloud run services delete pan-test-app-dev-www --project=asdf --region=asia-east1
471
+ - gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/dev/www --quiet --delete-tags
472
+ - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/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 asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/www@$version --quiet --delete-tags; done
473
+ - echo 'Disabling component in Dependency Track'
474
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/www" "$CI_ENVIRONMENT_URL" || true
475
+ - set -e
476
+ - echo "CL_GITLAB_ENVIRONMENT_URL=$ROOT_URL" >> gitlab_environment.env
477
+ environment:
478
+ name: dev/www
479
+ action: stop
480
+ artifacts:
481
+ reports:
482
+ dotenv: gitlab_environment.env
483
+ rules:
484
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
485
+ when: on_success
486
+ - when: never
487
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
488
+ - when: manual
489
+ if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
490
+ needs: []
491
+ retry: *a1
492
+ interruptible: true
493
+ allow_failure: true
494
+ 'www e2e | dev ':
495
+ stage: verify
496
+ image: cypress/browsers
497
+ variables: {}
498
+ script:
499
+ - collapseable_section_start "injectvars" "Injecting variables"
500
+ - export ENV_SHORT="dev"
501
+ - export APP_DIR="www"
502
+ - export ENV_TYPE="dev"
503
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
504
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
505
+ - 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")"
506
+ - export HOSTNAME="$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
507
+ - export ROOT_URL="https://$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
508
+ - export HOSTNAME_INTERNAL="$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
509
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
510
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
511
+ - export DEPLOY_CLOUD_RUN_REGION="asia-east1"
512
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_dev_www_GCLOUD_DEPLOY_credentialsKey"
513
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix"
514
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
515
+ - export CYPRESS_CACHE_FOLDER="$CI_PROJECT_DIR/cache/cypress"
516
+ - collapseable_section_end "injectvars"
517
+ - yarn install --frozen-lockfile
518
+ - CYPRESS_BASE_URL=$CI_ENVIRONMENT_URL yarn cypress:run:ci
519
+ - echo "CL_GITLAB_ENVIRONMENT_URL=$ROOT_URL" >> gitlab_environment.env
520
+ cache:
521
+ key: cypress
522
+ policy: pull-push
523
+ paths:
524
+ - .yarn/cache
525
+ - node_modules/
526
+ - cache/cypress
527
+ environment:
528
+ name: dev/www
529
+ action: access
530
+ artifacts:
531
+ expire_in: 1 week
532
+ when: always
533
+ reports:
534
+ junit:
535
+ - cypress/results/report-*.xml
536
+ dotenv: gitlab_environment.env
537
+ paths:
538
+ - cypress/results
539
+ - cypress/screenshots
540
+ - cypress/videos
541
+ rules:
542
+ - when: never
543
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
544
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
545
+ needs:
546
+ - job: 'www ๐Ÿš€ Deploy | dev '
547
+ artifacts: false
548
+ retry: *a1
549
+ interruptible: true
550
+ 'www ๐Ÿ”จ app | review ':
551
+ stage: build
552
+ image: path/to/docker/jobs-default:the-version
553
+ variables:
554
+ KUBERNETES_CPU_REQUEST: '0.45'
555
+ KUBERNETES_MEMORY_REQUEST: 1Gi
556
+ KUBERNETES_MEMORY_LIMIT: 4Gi
557
+ script:
558
+ - collapseable_section_start "injectvars" "Injecting variables"
559
+ - export ENV_SHORT="review"
560
+ - export APP_DIR="www"
561
+ - export ENV_TYPE="review"
562
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
563
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
564
+ - 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")"
565
+ - export HOSTNAME="$(printf %s "pan-test-app-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)}')"
566
+ - 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)}')"
567
+ - export HOSTNAME_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)}')"
568
+ - 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)}')"
569
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
570
+ - export DEPLOY_CLOUD_RUN_REGION="asia-east1"
571
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_review_www_GCLOUD_DEPLOY_credentialsKey"
572
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_review_www_GCLOUD_RUN_canonicalHostSuffix"
573
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
574
+ - collapseable_section_end "injectvars"
575
+ - collapseable_section_start "write-dotenv-www" "write dot env for www"
576
+ - |-
577
+ cat <<EOF > www/.env
578
+ ENV_SHORT=review
579
+ APP_DIR=www
580
+ ENV_TYPE=review
581
+ HOSTNAME=$(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)}')" | escapeForDotEnv)
582
+ ROOT_URL=$(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)}')" | escapeForDotEnv)
583
+ HOSTNAME_INTERNAL=$(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)}')" | escapeForDotEnv)
584
+ ROOT_URL_INTERNAL=$(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)}')" | escapeForDotEnv)
585
+ DEPLOY_CLOUD_RUN_PROJECT_ID=asdf
586
+ DEPLOY_CLOUD_RUN_REGION=asia-east1
587
+ GCLOUD_DEPLOY_credentialsKey=$(printf %s "$CL_review_www_GCLOUD_DEPLOY_credentialsKey" | escapeForDotEnv)
588
+ GCLOUD_RUN_canonicalHostSuffix=$(printf %s "$CL_review_www_GCLOUD_RUN_canonicalHostSuffix" | escapeForDotEnv)
589
+ _ALL_ENV_VAR_KEYS=["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOSTNAME","ROOT_URL","HOSTNAME_INTERNAL","ROOT_URL_INTERNAL","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
590
+ EOF
591
+ - collapseable_section_end "write-dotenv-www"
592
+ - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > www/__build_info.json
593
+ - collapseable_section_start "nodeinstall" "Ensure node version"
594
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
595
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
596
+ - collapseable_section_end "nodeinstall"
597
+ - cd www
598
+ - collapseable_section_start "nodeinstall" "Ensure node version"
599
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
600
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
601
+ - collapseable_section_end "nodeinstall"
602
+ - collapseable_section_start "yarninstall" "Yarn install"
603
+ - yarn install --immutable
604
+ - collapseable_section_end "yarninstall"
605
+ - yarn build
606
+ cache:
607
+ - key: www-yarn
608
+ policy: pull-push
609
+ paths:
610
+ - www/.yarn
611
+ - key: www-node-modules
612
+ policy: pull-push
613
+ paths:
614
+ - www/node_modules
615
+ artifacts:
616
+ paths:
617
+ - www/__build_info.json
618
+ - www/.next
619
+ - www/dist
620
+ exclude:
621
+ - www/.env
622
+ expire_in: 1 day
623
+ when: always
624
+ reports: {}
625
+ rules:
626
+ - if: $CI_MERGE_REQUEST_ID
627
+ needs: []
628
+ retry: *a1
629
+ interruptible: true
630
+ 'www ๐Ÿ”จ docker | review ':
631
+ stage: build
632
+ image: path/to/docker/docker-build:the-version
633
+ services:
634
+ - name: docker:24.0.6-dind
635
+ command:
636
+ - --tls=false
637
+ - --registry-mirror=https://mirror.gcr.io
638
+ variables:
639
+ DOCKER_HOST: tcp://0.0.0.0:2375
640
+ DOCKER_TLS_CERTDIR: ''
641
+ DOCKER_DRIVER: overlay2
642
+ DOCKER_BUILDKIT: '1'
643
+ KUBERNETES_CPU_REQUEST: '0.45'
644
+ KUBERNETES_MEMORY_REQUEST: 1Gi
645
+ KUBERNETES_MEMORY_LIMIT: 2Gi
646
+ script:
647
+ - collapseable_section_start "injectvars" "Injecting variables"
648
+ - export APP_DIR="www"
649
+ - export DOCKER_BUILD_CONTEXT="."
650
+ - export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
651
+ - export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/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"; })"
652
+ - export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/www"
653
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
654
+ - |-
655
+ export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
656
+ RUN yarn plugin import workspace-tools
657
+ RUN yarn workspaces focus --production && yarn rebuild"
658
+ - |-
659
+ export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node www/package.json /app/www/package.json
660
+ COPY --chown=node:node www/yarn.lock /app/www/yarn.lock
661
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
662
+ COPY --chown=node:node .yarn /app/.yarn"
663
+ - collapseable_section_end "injectvars"
664
+ - ensureNodeDockerfile
665
+ - collapseable_section_start "docker-login" "Docker Login"
666
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_review_www_GCLOUD_DEPLOY_credentialsKey")
667
+ - gcloud auth configure-docker asia-east1-docker.pkg.dev
668
+ - collapseable_section_end "docker-login"
669
+ - collapseable_section_start "docker-build" "Docker build"
670
+ - 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
671
+ - collapseable_section_end "docker-build"
672
+ - collapseable_section_start "docker-push" "Docker push and tag"
673
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
674
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
675
+ - docker push $DOCKER_CACHE_IMAGE
676
+ - collapseable_section_end "docker-push"
677
+ cache:
678
+ - key: www-yarn
679
+ policy: pull
680
+ paths:
681
+ - www/.yarn
682
+ rules:
683
+ - if: $CI_MERGE_REQUEST_ID
684
+ needs:
685
+ - 'www ๐Ÿ”จ app | review '
686
+ retry: *a1
687
+ interruptible: true
688
+ 'www ๐Ÿงพ sbom | review ':
689
+ stage: build
690
+ image: aquasec/trivy:0.38.3
691
+ variables: {}
692
+ script:
693
+ - collapseable_section_start "injectvars" "Injecting variables"
694
+ - collapseable_section_end "injectvars"
695
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" www
696
+ artifacts:
697
+ paths:
698
+ - __sbom.json
699
+ rules:
700
+ - if: $CI_MERGE_REQUEST_ID
701
+ needs: []
702
+ retry: *a1
703
+ interruptible: true
704
+ allow_failure: true
705
+ 'www ๐Ÿš€ Deploy | review ':
706
+ stage: deploy review
707
+ image: path/to/docker/gcloud:the-version
708
+ variables:
709
+ KUBERNETES_CPU_REQUEST: '0.22'
710
+ KUBERNETES_MEMORY_REQUEST: 200Mi
711
+ KUBERNETES_MEMORY_LIMIT: 400Mi
712
+ script:
713
+ - collapseable_section_start "injectvars" "Injecting variables"
714
+ - export ENV_SHORT="review"
715
+ - export APP_DIR="www"
716
+ - export ENV_TYPE="review"
717
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
718
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
719
+ - 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")"
720
+ - export HOSTNAME="$(printf %s "pan-test-app-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)}')"
721
+ - 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)}')"
722
+ - export HOSTNAME_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)}')"
723
+ - 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)}')"
724
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
725
+ - export DEPLOY_CLOUD_RUN_REGION="asia-east1"
726
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_review_www_GCLOUD_DEPLOY_credentialsKey"
727
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_review_www_GCLOUD_RUN_canonicalHostSuffix"
728
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
729
+ - export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
730
+ - export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/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"; })"
731
+ - export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/www"
732
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
733
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
734
+ - collapseable_section_end "injectvars"
735
+ - collapseable_section_start "prepare" "Prepare..."
736
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_review_www_GCLOUD_DEPLOY_credentialsKey")
737
+ - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe asdf --format="value(projectNumber)")
738
+ - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
739
+ - collapseable_section_end "prepare"
740
+ - collapseable_section_start "writeenvvars" "Write env vars to file"
741
+ - |
742
+ cat > ____envvars.yaml <<EOF
743
+ ENV_SHORT: |-
744
+ review
745
+ APP_DIR: |-
746
+ www
747
+ ENV_TYPE: |-
748
+ review
749
+ BUILD_INFO_BUILD_ID: |-
750
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed '1!s/^/ /')
751
+ BUILD_INFO_BUILD_TIME: |-
752
+ $(printf %s "$CI_JOB_STARTED_AT" | sed '1!s/^/ /')
753
+ BUILD_INFO_CURRENT_VERSION: |-
754
+ $(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 '1!s/^/ /')
755
+ HOSTNAME: |-
756
+ $(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 '1!s/^/ /')
757
+ ROOT_URL: |-
758
+ $(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 '1!s/^/ /')
759
+ HOSTNAME_INTERNAL: |-
760
+ $(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 '1!s/^/ /')
761
+ ROOT_URL_INTERNAL: |-
762
+ $(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 '1!s/^/ /')
763
+ DEPLOY_CLOUD_RUN_PROJECT_ID: |-
764
+ asdf
765
+ DEPLOY_CLOUD_RUN_REGION: |-
766
+ asia-east1
767
+ GCLOUD_RUN_canonicalHostSuffix: |-
768
+ $(printf %s "$CL_review_www_GCLOUD_RUN_canonicalHostSuffix" | sed '1!s/^/ /')
769
+ _ALL_ENV_VAR_KEYS: |-
770
+ ["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOSTNAME","ROOT_URL","HOSTNAME_INTERNAL","ROOT_URL_INTERNAL","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
771
+
772
+ EOF
773
+ - collapseable_section_end "writeenvvars"
774
+ - collapseable_section_start "deploy" "Deploy to cloud run"
775
+ - 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=asia-east1-docker.pkg.dev/asdf/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=asdf --region=asia-east1 --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
776
+ - collapseable_section_end "deploy"
777
+ - collapseable_section_start "cleanup" "Cleanup"
778
+ - gcloud run revisions list --project=asdf --region=asia-east1 --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=asdf --region=asia-east1 --quiet $revisionname ; done
779
+ - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/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 asia-east1-docker.pkg.dev/asdf/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
780
+ - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/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 asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/www@$version --quiet --delete-tags; done
781
+ - set +e
782
+ - gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/www --quiet --delete-tags
783
+ - set -e
784
+ - collapseable_section_end "cleanup"
785
+ - echo 'Uploading SBOM to Dependency Track'
786
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/www" "$ROOT_URL" "__sbom.json" vex.json || true
787
+ - echo "CL_GITLAB_ENVIRONMENT_URL=$ROOT_URL" >> gitlab_environment.env
788
+ environment:
789
+ name: review/$CI_COMMIT_REF_NAME/www
790
+ url: $CL_GITLAB_ENVIRONMENT_URL
791
+ on_stop: 'www ๐Ÿ›‘ Stop โš ๏ธ | review '
792
+ auto_stop_in: 1 week
793
+ artifacts:
794
+ reports:
795
+ dotenv: gitlab_environment.env
796
+ rules:
797
+ - when: on_success
798
+ if: $CI_MERGE_REQUEST_ID
799
+ needs:
800
+ - job: www ๐Ÿ‘ฎ lint
801
+ artifacts: false
802
+ - job: 'www ๐Ÿ”จ app | review '
803
+ artifacts: false
804
+ - job: 'www ๐Ÿ”จ docker | review '
805
+ artifacts: false
806
+ - job: www ๐Ÿงช test
807
+ artifacts: false
808
+ - job: 'www ๐Ÿงพ sbom | review '
809
+ artifacts: true
810
+ - job: www ๐Ÿ›ก audit
811
+ artifacts: false
812
+ retry: *a1
813
+ interruptible: true
814
+ allow_failure: false
815
+ 'www ๐Ÿ›‘ Stop โš ๏ธ | review ':
816
+ stage: stop review
817
+ image: path/to/docker/gcloud:the-version
818
+ variables:
819
+ KUBERNETES_CPU_REQUEST: '0.22'
820
+ KUBERNETES_MEMORY_REQUEST: 200Mi
821
+ KUBERNETES_MEMORY_LIMIT: 400Mi
822
+ GIT_STRATEGY: none
823
+ script:
824
+ - collapseable_section_start "injectvars" "Injecting variables"
825
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
826
+ - collapseable_section_end "injectvars"
827
+ - set +e
828
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_review_www_GCLOUD_DEPLOY_credentialsKey")
829
+ - 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=asdf --region=asia-east1
830
+ - gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/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
831
+ - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/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 asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/www@$version --quiet --delete-tags; done
832
+ - set +e
833
+ - gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/www --quiet --delete-tags
834
+ - set -e
835
+ - echo 'Disabling component in Dependency Track'
836
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/www" "$CI_ENVIRONMENT_URL" || true
837
+ - set -e
838
+ - echo "CL_GITLAB_ENVIRONMENT_URL=$ROOT_URL" >> gitlab_environment.env
839
+ environment:
840
+ name: review/$CI_COMMIT_REF_NAME/www
841
+ action: stop
842
+ artifacts:
843
+ reports:
844
+ dotenv: gitlab_environment.env
845
+ rules:
846
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
847
+ when: on_success
848
+ - when: manual
849
+ if: $CI_MERGE_REQUEST_ID
850
+ needs: []
851
+ retry: *a1
852
+ interruptible: true
853
+ allow_failure: true
854
+ 'www e2e | review ':
855
+ stage: verify
856
+ image: cypress/browsers
857
+ variables: {}
858
+ script:
859
+ - collapseable_section_start "injectvars" "Injecting variables"
860
+ - export ENV_SHORT="review"
861
+ - export APP_DIR="www"
862
+ - export ENV_TYPE="review"
863
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
864
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
865
+ - 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")"
866
+ - export HOSTNAME="$(printf %s "pan-test-app-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)}')"
867
+ - 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)}')"
868
+ - export HOSTNAME_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)}')"
869
+ - 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)}')"
870
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
871
+ - export DEPLOY_CLOUD_RUN_REGION="asia-east1"
872
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_review_www_GCLOUD_DEPLOY_credentialsKey"
873
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_review_www_GCLOUD_RUN_canonicalHostSuffix"
874
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
875
+ - export CYPRESS_CACHE_FOLDER="$CI_PROJECT_DIR/cache/cypress"
876
+ - collapseable_section_end "injectvars"
877
+ - yarn install --frozen-lockfile
878
+ - CYPRESS_BASE_URL=$CI_ENVIRONMENT_URL yarn cypress:run:ci
879
+ - echo "CL_GITLAB_ENVIRONMENT_URL=$ROOT_URL" >> gitlab_environment.env
880
+ cache:
881
+ key: cypress
882
+ policy: pull-push
883
+ paths:
884
+ - .yarn/cache
885
+ - node_modules/
886
+ - cache/cypress
887
+ environment:
888
+ name: review/$CI_COMMIT_REF_NAME/www
889
+ action: access
890
+ artifacts:
891
+ expire_in: 1 week
892
+ when: always
893
+ reports:
894
+ junit:
895
+ - cypress/results/report-*.xml
896
+ dotenv: gitlab_environment.env
897
+ paths:
898
+ - cypress/results
899
+ - cypress/screenshots
900
+ - cypress/videos
901
+ rules:
902
+ - if: $CI_MERGE_REQUEST_ID
903
+ needs:
904
+ - job: 'www ๐Ÿš€ Deploy | review '
905
+ artifacts: false
906
+ retry: *a1
907
+ interruptible: true
908
+ 'www ๐Ÿ”จ app | stage ':
909
+ stage: build
910
+ image: path/to/docker/jobs-default:the-version
911
+ variables:
912
+ KUBERNETES_CPU_REQUEST: '0.45'
913
+ KUBERNETES_MEMORY_REQUEST: 1Gi
914
+ KUBERNETES_MEMORY_LIMIT: 4Gi
915
+ script:
916
+ - collapseable_section_start "injectvars" "Injecting variables"
917
+ - export ENV_SHORT="stage"
918
+ - export APP_DIR="www"
919
+ - export ENV_TYPE="stage"
920
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
921
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
922
+ - 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")"
923
+ - export HOSTNAME="$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
924
+ - export ROOT_URL="https://$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
925
+ - export HOSTNAME_INTERNAL="$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
926
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
927
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
928
+ - export DEPLOY_CLOUD_RUN_REGION="asia-east1"
929
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_stage_www_GCLOUD_DEPLOY_credentialsKey"
930
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix"
931
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
932
+ - collapseable_section_end "injectvars"
933
+ - collapseable_section_start "write-dotenv-www" "write dot env for www"
934
+ - |-
935
+ cat <<EOF > www/.env
936
+ ENV_SHORT=stage
937
+ APP_DIR=www
938
+ ENV_TYPE=stage
939
+ HOSTNAME=$(printf %s "$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
940
+ ROOT_URL=$(printf %s "https://$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
941
+ HOSTNAME_INTERNAL=$(printf %s "$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
942
+ ROOT_URL_INTERNAL=$(printf %s "https://$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
943
+ DEPLOY_CLOUD_RUN_PROJECT_ID=asdf
944
+ DEPLOY_CLOUD_RUN_REGION=asia-east1
945
+ GCLOUD_DEPLOY_credentialsKey=$(printf %s "$CL_stage_www_GCLOUD_DEPLOY_credentialsKey" | escapeForDotEnv)
946
+ GCLOUD_RUN_canonicalHostSuffix=$(printf %s "$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | escapeForDotEnv)
947
+ _ALL_ENV_VAR_KEYS=["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOSTNAME","ROOT_URL","HOSTNAME_INTERNAL","ROOT_URL_INTERNAL","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
948
+ EOF
949
+ - collapseable_section_end "write-dotenv-www"
950
+ - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > www/__build_info.json
951
+ - collapseable_section_start "nodeinstall" "Ensure node version"
952
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
953
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
954
+ - collapseable_section_end "nodeinstall"
955
+ - cd www
956
+ - collapseable_section_start "nodeinstall" "Ensure node version"
957
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
958
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
959
+ - collapseable_section_end "nodeinstall"
960
+ - collapseable_section_start "yarninstall" "Yarn install"
961
+ - yarn install --immutable
962
+ - collapseable_section_end "yarninstall"
963
+ - yarn build
964
+ cache:
965
+ - key: www-yarn
966
+ policy: pull-push
967
+ paths:
968
+ - www/.yarn
969
+ - key: www-node-modules
970
+ policy: pull-push
971
+ paths:
972
+ - www/node_modules
973
+ artifacts:
974
+ paths:
975
+ - www/__build_info.json
976
+ - www/.next
977
+ - www/dist
978
+ exclude:
979
+ - www/.env
980
+ expire_in: 1 day
981
+ when: always
982
+ reports: {}
983
+ rules:
984
+ - if: $CI_COMMIT_TAG
985
+ needs: []
986
+ retry: *a1
987
+ interruptible: true
988
+ 'www ๐Ÿ”จ docker | stage ':
989
+ stage: build
990
+ image: path/to/docker/docker-build:the-version
991
+ services:
992
+ - name: docker:24.0.6-dind
993
+ command:
994
+ - --tls=false
995
+ - --registry-mirror=https://mirror.gcr.io
996
+ variables:
997
+ DOCKER_HOST: tcp://0.0.0.0:2375
998
+ DOCKER_TLS_CERTDIR: ''
999
+ DOCKER_DRIVER: overlay2
1000
+ DOCKER_BUILDKIT: '1'
1001
+ KUBERNETES_CPU_REQUEST: '0.45'
1002
+ KUBERNETES_MEMORY_REQUEST: 1Gi
1003
+ KUBERNETES_MEMORY_LIMIT: 2Gi
1004
+ script:
1005
+ - collapseable_section_start "injectvars" "Injecting variables"
1006
+ - export APP_DIR="www"
1007
+ - export DOCKER_BUILD_CONTEXT="."
1008
+ - export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
1009
+ - export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/stage/www"
1010
+ - export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/www"
1011
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
1012
+ - |-
1013
+ export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
1014
+ RUN yarn plugin import workspace-tools
1015
+ RUN yarn workspaces focus --production && yarn rebuild"
1016
+ - |-
1017
+ export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node www/package.json /app/www/package.json
1018
+ COPY --chown=node:node www/yarn.lock /app/www/yarn.lock
1019
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
1020
+ COPY --chown=node:node .yarn /app/.yarn"
1021
+ - collapseable_section_end "injectvars"
1022
+ - ensureNodeDockerfile
1023
+ - collapseable_section_start "docker-login" "Docker Login"
1024
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_stage_www_GCLOUD_DEPLOY_credentialsKey")
1025
+ - gcloud auth configure-docker asia-east1-docker.pkg.dev
1026
+ - collapseable_section_end "docker-login"
1027
+ - collapseable_section_start "docker-build" "Docker build"
1028
+ - 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
1029
+ - collapseable_section_end "docker-build"
1030
+ - collapseable_section_start "docker-push" "Docker push and tag"
1031
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
1032
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
1033
+ - docker push $DOCKER_CACHE_IMAGE
1034
+ - collapseable_section_end "docker-push"
1035
+ cache:
1036
+ - key: www-yarn
1037
+ policy: pull
1038
+ paths:
1039
+ - www/.yarn
1040
+ rules:
1041
+ - if: $CI_COMMIT_TAG
1042
+ needs:
1043
+ - 'www ๐Ÿ”จ app | stage '
1044
+ retry: *a1
1045
+ interruptible: true
1046
+ 'www ๐Ÿงพ sbom | stage ':
1047
+ stage: build
1048
+ image: aquasec/trivy:0.38.3
1049
+ variables: {}
1050
+ script:
1051
+ - collapseable_section_start "injectvars" "Injecting variables"
1052
+ - collapseable_section_end "injectvars"
1053
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" www
1054
+ artifacts:
1055
+ paths:
1056
+ - __sbom.json
1057
+ rules:
1058
+ - if: $CI_COMMIT_TAG
1059
+ needs: []
1060
+ retry: *a1
1061
+ interruptible: true
1062
+ allow_failure: true
1063
+ 'www ๐Ÿš€ Deploy | stage ':
1064
+ stage: deploy stage
1065
+ image: path/to/docker/gcloud:the-version
1066
+ variables:
1067
+ KUBERNETES_CPU_REQUEST: '0.22'
1068
+ KUBERNETES_MEMORY_REQUEST: 200Mi
1069
+ KUBERNETES_MEMORY_LIMIT: 400Mi
1070
+ script:
1071
+ - collapseable_section_start "injectvars" "Injecting variables"
1072
+ - export ENV_SHORT="stage"
1073
+ - export APP_DIR="www"
1074
+ - export ENV_TYPE="stage"
1075
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1076
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1077
+ - 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")"
1078
+ - export HOSTNAME="$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1079
+ - export ROOT_URL="https://$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1080
+ - export HOSTNAME_INTERNAL="$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1081
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1082
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
1083
+ - export DEPLOY_CLOUD_RUN_REGION="asia-east1"
1084
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_stage_www_GCLOUD_DEPLOY_credentialsKey"
1085
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix"
1086
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
1087
+ - export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
1088
+ - export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/stage/www"
1089
+ - export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/www"
1090
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
1091
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
1092
+ - collapseable_section_end "injectvars"
1093
+ - collapseable_section_start "prepare" "Prepare..."
1094
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_stage_www_GCLOUD_DEPLOY_credentialsKey")
1095
+ - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe asdf --format="value(projectNumber)")
1096
+ - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
1097
+ - collapseable_section_end "prepare"
1098
+ - collapseable_section_start "writeenvvars" "Write env vars to file"
1099
+ - |
1100
+ cat > ____envvars.yaml <<EOF
1101
+ ENV_SHORT: |-
1102
+ stage
1103
+ APP_DIR: |-
1104
+ www
1105
+ ENV_TYPE: |-
1106
+ stage
1107
+ BUILD_INFO_BUILD_ID: |-
1108
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed '1!s/^/ /')
1109
+ BUILD_INFO_BUILD_TIME: |-
1110
+ $(printf %s "$CI_JOB_STARTED_AT" | sed '1!s/^/ /')
1111
+ BUILD_INFO_CURRENT_VERSION: |-
1112
+ $(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 '1!s/^/ /')
1113
+ HOSTNAME: |-
1114
+ $(printf %s "$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
1115
+ ROOT_URL: |-
1116
+ $(printf %s "https://$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
1117
+ HOSTNAME_INTERNAL: |-
1118
+ $(printf %s "$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
1119
+ ROOT_URL_INTERNAL: |-
1120
+ $(printf %s "https://$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
1121
+ DEPLOY_CLOUD_RUN_PROJECT_ID: |-
1122
+ asdf
1123
+ DEPLOY_CLOUD_RUN_REGION: |-
1124
+ asia-east1
1125
+ GCLOUD_RUN_canonicalHostSuffix: |-
1126
+ $(printf %s "$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | sed '1!s/^/ /')
1127
+ _ALL_ENV_VAR_KEYS: |-
1128
+ ["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOSTNAME","ROOT_URL","HOSTNAME_INTERNAL","ROOT_URL_INTERNAL","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
1129
+
1130
+ EOF
1131
+ - collapseable_section_end "writeenvvars"
1132
+ - collapseable_section_start "deploy" "Deploy to cloud run"
1133
+ - gcloud run deploy pan-test-app-stage-www --command="yarn,start" --image=asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/stage/www:$DOCKER_IMAGE_TAG --project=asdf --region=asia-east1 --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
1134
+ - collapseable_section_end "deploy"
1135
+ - collapseable_section_start "cleanup" "Cleanup"
1136
+ - gcloud run revisions list --project=asdf --region=asia-east1 --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=asdf --region=asia-east1 --quiet $revisionname ; done
1137
+ - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/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 asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/stage/www@$version --quiet --delete-tags; done
1138
+ - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/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 asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/www@$version --quiet --delete-tags; done
1139
+ - collapseable_section_end "cleanup"
1140
+ - echo 'Uploading SBOM to Dependency Track'
1141
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/www" "$ROOT_URL" "__sbom.json" vex.json || true
1142
+ - echo "CL_GITLAB_ENVIRONMENT_URL=$ROOT_URL" >> gitlab_environment.env
1143
+ environment:
1144
+ name: stage/www
1145
+ url: $CL_GITLAB_ENVIRONMENT_URL
1146
+ on_stop: 'www ๐Ÿ›‘ Stop โš ๏ธ | stage '
1147
+ artifacts:
1148
+ reports:
1149
+ dotenv: gitlab_environment.env
1150
+ rules:
1151
+ - when: on_success
1152
+ if: $CI_COMMIT_TAG
1153
+ needs:
1154
+ - job: 'www ๐Ÿ”จ app | stage '
1155
+ artifacts: false
1156
+ - job: 'www ๐Ÿ”จ docker | stage '
1157
+ artifacts: false
1158
+ - job: 'www ๐Ÿงพ sbom | stage '
1159
+ artifacts: true
1160
+ retry: *a1
1161
+ interruptible: true
1162
+ allow_failure: false
1163
+ 'www ๐Ÿ›‘ Stop โš ๏ธ | stage ':
1164
+ stage: stop stage
1165
+ image: path/to/docker/gcloud:the-version
1166
+ variables:
1167
+ KUBERNETES_CPU_REQUEST: '0.22'
1168
+ KUBERNETES_MEMORY_REQUEST: 200Mi
1169
+ KUBERNETES_MEMORY_LIMIT: 400Mi
1170
+ GIT_STRATEGY: none
1171
+ script:
1172
+ - collapseable_section_start "injectvars" "Injecting variables"
1173
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
1174
+ - collapseable_section_end "injectvars"
1175
+ - set +e
1176
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_stage_www_GCLOUD_DEPLOY_credentialsKey")
1177
+ - gcloud run services delete pan-test-app-stage-www --project=asdf --region=asia-east1
1178
+ - gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/stage/www --quiet --delete-tags
1179
+ - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/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 asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/www@$version --quiet --delete-tags; done
1180
+ - echo 'Disabling component in Dependency Track'
1181
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/www" "$CI_ENVIRONMENT_URL" || true
1182
+ - set -e
1183
+ - echo "CL_GITLAB_ENVIRONMENT_URL=$ROOT_URL" >> gitlab_environment.env
1184
+ environment:
1185
+ name: stage/www
1186
+ action: stop
1187
+ artifacts:
1188
+ reports:
1189
+ dotenv: gitlab_environment.env
1190
+ rules:
1191
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
1192
+ when: on_success
1193
+ - when: manual
1194
+ if: $CI_COMMIT_TAG
1195
+ needs: []
1196
+ retry: *a1
1197
+ interruptible: true
1198
+ allow_failure: true
1199
+ 'www e2e | stage ':
1200
+ stage: verify
1201
+ image: cypress/browsers
1202
+ variables: {}
1203
+ script:
1204
+ - collapseable_section_start "injectvars" "Injecting variables"
1205
+ - export ENV_SHORT="stage"
1206
+ - export APP_DIR="www"
1207
+ - export ENV_TYPE="stage"
1208
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1209
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1210
+ - 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")"
1211
+ - export HOSTNAME="$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1212
+ - export ROOT_URL="https://$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1213
+ - export HOSTNAME_INTERNAL="$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1214
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1215
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
1216
+ - export DEPLOY_CLOUD_RUN_REGION="asia-east1"
1217
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_stage_www_GCLOUD_DEPLOY_credentialsKey"
1218
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix"
1219
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
1220
+ - export CYPRESS_CACHE_FOLDER="$CI_PROJECT_DIR/cache/cypress"
1221
+ - collapseable_section_end "injectvars"
1222
+ - yarn install --frozen-lockfile
1223
+ - CYPRESS_BASE_URL=$CI_ENVIRONMENT_URL yarn cypress:run:ci
1224
+ - echo "CL_GITLAB_ENVIRONMENT_URL=$ROOT_URL" >> gitlab_environment.env
1225
+ cache:
1226
+ key: cypress
1227
+ policy: pull-push
1228
+ paths:
1229
+ - .yarn/cache
1230
+ - node_modules/
1231
+ - cache/cypress
1232
+ environment:
1233
+ name: stage/www
1234
+ action: access
1235
+ artifacts:
1236
+ expire_in: 1 week
1237
+ when: always
1238
+ reports:
1239
+ junit:
1240
+ - cypress/results/report-*.xml
1241
+ dotenv: gitlab_environment.env
1242
+ paths:
1243
+ - cypress/results
1244
+ - cypress/screenshots
1245
+ - cypress/videos
1246
+ rules:
1247
+ - if: $CI_COMMIT_TAG
1248
+ needs:
1249
+ - job: 'www ๐Ÿš€ Deploy | stage '
1250
+ artifacts: false
1251
+ retry: *a1
1252
+ interruptible: true
1253
+ 'www ๐Ÿ”จ app | prod ':
1254
+ stage: build
1255
+ image: path/to/docker/jobs-default:the-version
1256
+ variables:
1257
+ KUBERNETES_CPU_REQUEST: '0.45'
1258
+ KUBERNETES_MEMORY_REQUEST: 1Gi
1259
+ KUBERNETES_MEMORY_LIMIT: 4Gi
1260
+ script:
1261
+ - collapseable_section_start "injectvars" "Injecting variables"
1262
+ - export ENV_SHORT="prod"
1263
+ - export APP_DIR="www"
1264
+ - export ENV_TYPE="prod"
1265
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1266
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1267
+ - 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")"
1268
+ - export HOSTNAME="$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1269
+ - export ROOT_URL="https://$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1270
+ - export HOSTNAME_INTERNAL="$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1271
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1272
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
1273
+ - export DEPLOY_CLOUD_RUN_REGION="asia-east1"
1274
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_prod_www_GCLOUD_DEPLOY_credentialsKey"
1275
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix"
1276
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
1277
+ - collapseable_section_end "injectvars"
1278
+ - collapseable_section_start "write-dotenv-www" "write dot env for www"
1279
+ - |-
1280
+ cat <<EOF > www/.env
1281
+ ENV_SHORT=prod
1282
+ APP_DIR=www
1283
+ ENV_TYPE=prod
1284
+ HOSTNAME=$(printf %s "$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
1285
+ ROOT_URL=$(printf %s "https://$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
1286
+ HOSTNAME_INTERNAL=$(printf %s "$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
1287
+ ROOT_URL_INTERNAL=$(printf %s "https://$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
1288
+ DEPLOY_CLOUD_RUN_PROJECT_ID=asdf
1289
+ DEPLOY_CLOUD_RUN_REGION=asia-east1
1290
+ GCLOUD_DEPLOY_credentialsKey=$(printf %s "$CL_prod_www_GCLOUD_DEPLOY_credentialsKey" | escapeForDotEnv)
1291
+ GCLOUD_RUN_canonicalHostSuffix=$(printf %s "$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | escapeForDotEnv)
1292
+ _ALL_ENV_VAR_KEYS=["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOSTNAME","ROOT_URL","HOSTNAME_INTERNAL","ROOT_URL_INTERNAL","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
1293
+ EOF
1294
+ - collapseable_section_end "write-dotenv-www"
1295
+ - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > www/__build_info.json
1296
+ - collapseable_section_start "nodeinstall" "Ensure node version"
1297
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1298
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1299
+ - collapseable_section_end "nodeinstall"
1300
+ - cd www
1301
+ - collapseable_section_start "nodeinstall" "Ensure node version"
1302
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1303
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1304
+ - collapseable_section_end "nodeinstall"
1305
+ - collapseable_section_start "yarninstall" "Yarn install"
1306
+ - yarn install --immutable
1307
+ - collapseable_section_end "yarninstall"
1308
+ - yarn build
1309
+ cache:
1310
+ - key: www-yarn
1311
+ policy: pull-push
1312
+ paths:
1313
+ - www/.yarn
1314
+ - key: www-node-modules
1315
+ policy: pull-push
1316
+ paths:
1317
+ - www/node_modules
1318
+ artifacts:
1319
+ paths:
1320
+ - www/__build_info.json
1321
+ - www/.next
1322
+ - www/dist
1323
+ exclude:
1324
+ - www/.env
1325
+ expire_in: 1 day
1326
+ when: always
1327
+ reports: {}
1328
+ rules:
1329
+ - if: $CI_COMMIT_TAG
1330
+ needs: []
1331
+ retry: *a1
1332
+ interruptible: true
1333
+ 'www ๐Ÿ”จ docker | prod ':
1334
+ stage: build
1335
+ image: path/to/docker/docker-build:the-version
1336
+ services:
1337
+ - name: docker:24.0.6-dind
1338
+ command:
1339
+ - --tls=false
1340
+ - --registry-mirror=https://mirror.gcr.io
1341
+ variables:
1342
+ DOCKER_HOST: tcp://0.0.0.0:2375
1343
+ DOCKER_TLS_CERTDIR: ''
1344
+ DOCKER_DRIVER: overlay2
1345
+ DOCKER_BUILDKIT: '1'
1346
+ KUBERNETES_CPU_REQUEST: '0.45'
1347
+ KUBERNETES_MEMORY_REQUEST: 1Gi
1348
+ KUBERNETES_MEMORY_LIMIT: 2Gi
1349
+ script:
1350
+ - collapseable_section_start "injectvars" "Injecting variables"
1351
+ - export APP_DIR="www"
1352
+ - export DOCKER_BUILD_CONTEXT="."
1353
+ - export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
1354
+ - export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/prod/www"
1355
+ - export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/www"
1356
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
1357
+ - |-
1358
+ export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
1359
+ RUN yarn plugin import workspace-tools
1360
+ RUN yarn workspaces focus --production && yarn rebuild"
1361
+ - |-
1362
+ export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node www/package.json /app/www/package.json
1363
+ COPY --chown=node:node www/yarn.lock /app/www/yarn.lock
1364
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
1365
+ COPY --chown=node:node .yarn /app/.yarn"
1366
+ - collapseable_section_end "injectvars"
1367
+ - ensureNodeDockerfile
1368
+ - collapseable_section_start "docker-login" "Docker Login"
1369
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_prod_www_GCLOUD_DEPLOY_credentialsKey")
1370
+ - gcloud auth configure-docker asia-east1-docker.pkg.dev
1371
+ - collapseable_section_end "docker-login"
1372
+ - collapseable_section_start "docker-build" "Docker build"
1373
+ - 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
1374
+ - collapseable_section_end "docker-build"
1375
+ - collapseable_section_start "docker-push" "Docker push and tag"
1376
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
1377
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
1378
+ - docker push $DOCKER_CACHE_IMAGE
1379
+ - collapseable_section_end "docker-push"
1380
+ cache:
1381
+ - key: www-yarn
1382
+ policy: pull
1383
+ paths:
1384
+ - www/.yarn
1385
+ rules:
1386
+ - if: $CI_COMMIT_TAG
1387
+ needs:
1388
+ - 'www ๐Ÿ”จ app | prod '
1389
+ retry: *a1
1390
+ interruptible: true
1391
+ 'www ๐Ÿงพ sbom | prod ':
1392
+ stage: build
1393
+ image: aquasec/trivy:0.38.3
1394
+ variables: {}
1395
+ script:
1396
+ - collapseable_section_start "injectvars" "Injecting variables"
1397
+ - collapseable_section_end "injectvars"
1398
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" www
1399
+ artifacts:
1400
+ paths:
1401
+ - __sbom.json
1402
+ rules:
1403
+ - if: $CI_COMMIT_TAG
1404
+ needs: []
1405
+ retry: *a1
1406
+ interruptible: true
1407
+ allow_failure: true
1408
+ 'www ๐Ÿš€ Deploy | prod ':
1409
+ stage: deploy prod
1410
+ image: path/to/docker/gcloud:the-version
1411
+ variables:
1412
+ KUBERNETES_CPU_REQUEST: '0.22'
1413
+ KUBERNETES_MEMORY_REQUEST: 200Mi
1414
+ KUBERNETES_MEMORY_LIMIT: 400Mi
1415
+ script:
1416
+ - collapseable_section_start "injectvars" "Injecting variables"
1417
+ - export ENV_SHORT="prod"
1418
+ - export APP_DIR="www"
1419
+ - export ENV_TYPE="prod"
1420
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1421
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1422
+ - 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")"
1423
+ - export HOSTNAME="$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1424
+ - export ROOT_URL="https://$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1425
+ - export HOSTNAME_INTERNAL="$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1426
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1427
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
1428
+ - export DEPLOY_CLOUD_RUN_REGION="asia-east1"
1429
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_prod_www_GCLOUD_DEPLOY_credentialsKey"
1430
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix"
1431
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
1432
+ - export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
1433
+ - export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/prod/www"
1434
+ - export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/www"
1435
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
1436
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
1437
+ - collapseable_section_end "injectvars"
1438
+ - collapseable_section_start "prepare" "Prepare..."
1439
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_prod_www_GCLOUD_DEPLOY_credentialsKey")
1440
+ - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe asdf --format="value(projectNumber)")
1441
+ - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
1442
+ - collapseable_section_end "prepare"
1443
+ - collapseable_section_start "writeenvvars" "Write env vars to file"
1444
+ - |
1445
+ cat > ____envvars.yaml <<EOF
1446
+ ENV_SHORT: |-
1447
+ prod
1448
+ APP_DIR: |-
1449
+ www
1450
+ ENV_TYPE: |-
1451
+ prod
1452
+ BUILD_INFO_BUILD_ID: |-
1453
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed '1!s/^/ /')
1454
+ BUILD_INFO_BUILD_TIME: |-
1455
+ $(printf %s "$CI_JOB_STARTED_AT" | sed '1!s/^/ /')
1456
+ BUILD_INFO_CURRENT_VERSION: |-
1457
+ $(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 '1!s/^/ /')
1458
+ HOSTNAME: |-
1459
+ $(printf %s "$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
1460
+ ROOT_URL: |-
1461
+ $(printf %s "https://$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
1462
+ HOSTNAME_INTERNAL: |-
1463
+ $(printf %s "$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
1464
+ ROOT_URL_INTERNAL: |-
1465
+ $(printf %s "https://$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
1466
+ DEPLOY_CLOUD_RUN_PROJECT_ID: |-
1467
+ asdf
1468
+ DEPLOY_CLOUD_RUN_REGION: |-
1469
+ asia-east1
1470
+ GCLOUD_RUN_canonicalHostSuffix: |-
1471
+ $(printf %s "$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | sed '1!s/^/ /')
1472
+ _ALL_ENV_VAR_KEYS: |-
1473
+ ["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOSTNAME","ROOT_URL","HOSTNAME_INTERNAL","ROOT_URL_INTERNAL","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
1474
+
1475
+ EOF
1476
+ - collapseable_section_end "writeenvvars"
1477
+ - collapseable_section_start "deploy" "Deploy to cloud run"
1478
+ - gcloud run deploy pan-test-app-prod-www --command="yarn,start" --image=asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/prod/www:$DOCKER_IMAGE_TAG --project=asdf --region=asia-east1 --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
1479
+ - collapseable_section_end "deploy"
1480
+ - collapseable_section_start "cleanup" "Cleanup"
1481
+ - gcloud run revisions list --project=asdf --region=asia-east1 --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=asdf --region=asia-east1 --quiet $revisionname ; done
1482
+ - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/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 asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/prod/www@$version --quiet --delete-tags; done
1483
+ - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/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 asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/www@$version --quiet --delete-tags; done
1484
+ - collapseable_section_end "cleanup"
1485
+ - echo 'Uploading SBOM to Dependency Track'
1486
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/www" "$ROOT_URL" "__sbom.json" vex.json || true
1487
+ - echo "CL_GITLAB_ENVIRONMENT_URL=$ROOT_URL" >> gitlab_environment.env
1488
+ environment:
1489
+ name: prod/www
1490
+ url: $CL_GITLAB_ENVIRONMENT_URL
1491
+ on_stop: 'www ๐Ÿ›‘ Stop โš ๏ธ | prod '
1492
+ artifacts:
1493
+ reports:
1494
+ dotenv: gitlab_environment.env
1495
+ rules:
1496
+ - when: manual
1497
+ if: $CI_COMMIT_TAG
1498
+ needs:
1499
+ - job: 'www ๐Ÿ”จ app | prod '
1500
+ artifacts: false
1501
+ - job: 'www ๐Ÿ”จ docker | prod '
1502
+ artifacts: false
1503
+ - job: 'www ๐Ÿงพ sbom | prod '
1504
+ artifacts: true
1505
+ retry: *a1
1506
+ interruptible: true
1507
+ allow_failure: true
1508
+ 'www ๐Ÿ›‘ Stop โš ๏ธ | prod ':
1509
+ stage: stop prod
1510
+ image: path/to/docker/gcloud:the-version
1511
+ variables:
1512
+ KUBERNETES_CPU_REQUEST: '0.22'
1513
+ KUBERNETES_MEMORY_REQUEST: 200Mi
1514
+ KUBERNETES_MEMORY_LIMIT: 400Mi
1515
+ GIT_STRATEGY: none
1516
+ script:
1517
+ - collapseable_section_start "injectvars" "Injecting variables"
1518
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
1519
+ - collapseable_section_end "injectvars"
1520
+ - set +e
1521
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_prod_www_GCLOUD_DEPLOY_credentialsKey")
1522
+ - gcloud run services delete pan-test-app-prod-www --project=asdf --region=asia-east1
1523
+ - gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/prod/www --quiet --delete-tags
1524
+ - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/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 asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/www@$version --quiet --delete-tags; done
1525
+ - echo 'Disabling component in Dependency Track'
1526
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/www" "$CI_ENVIRONMENT_URL" || true
1527
+ - set -e
1528
+ - echo "CL_GITLAB_ENVIRONMENT_URL=$ROOT_URL" >> gitlab_environment.env
1529
+ environment:
1530
+ name: prod/www
1531
+ action: stop
1532
+ artifacts:
1533
+ reports:
1534
+ dotenv: gitlab_environment.env
1535
+ rules:
1536
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
1537
+ when: on_success
1538
+ - when: manual
1539
+ if: $CI_COMMIT_TAG
1540
+ needs: []
1541
+ retry: *a1
1542
+ interruptible: true
1543
+ allow_failure: true
1544
+ 'www e2e | prod ':
1545
+ stage: verify
1546
+ image: cypress/browsers
1547
+ variables: {}
1548
+ script:
1549
+ - collapseable_section_start "injectvars" "Injecting variables"
1550
+ - export ENV_SHORT="prod"
1551
+ - export APP_DIR="www"
1552
+ - export ENV_TYPE="prod"
1553
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1554
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1555
+ - 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")"
1556
+ - export HOSTNAME="$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1557
+ - export ROOT_URL="https://$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1558
+ - export HOSTNAME_INTERNAL="$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1559
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1560
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
1561
+ - export DEPLOY_CLOUD_RUN_REGION="asia-east1"
1562
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_prod_www_GCLOUD_DEPLOY_credentialsKey"
1563
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix"
1564
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
1565
+ - export CYPRESS_CACHE_FOLDER="$CI_PROJECT_DIR/cache/cypress"
1566
+ - collapseable_section_end "injectvars"
1567
+ - yarn install --frozen-lockfile
1568
+ - CYPRESS_BASE_URL=$CI_ENVIRONMENT_URL yarn cypress:run:ci
1569
+ - echo "CL_GITLAB_ENVIRONMENT_URL=$ROOT_URL" >> gitlab_environment.env
1570
+ cache:
1571
+ key: cypress
1572
+ policy: pull-push
1573
+ paths:
1574
+ - .yarn/cache
1575
+ - node_modules/
1576
+ - cache/cypress
1577
+ environment:
1578
+ name: prod/www
1579
+ action: access
1580
+ artifacts:
1581
+ expire_in: 1 week
1582
+ when: always
1583
+ reports:
1584
+ junit:
1585
+ - cypress/results/report-*.xml
1586
+ dotenv: gitlab_environment.env
1587
+ paths:
1588
+ - cypress/results
1589
+ - cypress/screenshots
1590
+ - cypress/videos
1591
+ rules:
1592
+ - if: $CI_COMMIT_TAG
1593
+ needs:
1594
+ - job: 'www ๐Ÿš€ Deploy | prod '
1595
+ artifacts: false
1596
+ retry: *a1
1597
+ interruptible: true
1598
+ create release:
1599
+ stage: release
1600
+ image: path/to/docker/semantic-release:the-version
1601
+ script:
1602
+ - semanticRelease
1603
+ - echo '๐Ÿ‘‰ The project access token might be invald - run \`project-renew-token\` in catladder CLI to fix.'
1604
+ rules:
1605
+ - &a2
1606
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
1607
+ when: never
1608
+ - &a3
1609
+ if: $CI_PIPELINE_SOURCE == "schedule"
1610
+ when: never
1611
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $AUTO_RELEASE == "true"
1612
+ when: on_success
1613
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
1614
+ when: manual
1615
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+.([0-9]+|x).x$/
1616
+ when: manual
1617
+ โš ๏ธ force create release:
1618
+ stage: release
1619
+ image: path/to/docker/semantic-release:the-version
1620
+ script:
1621
+ - semanticRelease
1622
+ - echo '๐Ÿ‘‰ The project access token might be invald - run \`project-renew-token\` in catladder CLI to fix.'
1623
+ rules:
1624
+ - *a2
1625
+ - *a3
1626
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
1627
+ when: manual
1628
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+.([0-9]+|x).x$/
1629
+ when: manual
1630
+ needs: []
1631
+ "
1632
+ `;