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