@catladder/pipeline 1.162.0 โ†’ 1.163.1

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