@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,1795 @@
1
1
  // Jest Snapshot v1, https://goo.gl/fbAQLP
2
2
 
3
+ exports[`matches snapshot for cloud-run-memory-limit local pipeline YAML 1`] = `
4
+ "image: path/to/docker/jobs-default:the-version
5
+ stages:
6
+ - setup
7
+ - setup dev
8
+ - setup review
9
+ - setup stage
10
+ - setup prod
11
+ - test
12
+ - test dev
13
+ - test review
14
+ - test stage
15
+ - test prod
16
+ - build
17
+ - build dev
18
+ - build review
19
+ - build stage
20
+ - build prod
21
+ - deploy
22
+ - deploy dev
23
+ - deploy review
24
+ - deploy stage
25
+ - deploy prod
26
+ - verify
27
+ - verify dev
28
+ - verify review
29
+ - verify stage
30
+ - verify prod
31
+ - rollback
32
+ - rollback dev
33
+ - rollback review
34
+ - rollback stage
35
+ - rollback prod
36
+ - stop
37
+ - stop dev
38
+ - stop review
39
+ - stop stage
40
+ - stop prod
41
+ - release
42
+ variables:
43
+ FF_USE_FASTZIP: 'true'
44
+ ARTIFACT_COMPRESSION_LEVEL: fast
45
+ CACHE_COMPRESSION_LEVEL: fast
46
+ TRANSFER_METER_FREQUENCY: 5s
47
+ GIT_DEPTH: '1'
48
+ api 🛡 audit:
49
+ stage: test
50
+ image: path/to/docker/jobs-default:the-version
51
+ variables:
52
+ KUBERNETES_CPU_REQUEST: '0.45'
53
+ KUBERNETES_MEMORY_REQUEST: 1Gi
54
+ KUBERNETES_MEMORY_LIMIT: 4Gi
55
+ script:
56
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
57
+ - export APP_PATH="api"
58
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
59
+ - cd api
60
+ - yarn npm audit --environment production
61
+ rules:
62
+ - when: never
63
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
64
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
65
+ - if: $CI_MERGE_REQUEST_ID
66
+ needs: []
67
+ retry: &a1
68
+ max: 2
69
+ when:
70
+ - runner_system_failure
71
+ - stuck_or_timeout_failure
72
+ interruptible: true
73
+ allow_failure: true
74
+ api 👮 lint:
75
+ stage: test
76
+ image: path/to/docker/jobs-default:the-version
77
+ variables:
78
+ KUBERNETES_CPU_REQUEST: '0.45'
79
+ KUBERNETES_MEMORY_REQUEST: 1Gi
80
+ KUBERNETES_MEMORY_LIMIT: 4Gi
81
+ script:
82
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
83
+ - export APP_PATH="api"
84
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
85
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
86
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
87
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
88
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
89
+ - cd api
90
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
91
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
92
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
93
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
94
+ - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
95
+ - yarn install --immutable
96
+ - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
97
+ - yarn lint
98
+ cache:
99
+ - key: api-yarn
100
+ policy: pull-push
101
+ paths:
102
+ - api/.yarn
103
+ - key: api-node-modules
104
+ policy: pull-push
105
+ paths:
106
+ - api/node_modules
107
+ rules:
108
+ - when: never
109
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
110
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
111
+ - if: $CI_MERGE_REQUEST_ID
112
+ needs: []
113
+ retry: *a1
114
+ interruptible: true
115
+ api 🧪 test:
116
+ stage: test
117
+ image: path/to/docker/jobs-testing-chrome:the-version
118
+ variables:
119
+ KUBERNETES_CPU_REQUEST: '0.45'
120
+ KUBERNETES_MEMORY_REQUEST: 1Gi
121
+ KUBERNETES_MEMORY_LIMIT: 4Gi
122
+ script:
123
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
124
+ - export APP_PATH="api"
125
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
126
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
127
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
128
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
129
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
130
+ - cd api
131
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
132
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
133
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
134
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
135
+ - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
136
+ - yarn install --immutable
137
+ - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
138
+ - yarn test
139
+ cache:
140
+ - key: api-yarn
141
+ policy: pull-push
142
+ paths:
143
+ - api/.yarn
144
+ - key: api-node-modules
145
+ policy: pull-push
146
+ paths:
147
+ - api/node_modules
148
+ rules:
149
+ - when: never
150
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
151
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
152
+ - if: $CI_MERGE_REQUEST_ID
153
+ needs: []
154
+ retry: *a1
155
+ interruptible: true
156
+ 'api 🔨 app | dev ':
157
+ stage: build
158
+ image: path/to/docker/jobs-default:the-version
159
+ variables:
160
+ KUBERNETES_CPU_REQUEST: '0.45'
161
+ KUBERNETES_MEMORY_REQUEST: 1Gi
162
+ KUBERNETES_MEMORY_LIMIT: 4Gi
163
+ script:
164
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
165
+ - export ENV_SHORT="dev"
166
+ - export APP_DIR="api"
167
+ - export ENV_TYPE="dev"
168
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
169
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
170
+ - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
171
+ - export HOST="api.dev.test-app.pan.panter.cloud"
172
+ - export ROOT_URL="https://api.dev.test-app.pan.panter.cloud"
173
+ - export HOST_INTERNAL="api.dev.test-app.pan.panter.cloud"
174
+ - export HOST_CANONICAL="api.dev.test-app.pan.panter.cloud"
175
+ - export ROOT_URL_INTERNAL="https://api.dev.test-app.pan.panter.cloud"
176
+ - export KUBE_NAMESPACE="pan-test-app-dev"
177
+ - export KUBE_APP_NAME="api"
178
+ - export KUBE_APP_NAME_PREFIX=""
179
+ - export POSTGRESQL_PASSWORD="$CL_dev_api_POSTGRESQL_PASSWORD"
180
+ - export cloudsqlProxyCredentials="$CL_dev_api_cloudsqlProxyCredentials"
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\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\"]"
182
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
183
+ - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > api/__build_info.json
184
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
185
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
186
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
187
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
188
+ - cd api
189
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
190
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
191
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
192
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
193
+ - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
194
+ - yarn install --immutable
195
+ - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
196
+ - yarn build
197
+ cache:
198
+ - key: api-yarn
199
+ policy: pull-push
200
+ paths:
201
+ - api/.yarn
202
+ - key: api-node-modules
203
+ policy: pull-push
204
+ paths:
205
+ - api/node_modules
206
+ - key: api-next-cache
207
+ policy: pull-push
208
+ paths:
209
+ - api/.next/cache
210
+ artifacts:
211
+ paths:
212
+ - api/__build_info.json
213
+ - api/.next
214
+ - api/dist
215
+ expire_in: 1 day
216
+ when: always
217
+ reports: {}
218
+ rules:
219
+ - when: never
220
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
221
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
222
+ needs: []
223
+ retry: *a1
224
+ interruptible: true
225
+ 'api 🔨 docker | dev ':
226
+ stage: build
227
+ image: path/to/docker/docker-build:the-version
228
+ services:
229
+ - name: docker:24.0.6-dind
230
+ command:
231
+ - --tls=false
232
+ variables:
233
+ DOCKER_HOST: tcp://0.0.0.0:2375
234
+ DOCKER_TLS_CERTDIR: ''
235
+ DOCKER_DRIVER: overlay2
236
+ DOCKER_BUILDKIT: '1'
237
+ KUBERNETES_CPU_REQUEST: '0.45'
238
+ KUBERNETES_MEMORY_REQUEST: 1Gi
239
+ KUBERNETES_MEMORY_LIMIT: 2Gi
240
+ script:
241
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
242
+ - export APP_DIR="api"
243
+ - export DOCKER_BUILD_CONTEXT="."
244
+ - export DOCKER_REGISTRY="$CI_REGISTRY"
245
+ - export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/api"
246
+ - export DOCKER_IMAGE_NAME="dev/api"
247
+ - export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
248
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
249
+ - |-
250
+ export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
251
+ RUN yarn plugin import workspace-tools
252
+ RUN yarn workspaces focus --production && yarn rebuild"
253
+ - |-
254
+ export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node api/package.json /app/api/package.json
255
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
256
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
257
+ COPY --chown=node:node .yarn /app/.yarn"
258
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
259
+ - ensureNodeDockerfile
260
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
261
+ - docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY
262
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
263
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
264
+ - docker build --network host --cache-from $DOCKER_CACHE_IMAGE --tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG -f $APP_DIR/Dockerfile $DOCKER_BUILD_CONTEXT --build-arg BUILDKIT_INLINE_CACHE=1
265
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
266
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
267
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
268
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
269
+ - docker push $DOCKER_CACHE_IMAGE
270
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
271
+ cache:
272
+ - key: api-yarn
273
+ policy: pull
274
+ paths:
275
+ - api/.yarn
276
+ rules:
277
+ - when: never
278
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
279
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
280
+ needs:
281
+ - 'api 🔨 app | dev '
282
+ retry: *a1
283
+ interruptible: true
284
+ 'api 🧾 sbom | dev ':
285
+ stage: build
286
+ image: aquasec/trivy:0.38.3
287
+ variables: {}
288
+ script:
289
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
290
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
291
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" api
292
+ artifacts:
293
+ paths:
294
+ - __sbom.json
295
+ rules:
296
+ - when: never
297
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
298
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
299
+ needs: []
300
+ retry: *a1
301
+ interruptible: true
302
+ allow_failure: true
303
+ 'api 🚀 Deploy | dev ':
304
+ stage: deploy dev
305
+ image: path/to/docker/kubernetes:the-version
306
+ variables:
307
+ KUBERNETES_CPU_REQUEST: '0.22'
308
+ KUBERNETES_MEMORY_REQUEST: 200Mi
309
+ KUBERNETES_MEMORY_LIMIT: 400Mi
310
+ script:
311
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
312
+ - export ENV_SHORT="dev"
313
+ - export APP_DIR="api"
314
+ - export ENV_TYPE="dev"
315
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
316
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
317
+ - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
318
+ - export HOST="api.dev.test-app.pan.panter.cloud"
319
+ - export ROOT_URL="https://api.dev.test-app.pan.panter.cloud"
320
+ - export HOST_INTERNAL="api.dev.test-app.pan.panter.cloud"
321
+ - export HOST_CANONICAL="api.dev.test-app.pan.panter.cloud"
322
+ - export ROOT_URL_INTERNAL="https://api.dev.test-app.pan.panter.cloud"
323
+ - export KUBE_NAMESPACE="pan-test-app-dev"
324
+ - export KUBE_APP_NAME="api"
325
+ - export KUBE_APP_NAME_PREFIX=""
326
+ - export POSTGRESQL_PASSWORD="$CL_dev_api_POSTGRESQL_PASSWORD"
327
+ - export cloudsqlProxyCredentials="$CL_dev_api_cloudsqlProxyCredentials"
328
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\"]"
329
+ - export DOCKER_REGISTRY="$CI_REGISTRY"
330
+ - export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/api"
331
+ - export DOCKER_IMAGE_NAME="dev/api"
332
+ - export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
333
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
334
+ - export RELEASE_NAME="pan-test-app-dev-api"
335
+ - export HELM_EXPERIMENTAL_OCI="1"
336
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"
337
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
338
+ - export HELM_ARGS=""
339
+ - export COMPONENT_NAME="api"
340
+ - export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
341
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
342
+ - kubectl config set-cluster "kube-pan-test-app-dev-api" --server="$CL_dev_api_KUBE_URL" --certificate-authority <(echo $CL_dev_api_KUBE_CA_PEM | base64 -d) --embed-certs=true
343
+ - kubectl config set-credentials "kube-pan-test-app-dev-api" --token="$CL_dev_api_KUBE_TOKEN"
344
+ - kubectl config set-context "kube-pan-test-app-dev-api" --cluster="kube-pan-test-app-dev-api" --user="kube-pan-test-app-dev-api" --namespace="pan-test-app-dev"
345
+ - kubectl config use-context "kube-pan-test-app-dev-api"
346
+ - echo -e "\\e[0Ksection_start:$(date +%s):writeallvalues[collapsed=true]\\r\\e[0KWrite __all_values.yml for helm deployment"
347
+ - |
348
+ cat > __all_values.yml <<EOF
349
+ env:
350
+ secret:
351
+ POSTGRESQL_PASSWORD: |-
352
+ $(printf %s "$CL_dev_api_POSTGRESQL_PASSWORD" | sed 's/^/ /')
353
+ cloudsqlProxyCredentials: |-
354
+ $(printf %s "$CL_dev_api_cloudsqlProxyCredentials" | sed 's/^/ /')
355
+ public:
356
+ ENV_SHORT: |-
357
+ dev
358
+ APP_DIR: |-
359
+ api
360
+ ENV_TYPE: |-
361
+ dev
362
+ BUILD_INFO_BUILD_ID: |-
363
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
364
+ BUILD_INFO_BUILD_TIME: |-
365
+ $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
366
+ BUILD_INFO_CURRENT_VERSION: |-
367
+ $(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/^/ /')
368
+ HOST: |-
369
+ api.dev.test-app.pan.panter.cloud
370
+ ROOT_URL: |-
371
+ https://api.dev.test-app.pan.panter.cloud
372
+ HOST_INTERNAL: |-
373
+ api.dev.test-app.pan.panter.cloud
374
+ HOST_CANONICAL: |-
375
+ api.dev.test-app.pan.panter.cloud
376
+ ROOT_URL_INTERNAL: |-
377
+ https://api.dev.test-app.pan.panter.cloud
378
+ KUBE_NAMESPACE: |-
379
+ pan-test-app-dev
380
+ KUBE_APP_NAME: |-
381
+ api
382
+ KUBE_APP_NAME_PREFIX: ""
383
+ _ALL_ENV_VAR_KEYS: |-
384
+ ["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","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","POSTGRESQL_PASSWORD","cloudsqlProxyCredentials"]
385
+ application:
386
+ host: |-
387
+ api.dev.test-app.pan.panter.cloud
388
+ command: |-
389
+ yarn start
390
+ livenessProbe:
391
+ httpGet:
392
+ path: |-
393
+ __health
394
+ readinessProbe:
395
+ httpGet:
396
+ path: |-
397
+ __health
398
+ startupProbe:
399
+ httpGet:
400
+ path: |-
401
+ __health
402
+ cloudsql:
403
+ enabled: true
404
+ dbUser: |-
405
+ postgres
406
+ instanceConnectionName: |-
407
+ skynet-164509:europe-west6:pan-test-app-dev
408
+ proxyCredentials: |-
409
+ $CL_dev_api_cloudsqlProxyCredentials
410
+ fullDbName: |-
411
+ api
412
+
413
+ EOF
414
+ - echo -e "\\e[0Ksection_end:$(date +%s):writeallvalues\\r\\e[0K"
415
+ - kubernetesCreateSecret
416
+ - kubernetesDeploy
417
+ - echo 'Uploading SBOM to Dependency Track'
418
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/api" "https://api.dev.test-app.pan.panter.cloud" "__sbom.json" vex.json || true
419
+ - echo deployment successful 😻
420
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://api.dev.test-app.pan.panter.cloud" >> gitlab_environment.env
421
+ environment:
422
+ name: dev/api
423
+ url: $CL_GITLAB_ENVIRONMENT_URL
424
+ on_stop: 'api 🛑 Stop ⚠️ | dev '
425
+ auto_stop_in: 4 weeks
426
+ artifacts:
427
+ reports:
428
+ dotenv: gitlab_environment.env
429
+ rules:
430
+ - when: never
431
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
432
+ - when: on_success
433
+ if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
434
+ needs:
435
+ - job: api 👮 lint
436
+ artifacts: false
437
+ - job: 'api 🔨 app | dev '
438
+ artifacts: false
439
+ - job: 'api 🔨 docker | dev '
440
+ artifacts: false
441
+ - job: api 🧪 test
442
+ artifacts: false
443
+ - job: 'api 🧾 sbom | dev '
444
+ artifacts: true
445
+ - job: api 🛡 audit
446
+ artifacts: false
447
+ retry: *a1
448
+ interruptible: true
449
+ allow_failure: false
450
+ 'api 🛑 Stop ⚠️ | dev ':
451
+ stage: stop dev
452
+ image: path/to/docker/kubernetes:the-version
453
+ variables:
454
+ KUBERNETES_CPU_REQUEST: '0.22'
455
+ KUBERNETES_MEMORY_REQUEST: 200Mi
456
+ KUBERNETES_MEMORY_LIMIT: 400Mi
457
+ GIT_STRATEGY: none
458
+ script:
459
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
460
+ - export ENV_SHORT="dev"
461
+ - export APP_DIR="api"
462
+ - export ENV_TYPE="dev"
463
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
464
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
465
+ - 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")"
466
+ - export HOST="api.dev.test-app.pan.panter.cloud"
467
+ - export ROOT_URL="https://api.dev.test-app.pan.panter.cloud"
468
+ - export HOST_INTERNAL="api.dev.test-app.pan.panter.cloud"
469
+ - export HOST_CANONICAL="api.dev.test-app.pan.panter.cloud"
470
+ - export ROOT_URL_INTERNAL="https://api.dev.test-app.pan.panter.cloud"
471
+ - export KUBE_NAMESPACE="pan-test-app-dev"
472
+ - export KUBE_APP_NAME="api"
473
+ - export KUBE_APP_NAME_PREFIX=""
474
+ - export POSTGRESQL_PASSWORD="$CL_dev_api_POSTGRESQL_PASSWORD"
475
+ - export cloudsqlProxyCredentials="$CL_dev_api_cloudsqlProxyCredentials"
476
+ - 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\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\"]"
477
+ - export RELEASE_NAME="pan-test-app-dev-api"
478
+ - export HELM_EXPERIMENTAL_OCI="1"
479
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"
480
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
481
+ - export HELM_ARGS=""
482
+ - export COMPONENT_NAME="api"
483
+ - export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
484
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
485
+ - kubectl config set-cluster "kube-pan-test-app-dev-api" --server="$CL_dev_api_KUBE_URL" --certificate-authority <(echo $CL_dev_api_KUBE_CA_PEM | base64 -d) --embed-certs=true
486
+ - kubectl config set-credentials "kube-pan-test-app-dev-api" --token="$CL_dev_api_KUBE_TOKEN"
487
+ - kubectl config set-context "kube-pan-test-app-dev-api" --cluster="kube-pan-test-app-dev-api" --user="kube-pan-test-app-dev-api" --namespace="pan-test-app-dev"
488
+ - kubectl config use-context "kube-pan-test-app-dev-api"
489
+ - kubernetesDelete
490
+ - echo 'Disabling component in Dependency Track'
491
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/api" "https://api.dev.test-app.pan.panter.cloud" || true
492
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://api.dev.test-app.pan.panter.cloud" >> gitlab_environment.env
493
+ environment:
494
+ name: dev/api
495
+ url: $CL_GITLAB_ENVIRONMENT_URL
496
+ action: stop
497
+ artifacts:
498
+ reports:
499
+ dotenv: gitlab_environment.env
500
+ rules:
501
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
502
+ when: on_success
503
+ - when: never
504
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
505
+ - when: manual
506
+ if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
507
+ needs: []
508
+ retry: *a1
509
+ interruptible: true
510
+ allow_failure: true
511
+ 'api ↩️ Rollback ⚠️ | dev ':
512
+ stage: rollback dev
513
+ image: path/to/docker/kubernetes:the-version
514
+ variables:
515
+ KUBERNETES_CPU_REQUEST: '0.22'
516
+ KUBERNETES_MEMORY_REQUEST: 200Mi
517
+ KUBERNETES_MEMORY_LIMIT: 400Mi
518
+ GIT_STRATEGY: none
519
+ script:
520
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
521
+ - export ENV_SHORT="dev"
522
+ - export APP_DIR="api"
523
+ - export ENV_TYPE="dev"
524
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
525
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
526
+ - 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")"
527
+ - export HOST="api.dev.test-app.pan.panter.cloud"
528
+ - export ROOT_URL="https://api.dev.test-app.pan.panter.cloud"
529
+ - export HOST_INTERNAL="api.dev.test-app.pan.panter.cloud"
530
+ - export HOST_CANONICAL="api.dev.test-app.pan.panter.cloud"
531
+ - export ROOT_URL_INTERNAL="https://api.dev.test-app.pan.panter.cloud"
532
+ - export KUBE_NAMESPACE="pan-test-app-dev"
533
+ - export KUBE_APP_NAME="api"
534
+ - export KUBE_APP_NAME_PREFIX=""
535
+ - export POSTGRESQL_PASSWORD="$CL_dev_api_POSTGRESQL_PASSWORD"
536
+ - export cloudsqlProxyCredentials="$CL_dev_api_cloudsqlProxyCredentials"
537
+ - 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\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\"]"
538
+ - export RELEASE_NAME="pan-test-app-dev-api"
539
+ - export HELM_EXPERIMENTAL_OCI="1"
540
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"
541
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
542
+ - export HELM_ARGS=""
543
+ - export COMPONENT_NAME="api"
544
+ - export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
545
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
546
+ - kubectl config set-cluster "kube-pan-test-app-dev-api" --server="$CL_dev_api_KUBE_URL" --certificate-authority <(echo $CL_dev_api_KUBE_CA_PEM | base64 -d) --embed-certs=true
547
+ - kubectl config set-credentials "kube-pan-test-app-dev-api" --token="$CL_dev_api_KUBE_TOKEN"
548
+ - kubectl config set-context "kube-pan-test-app-dev-api" --cluster="kube-pan-test-app-dev-api" --user="kube-pan-test-app-dev-api" --namespace="pan-test-app-dev"
549
+ - kubectl config use-context "kube-pan-test-app-dev-api"
550
+ - kubernetesRollback
551
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://api.dev.test-app.pan.panter.cloud" >> gitlab_environment.env
552
+ environment:
553
+ name: dev/api
554
+ url: $CL_GITLAB_ENVIRONMENT_URL
555
+ action: access
556
+ artifacts:
557
+ reports:
558
+ dotenv: gitlab_environment.env
559
+ rules:
560
+ - when: never
561
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
562
+ - when: manual
563
+ if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
564
+ needs: []
565
+ retry: *a1
566
+ interruptible: true
567
+ allow_failure: true
568
+ 'api 🔨 app | review ':
569
+ stage: build
570
+ image: path/to/docker/jobs-default:the-version
571
+ variables:
572
+ KUBERNETES_CPU_REQUEST: '0.45'
573
+ KUBERNETES_MEMORY_REQUEST: 1Gi
574
+ KUBERNETES_MEMORY_LIMIT: 4Gi
575
+ script:
576
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
577
+ - export ENV_SHORT="review"
578
+ - export APP_DIR="api"
579
+ - export ENV_TYPE="review"
580
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
581
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
582
+ - 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")"
583
+ - export HOST="api.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
584
+ - export ROOT_URL="https://api.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
585
+ - export HOST_INTERNAL="api.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
586
+ - export HOST_CANONICAL="api.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
587
+ - export ROOT_URL_INTERNAL="https://api.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
588
+ - export KUBE_NAMESPACE="pan-test-app-review"
589
+ - export KUBE_APP_NAME="$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api"
590
+ - export KUBE_APP_NAME_PREFIX="$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-"
591
+ - export POSTGRESQL_PASSWORD="$CL_review_api_POSTGRESQL_PASSWORD"
592
+ - export cloudsqlProxyCredentials="$CL_review_api_cloudsqlProxyCredentials"
593
+ - 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\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\"]"
594
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
595
+ - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > api/__build_info.json
596
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
597
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
598
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
599
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
600
+ - cd api
601
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
602
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
603
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
604
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
605
+ - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
606
+ - yarn install --immutable
607
+ - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
608
+ - yarn build
609
+ cache:
610
+ - key: api-yarn
611
+ policy: pull-push
612
+ paths:
613
+ - api/.yarn
614
+ - key: api-node-modules
615
+ policy: pull-push
616
+ paths:
617
+ - api/node_modules
618
+ - key: api-next-cache
619
+ policy: pull-push
620
+ paths:
621
+ - api/.next/cache
622
+ artifacts:
623
+ paths:
624
+ - api/__build_info.json
625
+ - api/.next
626
+ - api/dist
627
+ expire_in: 1 day
628
+ when: always
629
+ reports: {}
630
+ rules:
631
+ - if: $CI_MERGE_REQUEST_ID
632
+ needs: []
633
+ retry: *a1
634
+ interruptible: true
635
+ 'api 🔨 docker | review ':
636
+ stage: build
637
+ image: path/to/docker/docker-build:the-version
638
+ services:
639
+ - name: docker:24.0.6-dind
640
+ command:
641
+ - --tls=false
642
+ variables:
643
+ DOCKER_HOST: tcp://0.0.0.0:2375
644
+ DOCKER_TLS_CERTDIR: ''
645
+ DOCKER_DRIVER: overlay2
646
+ DOCKER_BUILDKIT: '1'
647
+ KUBERNETES_CPU_REQUEST: '0.45'
648
+ KUBERNETES_MEMORY_REQUEST: 1Gi
649
+ KUBERNETES_MEMORY_LIMIT: 2Gi
650
+ script:
651
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
652
+ - export APP_DIR="api"
653
+ - export DOCKER_BUILD_CONTEXT="."
654
+ - export DOCKER_REGISTRY="$CI_REGISTRY"
655
+ - export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/api"
656
+ - export DOCKER_IMAGE_NAME="review/api"
657
+ - export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
658
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
659
+ - |-
660
+ export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
661
+ RUN yarn plugin import workspace-tools
662
+ RUN yarn workspaces focus --production && yarn rebuild"
663
+ - |-
664
+ export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node api/package.json /app/api/package.json
665
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
666
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
667
+ COPY --chown=node:node .yarn /app/.yarn"
668
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
669
+ - ensureNodeDockerfile
670
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
671
+ - docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY
672
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
673
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
674
+ - 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
675
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
676
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
677
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
678
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
679
+ - docker push $DOCKER_CACHE_IMAGE
680
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
681
+ cache:
682
+ - key: api-yarn
683
+ policy: pull
684
+ paths:
685
+ - api/.yarn
686
+ rules:
687
+ - if: $CI_MERGE_REQUEST_ID
688
+ needs:
689
+ - 'api 🔨 app | review '
690
+ retry: *a1
691
+ interruptible: true
692
+ 'api 🧾 sbom | review ':
693
+ stage: build
694
+ image: aquasec/trivy:0.38.3
695
+ variables: {}
696
+ script:
697
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
698
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
699
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" api
700
+ artifacts:
701
+ paths:
702
+ - __sbom.json
703
+ rules:
704
+ - if: $CI_MERGE_REQUEST_ID
705
+ needs: []
706
+ retry: *a1
707
+ interruptible: true
708
+ allow_failure: true
709
+ 'api 🚀 Deploy | review ':
710
+ stage: deploy review
711
+ image: path/to/docker/kubernetes:the-version
712
+ variables:
713
+ KUBERNETES_CPU_REQUEST: '0.22'
714
+ KUBERNETES_MEMORY_REQUEST: 200Mi
715
+ KUBERNETES_MEMORY_LIMIT: 400Mi
716
+ script:
717
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
718
+ - export ENV_SHORT="review"
719
+ - export APP_DIR="api"
720
+ - export ENV_TYPE="review"
721
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
722
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
723
+ - 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")"
724
+ - export HOST="api.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
725
+ - export ROOT_URL="https://api.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
726
+ - export HOST_INTERNAL="api.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
727
+ - export HOST_CANONICAL="api.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
728
+ - export ROOT_URL_INTERNAL="https://api.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
729
+ - export KUBE_NAMESPACE="pan-test-app-review"
730
+ - export KUBE_APP_NAME="$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api"
731
+ - export KUBE_APP_NAME_PREFIX="$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-"
732
+ - export POSTGRESQL_PASSWORD="$CL_review_api_POSTGRESQL_PASSWORD"
733
+ - export cloudsqlProxyCredentials="$CL_review_api_cloudsqlProxyCredentials"
734
+ - 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\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\"]"
735
+ - export DOCKER_REGISTRY="$CI_REGISTRY"
736
+ - export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/api"
737
+ - export DOCKER_IMAGE_NAME="review/api"
738
+ - export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
739
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
740
+ - export RELEASE_NAME="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"
741
+ - export HELM_EXPERIMENTAL_OCI="1"
742
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"
743
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
744
+ - export HELM_ARGS=""
745
+ - export COMPONENT_NAME="api"
746
+ - export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
747
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
748
+ - kubectl config set-cluster "kube-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" --server="$CL_review_api_KUBE_URL" --certificate-authority <(echo $CL_review_api_KUBE_CA_PEM | base64 -d) --embed-certs=true
749
+ - kubectl config set-credentials "kube-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" --token="$CL_review_api_KUBE_TOKEN"
750
+ - kubectl config set-context "kube-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" --cluster="kube-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" --user="kube-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" --namespace="pan-test-app-review"
751
+ - kubectl config use-context "kube-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"
752
+ - echo -e "\\e[0Ksection_start:$(date +%s):writeallvalues[collapsed=true]\\r\\e[0KWrite __all_values.yml for helm deployment"
753
+ - |
754
+ cat > __all_values.yml <<EOF
755
+ env:
756
+ secret:
757
+ POSTGRESQL_PASSWORD: |-
758
+ $(printf %s "$CL_review_api_POSTGRESQL_PASSWORD" | sed 's/^/ /')
759
+ cloudsqlProxyCredentials: |-
760
+ $(printf %s "$CL_review_api_cloudsqlProxyCredentials" | sed 's/^/ /')
761
+ public:
762
+ ENV_SHORT: |-
763
+ review
764
+ APP_DIR: |-
765
+ api
766
+ ENV_TYPE: |-
767
+ review
768
+ BUILD_INFO_BUILD_ID: |-
769
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
770
+ BUILD_INFO_BUILD_TIME: |-
771
+ $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
772
+ BUILD_INFO_CURRENT_VERSION: |-
773
+ $(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/^/ /')
774
+ HOST: |-
775
+ $(printf %s "api.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud" | sed 's/^/ /')
776
+ ROOT_URL: |-
777
+ $(printf %s "https://api.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud" | sed 's/^/ /')
778
+ HOST_INTERNAL: |-
779
+ $(printf %s "api.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud" | sed 's/^/ /')
780
+ HOST_CANONICAL: |-
781
+ $(printf %s "api.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud" | sed 's/^/ /')
782
+ ROOT_URL_INTERNAL: |-
783
+ $(printf %s "https://api.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud" | sed 's/^/ /')
784
+ KUBE_NAMESPACE: |-
785
+ pan-test-app-review
786
+ KUBE_APP_NAME: |-
787
+ $(printf %s "$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" | sed 's/^/ /')
788
+ KUBE_APP_NAME_PREFIX: |-
789
+ $(printf %s "$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-" | sed 's/^/ /')
790
+ _ALL_ENV_VAR_KEYS: |-
791
+ ["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","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","POSTGRESQL_PASSWORD","cloudsqlProxyCredentials"]
792
+ application:
793
+ host: |-
794
+ $(printf %s "api.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud" | sed 's/^/ /')
795
+ command: |-
796
+ yarn start
797
+ livenessProbe:
798
+ httpGet:
799
+ path: |-
800
+ __health
801
+ readinessProbe:
802
+ httpGet:
803
+ path: |-
804
+ __health
805
+ startupProbe:
806
+ httpGet:
807
+ path: |-
808
+ __health
809
+ cloudsql:
810
+ enabled: true
811
+ dbUser: |-
812
+ postgres
813
+ instanceConnectionName: |-
814
+ skynet-164509:europe-west6:pan-test-app-review
815
+ proxyCredentials: |-
816
+ $CL_review_api_cloudsqlProxyCredentials
817
+ fullDbName: |-
818
+ $(printf %s "$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" | sed 's/^/ /')
819
+
820
+ EOF
821
+ - echo -e "\\e[0Ksection_end:$(date +%s):writeallvalues\\r\\e[0K"
822
+ - kubernetesCreateSecret
823
+ - kubernetesDeploy
824
+ - echo 'Uploading SBOM to Dependency Track'
825
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/api" "https://api.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud" "__sbom.json" vex.json || true
826
+ - echo deployment successful 😻
827
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://api.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud" >> gitlab_environment.env
828
+ environment:
829
+ name: review/$CI_COMMIT_REF_NAME/api
830
+ url: $CL_GITLAB_ENVIRONMENT_URL
831
+ on_stop: 'api 🛑 Stop ⚠️ | review '
832
+ auto_stop_in: 1 week
833
+ artifacts:
834
+ reports:
835
+ dotenv: gitlab_environment.env
836
+ rules:
837
+ - when: on_success
838
+ if: $CI_MERGE_REQUEST_ID
839
+ needs:
840
+ - job: api 👮 lint
841
+ artifacts: false
842
+ - job: 'api 🔨 app | review '
843
+ artifacts: false
844
+ - job: 'api 🔨 docker | review '
845
+ artifacts: false
846
+ - job: api 🧪 test
847
+ artifacts: false
848
+ - job: 'api 🧾 sbom | review '
849
+ artifacts: true
850
+ - job: api 🛡 audit
851
+ artifacts: false
852
+ retry: *a1
853
+ interruptible: true
854
+ allow_failure: false
855
+ 'api 🛑 Stop ⚠️ | review ':
856
+ stage: stop review
857
+ image: path/to/docker/kubernetes:the-version
858
+ variables:
859
+ KUBERNETES_CPU_REQUEST: '0.22'
860
+ KUBERNETES_MEMORY_REQUEST: 200Mi
861
+ KUBERNETES_MEMORY_LIMIT: 400Mi
862
+ GIT_STRATEGY: none
863
+ script:
864
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
865
+ - export ENV_SHORT="review"
866
+ - export APP_DIR="api"
867
+ - export ENV_TYPE="review"
868
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
869
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
870
+ - 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")"
871
+ - export HOST="api.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
872
+ - export ROOT_URL="https://api.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
873
+ - export HOST_INTERNAL="api.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
874
+ - export HOST_CANONICAL="api.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
875
+ - export ROOT_URL_INTERNAL="https://api.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
876
+ - export KUBE_NAMESPACE="pan-test-app-review"
877
+ - export KUBE_APP_NAME="$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api"
878
+ - export KUBE_APP_NAME_PREFIX="$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-"
879
+ - export POSTGRESQL_PASSWORD="$CL_review_api_POSTGRESQL_PASSWORD"
880
+ - export cloudsqlProxyCredentials="$CL_review_api_cloudsqlProxyCredentials"
881
+ - 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\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\"]"
882
+ - export RELEASE_NAME="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"
883
+ - export HELM_EXPERIMENTAL_OCI="1"
884
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"
885
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
886
+ - export HELM_ARGS=""
887
+ - export COMPONENT_NAME="api"
888
+ - export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
889
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
890
+ - kubectl config set-cluster "kube-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" --server="$CL_review_api_KUBE_URL" --certificate-authority <(echo $CL_review_api_KUBE_CA_PEM | base64 -d) --embed-certs=true
891
+ - kubectl config set-credentials "kube-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" --token="$CL_review_api_KUBE_TOKEN"
892
+ - kubectl config set-context "kube-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" --cluster="kube-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" --user="kube-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" --namespace="pan-test-app-review"
893
+ - kubectl config use-context "kube-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"
894
+ - kubernetesDelete
895
+ - echo 'Disabling component in Dependency Track'
896
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/api" "https://api.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud" || true
897
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://api.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud" >> gitlab_environment.env
898
+ environment:
899
+ name: review/$CI_COMMIT_REF_NAME/api
900
+ url: $CL_GITLAB_ENVIRONMENT_URL
901
+ action: stop
902
+ artifacts:
903
+ reports:
904
+ dotenv: gitlab_environment.env
905
+ rules:
906
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
907
+ when: on_success
908
+ - when: manual
909
+ if: $CI_MERGE_REQUEST_ID
910
+ needs: []
911
+ retry: *a1
912
+ interruptible: true
913
+ allow_failure: true
914
+ 'api ↩️ Rollback ⚠️ | review ':
915
+ stage: rollback review
916
+ image: path/to/docker/kubernetes:the-version
917
+ variables:
918
+ KUBERNETES_CPU_REQUEST: '0.22'
919
+ KUBERNETES_MEMORY_REQUEST: 200Mi
920
+ KUBERNETES_MEMORY_LIMIT: 400Mi
921
+ GIT_STRATEGY: none
922
+ script:
923
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
924
+ - export ENV_SHORT="review"
925
+ - export APP_DIR="api"
926
+ - export ENV_TYPE="review"
927
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
928
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
929
+ - 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")"
930
+ - export HOST="api.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
931
+ - export ROOT_URL="https://api.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
932
+ - export HOST_INTERNAL="api.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
933
+ - export HOST_CANONICAL="api.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
934
+ - export ROOT_URL_INTERNAL="https://api.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
935
+ - export KUBE_NAMESPACE="pan-test-app-review"
936
+ - export KUBE_APP_NAME="$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api"
937
+ - export KUBE_APP_NAME_PREFIX="$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-"
938
+ - export POSTGRESQL_PASSWORD="$CL_review_api_POSTGRESQL_PASSWORD"
939
+ - export cloudsqlProxyCredentials="$CL_review_api_cloudsqlProxyCredentials"
940
+ - 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\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\"]"
941
+ - export RELEASE_NAME="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"
942
+ - export HELM_EXPERIMENTAL_OCI="1"
943
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"
944
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
945
+ - export HELM_ARGS=""
946
+ - export COMPONENT_NAME="api"
947
+ - export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
948
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
949
+ - kubectl config set-cluster "kube-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" --server="$CL_review_api_KUBE_URL" --certificate-authority <(echo $CL_review_api_KUBE_CA_PEM | base64 -d) --embed-certs=true
950
+ - kubectl config set-credentials "kube-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" --token="$CL_review_api_KUBE_TOKEN"
951
+ - kubectl config set-context "kube-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" --cluster="kube-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" --user="kube-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" --namespace="pan-test-app-review"
952
+ - kubectl config use-context "kube-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"
953
+ - kubernetesRollback
954
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://api.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud" >> gitlab_environment.env
955
+ environment:
956
+ name: review/$CI_COMMIT_REF_NAME/api
957
+ url: $CL_GITLAB_ENVIRONMENT_URL
958
+ action: access
959
+ artifacts:
960
+ reports:
961
+ dotenv: gitlab_environment.env
962
+ rules:
963
+ - when: manual
964
+ if: $CI_MERGE_REQUEST_ID
965
+ needs: []
966
+ retry: *a1
967
+ interruptible: true
968
+ allow_failure: true
969
+ 'api 🔨 app | stage ':
970
+ stage: build
971
+ image: path/to/docker/jobs-default:the-version
972
+ variables:
973
+ KUBERNETES_CPU_REQUEST: '0.45'
974
+ KUBERNETES_MEMORY_REQUEST: 1Gi
975
+ KUBERNETES_MEMORY_LIMIT: 4Gi
976
+ script:
977
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
978
+ - export ENV_SHORT="stage"
979
+ - export APP_DIR="api"
980
+ - export ENV_TYPE="stage"
981
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
982
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
983
+ - 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")"
984
+ - export HOST="api.stage.test-app.pan.panter.cloud"
985
+ - export ROOT_URL="https://api.stage.test-app.pan.panter.cloud"
986
+ - export HOST_INTERNAL="api.stage.test-app.pan.panter.cloud"
987
+ - export HOST_CANONICAL="api.stage.test-app.pan.panter.cloud"
988
+ - export ROOT_URL_INTERNAL="https://api.stage.test-app.pan.panter.cloud"
989
+ - export KUBE_NAMESPACE="pan-test-app-stage"
990
+ - export KUBE_APP_NAME="api"
991
+ - export KUBE_APP_NAME_PREFIX=""
992
+ - export POSTGRESQL_PASSWORD="$CL_stage_api_POSTGRESQL_PASSWORD"
993
+ - export cloudsqlProxyCredentials="$CL_stage_api_cloudsqlProxyCredentials"
994
+ - 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\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\"]"
995
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
996
+ - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > api/__build_info.json
997
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
998
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
999
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1000
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
1001
+ - cd api
1002
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
1003
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1004
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1005
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
1006
+ - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
1007
+ - yarn install --immutable
1008
+ - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
1009
+ - yarn build
1010
+ cache:
1011
+ - key: api-yarn
1012
+ policy: pull-push
1013
+ paths:
1014
+ - api/.yarn
1015
+ - key: api-node-modules
1016
+ policy: pull-push
1017
+ paths:
1018
+ - api/node_modules
1019
+ - key: api-next-cache
1020
+ policy: pull-push
1021
+ paths:
1022
+ - api/.next/cache
1023
+ artifacts:
1024
+ paths:
1025
+ - api/__build_info.json
1026
+ - api/.next
1027
+ - api/dist
1028
+ expire_in: 1 day
1029
+ when: always
1030
+ reports: {}
1031
+ rules:
1032
+ - if: $CI_COMMIT_TAG
1033
+ needs: []
1034
+ retry: *a1
1035
+ interruptible: true
1036
+ 'api 🔨 docker | stage ':
1037
+ stage: build
1038
+ image: path/to/docker/docker-build:the-version
1039
+ services:
1040
+ - name: docker:24.0.6-dind
1041
+ command:
1042
+ - --tls=false
1043
+ variables:
1044
+ DOCKER_HOST: tcp://0.0.0.0:2375
1045
+ DOCKER_TLS_CERTDIR: ''
1046
+ DOCKER_DRIVER: overlay2
1047
+ DOCKER_BUILDKIT: '1'
1048
+ KUBERNETES_CPU_REQUEST: '0.45'
1049
+ KUBERNETES_MEMORY_REQUEST: 1Gi
1050
+ KUBERNETES_MEMORY_LIMIT: 2Gi
1051
+ script:
1052
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1053
+ - export APP_DIR="api"
1054
+ - export DOCKER_BUILD_CONTEXT="."
1055
+ - export DOCKER_REGISTRY="$CI_REGISTRY"
1056
+ - export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/api"
1057
+ - export DOCKER_IMAGE_NAME="stage/api"
1058
+ - export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
1059
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
1060
+ - |-
1061
+ export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
1062
+ RUN yarn plugin import workspace-tools
1063
+ RUN yarn workspaces focus --production && yarn rebuild"
1064
+ - |-
1065
+ export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node api/package.json /app/api/package.json
1066
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
1067
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
1068
+ COPY --chown=node:node .yarn /app/.yarn"
1069
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1070
+ - ensureNodeDockerfile
1071
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
1072
+ - docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY
1073
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
1074
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
1075
+ - 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
1076
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
1077
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
1078
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
1079
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
1080
+ - docker push $DOCKER_CACHE_IMAGE
1081
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
1082
+ cache:
1083
+ - key: api-yarn
1084
+ policy: pull
1085
+ paths:
1086
+ - api/.yarn
1087
+ rules:
1088
+ - if: $CI_COMMIT_TAG
1089
+ needs:
1090
+ - 'api 🔨 app | stage '
1091
+ retry: *a1
1092
+ interruptible: true
1093
+ 'api 🧾 sbom | stage ':
1094
+ stage: build
1095
+ image: aquasec/trivy:0.38.3
1096
+ variables: {}
1097
+ script:
1098
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1099
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1100
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" api
1101
+ artifacts:
1102
+ paths:
1103
+ - __sbom.json
1104
+ rules:
1105
+ - if: $CI_COMMIT_TAG
1106
+ needs: []
1107
+ retry: *a1
1108
+ interruptible: true
1109
+ allow_failure: true
1110
+ 'api 🚀 Deploy | stage ':
1111
+ stage: deploy stage
1112
+ image: path/to/docker/kubernetes:the-version
1113
+ variables:
1114
+ KUBERNETES_CPU_REQUEST: '0.22'
1115
+ KUBERNETES_MEMORY_REQUEST: 200Mi
1116
+ KUBERNETES_MEMORY_LIMIT: 400Mi
1117
+ script:
1118
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1119
+ - export ENV_SHORT="stage"
1120
+ - export APP_DIR="api"
1121
+ - export ENV_TYPE="stage"
1122
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1123
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1124
+ - 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")"
1125
+ - export HOST="api.stage.test-app.pan.panter.cloud"
1126
+ - export ROOT_URL="https://api.stage.test-app.pan.panter.cloud"
1127
+ - export HOST_INTERNAL="api.stage.test-app.pan.panter.cloud"
1128
+ - export HOST_CANONICAL="api.stage.test-app.pan.panter.cloud"
1129
+ - export ROOT_URL_INTERNAL="https://api.stage.test-app.pan.panter.cloud"
1130
+ - export KUBE_NAMESPACE="pan-test-app-stage"
1131
+ - export KUBE_APP_NAME="api"
1132
+ - export KUBE_APP_NAME_PREFIX=""
1133
+ - export POSTGRESQL_PASSWORD="$CL_stage_api_POSTGRESQL_PASSWORD"
1134
+ - export cloudsqlProxyCredentials="$CL_stage_api_cloudsqlProxyCredentials"
1135
+ - 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\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\"]"
1136
+ - export DOCKER_REGISTRY="$CI_REGISTRY"
1137
+ - export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/api"
1138
+ - export DOCKER_IMAGE_NAME="stage/api"
1139
+ - export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
1140
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
1141
+ - export RELEASE_NAME="pan-test-app-stage-api"
1142
+ - export HELM_EXPERIMENTAL_OCI="1"
1143
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"
1144
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
1145
+ - export HELM_ARGS=""
1146
+ - export COMPONENT_NAME="api"
1147
+ - export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1148
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1149
+ - kubectl config set-cluster "kube-pan-test-app-stage-api" --server="$CL_stage_api_KUBE_URL" --certificate-authority <(echo $CL_stage_api_KUBE_CA_PEM | base64 -d) --embed-certs=true
1150
+ - kubectl config set-credentials "kube-pan-test-app-stage-api" --token="$CL_stage_api_KUBE_TOKEN"
1151
+ - kubectl config set-context "kube-pan-test-app-stage-api" --cluster="kube-pan-test-app-stage-api" --user="kube-pan-test-app-stage-api" --namespace="pan-test-app-stage"
1152
+ - kubectl config use-context "kube-pan-test-app-stage-api"
1153
+ - echo -e "\\e[0Ksection_start:$(date +%s):writeallvalues[collapsed=true]\\r\\e[0KWrite __all_values.yml for helm deployment"
1154
+ - |
1155
+ cat > __all_values.yml <<EOF
1156
+ env:
1157
+ secret:
1158
+ POSTGRESQL_PASSWORD: |-
1159
+ $(printf %s "$CL_stage_api_POSTGRESQL_PASSWORD" | sed 's/^/ /')
1160
+ cloudsqlProxyCredentials: |-
1161
+ $(printf %s "$CL_stage_api_cloudsqlProxyCredentials" | sed 's/^/ /')
1162
+ public:
1163
+ ENV_SHORT: |-
1164
+ stage
1165
+ APP_DIR: |-
1166
+ api
1167
+ ENV_TYPE: |-
1168
+ stage
1169
+ BUILD_INFO_BUILD_ID: |-
1170
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
1171
+ BUILD_INFO_BUILD_TIME: |-
1172
+ $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
1173
+ BUILD_INFO_CURRENT_VERSION: |-
1174
+ $(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/^/ /')
1175
+ HOST: |-
1176
+ api.stage.test-app.pan.panter.cloud
1177
+ ROOT_URL: |-
1178
+ https://api.stage.test-app.pan.panter.cloud
1179
+ HOST_INTERNAL: |-
1180
+ api.stage.test-app.pan.panter.cloud
1181
+ HOST_CANONICAL: |-
1182
+ api.stage.test-app.pan.panter.cloud
1183
+ ROOT_URL_INTERNAL: |-
1184
+ https://api.stage.test-app.pan.panter.cloud
1185
+ KUBE_NAMESPACE: |-
1186
+ pan-test-app-stage
1187
+ KUBE_APP_NAME: |-
1188
+ api
1189
+ KUBE_APP_NAME_PREFIX: ""
1190
+ _ALL_ENV_VAR_KEYS: |-
1191
+ ["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","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","POSTGRESQL_PASSWORD","cloudsqlProxyCredentials"]
1192
+ application:
1193
+ host: |-
1194
+ api.stage.test-app.pan.panter.cloud
1195
+ command: |-
1196
+ yarn start
1197
+ livenessProbe:
1198
+ httpGet:
1199
+ path: |-
1200
+ __health
1201
+ readinessProbe:
1202
+ httpGet:
1203
+ path: |-
1204
+ __health
1205
+ startupProbe:
1206
+ httpGet:
1207
+ path: |-
1208
+ __health
1209
+ cloudsql:
1210
+ enabled: true
1211
+ dbUser: |-
1212
+ postgres
1213
+ instanceConnectionName: |-
1214
+ skynet-164509:europe-west6:pan-test-app-stage
1215
+ proxyCredentials: |-
1216
+ $CL_stage_api_cloudsqlProxyCredentials
1217
+ fullDbName: |-
1218
+ api
1219
+
1220
+ EOF
1221
+ - echo -e "\\e[0Ksection_end:$(date +%s):writeallvalues\\r\\e[0K"
1222
+ - kubernetesCreateSecret
1223
+ - kubernetesDeploy
1224
+ - echo 'Uploading SBOM to Dependency Track'
1225
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/api" "https://api.stage.test-app.pan.panter.cloud" "__sbom.json" vex.json || true
1226
+ - echo deployment successful 😻
1227
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://api.stage.test-app.pan.panter.cloud" >> gitlab_environment.env
1228
+ environment:
1229
+ name: stage/api
1230
+ url: $CL_GITLAB_ENVIRONMENT_URL
1231
+ on_stop: 'api 🛑 Stop ⚠️ | stage '
1232
+ artifacts:
1233
+ reports:
1234
+ dotenv: gitlab_environment.env
1235
+ rules:
1236
+ - when: on_success
1237
+ if: $CI_COMMIT_TAG
1238
+ needs:
1239
+ - job: 'api 🔨 app | stage '
1240
+ artifacts: false
1241
+ - job: 'api 🔨 docker | stage '
1242
+ artifacts: false
1243
+ - job: 'api 🧾 sbom | stage '
1244
+ artifacts: true
1245
+ retry: *a1
1246
+ interruptible: true
1247
+ allow_failure: false
1248
+ 'api 🛑 Stop ⚠️ | stage ':
1249
+ stage: stop stage
1250
+ image: path/to/docker/kubernetes:the-version
1251
+ variables:
1252
+ KUBERNETES_CPU_REQUEST: '0.22'
1253
+ KUBERNETES_MEMORY_REQUEST: 200Mi
1254
+ KUBERNETES_MEMORY_LIMIT: 400Mi
1255
+ GIT_STRATEGY: none
1256
+ script:
1257
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1258
+ - export ENV_SHORT="stage"
1259
+ - export APP_DIR="api"
1260
+ - export ENV_TYPE="stage"
1261
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1262
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1263
+ - 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")"
1264
+ - export HOST="api.stage.test-app.pan.panter.cloud"
1265
+ - export ROOT_URL="https://api.stage.test-app.pan.panter.cloud"
1266
+ - export HOST_INTERNAL="api.stage.test-app.pan.panter.cloud"
1267
+ - export HOST_CANONICAL="api.stage.test-app.pan.panter.cloud"
1268
+ - export ROOT_URL_INTERNAL="https://api.stage.test-app.pan.panter.cloud"
1269
+ - export KUBE_NAMESPACE="pan-test-app-stage"
1270
+ - export KUBE_APP_NAME="api"
1271
+ - export KUBE_APP_NAME_PREFIX=""
1272
+ - export POSTGRESQL_PASSWORD="$CL_stage_api_POSTGRESQL_PASSWORD"
1273
+ - export cloudsqlProxyCredentials="$CL_stage_api_cloudsqlProxyCredentials"
1274
+ - 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\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\"]"
1275
+ - export RELEASE_NAME="pan-test-app-stage-api"
1276
+ - export HELM_EXPERIMENTAL_OCI="1"
1277
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"
1278
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
1279
+ - export HELM_ARGS=""
1280
+ - export COMPONENT_NAME="api"
1281
+ - export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1282
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1283
+ - kubectl config set-cluster "kube-pan-test-app-stage-api" --server="$CL_stage_api_KUBE_URL" --certificate-authority <(echo $CL_stage_api_KUBE_CA_PEM | base64 -d) --embed-certs=true
1284
+ - kubectl config set-credentials "kube-pan-test-app-stage-api" --token="$CL_stage_api_KUBE_TOKEN"
1285
+ - kubectl config set-context "kube-pan-test-app-stage-api" --cluster="kube-pan-test-app-stage-api" --user="kube-pan-test-app-stage-api" --namespace="pan-test-app-stage"
1286
+ - kubectl config use-context "kube-pan-test-app-stage-api"
1287
+ - kubernetesDelete
1288
+ - echo 'Disabling component in Dependency Track'
1289
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/api" "https://api.stage.test-app.pan.panter.cloud" || true
1290
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://api.stage.test-app.pan.panter.cloud" >> gitlab_environment.env
1291
+ environment:
1292
+ name: stage/api
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
+ 'api ↩️ Rollback ⚠️ | stage ':
1308
+ stage: rollback stage
1309
+ image: path/to/docker/kubernetes:the-version
1310
+ variables:
1311
+ KUBERNETES_CPU_REQUEST: '0.22'
1312
+ KUBERNETES_MEMORY_REQUEST: 200Mi
1313
+ KUBERNETES_MEMORY_LIMIT: 400Mi
1314
+ GIT_STRATEGY: none
1315
+ script:
1316
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1317
+ - export ENV_SHORT="stage"
1318
+ - export APP_DIR="api"
1319
+ - export ENV_TYPE="stage"
1320
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1321
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1322
+ - 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")"
1323
+ - export HOST="api.stage.test-app.pan.panter.cloud"
1324
+ - export ROOT_URL="https://api.stage.test-app.pan.panter.cloud"
1325
+ - export HOST_INTERNAL="api.stage.test-app.pan.panter.cloud"
1326
+ - export HOST_CANONICAL="api.stage.test-app.pan.panter.cloud"
1327
+ - export ROOT_URL_INTERNAL="https://api.stage.test-app.pan.panter.cloud"
1328
+ - export KUBE_NAMESPACE="pan-test-app-stage"
1329
+ - export KUBE_APP_NAME="api"
1330
+ - export KUBE_APP_NAME_PREFIX=""
1331
+ - export POSTGRESQL_PASSWORD="$CL_stage_api_POSTGRESQL_PASSWORD"
1332
+ - export cloudsqlProxyCredentials="$CL_stage_api_cloudsqlProxyCredentials"
1333
+ - 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\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\"]"
1334
+ - export RELEASE_NAME="pan-test-app-stage-api"
1335
+ - export HELM_EXPERIMENTAL_OCI="1"
1336
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"
1337
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
1338
+ - export HELM_ARGS=""
1339
+ - export COMPONENT_NAME="api"
1340
+ - export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1341
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1342
+ - kubectl config set-cluster "kube-pan-test-app-stage-api" --server="$CL_stage_api_KUBE_URL" --certificate-authority <(echo $CL_stage_api_KUBE_CA_PEM | base64 -d) --embed-certs=true
1343
+ - kubectl config set-credentials "kube-pan-test-app-stage-api" --token="$CL_stage_api_KUBE_TOKEN"
1344
+ - kubectl config set-context "kube-pan-test-app-stage-api" --cluster="kube-pan-test-app-stage-api" --user="kube-pan-test-app-stage-api" --namespace="pan-test-app-stage"
1345
+ - kubectl config use-context "kube-pan-test-app-stage-api"
1346
+ - kubernetesRollback
1347
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://api.stage.test-app.pan.panter.cloud" >> gitlab_environment.env
1348
+ environment:
1349
+ name: stage/api
1350
+ url: $CL_GITLAB_ENVIRONMENT_URL
1351
+ action: access
1352
+ artifacts:
1353
+ reports:
1354
+ dotenv: gitlab_environment.env
1355
+ rules:
1356
+ - when: manual
1357
+ if: $CI_COMMIT_TAG
1358
+ needs: []
1359
+ retry: *a1
1360
+ interruptible: true
1361
+ allow_failure: true
1362
+ 'api 🔨 app | prod ':
1363
+ stage: build
1364
+ image: path/to/docker/jobs-default:the-version
1365
+ variables:
1366
+ KUBERNETES_CPU_REQUEST: '0.45'
1367
+ KUBERNETES_MEMORY_REQUEST: 1Gi
1368
+ KUBERNETES_MEMORY_LIMIT: 4Gi
1369
+ script:
1370
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1371
+ - export ENV_SHORT="prod"
1372
+ - export APP_DIR="api"
1373
+ - export ENV_TYPE="prod"
1374
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1375
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1376
+ - 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")"
1377
+ - export HOST="api.prod.test-app.pan.panter.cloud"
1378
+ - export ROOT_URL="https://api.prod.test-app.pan.panter.cloud"
1379
+ - export HOST_INTERNAL="api.prod.test-app.pan.panter.cloud"
1380
+ - export HOST_CANONICAL="api.prod.test-app.pan.panter.cloud"
1381
+ - export ROOT_URL_INTERNAL="https://api.prod.test-app.pan.panter.cloud"
1382
+ - export KUBE_NAMESPACE="pan-test-app-prod"
1383
+ - export KUBE_APP_NAME="api"
1384
+ - export KUBE_APP_NAME_PREFIX=""
1385
+ - export POSTGRESQL_PASSWORD="$CL_prod_api_POSTGRESQL_PASSWORD"
1386
+ - export cloudsqlProxyCredentials="$CL_prod_api_cloudsqlProxyCredentials"
1387
+ - 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\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\"]"
1388
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1389
+ - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > api/__build_info.json
1390
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
1391
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1392
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1393
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
1394
+ - cd api
1395
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
1396
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1397
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1398
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
1399
+ - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
1400
+ - yarn install --immutable
1401
+ - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
1402
+ - yarn build
1403
+ cache:
1404
+ - key: api-yarn
1405
+ policy: pull-push
1406
+ paths:
1407
+ - api/.yarn
1408
+ - key: api-node-modules
1409
+ policy: pull-push
1410
+ paths:
1411
+ - api/node_modules
1412
+ - key: api-next-cache
1413
+ policy: pull-push
1414
+ paths:
1415
+ - api/.next/cache
1416
+ artifacts:
1417
+ paths:
1418
+ - api/__build_info.json
1419
+ - api/.next
1420
+ - api/dist
1421
+ expire_in: 1 day
1422
+ when: always
1423
+ reports: {}
1424
+ rules:
1425
+ - if: $CI_COMMIT_TAG
1426
+ needs: []
1427
+ retry: *a1
1428
+ interruptible: true
1429
+ 'api 🔨 docker | prod ':
1430
+ stage: build
1431
+ image: path/to/docker/docker-build:the-version
1432
+ services:
1433
+ - name: docker:24.0.6-dind
1434
+ command:
1435
+ - --tls=false
1436
+ variables:
1437
+ DOCKER_HOST: tcp://0.0.0.0:2375
1438
+ DOCKER_TLS_CERTDIR: ''
1439
+ DOCKER_DRIVER: overlay2
1440
+ DOCKER_BUILDKIT: '1'
1441
+ KUBERNETES_CPU_REQUEST: '0.45'
1442
+ KUBERNETES_MEMORY_REQUEST: 1Gi
1443
+ KUBERNETES_MEMORY_LIMIT: 2Gi
1444
+ script:
1445
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1446
+ - export APP_DIR="api"
1447
+ - export DOCKER_BUILD_CONTEXT="."
1448
+ - export DOCKER_REGISTRY="$CI_REGISTRY"
1449
+ - export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/api"
1450
+ - export DOCKER_IMAGE_NAME="prod/api"
1451
+ - export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
1452
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
1453
+ - |-
1454
+ export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
1455
+ RUN yarn plugin import workspace-tools
1456
+ RUN yarn workspaces focus --production && yarn rebuild"
1457
+ - |-
1458
+ export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node api/package.json /app/api/package.json
1459
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
1460
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
1461
+ COPY --chown=node:node .yarn /app/.yarn"
1462
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1463
+ - ensureNodeDockerfile
1464
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
1465
+ - docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY
1466
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
1467
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
1468
+ - 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
1469
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
1470
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
1471
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
1472
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
1473
+ - docker push $DOCKER_CACHE_IMAGE
1474
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
1475
+ cache:
1476
+ - key: api-yarn
1477
+ policy: pull
1478
+ paths:
1479
+ - api/.yarn
1480
+ rules:
1481
+ - if: $CI_COMMIT_TAG
1482
+ needs:
1483
+ - 'api 🔨 app | prod '
1484
+ retry: *a1
1485
+ interruptible: true
1486
+ 'api 🧾 sbom | prod ':
1487
+ stage: build
1488
+ image: aquasec/trivy:0.38.3
1489
+ variables: {}
1490
+ script:
1491
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1492
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1493
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" api
1494
+ artifacts:
1495
+ paths:
1496
+ - __sbom.json
1497
+ rules:
1498
+ - if: $CI_COMMIT_TAG
1499
+ needs: []
1500
+ retry: *a1
1501
+ interruptible: true
1502
+ allow_failure: true
1503
+ 'api 🚀 Deploy | prod ':
1504
+ stage: deploy prod
1505
+ image: path/to/docker/kubernetes:the-version
1506
+ variables:
1507
+ KUBERNETES_CPU_REQUEST: '0.22'
1508
+ KUBERNETES_MEMORY_REQUEST: 200Mi
1509
+ KUBERNETES_MEMORY_LIMIT: 400Mi
1510
+ script:
1511
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1512
+ - export ENV_SHORT="prod"
1513
+ - export APP_DIR="api"
1514
+ - export ENV_TYPE="prod"
1515
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1516
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1517
+ - 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")"
1518
+ - export HOST="api.prod.test-app.pan.panter.cloud"
1519
+ - export ROOT_URL="https://api.prod.test-app.pan.panter.cloud"
1520
+ - export HOST_INTERNAL="api.prod.test-app.pan.panter.cloud"
1521
+ - export HOST_CANONICAL="api.prod.test-app.pan.panter.cloud"
1522
+ - export ROOT_URL_INTERNAL="https://api.prod.test-app.pan.panter.cloud"
1523
+ - export KUBE_NAMESPACE="pan-test-app-prod"
1524
+ - export KUBE_APP_NAME="api"
1525
+ - export KUBE_APP_NAME_PREFIX=""
1526
+ - export POSTGRESQL_PASSWORD="$CL_prod_api_POSTGRESQL_PASSWORD"
1527
+ - export cloudsqlProxyCredentials="$CL_prod_api_cloudsqlProxyCredentials"
1528
+ - 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\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\"]"
1529
+ - export DOCKER_REGISTRY="$CI_REGISTRY"
1530
+ - export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/api"
1531
+ - export DOCKER_IMAGE_NAME="prod/api"
1532
+ - export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
1533
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
1534
+ - export RELEASE_NAME="pan-test-app-prod-api"
1535
+ - export HELM_EXPERIMENTAL_OCI="1"
1536
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"
1537
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
1538
+ - export HELM_ARGS=""
1539
+ - export COMPONENT_NAME="api"
1540
+ - export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1541
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1542
+ - kubectl config set-cluster "kube-pan-test-app-prod-api" --server="$CL_prod_api_KUBE_URL" --certificate-authority <(echo $CL_prod_api_KUBE_CA_PEM | base64 -d) --embed-certs=true
1543
+ - kubectl config set-credentials "kube-pan-test-app-prod-api" --token="$CL_prod_api_KUBE_TOKEN"
1544
+ - kubectl config set-context "kube-pan-test-app-prod-api" --cluster="kube-pan-test-app-prod-api" --user="kube-pan-test-app-prod-api" --namespace="pan-test-app-prod"
1545
+ - kubectl config use-context "kube-pan-test-app-prod-api"
1546
+ - echo -e "\\e[0Ksection_start:$(date +%s):writeallvalues[collapsed=true]\\r\\e[0KWrite __all_values.yml for helm deployment"
1547
+ - |
1548
+ cat > __all_values.yml <<EOF
1549
+ env:
1550
+ secret:
1551
+ POSTGRESQL_PASSWORD: |-
1552
+ $(printf %s "$CL_prod_api_POSTGRESQL_PASSWORD" | sed 's/^/ /')
1553
+ cloudsqlProxyCredentials: |-
1554
+ $(printf %s "$CL_prod_api_cloudsqlProxyCredentials" | sed 's/^/ /')
1555
+ public:
1556
+ ENV_SHORT: |-
1557
+ prod
1558
+ APP_DIR: |-
1559
+ api
1560
+ ENV_TYPE: |-
1561
+ prod
1562
+ BUILD_INFO_BUILD_ID: |-
1563
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
1564
+ BUILD_INFO_BUILD_TIME: |-
1565
+ $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
1566
+ BUILD_INFO_CURRENT_VERSION: |-
1567
+ $(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/^/ /')
1568
+ HOST: |-
1569
+ api.prod.test-app.pan.panter.cloud
1570
+ ROOT_URL: |-
1571
+ https://api.prod.test-app.pan.panter.cloud
1572
+ HOST_INTERNAL: |-
1573
+ api.prod.test-app.pan.panter.cloud
1574
+ HOST_CANONICAL: |-
1575
+ api.prod.test-app.pan.panter.cloud
1576
+ ROOT_URL_INTERNAL: |-
1577
+ https://api.prod.test-app.pan.panter.cloud
1578
+ KUBE_NAMESPACE: |-
1579
+ pan-test-app-prod
1580
+ KUBE_APP_NAME: |-
1581
+ api
1582
+ KUBE_APP_NAME_PREFIX: ""
1583
+ _ALL_ENV_VAR_KEYS: |-
1584
+ ["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","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","POSTGRESQL_PASSWORD","cloudsqlProxyCredentials"]
1585
+ application:
1586
+ host: |-
1587
+ api.prod.test-app.pan.panter.cloud
1588
+ command: |-
1589
+ yarn start
1590
+ livenessProbe:
1591
+ httpGet:
1592
+ path: |-
1593
+ __health
1594
+ readinessProbe:
1595
+ httpGet:
1596
+ path: |-
1597
+ __health
1598
+ startupProbe:
1599
+ httpGet:
1600
+ path: |-
1601
+ __health
1602
+ cloudsql:
1603
+ enabled: true
1604
+ dbUser: |-
1605
+ postgres
1606
+ instanceConnectionName: |-
1607
+ skynet-164509:europe-west6:pan-test-app-prod
1608
+ proxyCredentials: |-
1609
+ $CL_prod_api_cloudsqlProxyCredentials
1610
+ fullDbName: |-
1611
+ api
1612
+
1613
+ EOF
1614
+ - echo -e "\\e[0Ksection_end:$(date +%s):writeallvalues\\r\\e[0K"
1615
+ - kubernetesCreateSecret
1616
+ - kubernetesDeploy
1617
+ - echo 'Uploading SBOM to Dependency Track'
1618
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/api" "https://api.prod.test-app.pan.panter.cloud" "__sbom.json" vex.json || true
1619
+ - echo deployment successful 😻
1620
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://api.prod.test-app.pan.panter.cloud" >> gitlab_environment.env
1621
+ environment:
1622
+ name: prod/api
1623
+ url: $CL_GITLAB_ENVIRONMENT_URL
1624
+ on_stop: 'api 🛑 Stop ⚠️ | prod '
1625
+ artifacts:
1626
+ reports:
1627
+ dotenv: gitlab_environment.env
1628
+ rules:
1629
+ - when: manual
1630
+ if: $CI_COMMIT_TAG
1631
+ needs:
1632
+ - job: 'api 🔨 app | prod '
1633
+ artifacts: false
1634
+ - job: 'api 🔨 docker | prod '
1635
+ artifacts: false
1636
+ - job: 'api 🧾 sbom | prod '
1637
+ artifacts: true
1638
+ retry: *a1
1639
+ interruptible: true
1640
+ allow_failure: true
1641
+ 'api 🛑 Stop ⚠️ | prod ':
1642
+ stage: stop prod
1643
+ image: path/to/docker/kubernetes:the-version
1644
+ variables:
1645
+ KUBERNETES_CPU_REQUEST: '0.22'
1646
+ KUBERNETES_MEMORY_REQUEST: 200Mi
1647
+ KUBERNETES_MEMORY_LIMIT: 400Mi
1648
+ GIT_STRATEGY: none
1649
+ script:
1650
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1651
+ - export ENV_SHORT="prod"
1652
+ - export APP_DIR="api"
1653
+ - export ENV_TYPE="prod"
1654
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1655
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1656
+ - 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")"
1657
+ - export HOST="api.prod.test-app.pan.panter.cloud"
1658
+ - export ROOT_URL="https://api.prod.test-app.pan.panter.cloud"
1659
+ - export HOST_INTERNAL="api.prod.test-app.pan.panter.cloud"
1660
+ - export HOST_CANONICAL="api.prod.test-app.pan.panter.cloud"
1661
+ - export ROOT_URL_INTERNAL="https://api.prod.test-app.pan.panter.cloud"
1662
+ - export KUBE_NAMESPACE="pan-test-app-prod"
1663
+ - export KUBE_APP_NAME="api"
1664
+ - export KUBE_APP_NAME_PREFIX=""
1665
+ - export POSTGRESQL_PASSWORD="$CL_prod_api_POSTGRESQL_PASSWORD"
1666
+ - export cloudsqlProxyCredentials="$CL_prod_api_cloudsqlProxyCredentials"
1667
+ - 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\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\"]"
1668
+ - export RELEASE_NAME="pan-test-app-prod-api"
1669
+ - export HELM_EXPERIMENTAL_OCI="1"
1670
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"
1671
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
1672
+ - export HELM_ARGS=""
1673
+ - export COMPONENT_NAME="api"
1674
+ - export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1675
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1676
+ - kubectl config set-cluster "kube-pan-test-app-prod-api" --server="$CL_prod_api_KUBE_URL" --certificate-authority <(echo $CL_prod_api_KUBE_CA_PEM | base64 -d) --embed-certs=true
1677
+ - kubectl config set-credentials "kube-pan-test-app-prod-api" --token="$CL_prod_api_KUBE_TOKEN"
1678
+ - kubectl config set-context "kube-pan-test-app-prod-api" --cluster="kube-pan-test-app-prod-api" --user="kube-pan-test-app-prod-api" --namespace="pan-test-app-prod"
1679
+ - kubectl config use-context "kube-pan-test-app-prod-api"
1680
+ - kubernetesDelete
1681
+ - echo 'Disabling component in Dependency Track'
1682
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/api" "https://api.prod.test-app.pan.panter.cloud" || true
1683
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://api.prod.test-app.pan.panter.cloud" >> gitlab_environment.env
1684
+ environment:
1685
+ name: prod/api
1686
+ url: $CL_GITLAB_ENVIRONMENT_URL
1687
+ action: stop
1688
+ artifacts:
1689
+ reports:
1690
+ dotenv: gitlab_environment.env
1691
+ rules:
1692
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
1693
+ when: on_success
1694
+ - when: manual
1695
+ if: $CI_COMMIT_TAG
1696
+ needs: []
1697
+ retry: *a1
1698
+ interruptible: true
1699
+ allow_failure: true
1700
+ 'api ↩️ Rollback ⚠️ | prod ':
1701
+ stage: rollback prod
1702
+ image: path/to/docker/kubernetes:the-version
1703
+ variables:
1704
+ KUBERNETES_CPU_REQUEST: '0.22'
1705
+ KUBERNETES_MEMORY_REQUEST: 200Mi
1706
+ KUBERNETES_MEMORY_LIMIT: 400Mi
1707
+ GIT_STRATEGY: none
1708
+ script:
1709
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1710
+ - export ENV_SHORT="prod"
1711
+ - export APP_DIR="api"
1712
+ - export ENV_TYPE="prod"
1713
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1714
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1715
+ - 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")"
1716
+ - export HOST="api.prod.test-app.pan.panter.cloud"
1717
+ - export ROOT_URL="https://api.prod.test-app.pan.panter.cloud"
1718
+ - export HOST_INTERNAL="api.prod.test-app.pan.panter.cloud"
1719
+ - export HOST_CANONICAL="api.prod.test-app.pan.panter.cloud"
1720
+ - export ROOT_URL_INTERNAL="https://api.prod.test-app.pan.panter.cloud"
1721
+ - export KUBE_NAMESPACE="pan-test-app-prod"
1722
+ - export KUBE_APP_NAME="api"
1723
+ - export KUBE_APP_NAME_PREFIX=""
1724
+ - export POSTGRESQL_PASSWORD="$CL_prod_api_POSTGRESQL_PASSWORD"
1725
+ - export cloudsqlProxyCredentials="$CL_prod_api_cloudsqlProxyCredentials"
1726
+ - 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\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\"]"
1727
+ - export RELEASE_NAME="pan-test-app-prod-api"
1728
+ - export HELM_EXPERIMENTAL_OCI="1"
1729
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"
1730
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
1731
+ - export HELM_ARGS=""
1732
+ - export COMPONENT_NAME="api"
1733
+ - export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1734
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1735
+ - kubectl config set-cluster "kube-pan-test-app-prod-api" --server="$CL_prod_api_KUBE_URL" --certificate-authority <(echo $CL_prod_api_KUBE_CA_PEM | base64 -d) --embed-certs=true
1736
+ - kubectl config set-credentials "kube-pan-test-app-prod-api" --token="$CL_prod_api_KUBE_TOKEN"
1737
+ - kubectl config set-context "kube-pan-test-app-prod-api" --cluster="kube-pan-test-app-prod-api" --user="kube-pan-test-app-prod-api" --namespace="pan-test-app-prod"
1738
+ - kubectl config use-context "kube-pan-test-app-prod-api"
1739
+ - kubernetesRollback
1740
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://api.prod.test-app.pan.panter.cloud" >> gitlab_environment.env
1741
+ environment:
1742
+ name: prod/api
1743
+ url: $CL_GITLAB_ENVIRONMENT_URL
1744
+ action: access
1745
+ artifacts:
1746
+ reports:
1747
+ dotenv: gitlab_environment.env
1748
+ rules:
1749
+ - when: manual
1750
+ if: $CI_COMMIT_TAG
1751
+ needs: []
1752
+ retry: *a1
1753
+ interruptible: true
1754
+ allow_failure: true
1755
+ create release:
1756
+ stage: release
1757
+ image: path/to/docker/semantic-release:the-version
1758
+ script:
1759
+ - semanticRelease
1760
+ after_script:
1761
+ - echo '👉 The project access token might be invald - run \`project-renew-token\` in catladder CLI to fix.'
1762
+ rules:
1763
+ - &a2
1764
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
1765
+ when: never
1766
+ - &a3
1767
+ if: $CI_PIPELINE_SOURCE == "schedule"
1768
+ when: never
1769
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $AUTO_RELEASE == "true"
1770
+ when: on_success
1771
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
1772
+ when: manual
1773
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+.([0-9]+|x).x$/
1774
+ when: manual
1775
+ ⚠️ force create release:
1776
+ stage: release
1777
+ image: path/to/docker/semantic-release:the-version
1778
+ script:
1779
+ - semanticRelease
1780
+ after_script:
1781
+ - echo '👉 The project access token might be invald - run \`project-renew-token\` in catladder CLI to fix.'
1782
+ rules:
1783
+ - *a2
1784
+ - *a3
1785
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
1786
+ when: manual
1787
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+.([0-9]+|x).x$/
1788
+ when: manual
1789
+ needs: []
1790
+ "
1791
+ `;
1792
+
3
1793
  exports[`matches snapshot for kubernetes-with-cloud-sql-legacy 1`] = `
4
1794
  {
5
1795
  "mainBranch": {