@catladder/pipeline 0.0.0-next-e2e4f00a → 0.0.0-next-c0c5f6da

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