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