@catladder/pipeline 1.149.4 โ†’ 1.150.0

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