@catladder/pipeline 1.162.0 โ†’ 1.163.1

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