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