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