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