@catladder/pipeline 1.163.0 โ†’ 1.163.2

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 (78) hide show
  1. package/README.md +15 -1
  2. package/dist/bundles/catladder-gitlab/index.js +2 -2
  3. package/dist/constants.js +1 -1
  4. package/dist/pipeline/generatePipelineFiles.d.ts +38 -0
  5. package/dist/pipeline/generatePipelineFiles.js +44 -23
  6. package/dist/tsconfig.tsbuildinfo +1 -1
  7. package/examples/__snapshots__/cloud-run-memory-limit.test.ts.snap +1335 -1952
  8. package/examples/__snapshots__/cloud-run-meteor-with-worker.test.ts.snap +1319 -1928
  9. package/examples/__snapshots__/cloud-run-no-cpu-throttling.test.ts.snap +1335 -1952
  10. package/examples/__snapshots__/cloud-run-no-service.test.ts.snap +1387 -2004
  11. package/examples/__snapshots__/cloud-run-non-public.test.ts.snap +1335 -1952
  12. package/examples/__snapshots__/cloud-run-post-stop-job.test.ts.snap +1346 -1963
  13. package/examples/__snapshots__/cloud-run-service-gen2.test.ts.snap +1335 -1952
  14. package/examples/__snapshots__/cloud-run-service-increase-timout.test.ts.snap +1335 -1952
  15. package/examples/__snapshots__/cloud-run-service-with-volumes.test.ts.snap +1379 -1996
  16. package/examples/__snapshots__/cloud-run-storybook.test.ts.snap +1219 -1668
  17. package/examples/__snapshots__/cloud-run-with-ngnix.test.ts.snap +1335 -1952
  18. package/examples/__snapshots__/cloud-run-with-sql-reuse-db.test.ts.snap +2815 -3924
  19. package/examples/__snapshots__/cloud-run-with-sql.test.ts.snap +2562 -3447
  20. package/examples/__snapshots__/cloud-run-with-worker.test.ts.snap +1343 -1960
  21. package/examples/__snapshots__/custom-build-job-with-tests.test.ts.snap +1190 -1780
  22. package/examples/__snapshots__/custom-build-job.test.ts.snap +1079 -1480
  23. package/examples/__snapshots__/custom-deploy.test.ts.snap +1101 -1718
  24. package/examples/__snapshots__/custom-envs.test.ts.snap +707 -1172
  25. package/examples/__snapshots__/custom-sbom-java.test.ts.snap +1087 -1488
  26. package/examples/__snapshots__/git-submodule.test.ts.snap +1336 -1955
  27. package/examples/__snapshots__/kubernetes-application-customization.test.ts.snap +1772 -2443
  28. package/examples/__snapshots__/kubernetes-with-cloud-sql-legacy.test.ts.snap +1784 -2455
  29. package/examples/__snapshots__/kubernetes-with-cloud-sql.test.ts.snap +1792 -2463
  30. package/examples/__snapshots__/kubernetes-with-jobs.test.ts.snap +3342 -4547
  31. package/examples/__snapshots__/kubernetes-with-mongodb.test.ts.snap +1896 -2567
  32. package/examples/__snapshots__/local-dot-env.test.ts.snap +1335 -1952
  33. package/examples/__snapshots__/meteor-kubernetes.test.ts.snap +1833 -2496
  34. package/examples/__snapshots__/multiline-var.test.ts.snap +3295 -4406
  35. package/examples/__snapshots__/native-app.test.ts.snap +2143 -3160
  36. package/examples/__snapshots__/node-build-with-custom-image.test.ts.snap +1335 -1952
  37. package/examples/__snapshots__/node-build-with-docker-additions.test.ts.snap +1343 -1960
  38. package/examples/__snapshots__/rails-k8s-with-worker-dockerfile.test.ts.snap +1479 -2003
  39. package/examples/__snapshots__/rails-k8s-with-worker.test.ts.snap +1464 -1988
  40. package/examples/__snapshots__/wait-for-other-deploy.test.ts.snap +1273 -2102
  41. package/examples/__utils__/helpers.ts +14 -1
  42. package/examples/cloud-run-memory-limit.test.ts +4 -3
  43. package/examples/cloud-run-meteor-with-worker.test.ts +4 -3
  44. package/examples/cloud-run-no-cpu-throttling.test.ts +4 -3
  45. package/examples/cloud-run-no-service.test.ts +4 -3
  46. package/examples/cloud-run-non-public.test.ts +4 -3
  47. package/examples/cloud-run-post-stop-job.test.ts +4 -3
  48. package/examples/cloud-run-service-gen2.test.ts +4 -3
  49. package/examples/cloud-run-service-increase-timout.test.ts +4 -3
  50. package/examples/cloud-run-service-with-volumes.test.ts +4 -3
  51. package/examples/cloud-run-storybook.test.ts +4 -3
  52. package/examples/cloud-run-with-ngnix.test.ts +4 -3
  53. package/examples/cloud-run-with-sql-reuse-db.test.ts +4 -3
  54. package/examples/cloud-run-with-sql.test.ts +4 -3
  55. package/examples/cloud-run-with-worker.test.ts +4 -3
  56. package/examples/custom-build-job-with-tests.test.ts +4 -3
  57. package/examples/custom-build-job.test.ts +4 -3
  58. package/examples/custom-deploy.test.ts +4 -3
  59. package/examples/custom-envs.test.ts +4 -3
  60. package/examples/custom-sbom-java.test.ts +4 -3
  61. package/examples/git-submodule.test.ts +4 -3
  62. package/examples/kubernetes-application-customization.test.ts +4 -3
  63. package/examples/kubernetes-with-cloud-sql-legacy.test.ts +4 -3
  64. package/examples/kubernetes-with-cloud-sql.test.ts +4 -3
  65. package/examples/kubernetes-with-jobs.test.ts +4 -3
  66. package/examples/kubernetes-with-mongodb.test.ts +4 -3
  67. package/examples/local-dot-env.test.ts +4 -3
  68. package/examples/meteor-kubernetes.test.ts +4 -3
  69. package/examples/multiline-var.test.ts +4 -3
  70. package/examples/native-app.test.ts +4 -3
  71. package/examples/node-build-with-custom-image.test.ts +4 -3
  72. package/examples/node-build-with-docker-additions.test.ts +4 -3
  73. package/examples/rails-k8s-with-worker-dockerfile.test.ts +2 -2
  74. package/examples/rails-k8s-with-worker.test.ts +4 -3
  75. package/examples/wait-for-other-deploy.test.ts +4 -3
  76. package/package.json +4 -3
  77. package/scripts/generate-examples-test.ts +7 -7
  78. package/src/pipeline/generatePipelineFiles.ts +61 -36
@@ -1,1967 +1,1350 @@
1
1
  // Jest Snapshot v1, https://goo.gl/fbAQLP
2
2
 
3
- exports[`matches snapshot for cloud-run-with-worker 1`] = `
4
- {
5
- "mainBranch": {
6
- "image": "path/to/docker/jobs-default:the-version",
7
- "jobs": {
8
- "api ๐Ÿ‘ฎ lint": {
9
- "cache": [
10
- {
11
- "key": "api-yarn",
12
- "paths": [
13
- "api/.yarn",
14
- ],
15
- "policy": "pull-push",
16
- },
17
- {
18
- "key": "api-node-modules",
19
- "paths": [
20
- "api/node_modules",
21
- ],
22
- "policy": "pull-push",
23
- },
24
- ],
25
- "image": "path/to/docker/jobs-default:the-version",
26
- "interruptible": true,
27
- "needs": [],
28
- "retry": {
29
- "max": 2,
30
- "when": [
31
- "runner_system_failure",
32
- "stuck_or_timeout_failure",
33
- ],
34
- },
35
- "script": [
36
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
37
- "export APP_PATH="api"",
38
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
39
- "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
40
- "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
41
- "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
42
- "echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"",
43
- "cd api",
44
- "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
45
- "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
46
- "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
47
- "echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"",
48
- "echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"",
49
- "yarn install --immutable",
50
- "echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"",
51
- "yarn lint",
52
- ],
53
- "stage": "test",
54
- "variables": {
55
- "KUBERNETES_CPU_REQUEST": "0.45",
56
- "KUBERNETES_MEMORY_LIMIT": "4Gi",
57
- "KUBERNETES_MEMORY_REQUEST": "1Gi",
58
- },
59
- },
60
- "api ๐Ÿ”จ app | dev ": {
61
- "artifacts": {
62
- "expire_in": "1 day",
63
- "paths": [
64
- "api/__build_info.json",
65
- "api/.next",
66
- "api/dist",
67
- ],
68
- "reports": {
69
- "junit": undefined,
70
- },
71
- "when": "always",
72
- },
73
- "cache": [
74
- {
75
- "key": "api-yarn",
76
- "paths": [
77
- "api/.yarn",
78
- ],
79
- "policy": "pull-push",
80
- },
81
- {
82
- "key": "api-node-modules",
83
- "paths": [
84
- "api/node_modules",
85
- ],
86
- "policy": "pull-push",
87
- },
88
- {
89
- "key": "api-next-cache",
90
- "paths": [
91
- "api/.next/cache",
92
- ],
93
- "policy": "pull-push",
94
- },
95
- ],
96
- "image": "path/to/docker/jobs-default:the-version",
97
- "interruptible": true,
98
- "needs": [],
99
- "retry": {
100
- "max": 2,
101
- "when": [
102
- "runner_system_failure",
103
- "stuck_or_timeout_failure",
104
- ],
105
- },
106
- "script": [
107
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
108
- "export ENV_SHORT="dev"",
109
- "export APP_DIR="api"",
110
- "export ENV_TYPE="dev"",
111
- "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
112
- "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
113
- "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")"",
114
- "export HOST="$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
115
- "export ROOT_URL="https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
116
- "export HOST_INTERNAL="$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
117
- "export HOST_CANONICAL="$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
118
- "export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
119
- "export DEPLOY_CLOUD_RUN_PROJECT_ID="google-project-id"",
120
- "export DEPLOY_CLOUD_RUN_REGION="europe-west6"",
121
- "export GCLOUD_DEPLOY_credentialsKey="$CL_dev_api_GCLOUD_DEPLOY_credentialsKey"",
122
- "export GCLOUD_RUN_canonicalHostSuffix="$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix"",
123
- "export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"",
124
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
125
- "echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > api/__build_info.json",
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 api",
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 build",
139
- ],
140
- "stage": "build",
141
- "variables": {
142
- "KUBERNETES_CPU_REQUEST": "0.45",
143
- "KUBERNETES_MEMORY_LIMIT": "4Gi",
144
- "KUBERNETES_MEMORY_REQUEST": "1Gi",
145
- },
146
- },
147
- "api ๐Ÿ”จ docker | dev ": {
148
- "cache": [
149
- {
150
- "key": "api-yarn",
151
- "paths": [
152
- "api/.yarn",
153
- ],
154
- "policy": "pull",
155
- },
156
- ],
157
- "image": "path/to/docker/docker-build:the-version",
158
- "interruptible": true,
159
- "needs": [
160
- "api ๐Ÿ”จ app | dev ",
161
- ],
162
- "retry": {
163
- "max": 2,
164
- "when": [
165
- "runner_system_failure",
166
- "stuck_or_timeout_failure",
167
- ],
168
- },
169
- "script": [
170
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
171
- "export APP_DIR="api"",
172
- "export DOCKER_BUILD_CONTEXT="."",
173
- "export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"",
174
- "export DOCKER_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/dev/api"",
175
- "export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api"",
176
- "export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"",
177
- "export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
178
- RUN yarn plugin import workspace-tools
179
- RUN yarn workspaces focus --production && yarn rebuild"",
180
- "export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node api/package.json /app/api/package.json
181
- COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
182
- COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
183
- COPY --chown=node:node .yarn /app/.yarn"",
184
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
185
- "ensureNodeDockerfile",
186
- "echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"",
187
- "gcloud auth activate-service-account --key-file=<(echo "$CL_dev_api_GCLOUD_DEPLOY_credentialsKey")",
188
- "gcloud auth configure-docker europe-west6-docker.pkg.dev",
189
- "echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"",
190
- "echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"",
191
- "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",
192
- "echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"",
193
- "echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"",
194
- "docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
195
- "docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE",
196
- "docker push $DOCKER_CACHE_IMAGE",
197
- "echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"",
198
- ],
199
- "services": [
200
- {
201
- "command": [
202
- "--tls=false",
203
- ],
204
- "name": "docker:24.0.6-dind",
205
- },
206
- ],
207
- "stage": "build",
208
- "variables": {
209
- "DOCKER_BUILDKIT": "1",
210
- "DOCKER_DRIVER": "overlay2",
211
- "DOCKER_HOST": "tcp://0.0.0.0:2375",
212
- "DOCKER_TLS_CERTDIR": "",
213
- "KUBERNETES_CPU_REQUEST": "0.45",
214
- "KUBERNETES_MEMORY_LIMIT": "2Gi",
215
- "KUBERNETES_MEMORY_REQUEST": "1Gi",
216
- },
217
- },
218
- "api ๐Ÿš€ Deploy | dev ": {
219
- "allow_failure": false,
220
- "artifacts": {
221
- "reports": {
222
- "dotenv": "gitlab_environment.env",
223
- },
224
- },
225
- "environment": {
226
- "auto_stop_in": "4 weeks",
227
- "name": "dev/api",
228
- "on_stop": "api ๐Ÿ›‘ Stop โš ๏ธ | dev ",
229
- "url": "$CL_GITLAB_ENVIRONMENT_URL",
230
- },
231
- "image": "path/to/docker/gcloud:the-version",
232
- "interruptible": true,
233
- "needs": [
234
- {
235
- "artifacts": false,
236
- "job": "api ๐Ÿ‘ฎ lint",
237
- },
238
- {
239
- "artifacts": false,
240
- "job": "api ๐Ÿ”จ app | dev ",
241
- },
242
- {
243
- "artifacts": false,
244
- "job": "api ๐Ÿ”จ docker | dev ",
245
- },
246
- {
247
- "artifacts": false,
248
- "job": "api ๐Ÿงช test",
249
- },
250
- {
251
- "artifacts": true,
252
- "job": "api ๐Ÿงพ sbom | dev ",
253
- },
254
- {
255
- "artifacts": false,
256
- "job": "api ๐Ÿ›ก audit",
257
- },
258
- ],
259
- "retry": {
260
- "max": 2,
261
- "when": [
262
- "runner_system_failure",
263
- "stuck_or_timeout_failure",
264
- ],
265
- },
266
- "rules": [
267
- {
268
- "when": "on_success",
269
- },
270
- ],
271
- "script": [
272
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
273
- "export ENV_SHORT="dev"",
274
- "export APP_DIR="api"",
275
- "export ENV_TYPE="dev"",
276
- "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
277
- "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
278
- "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")"",
279
- "export HOST="$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
280
- "export ROOT_URL="https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
281
- "export HOST_INTERNAL="$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
282
- "export HOST_CANONICAL="$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
283
- "export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
284
- "export DEPLOY_CLOUD_RUN_PROJECT_ID="google-project-id"",
285
- "export DEPLOY_CLOUD_RUN_REGION="europe-west6"",
286
- "export GCLOUD_DEPLOY_credentialsKey="$CL_dev_api_GCLOUD_DEPLOY_credentialsKey"",
287
- "export GCLOUD_RUN_canonicalHostSuffix="$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix"",
288
- "export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"",
289
- "export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"",
290
- "export DOCKER_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/dev/api"",
291
- "export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api"",
292
- "export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"",
293
- "export CLOUDSDK_CORE_DISABLE_PROMPTS="1"",
294
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
295
- "echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."",
296
- "gcloud auth activate-service-account --key-file=<(echo "$CL_dev_api_GCLOUD_DEPLOY_credentialsKey")",
297
- "export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe google-project-id --format="value(projectNumber)")",
298
- "echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"",
299
- "echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"",
300
- "echo -e "\\e[0Ksection_start:$(date +%s):writeenvvars[collapsed=true]\\r\\e[0KWrite env vars to file"",
301
- "cat > ____envvars.yaml <<EOF
302
- ENV_SHORT: |-
303
- dev
304
- APP_DIR: |-
305
- api
306
- ENV_TYPE: |-
307
- dev
308
- BUILD_INFO_BUILD_ID: |-
309
- $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
310
- BUILD_INFO_BUILD_TIME: |-
311
- $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
312
- BUILD_INFO_CURRENT_VERSION: |-
313
- $(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/^/ /')
314
- HOST: |-
315
- $(printf %s "$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
316
- ROOT_URL: |-
317
- $(printf %s "https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
318
- HOST_INTERNAL: |-
319
- $(printf %s "$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
320
- HOST_CANONICAL: |-
321
- $(printf %s "$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
322
- ROOT_URL_INTERNAL: |-
323
- $(printf %s "https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
324
- DEPLOY_CLOUD_RUN_PROJECT_ID: |-
325
- google-project-id
326
- DEPLOY_CLOUD_RUN_REGION: |-
327
- europe-west6
328
- GCLOUD_RUN_canonicalHostSuffix: |-
329
- $(printf %s "$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | sed 's/^/ /')
330
- _ALL_ENV_VAR_KEYS: |-
331
- ["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_INTERNAL","HOST_CANONICAL","ROOT_URL_INTERNAL","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
3
+ exports[`matches snapshot for cloud-run-with-worker 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
+ api ๐Ÿ›ก 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="api"
58
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
59
+ - cd api
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
+ api ๐Ÿ‘ฎ 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="api"
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 api
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: api-yarn
100
+ policy: pull-push
101
+ paths:
102
+ - api/.yarn
103
+ - key: api-node-modules
104
+ policy: pull-push
105
+ paths:
106
+ - api/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
+ api ๐Ÿงช 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="api"
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 api
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: api-yarn
141
+ policy: pull-push
142
+ paths:
143
+ - api/.yarn
144
+ - key: api-node-modules
145
+ policy: pull-push
146
+ paths:
147
+ - api/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
+ 'api ๐Ÿ”จ 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="api"
167
+ - export ENV_TYPE="dev"
168
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
169
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
170
+ - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
171
+ - export HOST="$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
172
+ - export ROOT_URL="https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
173
+ - export HOST_INTERNAL="$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
174
+ - export HOST_CANONICAL="$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
175
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
176
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="google-project-id"
177
+ - export DEPLOY_CLOUD_RUN_REGION="europe-west6"
178
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_dev_api_GCLOUD_DEPLOY_credentialsKey"
179
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix"
180
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
181
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
182
+ - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > api/__build_info.json
183
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
184
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
185
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
186
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
187
+ - cd api
188
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
189
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
190
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
191
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
192
+ - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
193
+ - yarn install --immutable
194
+ - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
195
+ - yarn build
196
+ cache:
197
+ - key: api-yarn
198
+ policy: pull-push
199
+ paths:
200
+ - api/.yarn
201
+ - key: api-node-modules
202
+ policy: pull-push
203
+ paths:
204
+ - api/node_modules
205
+ - key: api-next-cache
206
+ policy: pull-push
207
+ paths:
208
+ - api/.next/cache
209
+ artifacts:
210
+ paths:
211
+ - api/__build_info.json
212
+ - api/.next
213
+ - api/dist
214
+ expire_in: 1 day
215
+ when: always
216
+ reports: {}
217
+ rules:
218
+ - when: never
219
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
220
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
221
+ needs: []
222
+ retry: *a1
223
+ interruptible: true
224
+ 'api ๐Ÿ”จ docker | dev ':
225
+ stage: build
226
+ image: path/to/docker/docker-build:the-version
227
+ services:
228
+ - name: docker:24.0.6-dind
229
+ command:
230
+ - --tls=false
231
+ variables:
232
+ DOCKER_HOST: tcp://0.0.0.0:2375
233
+ DOCKER_TLS_CERTDIR: ''
234
+ DOCKER_DRIVER: overlay2
235
+ DOCKER_BUILDKIT: '1'
236
+ KUBERNETES_CPU_REQUEST: '0.45'
237
+ KUBERNETES_MEMORY_REQUEST: 1Gi
238
+ KUBERNETES_MEMORY_LIMIT: 2Gi
239
+ script:
240
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
241
+ - export APP_DIR="api"
242
+ - export DOCKER_BUILD_CONTEXT="."
243
+ - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
244
+ - export DOCKER_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/dev/api"
245
+ - export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api"
246
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
247
+ - |-
248
+ export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
249
+ RUN yarn plugin import workspace-tools
250
+ RUN yarn workspaces focus --production && yarn rebuild"
251
+ - |-
252
+ export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node api/package.json /app/api/package.json
253
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
254
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
255
+ COPY --chown=node:node .yarn /app/.yarn"
256
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
257
+ - ensureNodeDockerfile
258
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
259
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_dev_api_GCLOUD_DEPLOY_credentialsKey")
260
+ - gcloud auth configure-docker europe-west6-docker.pkg.dev
261
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
262
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
263
+ - 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
264
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
265
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
266
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
267
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
268
+ - docker push $DOCKER_CACHE_IMAGE
269
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
270
+ cache:
271
+ - key: api-yarn
272
+ policy: pull
273
+ paths:
274
+ - api/.yarn
275
+ rules:
276
+ - when: never
277
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
278
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
279
+ needs:
280
+ - 'api ๐Ÿ”จ app | dev '
281
+ retry: *a1
282
+ interruptible: true
283
+ 'api ๐Ÿงพ sbom | dev ':
284
+ stage: build
285
+ image: aquasec/trivy:0.38.3
286
+ variables: {}
287
+ script:
288
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
289
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
290
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" api
291
+ artifacts:
292
+ paths:
293
+ - __sbom.json
294
+ rules:
295
+ - when: never
296
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
297
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
298
+ needs: []
299
+ retry: *a1
300
+ interruptible: true
301
+ allow_failure: true
302
+ 'api ๐Ÿš€ Deploy | dev ':
303
+ stage: deploy dev
304
+ image: path/to/docker/gcloud:the-version
305
+ variables:
306
+ KUBERNETES_CPU_REQUEST: '0.22'
307
+ KUBERNETES_MEMORY_REQUEST: 200Mi
308
+ KUBERNETES_MEMORY_LIMIT: 400Mi
309
+ script:
310
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
311
+ - export ENV_SHORT="dev"
312
+ - export APP_DIR="api"
313
+ - export ENV_TYPE="dev"
314
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
315
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
316
+ - 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")"
317
+ - export HOST="$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
318
+ - export ROOT_URL="https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
319
+ - export HOST_INTERNAL="$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
320
+ - export HOST_CANONICAL="$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
321
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
322
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="google-project-id"
323
+ - export DEPLOY_CLOUD_RUN_REGION="europe-west6"
324
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_dev_api_GCLOUD_DEPLOY_credentialsKey"
325
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix"
326
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
327
+ - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
328
+ - export DOCKER_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/dev/api"
329
+ - export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api"
330
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
331
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
332
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
333
+ - echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."
334
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_dev_api_GCLOUD_DEPLOY_credentialsKey")
335
+ - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe google-project-id --format="value(projectNumber)")
336
+ - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
337
+ - echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"
338
+ - echo -e "\\e[0Ksection_start:$(date +%s):writeenvvars[collapsed=true]\\r\\e[0KWrite env vars to file"
339
+ - |
340
+ cat > ____envvars.yaml <<EOF
341
+ ENV_SHORT: |-
342
+ dev
343
+ APP_DIR: |-
344
+ api
345
+ ENV_TYPE: |-
346
+ dev
347
+ BUILD_INFO_BUILD_ID: |-
348
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
349
+ BUILD_INFO_BUILD_TIME: |-
350
+ $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
351
+ BUILD_INFO_CURRENT_VERSION: |-
352
+ $(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/^/ /')
353
+ HOST: |-
354
+ $(printf %s "$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
355
+ ROOT_URL: |-
356
+ $(printf %s "https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
357
+ HOST_INTERNAL: |-
358
+ $(printf %s "$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
359
+ HOST_CANONICAL: |-
360
+ $(printf %s "$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
361
+ ROOT_URL_INTERNAL: |-
362
+ $(printf %s "https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
363
+ DEPLOY_CLOUD_RUN_PROJECT_ID: |-
364
+ google-project-id
365
+ DEPLOY_CLOUD_RUN_REGION: |-
366
+ europe-west6
367
+ GCLOUD_RUN_canonicalHostSuffix: |-
368
+ $(printf %s "$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | sed 's/^/ /')
369
+ _ALL_ENV_VAR_KEYS: |-
370
+ ["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_INTERNAL","HOST_CANONICAL","ROOT_URL_INTERNAL","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
332
371
 
333
- EOF
334
- ",
335
- "echo -e "\\e[0Ksection_end:$(date +%s):writeenvvars\\r\\e[0K"",
336
- "echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"",
337
- "gcloud run deploy pan-test-app-dev-api --command="yarn,start" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/dev/api:$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --labels=customer-name=pan,component-name=api,app-name=test-app,env-type=dev,env-name=dev,build-type=node,cloud-run-service-name=pan-test-app-dev-api --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost",
338
- "gcloud run deploy pan-test-app-dev-api-worker --command="yarn,start:worker" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/dev/api:$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --labels=customer-name=pan,component-name=api,app-name=test-app,env-type=dev,env-name=dev,build-type=node,cloud-run-service-name=pan-test-app-dev-api-worker --env-vars-file=____envvars.yaml --min-instances=1 --max-instances=1 --no-cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost",
339
- "echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"",
340
- "echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"",
341
- "gcloud run revisions list --project=google-project-id --region=europe-west6 --service=pan-test-app-dev-api --limit=unlimited --sort-by=metadata.creationTimestamp --format="value(name)" --filter='(status.conditions.status=False OR status.conditions.status=Unknown)' | while read -r revisionname; do gcloud run revisions delete --project=google-project-id --region=europe-west6 --quiet $revisionname ; done",
342
- "gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/dev/api --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/dev/api@$version --quiet --delete-tags; done",
343
- "gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api@$version --quiet --delete-tags; done",
344
- "echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"",
345
- "echo 'Uploading SBOM to Dependency Track'",
346
- "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/api" "https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" "__sbom.json" vex.json || true",
347
- "echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env",
348
- ],
349
- "stage": "deploy dev",
350
- "variables": {
351
- "KUBERNETES_CPU_REQUEST": "0.22",
352
- "KUBERNETES_MEMORY_LIMIT": "400Mi",
353
- "KUBERNETES_MEMORY_REQUEST": "200Mi",
354
- },
355
- },
356
- "api ๐Ÿ›‘ Stop โš ๏ธ | dev ": {
357
- "allow_failure": true,
358
- "artifacts": {
359
- "reports": {
360
- "dotenv": "gitlab_environment.env",
361
- },
362
- },
363
- "environment": {
364
- "action": "stop",
365
- "name": "dev/api",
366
- "url": "$CL_GITLAB_ENVIRONMENT_URL",
367
- },
368
- "image": "path/to/docker/gcloud:the-version",
369
- "interruptible": true,
370
- "needs": [],
371
- "retry": {
372
- "max": 2,
373
- "when": [
374
- "runner_system_failure",
375
- "stuck_or_timeout_failure",
376
- ],
377
- },
378
- "rules": [
379
- {
380
- "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/",
381
- "when": "on_success",
382
- },
383
- {
384
- "when": "manual",
385
- },
386
- ],
387
- "script": [
388
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
389
- "export CLOUDSDK_CORE_DISABLE_PROMPTS="1"",
390
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
391
- "set +e",
392
- "gcloud auth activate-service-account --key-file=<(echo "$CL_dev_api_GCLOUD_DEPLOY_credentialsKey")",
393
- "gcloud run services delete pan-test-app-dev-api --project=google-project-id --region=europe-west6",
394
- "gcloud run services delete pan-test-app-dev-api-worker --project=google-project-id --region=europe-west6",
395
- "gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/dev/api --quiet --delete-tags",
396
- "gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api@$version --quiet --delete-tags; done",
397
- "echo 'Disabling component in Dependency Track'",
398
- "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/api" "https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" || true",
399
- "set -e",
400
- "echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env",
401
- ],
402
- "stage": "stop dev",
403
- "variables": {
404
- "GIT_STRATEGY": "none",
405
- "KUBERNETES_CPU_REQUEST": "0.22",
406
- "KUBERNETES_MEMORY_LIMIT": "400Mi",
407
- "KUBERNETES_MEMORY_REQUEST": "200Mi",
408
- },
409
- },
410
- "api ๐Ÿ›ก audit": {
411
- "allow_failure": true,
412
- "image": "path/to/docker/jobs-default:the-version",
413
- "interruptible": true,
414
- "needs": [],
415
- "retry": {
416
- "max": 2,
417
- "when": [
418
- "runner_system_failure",
419
- "stuck_or_timeout_failure",
420
- ],
421
- },
422
- "script": [
423
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
424
- "export APP_PATH="api"",
425
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
426
- "cd api",
427
- "yarn npm audit --environment production",
428
- ],
429
- "stage": "test",
430
- "variables": {
431
- "KUBERNETES_CPU_REQUEST": "0.45",
432
- "KUBERNETES_MEMORY_LIMIT": "4Gi",
433
- "KUBERNETES_MEMORY_REQUEST": "1Gi",
434
- },
435
- },
436
- "api ๐Ÿงช test": {
437
- "cache": [
438
- {
439
- "key": "api-yarn",
440
- "paths": [
441
- "api/.yarn",
442
- ],
443
- "policy": "pull-push",
444
- },
445
- {
446
- "key": "api-node-modules",
447
- "paths": [
448
- "api/node_modules",
449
- ],
450
- "policy": "pull-push",
451
- },
452
- ],
453
- "image": "path/to/docker/jobs-testing-chrome:the-version",
454
- "interruptible": true,
455
- "needs": [],
456
- "retry": {
457
- "max": 2,
458
- "when": [
459
- "runner_system_failure",
460
- "stuck_or_timeout_failure",
461
- ],
462
- },
463
- "script": [
464
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
465
- "export APP_PATH="api"",
466
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
467
- "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
468
- "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
469
- "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
470
- "echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"",
471
- "cd api",
472
- "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
473
- "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
474
- "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
475
- "echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"",
476
- "echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"",
477
- "yarn install --immutable",
478
- "echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"",
479
- "yarn test",
480
- ],
481
- "stage": "test",
482
- "variables": {
483
- "KUBERNETES_CPU_REQUEST": "0.45",
484
- "KUBERNETES_MEMORY_LIMIT": "4Gi",
485
- "KUBERNETES_MEMORY_REQUEST": "1Gi",
486
- },
487
- },
488
- "api ๐Ÿงพ sbom | dev ": {
489
- "allow_failure": true,
490
- "artifacts": {
491
- "paths": [
492
- "__sbom.json",
493
- ],
494
- },
495
- "image": "aquasec/trivy:0.38.3",
496
- "interruptible": true,
497
- "needs": [],
498
- "retry": {
499
- "max": 2,
500
- "when": [
501
- "runner_system_failure",
502
- "stuck_or_timeout_failure",
503
- ],
504
- },
505
- "script": [
506
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
507
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
508
- "trivy fs --quiet --format cyclonedx --output "__sbom.json" api",
509
- ],
510
- "stage": "build",
511
- "variables": {},
512
- },
513
- },
514
- "stages": [
515
- "setup",
516
- "setup dev",
517
- "setup review",
518
- "setup stage",
519
- "setup prod",
520
- "test",
521
- "test dev",
522
- "test review",
523
- "test stage",
524
- "test prod",
525
- "build",
526
- "build dev",
527
- "build review",
528
- "build stage",
529
- "build prod",
530
- "deploy",
531
- "deploy dev",
532
- "deploy review",
533
- "deploy stage",
534
- "deploy prod",
535
- "verify",
536
- "verify dev",
537
- "verify review",
538
- "verify stage",
539
- "verify prod",
540
- "rollback",
541
- "rollback dev",
542
- "rollback review",
543
- "rollback stage",
544
- "rollback prod",
545
- "stop",
546
- "stop dev",
547
- "stop review",
548
- "stop stage",
549
- "stop prod",
550
- ],
551
- "variables": {
552
- "ARTIFACT_COMPRESSION_LEVEL": "fast",
553
- "CACHE_COMPRESSION_LEVEL": "fast",
554
- "FF_USE_FASTZIP": "true",
555
- "GIT_DEPTH": "1",
556
- "TRANSFER_METER_FREQUENCY": "5s",
557
- },
558
- "workflow": {
559
- "rules": [
560
- {
561
- "if": "$CI_COMMIT_TAG",
562
- },
563
- {
564
- "if": "$CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/",
565
- "when": "never",
566
- },
567
- {
568
- "if": "$CI_PIPELINE_SOURCE == "schedule"",
569
- "when": "never",
570
- },
571
- {
572
- "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+.([0-9]+|x).x$/",
573
- },
574
- {
575
- "if": "$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH",
576
- },
577
- {
578
- "if": "$CI_MERGE_REQUEST_ID",
579
- },
580
- ],
581
- },
582
- },
583
- "mr": {
584
- "image": "path/to/docker/jobs-default:the-version",
585
- "jobs": {
586
- "api ๐Ÿ‘ฎ lint": {
587
- "cache": [
588
- {
589
- "key": "api-yarn",
590
- "paths": [
591
- "api/.yarn",
592
- ],
593
- "policy": "pull-push",
594
- },
595
- {
596
- "key": "api-node-modules",
597
- "paths": [
598
- "api/node_modules",
599
- ],
600
- "policy": "pull-push",
601
- },
602
- ],
603
- "image": "path/to/docker/jobs-default:the-version",
604
- "interruptible": true,
605
- "needs": [],
606
- "retry": {
607
- "max": 2,
608
- "when": [
609
- "runner_system_failure",
610
- "stuck_or_timeout_failure",
611
- ],
612
- },
613
- "script": [
614
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
615
- "export APP_PATH="api"",
616
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
617
- "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
618
- "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
619
- "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
620
- "echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"",
621
- "cd api",
622
- "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
623
- "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
624
- "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
625
- "echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"",
626
- "echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"",
627
- "yarn install --immutable",
628
- "echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"",
629
- "yarn lint",
630
- ],
631
- "stage": "test",
632
- "variables": {
633
- "KUBERNETES_CPU_REQUEST": "0.45",
634
- "KUBERNETES_MEMORY_LIMIT": "4Gi",
635
- "KUBERNETES_MEMORY_REQUEST": "1Gi",
636
- },
637
- },
638
- "api ๐Ÿ”จ app | review ": {
639
- "artifacts": {
640
- "expire_in": "1 day",
641
- "paths": [
642
- "api/__build_info.json",
643
- "api/.next",
644
- "api/dist",
645
- ],
646
- "reports": {
647
- "junit": undefined,
648
- },
649
- "when": "always",
650
- },
651
- "cache": [
652
- {
653
- "key": "api-yarn",
654
- "paths": [
655
- "api/.yarn",
656
- ],
657
- "policy": "pull-push",
658
- },
659
- {
660
- "key": "api-node-modules",
661
- "paths": [
662
- "api/node_modules",
663
- ],
664
- "policy": "pull-push",
665
- },
666
- {
667
- "key": "api-next-cache",
668
- "paths": [
669
- "api/.next/cache",
670
- ],
671
- "policy": "pull-push",
672
- },
673
- ],
674
- "image": "path/to/docker/jobs-default:the-version",
675
- "interruptible": true,
676
- "needs": [],
677
- "retry": {
678
- "max": 2,
679
- "when": [
680
- "runner_system_failure",
681
- "stuck_or_timeout_failure",
682
- ],
683
- },
684
- "script": [
685
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
686
- "export ENV_SHORT="review"",
687
- "export APP_DIR="api"",
688
- "export ENV_TYPE="review"",
689
- "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
690
- "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
691
- "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")"",
692
- "export HOST="$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
693
- "export ROOT_URL="https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
694
- "export HOST_INTERNAL="$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
695
- "export HOST_CANONICAL="$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
696
- "export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
697
- "export DEPLOY_CLOUD_RUN_PROJECT_ID="google-project-id"",
698
- "export DEPLOY_CLOUD_RUN_REGION="europe-west6"",
699
- "export GCLOUD_DEPLOY_credentialsKey="$CL_review_api_GCLOUD_DEPLOY_credentialsKey"",
700
- "export GCLOUD_RUN_canonicalHostSuffix="$CL_review_api_GCLOUD_RUN_canonicalHostSuffix"",
701
- "export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"",
702
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
703
- "echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > api/__build_info.json",
704
- "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
705
- "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
706
- "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
707
- "echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"",
708
- "cd api",
709
- "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
710
- "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
711
- "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
712
- "echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"",
713
- "echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"",
714
- "yarn install --immutable",
715
- "echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"",
716
- "yarn build",
717
- ],
718
- "stage": "build",
719
- "variables": {
720
- "KUBERNETES_CPU_REQUEST": "0.45",
721
- "KUBERNETES_MEMORY_LIMIT": "4Gi",
722
- "KUBERNETES_MEMORY_REQUEST": "1Gi",
723
- },
724
- },
725
- "api ๐Ÿ”จ docker | review ": {
726
- "cache": [
727
- {
728
- "key": "api-yarn",
729
- "paths": [
730
- "api/.yarn",
731
- ],
732
- "policy": "pull",
733
- },
734
- ],
735
- "image": "path/to/docker/docker-build:the-version",
736
- "interruptible": true,
737
- "needs": [
738
- "api ๐Ÿ”จ app | review ",
739
- ],
740
- "retry": {
741
- "max": 2,
742
- "when": [
743
- "runner_system_failure",
744
- "stuck_or_timeout_failure",
745
- ],
746
- },
747
- "script": [
748
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
749
- "export APP_DIR="api"",
750
- "export DOCKER_BUILD_CONTEXT="."",
751
- "export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"",
752
- "export DOCKER_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/api/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })"",
753
- "export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api"",
754
- "export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"",
755
- "export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
756
- RUN yarn plugin import workspace-tools
757
- RUN yarn workspaces focus --production && yarn rebuild"",
758
- "export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node api/package.json /app/api/package.json
759
- COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
760
- COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
761
- COPY --chown=node:node .yarn /app/.yarn"",
762
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
763
- "ensureNodeDockerfile",
764
- "echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"",
765
- "gcloud auth activate-service-account --key-file=<(echo "$CL_review_api_GCLOUD_DEPLOY_credentialsKey")",
766
- "gcloud auth configure-docker europe-west6-docker.pkg.dev",
767
- "echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"",
768
- "echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"",
769
- "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",
770
- "echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"",
771
- "echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"",
772
- "docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
773
- "docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE",
774
- "docker push $DOCKER_CACHE_IMAGE",
775
- "echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"",
776
- ],
777
- "services": [
778
- {
779
- "command": [
780
- "--tls=false",
781
- ],
782
- "name": "docker:24.0.6-dind",
783
- },
784
- ],
785
- "stage": "build",
786
- "variables": {
787
- "DOCKER_BUILDKIT": "1",
788
- "DOCKER_DRIVER": "overlay2",
789
- "DOCKER_HOST": "tcp://0.0.0.0:2375",
790
- "DOCKER_TLS_CERTDIR": "",
791
- "KUBERNETES_CPU_REQUEST": "0.45",
792
- "KUBERNETES_MEMORY_LIMIT": "2Gi",
793
- "KUBERNETES_MEMORY_REQUEST": "1Gi",
794
- },
795
- },
796
- "api ๐Ÿš€ Deploy | review ": {
797
- "allow_failure": false,
798
- "artifacts": {
799
- "reports": {
800
- "dotenv": "gitlab_environment.env",
801
- },
802
- },
803
- "environment": {
804
- "auto_stop_in": "1 week",
805
- "name": "review/$CI_COMMIT_REF_NAME/api",
806
- "on_stop": "api ๐Ÿ›‘ Stop โš ๏ธ | review ",
807
- "url": "$CL_GITLAB_ENVIRONMENT_URL",
808
- },
809
- "image": "path/to/docker/gcloud:the-version",
810
- "interruptible": true,
811
- "needs": [
812
- {
813
- "artifacts": false,
814
- "job": "api ๐Ÿ‘ฎ lint",
815
- },
816
- {
817
- "artifacts": false,
818
- "job": "api ๐Ÿ”จ app | review ",
819
- },
820
- {
821
- "artifacts": false,
822
- "job": "api ๐Ÿ”จ docker | review ",
823
- },
824
- {
825
- "artifacts": false,
826
- "job": "api ๐Ÿงช test",
827
- },
828
- {
829
- "artifacts": true,
830
- "job": "api ๐Ÿงพ sbom | review ",
831
- },
832
- {
833
- "artifacts": false,
834
- "job": "api ๐Ÿ›ก audit",
835
- },
836
- ],
837
- "retry": {
838
- "max": 2,
839
- "when": [
840
- "runner_system_failure",
841
- "stuck_or_timeout_failure",
842
- ],
843
- },
844
- "rules": [
845
- {
846
- "when": "on_success",
847
- },
848
- ],
849
- "script": [
850
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
851
- "export ENV_SHORT="review"",
852
- "export APP_DIR="api"",
853
- "export ENV_TYPE="review"",
854
- "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
855
- "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
856
- "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")"",
857
- "export HOST="$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
858
- "export ROOT_URL="https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
859
- "export HOST_INTERNAL="$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
860
- "export HOST_CANONICAL="$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
861
- "export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
862
- "export DEPLOY_CLOUD_RUN_PROJECT_ID="google-project-id"",
863
- "export DEPLOY_CLOUD_RUN_REGION="europe-west6"",
864
- "export GCLOUD_DEPLOY_credentialsKey="$CL_review_api_GCLOUD_DEPLOY_credentialsKey"",
865
- "export GCLOUD_RUN_canonicalHostSuffix="$CL_review_api_GCLOUD_RUN_canonicalHostSuffix"",
866
- "export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"",
867
- "export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"",
868
- "export DOCKER_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/api/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })"",
869
- "export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api"",
870
- "export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"",
871
- "export CLOUDSDK_CORE_DISABLE_PROMPTS="1"",
872
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
873
- "echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."",
874
- "gcloud auth activate-service-account --key-file=<(echo "$CL_review_api_GCLOUD_DEPLOY_credentialsKey")",
875
- "export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe google-project-id --format="value(projectNumber)")",
876
- "echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"",
877
- "echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"",
878
- "echo -e "\\e[0Ksection_start:$(date +%s):writeenvvars[collapsed=true]\\r\\e[0KWrite env vars to file"",
879
- "cat > ____envvars.yaml <<EOF
880
- ENV_SHORT: |-
881
- review
882
- APP_DIR: |-
883
- api
884
- ENV_TYPE: |-
885
- review
886
- BUILD_INFO_BUILD_ID: |-
887
- $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
888
- BUILD_INFO_BUILD_TIME: |-
889
- $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
890
- BUILD_INFO_CURRENT_VERSION: |-
891
- $(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/^/ /')
892
- HOST: |-
893
- $(printf %s "$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
894
- ROOT_URL: |-
895
- $(printf %s "https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
896
- HOST_INTERNAL: |-
897
- $(printf %s "$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
898
- HOST_CANONICAL: |-
899
- $(printf %s "$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
900
- ROOT_URL_INTERNAL: |-
901
- $(printf %s "https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
902
- DEPLOY_CLOUD_RUN_PROJECT_ID: |-
903
- google-project-id
904
- DEPLOY_CLOUD_RUN_REGION: |-
905
- europe-west6
906
- GCLOUD_RUN_canonicalHostSuffix: |-
907
- $(printf %s "$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | sed 's/^/ /')
908
- _ALL_ENV_VAR_KEYS: |-
909
- ["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_INTERNAL","HOST_CANONICAL","ROOT_URL_INTERNAL","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
372
+ EOF
373
+ - echo -e "\\e[0Ksection_end:$(date +%s):writeenvvars\\r\\e[0K"
374
+ - echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"
375
+ - gcloud run deploy pan-test-app-dev-api --command="yarn,start" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/dev/api:$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --labels=customer-name=pan,component-name=api,app-name=test-app,env-type=dev,env-name=dev,build-type=node,cloud-run-service-name=pan-test-app-dev-api --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost
376
+ - gcloud run deploy pan-test-app-dev-api-worker --command="yarn,start:worker" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/dev/api:$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --labels=customer-name=pan,component-name=api,app-name=test-app,env-type=dev,env-name=dev,build-type=node,cloud-run-service-name=pan-test-app-dev-api-worker --env-vars-file=____envvars.yaml --min-instances=1 --max-instances=1 --no-cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost
377
+ - echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"
378
+ - echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"
379
+ - gcloud run revisions list --project=google-project-id --region=europe-west6 --service=pan-test-app-dev-api --limit=unlimited --sort-by=metadata.creationTimestamp --format="value(name)" --filter='(status.conditions.status=False OR status.conditions.status=Unknown)' | while read -r revisionname; do gcloud run revisions delete --project=google-project-id --region=europe-west6 --quiet $revisionname ; done
380
+ - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/dev/api --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/dev/api@$version --quiet --delete-tags; done
381
+ - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api@$version --quiet --delete-tags; done
382
+ - echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"
383
+ - echo 'Uploading SBOM to Dependency Track'
384
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/api" "https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" "__sbom.json" vex.json || true
385
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
386
+ environment:
387
+ name: dev/api
388
+ url: $CL_GITLAB_ENVIRONMENT_URL
389
+ on_stop: 'api ๐Ÿ›‘ Stop โš ๏ธ | dev '
390
+ auto_stop_in: 4 weeks
391
+ artifacts:
392
+ reports:
393
+ dotenv: gitlab_environment.env
394
+ rules:
395
+ - when: never
396
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
397
+ - when: on_success
398
+ if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
399
+ needs:
400
+ - job: api ๐Ÿ‘ฎ lint
401
+ artifacts: false
402
+ - job: 'api ๐Ÿ”จ app | dev '
403
+ artifacts: false
404
+ - job: 'api ๐Ÿ”จ docker | dev '
405
+ artifacts: false
406
+ - job: api ๐Ÿงช test
407
+ artifacts: false
408
+ - job: 'api ๐Ÿงพ sbom | dev '
409
+ artifacts: true
410
+ - job: api ๐Ÿ›ก audit
411
+ artifacts: false
412
+ retry: *a1
413
+ interruptible: true
414
+ allow_failure: false
415
+ 'api ๐Ÿ›‘ Stop โš ๏ธ | dev ':
416
+ stage: stop dev
417
+ image: path/to/docker/gcloud:the-version
418
+ variables:
419
+ KUBERNETES_CPU_REQUEST: '0.22'
420
+ KUBERNETES_MEMORY_REQUEST: 200Mi
421
+ KUBERNETES_MEMORY_LIMIT: 400Mi
422
+ GIT_STRATEGY: none
423
+ script:
424
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
425
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
426
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
427
+ - set +e
428
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_dev_api_GCLOUD_DEPLOY_credentialsKey")
429
+ - gcloud run services delete pan-test-app-dev-api --project=google-project-id --region=europe-west6
430
+ - gcloud run services delete pan-test-app-dev-api-worker --project=google-project-id --region=europe-west6
431
+ - gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/dev/api --quiet --delete-tags
432
+ - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api@$version --quiet --delete-tags; done
433
+ - echo 'Disabling component in Dependency Track'
434
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/api" "https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" || true
435
+ - set -e
436
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
437
+ environment:
438
+ name: dev/api
439
+ url: $CL_GITLAB_ENVIRONMENT_URL
440
+ action: stop
441
+ artifacts:
442
+ reports:
443
+ dotenv: gitlab_environment.env
444
+ rules:
445
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
446
+ when: on_success
447
+ - when: never
448
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
449
+ - when: manual
450
+ if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
451
+ needs: []
452
+ retry: *a1
453
+ interruptible: true
454
+ allow_failure: true
455
+ 'api ๐Ÿ”จ app | review ':
456
+ stage: build
457
+ image: path/to/docker/jobs-default:the-version
458
+ variables:
459
+ KUBERNETES_CPU_REQUEST: '0.45'
460
+ KUBERNETES_MEMORY_REQUEST: 1Gi
461
+ KUBERNETES_MEMORY_LIMIT: 4Gi
462
+ script:
463
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
464
+ - export ENV_SHORT="review"
465
+ - export APP_DIR="api"
466
+ - export ENV_TYPE="review"
467
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
468
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
469
+ - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
470
+ - export HOST="$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
471
+ - export ROOT_URL="https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
472
+ - export HOST_INTERNAL="$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
473
+ - export HOST_CANONICAL="$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
474
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
475
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="google-project-id"
476
+ - export DEPLOY_CLOUD_RUN_REGION="europe-west6"
477
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_review_api_GCLOUD_DEPLOY_credentialsKey"
478
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_review_api_GCLOUD_RUN_canonicalHostSuffix"
479
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
480
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
481
+ - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > api/__build_info.json
482
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
483
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
484
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
485
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
486
+ - cd api
487
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
488
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
489
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
490
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
491
+ - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
492
+ - yarn install --immutable
493
+ - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
494
+ - yarn build
495
+ cache:
496
+ - key: api-yarn
497
+ policy: pull-push
498
+ paths:
499
+ - api/.yarn
500
+ - key: api-node-modules
501
+ policy: pull-push
502
+ paths:
503
+ - api/node_modules
504
+ - key: api-next-cache
505
+ policy: pull-push
506
+ paths:
507
+ - api/.next/cache
508
+ artifacts:
509
+ paths:
510
+ - api/__build_info.json
511
+ - api/.next
512
+ - api/dist
513
+ expire_in: 1 day
514
+ when: always
515
+ reports: {}
516
+ rules:
517
+ - if: $CI_MERGE_REQUEST_ID
518
+ needs: []
519
+ retry: *a1
520
+ interruptible: true
521
+ 'api ๐Ÿ”จ docker | review ':
522
+ stage: build
523
+ image: path/to/docker/docker-build:the-version
524
+ services:
525
+ - name: docker:24.0.6-dind
526
+ command:
527
+ - --tls=false
528
+ variables:
529
+ DOCKER_HOST: tcp://0.0.0.0:2375
530
+ DOCKER_TLS_CERTDIR: ''
531
+ DOCKER_DRIVER: overlay2
532
+ DOCKER_BUILDKIT: '1'
533
+ KUBERNETES_CPU_REQUEST: '0.45'
534
+ KUBERNETES_MEMORY_REQUEST: 1Gi
535
+ KUBERNETES_MEMORY_LIMIT: 2Gi
536
+ script:
537
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
538
+ - export APP_DIR="api"
539
+ - export DOCKER_BUILD_CONTEXT="."
540
+ - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
541
+ - export DOCKER_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/api/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })"
542
+ - export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api"
543
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
544
+ - |-
545
+ export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
546
+ RUN yarn plugin import workspace-tools
547
+ RUN yarn workspaces focus --production && yarn rebuild"
548
+ - |-
549
+ export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node api/package.json /app/api/package.json
550
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
551
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
552
+ COPY --chown=node:node .yarn /app/.yarn"
553
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
554
+ - ensureNodeDockerfile
555
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
556
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_review_api_GCLOUD_DEPLOY_credentialsKey")
557
+ - gcloud auth configure-docker europe-west6-docker.pkg.dev
558
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
559
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
560
+ - 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
561
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
562
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
563
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
564
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
565
+ - docker push $DOCKER_CACHE_IMAGE
566
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
567
+ cache:
568
+ - key: api-yarn
569
+ policy: pull
570
+ paths:
571
+ - api/.yarn
572
+ rules:
573
+ - if: $CI_MERGE_REQUEST_ID
574
+ needs:
575
+ - 'api ๐Ÿ”จ app | review '
576
+ retry: *a1
577
+ interruptible: true
578
+ 'api ๐Ÿงพ sbom | review ':
579
+ stage: build
580
+ image: aquasec/trivy:0.38.3
581
+ variables: {}
582
+ script:
583
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
584
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
585
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" api
586
+ artifacts:
587
+ paths:
588
+ - __sbom.json
589
+ rules:
590
+ - if: $CI_MERGE_REQUEST_ID
591
+ needs: []
592
+ retry: *a1
593
+ interruptible: true
594
+ allow_failure: true
595
+ 'api ๐Ÿš€ Deploy | review ':
596
+ stage: deploy review
597
+ image: path/to/docker/gcloud:the-version
598
+ variables:
599
+ KUBERNETES_CPU_REQUEST: '0.22'
600
+ KUBERNETES_MEMORY_REQUEST: 200Mi
601
+ KUBERNETES_MEMORY_LIMIT: 400Mi
602
+ script:
603
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
604
+ - export ENV_SHORT="review"
605
+ - export APP_DIR="api"
606
+ - export ENV_TYPE="review"
607
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
608
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
609
+ - 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")"
610
+ - export HOST="$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
611
+ - export ROOT_URL="https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
612
+ - export HOST_INTERNAL="$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
613
+ - export HOST_CANONICAL="$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
614
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
615
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="google-project-id"
616
+ - export DEPLOY_CLOUD_RUN_REGION="europe-west6"
617
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_review_api_GCLOUD_DEPLOY_credentialsKey"
618
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_review_api_GCLOUD_RUN_canonicalHostSuffix"
619
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
620
+ - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
621
+ - export DOCKER_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/api/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })"
622
+ - export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api"
623
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
624
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
625
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
626
+ - echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."
627
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_review_api_GCLOUD_DEPLOY_credentialsKey")
628
+ - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe google-project-id --format="value(projectNumber)")
629
+ - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
630
+ - echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"
631
+ - echo -e "\\e[0Ksection_start:$(date +%s):writeenvvars[collapsed=true]\\r\\e[0KWrite env vars to file"
632
+ - |
633
+ cat > ____envvars.yaml <<EOF
634
+ ENV_SHORT: |-
635
+ review
636
+ APP_DIR: |-
637
+ api
638
+ ENV_TYPE: |-
639
+ review
640
+ BUILD_INFO_BUILD_ID: |-
641
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
642
+ BUILD_INFO_BUILD_TIME: |-
643
+ $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
644
+ BUILD_INFO_CURRENT_VERSION: |-
645
+ $(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/^/ /')
646
+ HOST: |-
647
+ $(printf %s "$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
648
+ ROOT_URL: |-
649
+ $(printf %s "https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
650
+ HOST_INTERNAL: |-
651
+ $(printf %s "$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
652
+ HOST_CANONICAL: |-
653
+ $(printf %s "$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
654
+ ROOT_URL_INTERNAL: |-
655
+ $(printf %s "https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
656
+ DEPLOY_CLOUD_RUN_PROJECT_ID: |-
657
+ google-project-id
658
+ DEPLOY_CLOUD_RUN_REGION: |-
659
+ europe-west6
660
+ GCLOUD_RUN_canonicalHostSuffix: |-
661
+ $(printf %s "$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | sed 's/^/ /')
662
+ _ALL_ENV_VAR_KEYS: |-
663
+ ["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_INTERNAL","HOST_CANONICAL","ROOT_URL_INTERNAL","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
910
664
 
911
- EOF
912
- ",
913
- "echo -e "\\e[0Ksection_end:$(date +%s):writeenvvars\\r\\e[0K"",
914
- "echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"",
915
- "gcloud run deploy $(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" | awk '{print tolower($0)}') --command="yarn,start" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/api/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }):$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --labels=customer-name=pan,component-name=api,app-name=test-app,env-type=review,env-name=review,build-type=node,cloud-run-service-name=$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" | awk '{print tolower($0)}') --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost",
916
- "gcloud run deploy $(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" | awk '{print tolower($0)}')-worker --command="yarn,start:worker" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/api/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }):$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --labels=customer-name=pan,component-name=api,app-name=test-app,env-type=review,env-name=review,build-type=node,cloud-run-service-name=$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" | awk '{print tolower($0)}')-worker --env-vars-file=____envvars.yaml --min-instances=1 --max-instances=1 --no-cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost",
917
- "echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"",
918
- "echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"",
919
- "gcloud run revisions list --project=google-project-id --region=europe-west6 --service=$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" | awk '{print tolower($0)}') --limit=unlimited --sort-by=metadata.creationTimestamp --format="value(name)" --filter='(status.conditions.status=False OR status.conditions.status=Unknown)' | while read -r revisionname; do gcloud run revisions delete --project=google-project-id --region=europe-west6 --quiet $revisionname ; done",
920
- "gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/api/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }) --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/api/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })@$version --quiet --delete-tags; done",
921
- "gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api@$version --quiet --delete-tags; done",
922
- "set +e",
923
- "gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/api --quiet --delete-tags",
924
- "set -e",
925
- "echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"",
926
- "echo 'Uploading SBOM to Dependency Track'",
927
- "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/api" "https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" "__sbom.json" vex.json || true",
928
- "echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env",
929
- ],
930
- "stage": "deploy review",
931
- "variables": {
932
- "KUBERNETES_CPU_REQUEST": "0.22",
933
- "KUBERNETES_MEMORY_LIMIT": "400Mi",
934
- "KUBERNETES_MEMORY_REQUEST": "200Mi",
935
- },
936
- },
937
- "api ๐Ÿ›‘ Stop โš ๏ธ | review ": {
938
- "allow_failure": true,
939
- "artifacts": {
940
- "reports": {
941
- "dotenv": "gitlab_environment.env",
942
- },
943
- },
944
- "environment": {
945
- "action": "stop",
946
- "name": "review/$CI_COMMIT_REF_NAME/api",
947
- "url": "$CL_GITLAB_ENVIRONMENT_URL",
948
- },
949
- "image": "path/to/docker/gcloud:the-version",
950
- "interruptible": true,
951
- "needs": [],
952
- "retry": {
953
- "max": 2,
954
- "when": [
955
- "runner_system_failure",
956
- "stuck_or_timeout_failure",
957
- ],
958
- },
959
- "rules": [
960
- {
961
- "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/",
962
- "when": "on_success",
963
- },
964
- {
965
- "when": "manual",
966
- },
967
- ],
968
- "script": [
969
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
970
- "export CLOUDSDK_CORE_DISABLE_PROMPTS="1"",
971
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
972
- "set +e",
973
- "gcloud auth activate-service-account --key-file=<(echo "$CL_review_api_GCLOUD_DEPLOY_credentialsKey")",
974
- "gcloud run services delete $(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" | awk '{print tolower($0)}') --project=google-project-id --region=europe-west6",
975
- "gcloud run services delete $(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" | awk '{print tolower($0)}')-worker --project=google-project-id --region=europe-west6",
976
- "gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/api/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }) --quiet --delete-tags",
977
- "gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api@$version --quiet --delete-tags; done",
978
- "set +e",
979
- "gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/api --quiet --delete-tags",
980
- "set -e",
981
- "echo 'Disabling component in Dependency Track'",
982
- "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/api" "https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" || true",
983
- "set -e",
984
- "echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env",
985
- ],
986
- "stage": "stop review",
987
- "variables": {
988
- "GIT_STRATEGY": "none",
989
- "KUBERNETES_CPU_REQUEST": "0.22",
990
- "KUBERNETES_MEMORY_LIMIT": "400Mi",
991
- "KUBERNETES_MEMORY_REQUEST": "200Mi",
992
- },
993
- },
994
- "api ๐Ÿ›ก audit": {
995
- "allow_failure": true,
996
- "image": "path/to/docker/jobs-default:the-version",
997
- "interruptible": true,
998
- "needs": [],
999
- "retry": {
1000
- "max": 2,
1001
- "when": [
1002
- "runner_system_failure",
1003
- "stuck_or_timeout_failure",
1004
- ],
1005
- },
1006
- "script": [
1007
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
1008
- "export APP_PATH="api"",
1009
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
1010
- "cd api",
1011
- "yarn npm audit --environment production",
1012
- ],
1013
- "stage": "test",
1014
- "variables": {
1015
- "KUBERNETES_CPU_REQUEST": "0.45",
1016
- "KUBERNETES_MEMORY_LIMIT": "4Gi",
1017
- "KUBERNETES_MEMORY_REQUEST": "1Gi",
1018
- },
1019
- },
1020
- "api ๐Ÿงช test": {
1021
- "cache": [
1022
- {
1023
- "key": "api-yarn",
1024
- "paths": [
1025
- "api/.yarn",
1026
- ],
1027
- "policy": "pull-push",
1028
- },
1029
- {
1030
- "key": "api-node-modules",
1031
- "paths": [
1032
- "api/node_modules",
1033
- ],
1034
- "policy": "pull-push",
1035
- },
1036
- ],
1037
- "image": "path/to/docker/jobs-testing-chrome:the-version",
1038
- "interruptible": true,
1039
- "needs": [],
1040
- "retry": {
1041
- "max": 2,
1042
- "when": [
1043
- "runner_system_failure",
1044
- "stuck_or_timeout_failure",
1045
- ],
1046
- },
1047
- "script": [
1048
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
1049
- "export APP_PATH="api"",
1050
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
1051
- "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
1052
- "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
1053
- "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
1054
- "echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"",
1055
- "cd api",
1056
- "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
1057
- "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
1058
- "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
1059
- "echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"",
1060
- "echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"",
1061
- "yarn install --immutable",
1062
- "echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"",
1063
- "yarn test",
1064
- ],
1065
- "stage": "test",
1066
- "variables": {
1067
- "KUBERNETES_CPU_REQUEST": "0.45",
1068
- "KUBERNETES_MEMORY_LIMIT": "4Gi",
1069
- "KUBERNETES_MEMORY_REQUEST": "1Gi",
1070
- },
1071
- },
1072
- "api ๐Ÿงพ sbom | review ": {
1073
- "allow_failure": true,
1074
- "artifacts": {
1075
- "paths": [
1076
- "__sbom.json",
1077
- ],
1078
- },
1079
- "image": "aquasec/trivy:0.38.3",
1080
- "interruptible": true,
1081
- "needs": [],
1082
- "retry": {
1083
- "max": 2,
1084
- "when": [
1085
- "runner_system_failure",
1086
- "stuck_or_timeout_failure",
1087
- ],
1088
- },
1089
- "script": [
1090
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
1091
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
1092
- "trivy fs --quiet --format cyclonedx --output "__sbom.json" api",
1093
- ],
1094
- "stage": "build",
1095
- "variables": {},
1096
- },
1097
- },
1098
- "stages": [
1099
- "setup",
1100
- "setup dev",
1101
- "setup review",
1102
- "setup stage",
1103
- "setup prod",
1104
- "test",
1105
- "test dev",
1106
- "test review",
1107
- "test stage",
1108
- "test prod",
1109
- "build",
1110
- "build dev",
1111
- "build review",
1112
- "build stage",
1113
- "build prod",
1114
- "deploy",
1115
- "deploy dev",
1116
- "deploy review",
1117
- "deploy stage",
1118
- "deploy prod",
1119
- "verify",
1120
- "verify dev",
1121
- "verify review",
1122
- "verify stage",
1123
- "verify prod",
1124
- "rollback",
1125
- "rollback dev",
1126
- "rollback review",
1127
- "rollback stage",
1128
- "rollback prod",
1129
- "stop",
1130
- "stop dev",
1131
- "stop review",
1132
- "stop stage",
1133
- "stop prod",
1134
- ],
1135
- "variables": {
1136
- "ARTIFACT_COMPRESSION_LEVEL": "fast",
1137
- "CACHE_COMPRESSION_LEVEL": "fast",
1138
- "FF_USE_FASTZIP": "true",
1139
- "GIT_DEPTH": "1",
1140
- "TRANSFER_METER_FREQUENCY": "5s",
1141
- },
1142
- "workflow": {
1143
- "rules": [
1144
- {
1145
- "if": "$CI_COMMIT_TAG",
1146
- },
1147
- {
1148
- "if": "$CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/",
1149
- "when": "never",
1150
- },
1151
- {
1152
- "if": "$CI_PIPELINE_SOURCE == "schedule"",
1153
- "when": "never",
1154
- },
1155
- {
1156
- "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+.([0-9]+|x).x$/",
1157
- },
1158
- {
1159
- "if": "$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH",
1160
- },
1161
- {
1162
- "if": "$CI_MERGE_REQUEST_ID",
1163
- },
1164
- ],
1165
- },
1166
- },
1167
- "taggedRelease": {
1168
- "image": "path/to/docker/jobs-default:the-version",
1169
- "jobs": {
1170
- "api ๐Ÿ”จ app | prod ": {
1171
- "artifacts": {
1172
- "expire_in": "1 day",
1173
- "paths": [
1174
- "api/__build_info.json",
1175
- "api/.next",
1176
- "api/dist",
1177
- ],
1178
- "reports": {
1179
- "junit": undefined,
1180
- },
1181
- "when": "always",
1182
- },
1183
- "cache": [
1184
- {
1185
- "key": "api-yarn",
1186
- "paths": [
1187
- "api/.yarn",
1188
- ],
1189
- "policy": "pull-push",
1190
- },
1191
- {
1192
- "key": "api-node-modules",
1193
- "paths": [
1194
- "api/node_modules",
1195
- ],
1196
- "policy": "pull-push",
1197
- },
1198
- {
1199
- "key": "api-next-cache",
1200
- "paths": [
1201
- "api/.next/cache",
1202
- ],
1203
- "policy": "pull-push",
1204
- },
1205
- ],
1206
- "image": "path/to/docker/jobs-default:the-version",
1207
- "interruptible": true,
1208
- "needs": [],
1209
- "retry": {
1210
- "max": 2,
1211
- "when": [
1212
- "runner_system_failure",
1213
- "stuck_or_timeout_failure",
1214
- ],
1215
- },
1216
- "script": [
1217
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
1218
- "export ENV_SHORT="prod"",
1219
- "export APP_DIR="api"",
1220
- "export ENV_TYPE="prod"",
1221
- "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
1222
- "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
1223
- "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")"",
1224
- "export HOST="$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
1225
- "export ROOT_URL="https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
1226
- "export HOST_INTERNAL="$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
1227
- "export HOST_CANONICAL="$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
1228
- "export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
1229
- "export DEPLOY_CLOUD_RUN_PROJECT_ID="google-project-id"",
1230
- "export DEPLOY_CLOUD_RUN_REGION="europe-west6"",
1231
- "export GCLOUD_DEPLOY_credentialsKey="$CL_prod_api_GCLOUD_DEPLOY_credentialsKey"",
1232
- "export GCLOUD_RUN_canonicalHostSuffix="$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix"",
1233
- "export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"",
1234
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
1235
- "echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > api/__build_info.json",
1236
- "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
1237
- "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
1238
- "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
1239
- "echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"",
1240
- "cd api",
1241
- "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
1242
- "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
1243
- "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
1244
- "echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"",
1245
- "echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"",
1246
- "yarn install --immutable",
1247
- "echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"",
1248
- "yarn build",
1249
- ],
1250
- "stage": "build",
1251
- "variables": {
1252
- "KUBERNETES_CPU_REQUEST": "0.45",
1253
- "KUBERNETES_MEMORY_LIMIT": "4Gi",
1254
- "KUBERNETES_MEMORY_REQUEST": "1Gi",
1255
- },
1256
- },
1257
- "api ๐Ÿ”จ app | stage ": {
1258
- "artifacts": {
1259
- "expire_in": "1 day",
1260
- "paths": [
1261
- "api/__build_info.json",
1262
- "api/.next",
1263
- "api/dist",
1264
- ],
1265
- "reports": {
1266
- "junit": undefined,
1267
- },
1268
- "when": "always",
1269
- },
1270
- "cache": [
1271
- {
1272
- "key": "api-yarn",
1273
- "paths": [
1274
- "api/.yarn",
1275
- ],
1276
- "policy": "pull-push",
1277
- },
1278
- {
1279
- "key": "api-node-modules",
1280
- "paths": [
1281
- "api/node_modules",
1282
- ],
1283
- "policy": "pull-push",
1284
- },
1285
- {
1286
- "key": "api-next-cache",
1287
- "paths": [
1288
- "api/.next/cache",
1289
- ],
1290
- "policy": "pull-push",
1291
- },
1292
- ],
1293
- "image": "path/to/docker/jobs-default:the-version",
1294
- "interruptible": true,
1295
- "needs": [],
1296
- "retry": {
1297
- "max": 2,
1298
- "when": [
1299
- "runner_system_failure",
1300
- "stuck_or_timeout_failure",
1301
- ],
1302
- },
1303
- "script": [
1304
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
1305
- "export ENV_SHORT="stage"",
1306
- "export APP_DIR="api"",
1307
- "export ENV_TYPE="stage"",
1308
- "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
1309
- "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
1310
- "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")"",
1311
- "export HOST="$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
1312
- "export ROOT_URL="https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
1313
- "export HOST_INTERNAL="$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
1314
- "export HOST_CANONICAL="$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
1315
- "export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
1316
- "export DEPLOY_CLOUD_RUN_PROJECT_ID="google-project-id"",
1317
- "export DEPLOY_CLOUD_RUN_REGION="europe-west6"",
1318
- "export GCLOUD_DEPLOY_credentialsKey="$CL_stage_api_GCLOUD_DEPLOY_credentialsKey"",
1319
- "export GCLOUD_RUN_canonicalHostSuffix="$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix"",
1320
- "export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"",
1321
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
1322
- "echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > api/__build_info.json",
1323
- "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
1324
- "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
1325
- "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
1326
- "echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"",
1327
- "cd api",
1328
- "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
1329
- "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
1330
- "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
1331
- "echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"",
1332
- "echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"",
1333
- "yarn install --immutable",
1334
- "echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"",
1335
- "yarn build",
1336
- ],
1337
- "stage": "build",
1338
- "variables": {
1339
- "KUBERNETES_CPU_REQUEST": "0.45",
1340
- "KUBERNETES_MEMORY_LIMIT": "4Gi",
1341
- "KUBERNETES_MEMORY_REQUEST": "1Gi",
1342
- },
1343
- },
1344
- "api ๐Ÿ”จ docker | prod ": {
1345
- "cache": [
1346
- {
1347
- "key": "api-yarn",
1348
- "paths": [
1349
- "api/.yarn",
1350
- ],
1351
- "policy": "pull",
1352
- },
1353
- ],
1354
- "image": "path/to/docker/docker-build:the-version",
1355
- "interruptible": true,
1356
- "needs": [
1357
- "api ๐Ÿ”จ app | prod ",
1358
- ],
1359
- "retry": {
1360
- "max": 2,
1361
- "when": [
1362
- "runner_system_failure",
1363
- "stuck_or_timeout_failure",
1364
- ],
1365
- },
1366
- "script": [
1367
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
1368
- "export APP_DIR="api"",
1369
- "export DOCKER_BUILD_CONTEXT="."",
1370
- "export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"",
1371
- "export DOCKER_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/prod/api"",
1372
- "export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api"",
1373
- "export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"",
1374
- "export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
1375
- RUN yarn plugin import workspace-tools
1376
- RUN yarn workspaces focus --production && yarn rebuild"",
1377
- "export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node api/package.json /app/api/package.json
1378
- COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
1379
- COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
1380
- COPY --chown=node:node .yarn /app/.yarn"",
1381
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
1382
- "ensureNodeDockerfile",
1383
- "echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"",
1384
- "gcloud auth activate-service-account --key-file=<(echo "$CL_prod_api_GCLOUD_DEPLOY_credentialsKey")",
1385
- "gcloud auth configure-docker europe-west6-docker.pkg.dev",
1386
- "echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"",
1387
- "echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"",
1388
- "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",
1389
- "echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"",
1390
- "echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"",
1391
- "docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
1392
- "docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE",
1393
- "docker push $DOCKER_CACHE_IMAGE",
1394
- "echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"",
1395
- ],
1396
- "services": [
1397
- {
1398
- "command": [
1399
- "--tls=false",
1400
- ],
1401
- "name": "docker:24.0.6-dind",
1402
- },
1403
- ],
1404
- "stage": "build",
1405
- "variables": {
1406
- "DOCKER_BUILDKIT": "1",
1407
- "DOCKER_DRIVER": "overlay2",
1408
- "DOCKER_HOST": "tcp://0.0.0.0:2375",
1409
- "DOCKER_TLS_CERTDIR": "",
1410
- "KUBERNETES_CPU_REQUEST": "0.45",
1411
- "KUBERNETES_MEMORY_LIMIT": "2Gi",
1412
- "KUBERNETES_MEMORY_REQUEST": "1Gi",
1413
- },
1414
- },
1415
- "api ๐Ÿ”จ docker | stage ": {
1416
- "cache": [
1417
- {
1418
- "key": "api-yarn",
1419
- "paths": [
1420
- "api/.yarn",
1421
- ],
1422
- "policy": "pull",
1423
- },
1424
- ],
1425
- "image": "path/to/docker/docker-build:the-version",
1426
- "interruptible": true,
1427
- "needs": [
1428
- "api ๐Ÿ”จ app | stage ",
1429
- ],
1430
- "retry": {
1431
- "max": 2,
1432
- "when": [
1433
- "runner_system_failure",
1434
- "stuck_or_timeout_failure",
1435
- ],
1436
- },
1437
- "script": [
1438
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
1439
- "export APP_DIR="api"",
1440
- "export DOCKER_BUILD_CONTEXT="."",
1441
- "export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"",
1442
- "export DOCKER_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/stage/api"",
1443
- "export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api"",
1444
- "export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"",
1445
- "export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
1446
- RUN yarn plugin import workspace-tools
1447
- RUN yarn workspaces focus --production && yarn rebuild"",
1448
- "export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node api/package.json /app/api/package.json
1449
- COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
1450
- COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
1451
- COPY --chown=node:node .yarn /app/.yarn"",
1452
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
1453
- "ensureNodeDockerfile",
1454
- "echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"",
1455
- "gcloud auth activate-service-account --key-file=<(echo "$CL_stage_api_GCLOUD_DEPLOY_credentialsKey")",
1456
- "gcloud auth configure-docker europe-west6-docker.pkg.dev",
1457
- "echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"",
1458
- "echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"",
1459
- "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",
1460
- "echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"",
1461
- "echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"",
1462
- "docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
1463
- "docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE",
1464
- "docker push $DOCKER_CACHE_IMAGE",
1465
- "echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"",
1466
- ],
1467
- "services": [
1468
- {
1469
- "command": [
1470
- "--tls=false",
1471
- ],
1472
- "name": "docker:24.0.6-dind",
1473
- },
1474
- ],
1475
- "stage": "build",
1476
- "variables": {
1477
- "DOCKER_BUILDKIT": "1",
1478
- "DOCKER_DRIVER": "overlay2",
1479
- "DOCKER_HOST": "tcp://0.0.0.0:2375",
1480
- "DOCKER_TLS_CERTDIR": "",
1481
- "KUBERNETES_CPU_REQUEST": "0.45",
1482
- "KUBERNETES_MEMORY_LIMIT": "2Gi",
1483
- "KUBERNETES_MEMORY_REQUEST": "1Gi",
1484
- },
1485
- },
1486
- "api ๐Ÿš€ Deploy | prod ": {
1487
- "allow_failure": true,
1488
- "artifacts": {
1489
- "reports": {
1490
- "dotenv": "gitlab_environment.env",
1491
- },
1492
- },
1493
- "environment": {
1494
- "auto_stop_in": undefined,
1495
- "name": "prod/api",
1496
- "on_stop": "api ๐Ÿ›‘ Stop โš ๏ธ | prod ",
1497
- "url": "$CL_GITLAB_ENVIRONMENT_URL",
1498
- },
1499
- "image": "path/to/docker/gcloud:the-version",
1500
- "interruptible": true,
1501
- "needs": [
1502
- {
1503
- "artifacts": false,
1504
- "job": "api ๐Ÿ”จ app | prod ",
1505
- },
1506
- {
1507
- "artifacts": false,
1508
- "job": "api ๐Ÿ”จ docker | prod ",
1509
- },
1510
- {
1511
- "artifacts": true,
1512
- "job": "api ๐Ÿงพ sbom | prod ",
1513
- },
1514
- ],
1515
- "retry": {
1516
- "max": 2,
1517
- "when": [
1518
- "runner_system_failure",
1519
- "stuck_or_timeout_failure",
1520
- ],
1521
- },
1522
- "rules": [
1523
- {
1524
- "when": "manual",
1525
- },
1526
- ],
1527
- "script": [
1528
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
1529
- "export ENV_SHORT="prod"",
1530
- "export APP_DIR="api"",
1531
- "export ENV_TYPE="prod"",
1532
- "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
1533
- "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
1534
- "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")"",
1535
- "export HOST="$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
1536
- "export ROOT_URL="https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
1537
- "export HOST_INTERNAL="$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
1538
- "export HOST_CANONICAL="$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
1539
- "export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
1540
- "export DEPLOY_CLOUD_RUN_PROJECT_ID="google-project-id"",
1541
- "export DEPLOY_CLOUD_RUN_REGION="europe-west6"",
1542
- "export GCLOUD_DEPLOY_credentialsKey="$CL_prod_api_GCLOUD_DEPLOY_credentialsKey"",
1543
- "export GCLOUD_RUN_canonicalHostSuffix="$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix"",
1544
- "export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"",
1545
- "export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"",
1546
- "export DOCKER_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/prod/api"",
1547
- "export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api"",
1548
- "export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"",
1549
- "export CLOUDSDK_CORE_DISABLE_PROMPTS="1"",
1550
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
1551
- "echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."",
1552
- "gcloud auth activate-service-account --key-file=<(echo "$CL_prod_api_GCLOUD_DEPLOY_credentialsKey")",
1553
- "export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe google-project-id --format="value(projectNumber)")",
1554
- "echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"",
1555
- "echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"",
1556
- "echo -e "\\e[0Ksection_start:$(date +%s):writeenvvars[collapsed=true]\\r\\e[0KWrite env vars to file"",
1557
- "cat > ____envvars.yaml <<EOF
1558
- ENV_SHORT: |-
1559
- prod
1560
- APP_DIR: |-
1561
- api
1562
- ENV_TYPE: |-
1563
- prod
1564
- BUILD_INFO_BUILD_ID: |-
1565
- $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
1566
- BUILD_INFO_BUILD_TIME: |-
1567
- $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
1568
- BUILD_INFO_CURRENT_VERSION: |-
1569
- $(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/^/ /')
1570
- HOST: |-
1571
- $(printf %s "$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1572
- ROOT_URL: |-
1573
- $(printf %s "https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1574
- HOST_INTERNAL: |-
1575
- $(printf %s "$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1576
- HOST_CANONICAL: |-
1577
- $(printf %s "$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1578
- ROOT_URL_INTERNAL: |-
1579
- $(printf %s "https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1580
- DEPLOY_CLOUD_RUN_PROJECT_ID: |-
1581
- google-project-id
1582
- DEPLOY_CLOUD_RUN_REGION: |-
1583
- europe-west6
1584
- GCLOUD_RUN_canonicalHostSuffix: |-
1585
- $(printf %s "$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | sed 's/^/ /')
1586
- _ALL_ENV_VAR_KEYS: |-
1587
- ["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_INTERNAL","HOST_CANONICAL","ROOT_URL_INTERNAL","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
665
+ EOF
666
+ - echo -e "\\e[0Ksection_end:$(date +%s):writeenvvars\\r\\e[0K"
667
+ - echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"
668
+ - gcloud run deploy $(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" | awk '{print tolower($0)}') --command="yarn,start" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/api/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }):$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --labels=customer-name=pan,component-name=api,app-name=test-app,env-type=review,env-name=review,build-type=node,cloud-run-service-name=$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" | awk '{print tolower($0)}') --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost
669
+ - gcloud run deploy $(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" | awk '{print tolower($0)}')-worker --command="yarn,start:worker" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/api/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }):$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --labels=customer-name=pan,component-name=api,app-name=test-app,env-type=review,env-name=review,build-type=node,cloud-run-service-name=$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" | awk '{print tolower($0)}')-worker --env-vars-file=____envvars.yaml --min-instances=1 --max-instances=1 --no-cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost
670
+ - echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"
671
+ - echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"
672
+ - gcloud run revisions list --project=google-project-id --region=europe-west6 --service=$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" | awk '{print tolower($0)}') --limit=unlimited --sort-by=metadata.creationTimestamp --format="value(name)" --filter='(status.conditions.status=False OR status.conditions.status=Unknown)' | while read -r revisionname; do gcloud run revisions delete --project=google-project-id --region=europe-west6 --quiet $revisionname ; done
673
+ - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/api/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }) --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/api/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })@$version --quiet --delete-tags; done
674
+ - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api@$version --quiet --delete-tags; done
675
+ - set +e
676
+ - gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/api --quiet --delete-tags
677
+ - set -e
678
+ - echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"
679
+ - echo 'Uploading SBOM to Dependency Track'
680
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/api" "https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" "__sbom.json" vex.json || true
681
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
682
+ environment:
683
+ name: review/$CI_COMMIT_REF_NAME/api
684
+ url: $CL_GITLAB_ENVIRONMENT_URL
685
+ on_stop: 'api ๐Ÿ›‘ Stop โš ๏ธ | review '
686
+ auto_stop_in: 1 week
687
+ artifacts:
688
+ reports:
689
+ dotenv: gitlab_environment.env
690
+ rules:
691
+ - when: on_success
692
+ if: $CI_MERGE_REQUEST_ID
693
+ needs:
694
+ - job: api ๐Ÿ‘ฎ lint
695
+ artifacts: false
696
+ - job: 'api ๐Ÿ”จ app | review '
697
+ artifacts: false
698
+ - job: 'api ๐Ÿ”จ docker | review '
699
+ artifacts: false
700
+ - job: api ๐Ÿงช test
701
+ artifacts: false
702
+ - job: 'api ๐Ÿงพ sbom | review '
703
+ artifacts: true
704
+ - job: api ๐Ÿ›ก audit
705
+ artifacts: false
706
+ retry: *a1
707
+ interruptible: true
708
+ allow_failure: false
709
+ 'api ๐Ÿ›‘ Stop โš ๏ธ | review ':
710
+ stage: stop review
711
+ image: path/to/docker/gcloud:the-version
712
+ variables:
713
+ KUBERNETES_CPU_REQUEST: '0.22'
714
+ KUBERNETES_MEMORY_REQUEST: 200Mi
715
+ KUBERNETES_MEMORY_LIMIT: 400Mi
716
+ GIT_STRATEGY: none
717
+ script:
718
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
719
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
720
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
721
+ - set +e
722
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_review_api_GCLOUD_DEPLOY_credentialsKey")
723
+ - gcloud run services delete $(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" | awk '{print tolower($0)}') --project=google-project-id --region=europe-west6
724
+ - gcloud run services delete $(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" | awk '{print tolower($0)}')-worker --project=google-project-id --region=europe-west6
725
+ - gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/api/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }) --quiet --delete-tags
726
+ - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api@$version --quiet --delete-tags; done
727
+ - set +e
728
+ - gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/api --quiet --delete-tags
729
+ - set -e
730
+ - echo 'Disabling component in Dependency Track'
731
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/api" "https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" || true
732
+ - set -e
733
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
734
+ environment:
735
+ name: review/$CI_COMMIT_REF_NAME/api
736
+ url: $CL_GITLAB_ENVIRONMENT_URL
737
+ action: stop
738
+ artifacts:
739
+ reports:
740
+ dotenv: gitlab_environment.env
741
+ rules:
742
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
743
+ when: on_success
744
+ - when: manual
745
+ if: $CI_MERGE_REQUEST_ID
746
+ needs: []
747
+ retry: *a1
748
+ interruptible: true
749
+ allow_failure: true
750
+ 'api ๐Ÿ”จ app | stage ':
751
+ stage: build
752
+ image: path/to/docker/jobs-default:the-version
753
+ variables:
754
+ KUBERNETES_CPU_REQUEST: '0.45'
755
+ KUBERNETES_MEMORY_REQUEST: 1Gi
756
+ KUBERNETES_MEMORY_LIMIT: 4Gi
757
+ script:
758
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
759
+ - export ENV_SHORT="stage"
760
+ - export APP_DIR="api"
761
+ - export ENV_TYPE="stage"
762
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
763
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
764
+ - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
765
+ - export HOST="$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
766
+ - export ROOT_URL="https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
767
+ - export HOST_INTERNAL="$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
768
+ - export HOST_CANONICAL="$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
769
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
770
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="google-project-id"
771
+ - export DEPLOY_CLOUD_RUN_REGION="europe-west6"
772
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_stage_api_GCLOUD_DEPLOY_credentialsKey"
773
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix"
774
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
775
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
776
+ - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > api/__build_info.json
777
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
778
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
779
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
780
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
781
+ - cd api
782
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
783
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
784
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
785
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
786
+ - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
787
+ - yarn install --immutable
788
+ - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
789
+ - yarn build
790
+ cache:
791
+ - key: api-yarn
792
+ policy: pull-push
793
+ paths:
794
+ - api/.yarn
795
+ - key: api-node-modules
796
+ policy: pull-push
797
+ paths:
798
+ - api/node_modules
799
+ - key: api-next-cache
800
+ policy: pull-push
801
+ paths:
802
+ - api/.next/cache
803
+ artifacts:
804
+ paths:
805
+ - api/__build_info.json
806
+ - api/.next
807
+ - api/dist
808
+ expire_in: 1 day
809
+ when: always
810
+ reports: {}
811
+ rules:
812
+ - if: $CI_COMMIT_TAG
813
+ needs: []
814
+ retry: *a1
815
+ interruptible: true
816
+ 'api ๐Ÿ”จ docker | stage ':
817
+ stage: build
818
+ image: path/to/docker/docker-build:the-version
819
+ services:
820
+ - name: docker:24.0.6-dind
821
+ command:
822
+ - --tls=false
823
+ variables:
824
+ DOCKER_HOST: tcp://0.0.0.0:2375
825
+ DOCKER_TLS_CERTDIR: ''
826
+ DOCKER_DRIVER: overlay2
827
+ DOCKER_BUILDKIT: '1'
828
+ KUBERNETES_CPU_REQUEST: '0.45'
829
+ KUBERNETES_MEMORY_REQUEST: 1Gi
830
+ KUBERNETES_MEMORY_LIMIT: 2Gi
831
+ script:
832
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
833
+ - export APP_DIR="api"
834
+ - export DOCKER_BUILD_CONTEXT="."
835
+ - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
836
+ - export DOCKER_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/stage/api"
837
+ - export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api"
838
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
839
+ - |-
840
+ export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
841
+ RUN yarn plugin import workspace-tools
842
+ RUN yarn workspaces focus --production && yarn rebuild"
843
+ - |-
844
+ export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node api/package.json /app/api/package.json
845
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
846
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
847
+ COPY --chown=node:node .yarn /app/.yarn"
848
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
849
+ - ensureNodeDockerfile
850
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
851
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_stage_api_GCLOUD_DEPLOY_credentialsKey")
852
+ - gcloud auth configure-docker europe-west6-docker.pkg.dev
853
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
854
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
855
+ - 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
856
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
857
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
858
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
859
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
860
+ - docker push $DOCKER_CACHE_IMAGE
861
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
862
+ cache:
863
+ - key: api-yarn
864
+ policy: pull
865
+ paths:
866
+ - api/.yarn
867
+ rules:
868
+ - if: $CI_COMMIT_TAG
869
+ needs:
870
+ - 'api ๐Ÿ”จ app | stage '
871
+ retry: *a1
872
+ interruptible: true
873
+ 'api ๐Ÿงพ sbom | stage ':
874
+ stage: build
875
+ image: aquasec/trivy:0.38.3
876
+ variables: {}
877
+ script:
878
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
879
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
880
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" api
881
+ artifacts:
882
+ paths:
883
+ - __sbom.json
884
+ rules:
885
+ - if: $CI_COMMIT_TAG
886
+ needs: []
887
+ retry: *a1
888
+ interruptible: true
889
+ allow_failure: true
890
+ 'api ๐Ÿš€ Deploy | stage ':
891
+ stage: deploy stage
892
+ image: path/to/docker/gcloud:the-version
893
+ variables:
894
+ KUBERNETES_CPU_REQUEST: '0.22'
895
+ KUBERNETES_MEMORY_REQUEST: 200Mi
896
+ KUBERNETES_MEMORY_LIMIT: 400Mi
897
+ script:
898
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
899
+ - export ENV_SHORT="stage"
900
+ - export APP_DIR="api"
901
+ - export ENV_TYPE="stage"
902
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
903
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
904
+ - 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")"
905
+ - export HOST="$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
906
+ - export ROOT_URL="https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
907
+ - export HOST_INTERNAL="$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
908
+ - export HOST_CANONICAL="$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
909
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
910
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="google-project-id"
911
+ - export DEPLOY_CLOUD_RUN_REGION="europe-west6"
912
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_stage_api_GCLOUD_DEPLOY_credentialsKey"
913
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix"
914
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
915
+ - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
916
+ - export DOCKER_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/stage/api"
917
+ - export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api"
918
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
919
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
920
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
921
+ - echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."
922
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_stage_api_GCLOUD_DEPLOY_credentialsKey")
923
+ - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe google-project-id --format="value(projectNumber)")
924
+ - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
925
+ - echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"
926
+ - echo -e "\\e[0Ksection_start:$(date +%s):writeenvvars[collapsed=true]\\r\\e[0KWrite env vars to file"
927
+ - |
928
+ cat > ____envvars.yaml <<EOF
929
+ ENV_SHORT: |-
930
+ stage
931
+ APP_DIR: |-
932
+ api
933
+ ENV_TYPE: |-
934
+ stage
935
+ BUILD_INFO_BUILD_ID: |-
936
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
937
+ BUILD_INFO_BUILD_TIME: |-
938
+ $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
939
+ BUILD_INFO_CURRENT_VERSION: |-
940
+ $(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/^/ /')
941
+ HOST: |-
942
+ $(printf %s "$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
943
+ ROOT_URL: |-
944
+ $(printf %s "https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
945
+ HOST_INTERNAL: |-
946
+ $(printf %s "$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
947
+ HOST_CANONICAL: |-
948
+ $(printf %s "$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
949
+ ROOT_URL_INTERNAL: |-
950
+ $(printf %s "https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
951
+ DEPLOY_CLOUD_RUN_PROJECT_ID: |-
952
+ google-project-id
953
+ DEPLOY_CLOUD_RUN_REGION: |-
954
+ europe-west6
955
+ GCLOUD_RUN_canonicalHostSuffix: |-
956
+ $(printf %s "$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | sed 's/^/ /')
957
+ _ALL_ENV_VAR_KEYS: |-
958
+ ["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_INTERNAL","HOST_CANONICAL","ROOT_URL_INTERNAL","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
1588
959
 
1589
- EOF
1590
- ",
1591
- "echo -e "\\e[0Ksection_end:$(date +%s):writeenvvars\\r\\e[0K"",
1592
- "echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"",
1593
- "gcloud run deploy pan-test-app-prod-api --command="yarn,start" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/prod/api:$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --labels=customer-name=pan,component-name=api,app-name=test-app,env-type=prod,env-name=prod,build-type=node,cloud-run-service-name=pan-test-app-prod-api --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost",
1594
- "gcloud run deploy pan-test-app-prod-api-worker --command="yarn,start:worker" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/prod/api:$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --labels=customer-name=pan,component-name=api,app-name=test-app,env-type=prod,env-name=prod,build-type=node,cloud-run-service-name=pan-test-app-prod-api-worker --env-vars-file=____envvars.yaml --min-instances=1 --max-instances=1 --no-cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost",
1595
- "echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"",
1596
- "echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"",
1597
- "gcloud run revisions list --project=google-project-id --region=europe-west6 --service=pan-test-app-prod-api --limit=unlimited --sort-by=metadata.creationTimestamp --format="value(name)" --filter='(status.conditions.status=False OR status.conditions.status=Unknown)' | tail -n +6 | while read -r revisionname; do gcloud run revisions delete --project=google-project-id --region=europe-west6 --quiet $revisionname ; done",
1598
- "gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/prod/api --sort-by=~CREATE_TIME --format="value(version)" | tail -n +7 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/prod/api@$version --quiet --delete-tags; done",
1599
- "gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api@$version --quiet --delete-tags; done",
1600
- "echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"",
1601
- "echo 'Uploading SBOM to Dependency Track'",
1602
- "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/api" "https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" "__sbom.json" vex.json || true",
1603
- "echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env",
1604
- ],
1605
- "stage": "deploy prod",
1606
- "variables": {
1607
- "KUBERNETES_CPU_REQUEST": "0.22",
1608
- "KUBERNETES_MEMORY_LIMIT": "400Mi",
1609
- "KUBERNETES_MEMORY_REQUEST": "200Mi",
1610
- },
1611
- },
1612
- "api ๐Ÿš€ Deploy | stage ": {
1613
- "allow_failure": false,
1614
- "artifacts": {
1615
- "reports": {
1616
- "dotenv": "gitlab_environment.env",
1617
- },
1618
- },
1619
- "environment": {
1620
- "auto_stop_in": undefined,
1621
- "name": "stage/api",
1622
- "on_stop": "api ๐Ÿ›‘ Stop โš ๏ธ | stage ",
1623
- "url": "$CL_GITLAB_ENVIRONMENT_URL",
1624
- },
1625
- "image": "path/to/docker/gcloud:the-version",
1626
- "interruptible": true,
1627
- "needs": [
1628
- {
1629
- "artifacts": false,
1630
- "job": "api ๐Ÿ”จ app | stage ",
1631
- },
1632
- {
1633
- "artifacts": false,
1634
- "job": "api ๐Ÿ”จ docker | stage ",
1635
- },
1636
- {
1637
- "artifacts": true,
1638
- "job": "api ๐Ÿงพ sbom | stage ",
1639
- },
1640
- ],
1641
- "retry": {
1642
- "max": 2,
1643
- "when": [
1644
- "runner_system_failure",
1645
- "stuck_or_timeout_failure",
1646
- ],
1647
- },
1648
- "rules": [
1649
- {
1650
- "when": "on_success",
1651
- },
1652
- ],
1653
- "script": [
1654
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
1655
- "export ENV_SHORT="stage"",
1656
- "export APP_DIR="api"",
1657
- "export ENV_TYPE="stage"",
1658
- "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
1659
- "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
1660
- "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")"",
1661
- "export HOST="$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
1662
- "export ROOT_URL="https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
1663
- "export HOST_INTERNAL="$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
1664
- "export HOST_CANONICAL="$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
1665
- "export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
1666
- "export DEPLOY_CLOUD_RUN_PROJECT_ID="google-project-id"",
1667
- "export DEPLOY_CLOUD_RUN_REGION="europe-west6"",
1668
- "export GCLOUD_DEPLOY_credentialsKey="$CL_stage_api_GCLOUD_DEPLOY_credentialsKey"",
1669
- "export GCLOUD_RUN_canonicalHostSuffix="$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix"",
1670
- "export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"",
1671
- "export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"",
1672
- "export DOCKER_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/stage/api"",
1673
- "export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api"",
1674
- "export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"",
1675
- "export CLOUDSDK_CORE_DISABLE_PROMPTS="1"",
1676
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
1677
- "echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."",
1678
- "gcloud auth activate-service-account --key-file=<(echo "$CL_stage_api_GCLOUD_DEPLOY_credentialsKey")",
1679
- "export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe google-project-id --format="value(projectNumber)")",
1680
- "echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"",
1681
- "echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"",
1682
- "echo -e "\\e[0Ksection_start:$(date +%s):writeenvvars[collapsed=true]\\r\\e[0KWrite env vars to file"",
1683
- "cat > ____envvars.yaml <<EOF
1684
- ENV_SHORT: |-
1685
- stage
1686
- APP_DIR: |-
1687
- api
1688
- ENV_TYPE: |-
1689
- stage
1690
- BUILD_INFO_BUILD_ID: |-
1691
- $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
1692
- BUILD_INFO_BUILD_TIME: |-
1693
- $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
1694
- BUILD_INFO_CURRENT_VERSION: |-
1695
- $(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/^/ /')
1696
- HOST: |-
1697
- $(printf %s "$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1698
- ROOT_URL: |-
1699
- $(printf %s "https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1700
- HOST_INTERNAL: |-
1701
- $(printf %s "$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1702
- HOST_CANONICAL: |-
1703
- $(printf %s "$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1704
- ROOT_URL_INTERNAL: |-
1705
- $(printf %s "https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1706
- DEPLOY_CLOUD_RUN_PROJECT_ID: |-
1707
- google-project-id
1708
- DEPLOY_CLOUD_RUN_REGION: |-
1709
- europe-west6
1710
- GCLOUD_RUN_canonicalHostSuffix: |-
1711
- $(printf %s "$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | sed 's/^/ /')
1712
- _ALL_ENV_VAR_KEYS: |-
1713
- ["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_INTERNAL","HOST_CANONICAL","ROOT_URL_INTERNAL","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
960
+ EOF
961
+ - echo -e "\\e[0Ksection_end:$(date +%s):writeenvvars\\r\\e[0K"
962
+ - echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"
963
+ - gcloud run deploy pan-test-app-stage-api --command="yarn,start" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/stage/api:$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --labels=customer-name=pan,component-name=api,app-name=test-app,env-type=stage,env-name=stage,build-type=node,cloud-run-service-name=pan-test-app-stage-api --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost
964
+ - gcloud run deploy pan-test-app-stage-api-worker --command="yarn,start:worker" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/stage/api:$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --labels=customer-name=pan,component-name=api,app-name=test-app,env-type=stage,env-name=stage,build-type=node,cloud-run-service-name=pan-test-app-stage-api-worker --env-vars-file=____envvars.yaml --min-instances=1 --max-instances=1 --no-cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost
965
+ - echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"
966
+ - echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"
967
+ - gcloud run revisions list --project=google-project-id --region=europe-west6 --service=pan-test-app-stage-api --limit=unlimited --sort-by=metadata.creationTimestamp --format="value(name)" --filter='(status.conditions.status=False OR status.conditions.status=Unknown)' | while read -r revisionname; do gcloud run revisions delete --project=google-project-id --region=europe-west6 --quiet $revisionname ; done
968
+ - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/stage/api --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/stage/api@$version --quiet --delete-tags; done
969
+ - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api@$version --quiet --delete-tags; done
970
+ - echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"
971
+ - echo 'Uploading SBOM to Dependency Track'
972
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/api" "https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" "__sbom.json" vex.json || true
973
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
974
+ environment:
975
+ name: stage/api
976
+ url: $CL_GITLAB_ENVIRONMENT_URL
977
+ on_stop: 'api ๐Ÿ›‘ Stop โš ๏ธ | stage '
978
+ artifacts:
979
+ reports:
980
+ dotenv: gitlab_environment.env
981
+ rules:
982
+ - when: on_success
983
+ if: $CI_COMMIT_TAG
984
+ needs:
985
+ - job: 'api ๐Ÿ”จ app | stage '
986
+ artifacts: false
987
+ - job: 'api ๐Ÿ”จ docker | stage '
988
+ artifacts: false
989
+ - job: 'api ๐Ÿงพ sbom | stage '
990
+ artifacts: true
991
+ retry: *a1
992
+ interruptible: true
993
+ allow_failure: false
994
+ 'api ๐Ÿ›‘ Stop โš ๏ธ | stage ':
995
+ stage: stop stage
996
+ image: path/to/docker/gcloud:the-version
997
+ variables:
998
+ KUBERNETES_CPU_REQUEST: '0.22'
999
+ KUBERNETES_MEMORY_REQUEST: 200Mi
1000
+ KUBERNETES_MEMORY_LIMIT: 400Mi
1001
+ GIT_STRATEGY: none
1002
+ script:
1003
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1004
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
1005
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1006
+ - set +e
1007
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_stage_api_GCLOUD_DEPLOY_credentialsKey")
1008
+ - gcloud run services delete pan-test-app-stage-api --project=google-project-id --region=europe-west6
1009
+ - gcloud run services delete pan-test-app-stage-api-worker --project=google-project-id --region=europe-west6
1010
+ - gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/stage/api --quiet --delete-tags
1011
+ - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api@$version --quiet --delete-tags; done
1012
+ - echo 'Disabling component in Dependency Track'
1013
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/api" "https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" || true
1014
+ - set -e
1015
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
1016
+ environment:
1017
+ name: stage/api
1018
+ url: $CL_GITLAB_ENVIRONMENT_URL
1019
+ action: stop
1020
+ artifacts:
1021
+ reports:
1022
+ dotenv: gitlab_environment.env
1023
+ rules:
1024
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
1025
+ when: on_success
1026
+ - when: manual
1027
+ if: $CI_COMMIT_TAG
1028
+ needs: []
1029
+ retry: *a1
1030
+ interruptible: true
1031
+ allow_failure: true
1032
+ 'api ๐Ÿ”จ app | prod ':
1033
+ stage: build
1034
+ image: path/to/docker/jobs-default:the-version
1035
+ variables:
1036
+ KUBERNETES_CPU_REQUEST: '0.45'
1037
+ KUBERNETES_MEMORY_REQUEST: 1Gi
1038
+ KUBERNETES_MEMORY_LIMIT: 4Gi
1039
+ script:
1040
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1041
+ - export ENV_SHORT="prod"
1042
+ - export APP_DIR="api"
1043
+ - export ENV_TYPE="prod"
1044
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1045
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1046
+ - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
1047
+ - export HOST="$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1048
+ - export ROOT_URL="https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1049
+ - export HOST_INTERNAL="$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1050
+ - export HOST_CANONICAL="$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1051
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1052
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="google-project-id"
1053
+ - export DEPLOY_CLOUD_RUN_REGION="europe-west6"
1054
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_prod_api_GCLOUD_DEPLOY_credentialsKey"
1055
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix"
1056
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
1057
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1058
+ - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > api/__build_info.json
1059
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
1060
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1061
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1062
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
1063
+ - cd api
1064
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
1065
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1066
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1067
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
1068
+ - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
1069
+ - yarn install --immutable
1070
+ - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
1071
+ - yarn build
1072
+ cache:
1073
+ - key: api-yarn
1074
+ policy: pull-push
1075
+ paths:
1076
+ - api/.yarn
1077
+ - key: api-node-modules
1078
+ policy: pull-push
1079
+ paths:
1080
+ - api/node_modules
1081
+ - key: api-next-cache
1082
+ policy: pull-push
1083
+ paths:
1084
+ - api/.next/cache
1085
+ artifacts:
1086
+ paths:
1087
+ - api/__build_info.json
1088
+ - api/.next
1089
+ - api/dist
1090
+ expire_in: 1 day
1091
+ when: always
1092
+ reports: {}
1093
+ rules:
1094
+ - if: $CI_COMMIT_TAG
1095
+ needs: []
1096
+ retry: *a1
1097
+ interruptible: true
1098
+ 'api ๐Ÿ”จ docker | prod ':
1099
+ stage: build
1100
+ image: path/to/docker/docker-build:the-version
1101
+ services:
1102
+ - name: docker:24.0.6-dind
1103
+ command:
1104
+ - --tls=false
1105
+ variables:
1106
+ DOCKER_HOST: tcp://0.0.0.0:2375
1107
+ DOCKER_TLS_CERTDIR: ''
1108
+ DOCKER_DRIVER: overlay2
1109
+ DOCKER_BUILDKIT: '1'
1110
+ KUBERNETES_CPU_REQUEST: '0.45'
1111
+ KUBERNETES_MEMORY_REQUEST: 1Gi
1112
+ KUBERNETES_MEMORY_LIMIT: 2Gi
1113
+ script:
1114
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1115
+ - export APP_DIR="api"
1116
+ - export DOCKER_BUILD_CONTEXT="."
1117
+ - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
1118
+ - export DOCKER_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/prod/api"
1119
+ - export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api"
1120
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
1121
+ - |-
1122
+ export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
1123
+ RUN yarn plugin import workspace-tools
1124
+ RUN yarn workspaces focus --production && yarn rebuild"
1125
+ - |-
1126
+ export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node api/package.json /app/api/package.json
1127
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
1128
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
1129
+ COPY --chown=node:node .yarn /app/.yarn"
1130
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1131
+ - ensureNodeDockerfile
1132
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
1133
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_prod_api_GCLOUD_DEPLOY_credentialsKey")
1134
+ - gcloud auth configure-docker europe-west6-docker.pkg.dev
1135
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
1136
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
1137
+ - 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
1138
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
1139
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
1140
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
1141
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
1142
+ - docker push $DOCKER_CACHE_IMAGE
1143
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
1144
+ cache:
1145
+ - key: api-yarn
1146
+ policy: pull
1147
+ paths:
1148
+ - api/.yarn
1149
+ rules:
1150
+ - if: $CI_COMMIT_TAG
1151
+ needs:
1152
+ - 'api ๐Ÿ”จ app | prod '
1153
+ retry: *a1
1154
+ interruptible: true
1155
+ 'api ๐Ÿงพ sbom | prod ':
1156
+ stage: build
1157
+ image: aquasec/trivy:0.38.3
1158
+ variables: {}
1159
+ script:
1160
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1161
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1162
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" api
1163
+ artifacts:
1164
+ paths:
1165
+ - __sbom.json
1166
+ rules:
1167
+ - if: $CI_COMMIT_TAG
1168
+ needs: []
1169
+ retry: *a1
1170
+ interruptible: true
1171
+ allow_failure: true
1172
+ 'api ๐Ÿš€ Deploy | prod ':
1173
+ stage: deploy prod
1174
+ image: path/to/docker/gcloud:the-version
1175
+ variables:
1176
+ KUBERNETES_CPU_REQUEST: '0.22'
1177
+ KUBERNETES_MEMORY_REQUEST: 200Mi
1178
+ KUBERNETES_MEMORY_LIMIT: 400Mi
1179
+ script:
1180
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1181
+ - export ENV_SHORT="prod"
1182
+ - export APP_DIR="api"
1183
+ - export ENV_TYPE="prod"
1184
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1185
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1186
+ - 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")"
1187
+ - export HOST="$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1188
+ - export ROOT_URL="https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1189
+ - export HOST_INTERNAL="$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1190
+ - export HOST_CANONICAL="$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1191
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1192
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="google-project-id"
1193
+ - export DEPLOY_CLOUD_RUN_REGION="europe-west6"
1194
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_prod_api_GCLOUD_DEPLOY_credentialsKey"
1195
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix"
1196
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
1197
+ - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
1198
+ - export DOCKER_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/prod/api"
1199
+ - export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api"
1200
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
1201
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
1202
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1203
+ - echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."
1204
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_prod_api_GCLOUD_DEPLOY_credentialsKey")
1205
+ - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe google-project-id --format="value(projectNumber)")
1206
+ - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
1207
+ - echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"
1208
+ - echo -e "\\e[0Ksection_start:$(date +%s):writeenvvars[collapsed=true]\\r\\e[0KWrite env vars to file"
1209
+ - |
1210
+ cat > ____envvars.yaml <<EOF
1211
+ ENV_SHORT: |-
1212
+ prod
1213
+ APP_DIR: |-
1214
+ api
1215
+ ENV_TYPE: |-
1216
+ prod
1217
+ BUILD_INFO_BUILD_ID: |-
1218
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
1219
+ BUILD_INFO_BUILD_TIME: |-
1220
+ $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
1221
+ BUILD_INFO_CURRENT_VERSION: |-
1222
+ $(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/^/ /')
1223
+ HOST: |-
1224
+ $(printf %s "$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1225
+ ROOT_URL: |-
1226
+ $(printf %s "https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1227
+ HOST_INTERNAL: |-
1228
+ $(printf %s "$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1229
+ HOST_CANONICAL: |-
1230
+ $(printf %s "$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1231
+ ROOT_URL_INTERNAL: |-
1232
+ $(printf %s "https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1233
+ DEPLOY_CLOUD_RUN_PROJECT_ID: |-
1234
+ google-project-id
1235
+ DEPLOY_CLOUD_RUN_REGION: |-
1236
+ europe-west6
1237
+ GCLOUD_RUN_canonicalHostSuffix: |-
1238
+ $(printf %s "$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | sed 's/^/ /')
1239
+ _ALL_ENV_VAR_KEYS: |-
1240
+ ["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_INTERNAL","HOST_CANONICAL","ROOT_URL_INTERNAL","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
1714
1241
 
1715
- EOF
1716
- ",
1717
- "echo -e "\\e[0Ksection_end:$(date +%s):writeenvvars\\r\\e[0K"",
1718
- "echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"",
1719
- "gcloud run deploy pan-test-app-stage-api --command="yarn,start" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/stage/api:$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --labels=customer-name=pan,component-name=api,app-name=test-app,env-type=stage,env-name=stage,build-type=node,cloud-run-service-name=pan-test-app-stage-api --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost",
1720
- "gcloud run deploy pan-test-app-stage-api-worker --command="yarn,start:worker" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/stage/api:$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --labels=customer-name=pan,component-name=api,app-name=test-app,env-type=stage,env-name=stage,build-type=node,cloud-run-service-name=pan-test-app-stage-api-worker --env-vars-file=____envvars.yaml --min-instances=1 --max-instances=1 --no-cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost",
1721
- "echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"",
1722
- "echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"",
1723
- "gcloud run revisions list --project=google-project-id --region=europe-west6 --service=pan-test-app-stage-api --limit=unlimited --sort-by=metadata.creationTimestamp --format="value(name)" --filter='(status.conditions.status=False OR status.conditions.status=Unknown)' | while read -r revisionname; do gcloud run revisions delete --project=google-project-id --region=europe-west6 --quiet $revisionname ; done",
1724
- "gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/stage/api --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/stage/api@$version --quiet --delete-tags; done",
1725
- "gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api@$version --quiet --delete-tags; done",
1726
- "echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"",
1727
- "echo 'Uploading SBOM to Dependency Track'",
1728
- "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/api" "https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" "__sbom.json" vex.json || true",
1729
- "echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env",
1730
- ],
1731
- "stage": "deploy stage",
1732
- "variables": {
1733
- "KUBERNETES_CPU_REQUEST": "0.22",
1734
- "KUBERNETES_MEMORY_LIMIT": "400Mi",
1735
- "KUBERNETES_MEMORY_REQUEST": "200Mi",
1736
- },
1737
- },
1738
- "api ๐Ÿ›‘ Stop โš ๏ธ | prod ": {
1739
- "allow_failure": true,
1740
- "artifacts": {
1741
- "reports": {
1742
- "dotenv": "gitlab_environment.env",
1743
- },
1744
- },
1745
- "environment": {
1746
- "action": "stop",
1747
- "name": "prod/api",
1748
- "url": "$CL_GITLAB_ENVIRONMENT_URL",
1749
- },
1750
- "image": "path/to/docker/gcloud:the-version",
1751
- "interruptible": true,
1752
- "needs": [],
1753
- "retry": {
1754
- "max": 2,
1755
- "when": [
1756
- "runner_system_failure",
1757
- "stuck_or_timeout_failure",
1758
- ],
1759
- },
1760
- "rules": [
1761
- {
1762
- "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/",
1763
- "when": "on_success",
1764
- },
1765
- {
1766
- "when": "manual",
1767
- },
1768
- ],
1769
- "script": [
1770
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
1771
- "export CLOUDSDK_CORE_DISABLE_PROMPTS="1"",
1772
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
1773
- "set +e",
1774
- "gcloud auth activate-service-account --key-file=<(echo "$CL_prod_api_GCLOUD_DEPLOY_credentialsKey")",
1775
- "gcloud run services delete pan-test-app-prod-api --project=google-project-id --region=europe-west6",
1776
- "gcloud run services delete pan-test-app-prod-api-worker --project=google-project-id --region=europe-west6",
1777
- "gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/prod/api --quiet --delete-tags",
1778
- "gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api@$version --quiet --delete-tags; done",
1779
- "echo 'Disabling component in Dependency Track'",
1780
- "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/api" "https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" || true",
1781
- "set -e",
1782
- "echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env",
1783
- ],
1784
- "stage": "stop prod",
1785
- "variables": {
1786
- "GIT_STRATEGY": "none",
1787
- "KUBERNETES_CPU_REQUEST": "0.22",
1788
- "KUBERNETES_MEMORY_LIMIT": "400Mi",
1789
- "KUBERNETES_MEMORY_REQUEST": "200Mi",
1790
- },
1791
- },
1792
- "api ๐Ÿ›‘ Stop โš ๏ธ | stage ": {
1793
- "allow_failure": true,
1794
- "artifacts": {
1795
- "reports": {
1796
- "dotenv": "gitlab_environment.env",
1797
- },
1798
- },
1799
- "environment": {
1800
- "action": "stop",
1801
- "name": "stage/api",
1802
- "url": "$CL_GITLAB_ENVIRONMENT_URL",
1803
- },
1804
- "image": "path/to/docker/gcloud:the-version",
1805
- "interruptible": true,
1806
- "needs": [],
1807
- "retry": {
1808
- "max": 2,
1809
- "when": [
1810
- "runner_system_failure",
1811
- "stuck_or_timeout_failure",
1812
- ],
1813
- },
1814
- "rules": [
1815
- {
1816
- "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/",
1817
- "when": "on_success",
1818
- },
1819
- {
1820
- "when": "manual",
1821
- },
1822
- ],
1823
- "script": [
1824
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
1825
- "export CLOUDSDK_CORE_DISABLE_PROMPTS="1"",
1826
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
1827
- "set +e",
1828
- "gcloud auth activate-service-account --key-file=<(echo "$CL_stage_api_GCLOUD_DEPLOY_credentialsKey")",
1829
- "gcloud run services delete pan-test-app-stage-api --project=google-project-id --region=europe-west6",
1830
- "gcloud run services delete pan-test-app-stage-api-worker --project=google-project-id --region=europe-west6",
1831
- "gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/stage/api --quiet --delete-tags",
1832
- "gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api@$version --quiet --delete-tags; done",
1833
- "echo 'Disabling component in Dependency Track'",
1834
- "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/api" "https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" || true",
1835
- "set -e",
1836
- "echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env",
1837
- ],
1838
- "stage": "stop stage",
1839
- "variables": {
1840
- "GIT_STRATEGY": "none",
1841
- "KUBERNETES_CPU_REQUEST": "0.22",
1842
- "KUBERNETES_MEMORY_LIMIT": "400Mi",
1843
- "KUBERNETES_MEMORY_REQUEST": "200Mi",
1844
- },
1845
- },
1846
- "api ๐Ÿงพ sbom | prod ": {
1847
- "allow_failure": true,
1848
- "artifacts": {
1849
- "paths": [
1850
- "__sbom.json",
1851
- ],
1852
- },
1853
- "image": "aquasec/trivy:0.38.3",
1854
- "interruptible": true,
1855
- "needs": [],
1856
- "retry": {
1857
- "max": 2,
1858
- "when": [
1859
- "runner_system_failure",
1860
- "stuck_or_timeout_failure",
1861
- ],
1862
- },
1863
- "script": [
1864
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
1865
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
1866
- "trivy fs --quiet --format cyclonedx --output "__sbom.json" api",
1867
- ],
1868
- "stage": "build",
1869
- "variables": {},
1870
- },
1871
- "api ๐Ÿงพ sbom | stage ": {
1872
- "allow_failure": true,
1873
- "artifacts": {
1874
- "paths": [
1875
- "__sbom.json",
1876
- ],
1877
- },
1878
- "image": "aquasec/trivy:0.38.3",
1879
- "interruptible": true,
1880
- "needs": [],
1881
- "retry": {
1882
- "max": 2,
1883
- "when": [
1884
- "runner_system_failure",
1885
- "stuck_or_timeout_failure",
1886
- ],
1887
- },
1888
- "script": [
1889
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
1890
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
1891
- "trivy fs --quiet --format cyclonedx --output "__sbom.json" api",
1892
- ],
1893
- "stage": "build",
1894
- "variables": {},
1895
- },
1896
- },
1897
- "stages": [
1898
- "setup",
1899
- "setup dev",
1900
- "setup review",
1901
- "setup stage",
1902
- "setup prod",
1903
- "test",
1904
- "test dev",
1905
- "test review",
1906
- "test stage",
1907
- "test prod",
1908
- "build",
1909
- "build dev",
1910
- "build review",
1911
- "build stage",
1912
- "build prod",
1913
- "deploy",
1914
- "deploy dev",
1915
- "deploy review",
1916
- "deploy stage",
1917
- "deploy prod",
1918
- "verify",
1919
- "verify dev",
1920
- "verify review",
1921
- "verify stage",
1922
- "verify prod",
1923
- "rollback",
1924
- "rollback dev",
1925
- "rollback review",
1926
- "rollback stage",
1927
- "rollback prod",
1928
- "stop",
1929
- "stop dev",
1930
- "stop review",
1931
- "stop stage",
1932
- "stop prod",
1933
- ],
1934
- "variables": {
1935
- "ARTIFACT_COMPRESSION_LEVEL": "fast",
1936
- "CACHE_COMPRESSION_LEVEL": "fast",
1937
- "FF_USE_FASTZIP": "true",
1938
- "GIT_DEPTH": "1",
1939
- "TRANSFER_METER_FREQUENCY": "5s",
1940
- },
1941
- "workflow": {
1942
- "rules": [
1943
- {
1944
- "if": "$CI_COMMIT_TAG",
1945
- },
1946
- {
1947
- "if": "$CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/",
1948
- "when": "never",
1949
- },
1950
- {
1951
- "if": "$CI_PIPELINE_SOURCE == "schedule"",
1952
- "when": "never",
1953
- },
1954
- {
1955
- "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+.([0-9]+|x).x$/",
1956
- },
1957
- {
1958
- "if": "$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH",
1959
- },
1960
- {
1961
- "if": "$CI_MERGE_REQUEST_ID",
1962
- },
1963
- ],
1964
- },
1965
- },
1966
- }
1242
+ EOF
1243
+ - echo -e "\\e[0Ksection_end:$(date +%s):writeenvvars\\r\\e[0K"
1244
+ - echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"
1245
+ - gcloud run deploy pan-test-app-prod-api --command="yarn,start" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/prod/api:$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --labels=customer-name=pan,component-name=api,app-name=test-app,env-type=prod,env-name=prod,build-type=node,cloud-run-service-name=pan-test-app-prod-api --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost
1246
+ - gcloud run deploy pan-test-app-prod-api-worker --command="yarn,start:worker" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/prod/api:$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --labels=customer-name=pan,component-name=api,app-name=test-app,env-type=prod,env-name=prod,build-type=node,cloud-run-service-name=pan-test-app-prod-api-worker --env-vars-file=____envvars.yaml --min-instances=1 --max-instances=1 --no-cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost
1247
+ - echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"
1248
+ - echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"
1249
+ - gcloud run revisions list --project=google-project-id --region=europe-west6 --service=pan-test-app-prod-api --limit=unlimited --sort-by=metadata.creationTimestamp --format="value(name)" --filter='(status.conditions.status=False OR status.conditions.status=Unknown)' | tail -n +6 | while read -r revisionname; do gcloud run revisions delete --project=google-project-id --region=europe-west6 --quiet $revisionname ; done
1250
+ - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/prod/api --sort-by=~CREATE_TIME --format="value(version)" | tail -n +7 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/prod/api@$version --quiet --delete-tags; done
1251
+ - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api@$version --quiet --delete-tags; done
1252
+ - echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"
1253
+ - echo 'Uploading SBOM to Dependency Track'
1254
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/api" "https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" "__sbom.json" vex.json || true
1255
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
1256
+ environment:
1257
+ name: prod/api
1258
+ url: $CL_GITLAB_ENVIRONMENT_URL
1259
+ on_stop: 'api ๐Ÿ›‘ Stop โš ๏ธ | prod '
1260
+ artifacts:
1261
+ reports:
1262
+ dotenv: gitlab_environment.env
1263
+ rules:
1264
+ - when: manual
1265
+ if: $CI_COMMIT_TAG
1266
+ needs:
1267
+ - job: 'api ๐Ÿ”จ app | prod '
1268
+ artifacts: false
1269
+ - job: 'api ๐Ÿ”จ docker | prod '
1270
+ artifacts: false
1271
+ - job: 'api ๐Ÿงพ sbom | prod '
1272
+ artifacts: true
1273
+ retry: *a1
1274
+ interruptible: true
1275
+ allow_failure: true
1276
+ 'api ๐Ÿ›‘ Stop โš ๏ธ | prod ':
1277
+ stage: stop prod
1278
+ image: path/to/docker/gcloud:the-version
1279
+ variables:
1280
+ KUBERNETES_CPU_REQUEST: '0.22'
1281
+ KUBERNETES_MEMORY_REQUEST: 200Mi
1282
+ KUBERNETES_MEMORY_LIMIT: 400Mi
1283
+ GIT_STRATEGY: none
1284
+ script:
1285
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1286
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
1287
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1288
+ - set +e
1289
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_prod_api_GCLOUD_DEPLOY_credentialsKey")
1290
+ - gcloud run services delete pan-test-app-prod-api --project=google-project-id --region=europe-west6
1291
+ - gcloud run services delete pan-test-app-prod-api-worker --project=google-project-id --region=europe-west6
1292
+ - gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/prod/api --quiet --delete-tags
1293
+ - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api@$version --quiet --delete-tags; done
1294
+ - echo 'Disabling component in Dependency Track'
1295
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/api" "https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" || true
1296
+ - set -e
1297
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
1298
+ environment:
1299
+ name: prod/api
1300
+ url: $CL_GITLAB_ENVIRONMENT_URL
1301
+ action: stop
1302
+ artifacts:
1303
+ reports:
1304
+ dotenv: gitlab_environment.env
1305
+ rules:
1306
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
1307
+ when: on_success
1308
+ - when: manual
1309
+ if: $CI_COMMIT_TAG
1310
+ needs: []
1311
+ retry: *a1
1312
+ interruptible: true
1313
+ allow_failure: true
1314
+ create release:
1315
+ stage: release
1316
+ image: path/to/docker/semantic-release:the-version
1317
+ script:
1318
+ - semanticRelease
1319
+ after_script:
1320
+ - echo '๐Ÿ‘‰ The project access token might be invald - run \`project-renew-token\` in catladder CLI to fix.'
1321
+ rules:
1322
+ - &a2
1323
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
1324
+ when: never
1325
+ - &a3
1326
+ if: $CI_PIPELINE_SOURCE == "schedule"
1327
+ when: never
1328
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $AUTO_RELEASE == "true"
1329
+ when: on_success
1330
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
1331
+ when: manual
1332
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+.([0-9]+|x).x$/
1333
+ when: manual
1334
+ โš ๏ธ force create release:
1335
+ stage: release
1336
+ image: path/to/docker/semantic-release:the-version
1337
+ script:
1338
+ - semanticRelease
1339
+ after_script:
1340
+ - echo '๐Ÿ‘‰ The project access token might be invald - run \`project-renew-token\` in catladder CLI to fix.'
1341
+ rules:
1342
+ - *a2
1343
+ - *a3
1344
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
1345
+ when: manual
1346
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+.([0-9]+|x).x$/
1347
+ when: manual
1348
+ needs: []
1349
+ "
1967
1350
  `;