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