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