@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,1803 @@
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
+ myproject:europe-west6:instance-name
408
+ proxyCredentials: |-
409
+ $CL_dev_api_cloudsqlProxyCredentials
410
+ fullDbName: |-
411
+ pan-test-app-dev-api
412
+ type: |-
413
+ unmanaged
414
+
415
+ EOF
416
+ - echo -e "\\e[0Ksection_end:$(date +%s):writeallvalues\\r\\e[0K"
417
+ - kubernetesCreateSecret
418
+ - kubernetesDeploy
419
+ - echo 'Uploading SBOM to Dependency Track'
420
+ - /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
421
+ - echo deployment successful 😻
422
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://api.dev.test-app.pan.panter.cloud" >> gitlab_environment.env
423
+ environment:
424
+ name: dev/api
425
+ url: $CL_GITLAB_ENVIRONMENT_URL
426
+ on_stop: 'api 🛑 Stop ⚠️ | dev '
427
+ auto_stop_in: 4 weeks
428
+ artifacts:
429
+ reports:
430
+ dotenv: gitlab_environment.env
431
+ rules:
432
+ - when: never
433
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
434
+ - when: on_success
435
+ if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
436
+ needs:
437
+ - job: api 👮 lint
438
+ artifacts: false
439
+ - job: 'api 🔨 app | dev '
440
+ artifacts: false
441
+ - job: 'api 🔨 docker | dev '
442
+ artifacts: false
443
+ - job: api 🧪 test
444
+ artifacts: false
445
+ - job: 'api 🧾 sbom | dev '
446
+ artifacts: true
447
+ - job: api 🛡 audit
448
+ artifacts: false
449
+ retry: *a1
450
+ interruptible: true
451
+ allow_failure: false
452
+ 'api 🛑 Stop ⚠️ | dev ':
453
+ stage: stop dev
454
+ image: path/to/docker/kubernetes:the-version
455
+ variables:
456
+ KUBERNETES_CPU_REQUEST: '0.22'
457
+ KUBERNETES_MEMORY_REQUEST: 200Mi
458
+ KUBERNETES_MEMORY_LIMIT: 400Mi
459
+ GIT_STRATEGY: none
460
+ script:
461
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
462
+ - export ENV_SHORT="dev"
463
+ - export APP_DIR="api"
464
+ - export ENV_TYPE="dev"
465
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
466
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
467
+ - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
468
+ - export HOST="api.dev.test-app.pan.panter.cloud"
469
+ - export ROOT_URL="https://api.dev.test-app.pan.panter.cloud"
470
+ - export HOST_INTERNAL="api.dev.test-app.pan.panter.cloud"
471
+ - export HOST_CANONICAL="api.dev.test-app.pan.panter.cloud"
472
+ - export ROOT_URL_INTERNAL="https://api.dev.test-app.pan.panter.cloud"
473
+ - export KUBE_NAMESPACE="pan-test-app-dev"
474
+ - export KUBE_APP_NAME="api"
475
+ - export KUBE_APP_NAME_PREFIX=""
476
+ - export POSTGRESQL_PASSWORD="$CL_dev_api_POSTGRESQL_PASSWORD"
477
+ - export cloudsqlProxyCredentials="$CL_dev_api_cloudsqlProxyCredentials"
478
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\"]"
479
+ - export RELEASE_NAME="pan-test-app-dev-api"
480
+ - export HELM_EXPERIMENTAL_OCI="1"
481
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"
482
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
483
+ - export HELM_ARGS=""
484
+ - export COMPONENT_NAME="api"
485
+ - export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
486
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
487
+ - 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
488
+ - kubectl config set-credentials "kube-pan-test-app-dev-api" --token="$CL_dev_api_KUBE_TOKEN"
489
+ - 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"
490
+ - kubectl config use-context "kube-pan-test-app-dev-api"
491
+ - kubernetesDelete
492
+ - echo 'Disabling component in Dependency Track'
493
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/api" "https://api.dev.test-app.pan.panter.cloud" || true
494
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://api.dev.test-app.pan.panter.cloud" >> gitlab_environment.env
495
+ environment:
496
+ name: dev/api
497
+ url: $CL_GITLAB_ENVIRONMENT_URL
498
+ action: stop
499
+ artifacts:
500
+ reports:
501
+ dotenv: gitlab_environment.env
502
+ rules:
503
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
504
+ when: on_success
505
+ - when: never
506
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
507
+ - when: manual
508
+ if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
509
+ needs: []
510
+ retry: *a1
511
+ interruptible: true
512
+ allow_failure: true
513
+ 'api ↩️ Rollback ⚠️ | dev ':
514
+ stage: rollback dev
515
+ image: path/to/docker/kubernetes:the-version
516
+ variables:
517
+ KUBERNETES_CPU_REQUEST: '0.22'
518
+ KUBERNETES_MEMORY_REQUEST: 200Mi
519
+ KUBERNETES_MEMORY_LIMIT: 400Mi
520
+ GIT_STRATEGY: none
521
+ script:
522
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
523
+ - export ENV_SHORT="dev"
524
+ - export APP_DIR="api"
525
+ - export ENV_TYPE="dev"
526
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
527
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
528
+ - 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")"
529
+ - export HOST="api.dev.test-app.pan.panter.cloud"
530
+ - export ROOT_URL="https://api.dev.test-app.pan.panter.cloud"
531
+ - export HOST_INTERNAL="api.dev.test-app.pan.panter.cloud"
532
+ - export HOST_CANONICAL="api.dev.test-app.pan.panter.cloud"
533
+ - export ROOT_URL_INTERNAL="https://api.dev.test-app.pan.panter.cloud"
534
+ - export KUBE_NAMESPACE="pan-test-app-dev"
535
+ - export KUBE_APP_NAME="api"
536
+ - export KUBE_APP_NAME_PREFIX=""
537
+ - export POSTGRESQL_PASSWORD="$CL_dev_api_POSTGRESQL_PASSWORD"
538
+ - export cloudsqlProxyCredentials="$CL_dev_api_cloudsqlProxyCredentials"
539
+ - 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\\"]"
540
+ - export RELEASE_NAME="pan-test-app-dev-api"
541
+ - export HELM_EXPERIMENTAL_OCI="1"
542
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"
543
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
544
+ - export HELM_ARGS=""
545
+ - export COMPONENT_NAME="api"
546
+ - export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
547
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
548
+ - 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
549
+ - kubectl config set-credentials "kube-pan-test-app-dev-api" --token="$CL_dev_api_KUBE_TOKEN"
550
+ - 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"
551
+ - kubectl config use-context "kube-pan-test-app-dev-api"
552
+ - kubernetesRollback
553
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://api.dev.test-app.pan.panter.cloud" >> gitlab_environment.env
554
+ environment:
555
+ name: dev/api
556
+ url: $CL_GITLAB_ENVIRONMENT_URL
557
+ action: access
558
+ artifacts:
559
+ reports:
560
+ dotenv: gitlab_environment.env
561
+ rules:
562
+ - when: never
563
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
564
+ - when: manual
565
+ if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
566
+ needs: []
567
+ retry: *a1
568
+ interruptible: true
569
+ allow_failure: true
570
+ 'api 🔨 app | review ':
571
+ stage: build
572
+ image: path/to/docker/jobs-default:the-version
573
+ variables:
574
+ KUBERNETES_CPU_REQUEST: '0.45'
575
+ KUBERNETES_MEMORY_REQUEST: 1Gi
576
+ KUBERNETES_MEMORY_LIMIT: 4Gi
577
+ script:
578
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
579
+ - export ENV_SHORT="review"
580
+ - export APP_DIR="api"
581
+ - export ENV_TYPE="review"
582
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
583
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
584
+ - 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")"
585
+ - 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"
586
+ - 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"
587
+ - 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"
588
+ - 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"
589
+ - 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"
590
+ - export KUBE_NAMESPACE="pan-test-app-review"
591
+ - 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"
592
+ - 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"; })-"
593
+ - export POSTGRESQL_PASSWORD="$CL_review_api_POSTGRESQL_PASSWORD"
594
+ - export cloudsqlProxyCredentials="$CL_review_api_cloudsqlProxyCredentials"
595
+ - 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\\"]"
596
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
597
+ - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > api/__build_info.json
598
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
599
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
600
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
601
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
602
+ - cd api
603
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
604
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
605
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
606
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
607
+ - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
608
+ - yarn install --immutable
609
+ - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
610
+ - yarn build
611
+ cache:
612
+ - key: api-yarn
613
+ policy: pull-push
614
+ paths:
615
+ - api/.yarn
616
+ - key: api-node-modules
617
+ policy: pull-push
618
+ paths:
619
+ - api/node_modules
620
+ - key: api-next-cache
621
+ policy: pull-push
622
+ paths:
623
+ - api/.next/cache
624
+ artifacts:
625
+ paths:
626
+ - api/__build_info.json
627
+ - api/.next
628
+ - api/dist
629
+ expire_in: 1 day
630
+ when: always
631
+ reports: {}
632
+ rules:
633
+ - if: $CI_MERGE_REQUEST_ID
634
+ needs: []
635
+ retry: *a1
636
+ interruptible: true
637
+ 'api 🔨 docker | review ':
638
+ stage: build
639
+ image: path/to/docker/docker-build:the-version
640
+ services:
641
+ - name: docker:24.0.6-dind
642
+ command:
643
+ - --tls=false
644
+ variables:
645
+ DOCKER_HOST: tcp://0.0.0.0:2375
646
+ DOCKER_TLS_CERTDIR: ''
647
+ DOCKER_DRIVER: overlay2
648
+ DOCKER_BUILDKIT: '1'
649
+ KUBERNETES_CPU_REQUEST: '0.45'
650
+ KUBERNETES_MEMORY_REQUEST: 1Gi
651
+ KUBERNETES_MEMORY_LIMIT: 2Gi
652
+ script:
653
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
654
+ - export APP_DIR="api"
655
+ - export DOCKER_BUILD_CONTEXT="."
656
+ - export DOCKER_REGISTRY="$CI_REGISTRY"
657
+ - export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/api"
658
+ - export DOCKER_IMAGE_NAME="review/api"
659
+ - export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
660
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
661
+ - |-
662
+ export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
663
+ RUN yarn plugin import workspace-tools
664
+ RUN yarn workspaces focus --production && yarn rebuild"
665
+ - |-
666
+ export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node api/package.json /app/api/package.json
667
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
668
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
669
+ COPY --chown=node:node .yarn /app/.yarn"
670
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
671
+ - ensureNodeDockerfile
672
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
673
+ - docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY
674
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
675
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
676
+ - 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
677
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
678
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
679
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
680
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
681
+ - docker push $DOCKER_CACHE_IMAGE
682
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
683
+ cache:
684
+ - key: api-yarn
685
+ policy: pull
686
+ paths:
687
+ - api/.yarn
688
+ rules:
689
+ - if: $CI_MERGE_REQUEST_ID
690
+ needs:
691
+ - 'api 🔨 app | review '
692
+ retry: *a1
693
+ interruptible: true
694
+ 'api 🧾 sbom | review ':
695
+ stage: build
696
+ image: aquasec/trivy:0.38.3
697
+ variables: {}
698
+ script:
699
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
700
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
701
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" api
702
+ artifacts:
703
+ paths:
704
+ - __sbom.json
705
+ rules:
706
+ - if: $CI_MERGE_REQUEST_ID
707
+ needs: []
708
+ retry: *a1
709
+ interruptible: true
710
+ allow_failure: true
711
+ 'api 🚀 Deploy | review ':
712
+ stage: deploy review
713
+ image: path/to/docker/kubernetes:the-version
714
+ variables:
715
+ KUBERNETES_CPU_REQUEST: '0.22'
716
+ KUBERNETES_MEMORY_REQUEST: 200Mi
717
+ KUBERNETES_MEMORY_LIMIT: 400Mi
718
+ script:
719
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
720
+ - export ENV_SHORT="review"
721
+ - export APP_DIR="api"
722
+ - export ENV_TYPE="review"
723
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
724
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
725
+ - 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")"
726
+ - 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"
727
+ - 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"
728
+ - 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"
729
+ - 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"
730
+ - 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"
731
+ - export KUBE_NAMESPACE="pan-test-app-review"
732
+ - 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"
733
+ - 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"; })-"
734
+ - export POSTGRESQL_PASSWORD="$CL_review_api_POSTGRESQL_PASSWORD"
735
+ - export cloudsqlProxyCredentials="$CL_review_api_cloudsqlProxyCredentials"
736
+ - 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\\"]"
737
+ - export DOCKER_REGISTRY="$CI_REGISTRY"
738
+ - export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/api"
739
+ - export DOCKER_IMAGE_NAME="review/api"
740
+ - export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
741
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
742
+ - 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"
743
+ - export HELM_EXPERIMENTAL_OCI="1"
744
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"
745
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
746
+ - export HELM_ARGS=""
747
+ - export COMPONENT_NAME="api"
748
+ - export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
749
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
750
+ - 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
751
+ - 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"
752
+ - 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"
753
+ - 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"
754
+ - echo -e "\\e[0Ksection_start:$(date +%s):writeallvalues[collapsed=true]\\r\\e[0KWrite __all_values.yml for helm deployment"
755
+ - |
756
+ cat > __all_values.yml <<EOF
757
+ env:
758
+ secret:
759
+ POSTGRESQL_PASSWORD: |-
760
+ $(printf %s "$CL_review_api_POSTGRESQL_PASSWORD" | sed 's/^/ /')
761
+ cloudsqlProxyCredentials: |-
762
+ $(printf %s "$CL_review_api_cloudsqlProxyCredentials" | sed 's/^/ /')
763
+ public:
764
+ ENV_SHORT: |-
765
+ review
766
+ APP_DIR: |-
767
+ api
768
+ ENV_TYPE: |-
769
+ review
770
+ BUILD_INFO_BUILD_ID: |-
771
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
772
+ BUILD_INFO_BUILD_TIME: |-
773
+ $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
774
+ BUILD_INFO_CURRENT_VERSION: |-
775
+ $(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/^/ /')
776
+ HOST: |-
777
+ $(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/^/ /')
778
+ ROOT_URL: |-
779
+ $(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/^/ /')
780
+ HOST_INTERNAL: |-
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
+ HOST_CANONICAL: |-
783
+ $(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/^/ /')
784
+ ROOT_URL_INTERNAL: |-
785
+ $(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/^/ /')
786
+ KUBE_NAMESPACE: |-
787
+ pan-test-app-review
788
+ KUBE_APP_NAME: |-
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"; })-api" | sed 's/^/ /')
790
+ KUBE_APP_NAME_PREFIX: |-
791
+ $(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/^/ /')
792
+ _ALL_ENV_VAR_KEYS: |-
793
+ ["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"]
794
+ application:
795
+ host: |-
796
+ $(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/^/ /')
797
+ command: |-
798
+ yarn start
799
+ livenessProbe:
800
+ httpGet:
801
+ path: |-
802
+ __health
803
+ readinessProbe:
804
+ httpGet:
805
+ path: |-
806
+ __health
807
+ startupProbe:
808
+ httpGet:
809
+ path: |-
810
+ __health
811
+ cloudsql:
812
+ enabled: true
813
+ dbUser: |-
814
+ postgres
815
+ instanceConnectionName: |-
816
+ myproject:europe-west6:instance-name
817
+ proxyCredentials: |-
818
+ $CL_review_api_cloudsqlProxyCredentials
819
+ fullDbName: |-
820
+ $(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" | sed 's/^/ /')
821
+ type: |-
822
+ unmanaged
823
+
824
+ EOF
825
+ - echo -e "\\e[0Ksection_end:$(date +%s):writeallvalues\\r\\e[0K"
826
+ - kubernetesCreateSecret
827
+ - kubernetesDeploy
828
+ - echo 'Uploading SBOM to Dependency Track'
829
+ - /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
830
+ - echo deployment successful 😻
831
+ - 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
832
+ environment:
833
+ name: review/$CI_COMMIT_REF_NAME/api
834
+ url: $CL_GITLAB_ENVIRONMENT_URL
835
+ on_stop: 'api 🛑 Stop ⚠️ | review '
836
+ auto_stop_in: 1 week
837
+ artifacts:
838
+ reports:
839
+ dotenv: gitlab_environment.env
840
+ rules:
841
+ - when: on_success
842
+ if: $CI_MERGE_REQUEST_ID
843
+ needs:
844
+ - job: api 👮 lint
845
+ artifacts: false
846
+ - job: 'api 🔨 app | review '
847
+ artifacts: false
848
+ - job: 'api 🔨 docker | review '
849
+ artifacts: false
850
+ - job: api 🧪 test
851
+ artifacts: false
852
+ - job: 'api 🧾 sbom | review '
853
+ artifacts: true
854
+ - job: api 🛡 audit
855
+ artifacts: false
856
+ retry: *a1
857
+ interruptible: true
858
+ allow_failure: false
859
+ 'api 🛑 Stop ⚠️ | review ':
860
+ stage: stop review
861
+ image: path/to/docker/kubernetes:the-version
862
+ variables:
863
+ KUBERNETES_CPU_REQUEST: '0.22'
864
+ KUBERNETES_MEMORY_REQUEST: 200Mi
865
+ KUBERNETES_MEMORY_LIMIT: 400Mi
866
+ GIT_STRATEGY: none
867
+ script:
868
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
869
+ - export ENV_SHORT="review"
870
+ - export APP_DIR="api"
871
+ - export ENV_TYPE="review"
872
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
873
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
874
+ - 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")"
875
+ - 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"
876
+ - 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"
877
+ - 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"
878
+ - 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"
879
+ - 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"
880
+ - export KUBE_NAMESPACE="pan-test-app-review"
881
+ - 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"
882
+ - 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"; })-"
883
+ - export POSTGRESQL_PASSWORD="$CL_review_api_POSTGRESQL_PASSWORD"
884
+ - export cloudsqlProxyCredentials="$CL_review_api_cloudsqlProxyCredentials"
885
+ - 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\\"]"
886
+ - 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"
887
+ - export HELM_EXPERIMENTAL_OCI="1"
888
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"
889
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
890
+ - export HELM_ARGS=""
891
+ - export COMPONENT_NAME="api"
892
+ - export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
893
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
894
+ - 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
895
+ - 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"
896
+ - 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"
897
+ - 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"
898
+ - kubernetesDelete
899
+ - echo 'Disabling component in Dependency Track'
900
+ - /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
901
+ - 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
902
+ environment:
903
+ name: review/$CI_COMMIT_REF_NAME/api
904
+ url: $CL_GITLAB_ENVIRONMENT_URL
905
+ action: stop
906
+ artifacts:
907
+ reports:
908
+ dotenv: gitlab_environment.env
909
+ rules:
910
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
911
+ when: on_success
912
+ - when: manual
913
+ if: $CI_MERGE_REQUEST_ID
914
+ needs: []
915
+ retry: *a1
916
+ interruptible: true
917
+ allow_failure: true
918
+ 'api ↩️ Rollback ⚠️ | review ':
919
+ stage: rollback review
920
+ image: path/to/docker/kubernetes:the-version
921
+ variables:
922
+ KUBERNETES_CPU_REQUEST: '0.22'
923
+ KUBERNETES_MEMORY_REQUEST: 200Mi
924
+ KUBERNETES_MEMORY_LIMIT: 400Mi
925
+ GIT_STRATEGY: none
926
+ script:
927
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
928
+ - export ENV_SHORT="review"
929
+ - export APP_DIR="api"
930
+ - export ENV_TYPE="review"
931
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
932
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
933
+ - 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")"
934
+ - 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"
935
+ - 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"
936
+ - 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"
937
+ - 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"
938
+ - 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"
939
+ - export KUBE_NAMESPACE="pan-test-app-review"
940
+ - 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"
941
+ - 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"; })-"
942
+ - export POSTGRESQL_PASSWORD="$CL_review_api_POSTGRESQL_PASSWORD"
943
+ - export cloudsqlProxyCredentials="$CL_review_api_cloudsqlProxyCredentials"
944
+ - 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\\"]"
945
+ - 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"
946
+ - export HELM_EXPERIMENTAL_OCI="1"
947
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"
948
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
949
+ - export HELM_ARGS=""
950
+ - export COMPONENT_NAME="api"
951
+ - export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
952
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
953
+ - 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
954
+ - 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"
955
+ - 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"
956
+ - 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"
957
+ - kubernetesRollback
958
+ - 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
959
+ environment:
960
+ name: review/$CI_COMMIT_REF_NAME/api
961
+ url: $CL_GITLAB_ENVIRONMENT_URL
962
+ action: access
963
+ artifacts:
964
+ reports:
965
+ dotenv: gitlab_environment.env
966
+ rules:
967
+ - when: manual
968
+ if: $CI_MERGE_REQUEST_ID
969
+ needs: []
970
+ retry: *a1
971
+ interruptible: true
972
+ allow_failure: true
973
+ 'api 🔨 app | stage ':
974
+ stage: build
975
+ image: path/to/docker/jobs-default:the-version
976
+ variables:
977
+ KUBERNETES_CPU_REQUEST: '0.45'
978
+ KUBERNETES_MEMORY_REQUEST: 1Gi
979
+ KUBERNETES_MEMORY_LIMIT: 4Gi
980
+ script:
981
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
982
+ - export ENV_SHORT="stage"
983
+ - export APP_DIR="api"
984
+ - export ENV_TYPE="stage"
985
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
986
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
987
+ - 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")"
988
+ - export HOST="api.stage.test-app.pan.panter.cloud"
989
+ - export ROOT_URL="https://api.stage.test-app.pan.panter.cloud"
990
+ - export HOST_INTERNAL="api.stage.test-app.pan.panter.cloud"
991
+ - export HOST_CANONICAL="api.stage.test-app.pan.panter.cloud"
992
+ - export ROOT_URL_INTERNAL="https://api.stage.test-app.pan.panter.cloud"
993
+ - export KUBE_NAMESPACE="pan-test-app-stage"
994
+ - export KUBE_APP_NAME="api"
995
+ - export KUBE_APP_NAME_PREFIX=""
996
+ - export POSTGRESQL_PASSWORD="$CL_stage_api_POSTGRESQL_PASSWORD"
997
+ - export cloudsqlProxyCredentials="$CL_stage_api_cloudsqlProxyCredentials"
998
+ - 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\\"]"
999
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1000
+ - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > api/__build_info.json
1001
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
1002
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1003
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1004
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
1005
+ - cd api
1006
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
1007
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1008
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1009
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
1010
+ - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
1011
+ - yarn install --immutable
1012
+ - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
1013
+ - yarn build
1014
+ cache:
1015
+ - key: api-yarn
1016
+ policy: pull-push
1017
+ paths:
1018
+ - api/.yarn
1019
+ - key: api-node-modules
1020
+ policy: pull-push
1021
+ paths:
1022
+ - api/node_modules
1023
+ - key: api-next-cache
1024
+ policy: pull-push
1025
+ paths:
1026
+ - api/.next/cache
1027
+ artifacts:
1028
+ paths:
1029
+ - api/__build_info.json
1030
+ - api/.next
1031
+ - api/dist
1032
+ expire_in: 1 day
1033
+ when: always
1034
+ reports: {}
1035
+ rules:
1036
+ - if: $CI_COMMIT_TAG
1037
+ needs: []
1038
+ retry: *a1
1039
+ interruptible: true
1040
+ 'api 🔨 docker | stage ':
1041
+ stage: build
1042
+ image: path/to/docker/docker-build:the-version
1043
+ services:
1044
+ - name: docker:24.0.6-dind
1045
+ command:
1046
+ - --tls=false
1047
+ variables:
1048
+ DOCKER_HOST: tcp://0.0.0.0:2375
1049
+ DOCKER_TLS_CERTDIR: ''
1050
+ DOCKER_DRIVER: overlay2
1051
+ DOCKER_BUILDKIT: '1'
1052
+ KUBERNETES_CPU_REQUEST: '0.45'
1053
+ KUBERNETES_MEMORY_REQUEST: 1Gi
1054
+ KUBERNETES_MEMORY_LIMIT: 2Gi
1055
+ script:
1056
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1057
+ - export APP_DIR="api"
1058
+ - export DOCKER_BUILD_CONTEXT="."
1059
+ - export DOCKER_REGISTRY="$CI_REGISTRY"
1060
+ - export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/api"
1061
+ - export DOCKER_IMAGE_NAME="stage/api"
1062
+ - export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
1063
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
1064
+ - |-
1065
+ export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
1066
+ RUN yarn plugin import workspace-tools
1067
+ RUN yarn workspaces focus --production && yarn rebuild"
1068
+ - |-
1069
+ export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node api/package.json /app/api/package.json
1070
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
1071
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
1072
+ COPY --chown=node:node .yarn /app/.yarn"
1073
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1074
+ - ensureNodeDockerfile
1075
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
1076
+ - docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY
1077
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
1078
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
1079
+ - 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
1080
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
1081
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
1082
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
1083
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
1084
+ - docker push $DOCKER_CACHE_IMAGE
1085
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
1086
+ cache:
1087
+ - key: api-yarn
1088
+ policy: pull
1089
+ paths:
1090
+ - api/.yarn
1091
+ rules:
1092
+ - if: $CI_COMMIT_TAG
1093
+ needs:
1094
+ - 'api 🔨 app | stage '
1095
+ retry: *a1
1096
+ interruptible: true
1097
+ 'api 🧾 sbom | stage ':
1098
+ stage: build
1099
+ image: aquasec/trivy:0.38.3
1100
+ variables: {}
1101
+ script:
1102
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1103
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1104
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" api
1105
+ artifacts:
1106
+ paths:
1107
+ - __sbom.json
1108
+ rules:
1109
+ - if: $CI_COMMIT_TAG
1110
+ needs: []
1111
+ retry: *a1
1112
+ interruptible: true
1113
+ allow_failure: true
1114
+ 'api 🚀 Deploy | stage ':
1115
+ stage: deploy stage
1116
+ image: path/to/docker/kubernetes:the-version
1117
+ variables:
1118
+ KUBERNETES_CPU_REQUEST: '0.22'
1119
+ KUBERNETES_MEMORY_REQUEST: 200Mi
1120
+ KUBERNETES_MEMORY_LIMIT: 400Mi
1121
+ script:
1122
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1123
+ - export ENV_SHORT="stage"
1124
+ - export APP_DIR="api"
1125
+ - export ENV_TYPE="stage"
1126
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1127
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1128
+ - 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")"
1129
+ - export HOST="api.stage.test-app.pan.panter.cloud"
1130
+ - export ROOT_URL="https://api.stage.test-app.pan.panter.cloud"
1131
+ - export HOST_INTERNAL="api.stage.test-app.pan.panter.cloud"
1132
+ - export HOST_CANONICAL="api.stage.test-app.pan.panter.cloud"
1133
+ - export ROOT_URL_INTERNAL="https://api.stage.test-app.pan.panter.cloud"
1134
+ - export KUBE_NAMESPACE="pan-test-app-stage"
1135
+ - export KUBE_APP_NAME="api"
1136
+ - export KUBE_APP_NAME_PREFIX=""
1137
+ - export POSTGRESQL_PASSWORD="$CL_stage_api_POSTGRESQL_PASSWORD"
1138
+ - export cloudsqlProxyCredentials="$CL_stage_api_cloudsqlProxyCredentials"
1139
+ - 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\\"]"
1140
+ - export DOCKER_REGISTRY="$CI_REGISTRY"
1141
+ - export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/api"
1142
+ - export DOCKER_IMAGE_NAME="stage/api"
1143
+ - export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
1144
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
1145
+ - export RELEASE_NAME="pan-test-app-stage-api"
1146
+ - export HELM_EXPERIMENTAL_OCI="1"
1147
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"
1148
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
1149
+ - export HELM_ARGS=""
1150
+ - export COMPONENT_NAME="api"
1151
+ - export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1152
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1153
+ - 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
1154
+ - kubectl config set-credentials "kube-pan-test-app-stage-api" --token="$CL_stage_api_KUBE_TOKEN"
1155
+ - 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"
1156
+ - kubectl config use-context "kube-pan-test-app-stage-api"
1157
+ - echo -e "\\e[0Ksection_start:$(date +%s):writeallvalues[collapsed=true]\\r\\e[0KWrite __all_values.yml for helm deployment"
1158
+ - |
1159
+ cat > __all_values.yml <<EOF
1160
+ env:
1161
+ secret:
1162
+ POSTGRESQL_PASSWORD: |-
1163
+ $(printf %s "$CL_stage_api_POSTGRESQL_PASSWORD" | sed 's/^/ /')
1164
+ cloudsqlProxyCredentials: |-
1165
+ $(printf %s "$CL_stage_api_cloudsqlProxyCredentials" | sed 's/^/ /')
1166
+ public:
1167
+ ENV_SHORT: |-
1168
+ stage
1169
+ APP_DIR: |-
1170
+ api
1171
+ ENV_TYPE: |-
1172
+ stage
1173
+ BUILD_INFO_BUILD_ID: |-
1174
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
1175
+ BUILD_INFO_BUILD_TIME: |-
1176
+ $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
1177
+ BUILD_INFO_CURRENT_VERSION: |-
1178
+ $(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/^/ /')
1179
+ HOST: |-
1180
+ api.stage.test-app.pan.panter.cloud
1181
+ ROOT_URL: |-
1182
+ https://api.stage.test-app.pan.panter.cloud
1183
+ HOST_INTERNAL: |-
1184
+ api.stage.test-app.pan.panter.cloud
1185
+ HOST_CANONICAL: |-
1186
+ api.stage.test-app.pan.panter.cloud
1187
+ ROOT_URL_INTERNAL: |-
1188
+ https://api.stage.test-app.pan.panter.cloud
1189
+ KUBE_NAMESPACE: |-
1190
+ pan-test-app-stage
1191
+ KUBE_APP_NAME: |-
1192
+ api
1193
+ KUBE_APP_NAME_PREFIX: ""
1194
+ _ALL_ENV_VAR_KEYS: |-
1195
+ ["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"]
1196
+ application:
1197
+ host: |-
1198
+ api.stage.test-app.pan.panter.cloud
1199
+ command: |-
1200
+ yarn start
1201
+ livenessProbe:
1202
+ httpGet:
1203
+ path: |-
1204
+ __health
1205
+ readinessProbe:
1206
+ httpGet:
1207
+ path: |-
1208
+ __health
1209
+ startupProbe:
1210
+ httpGet:
1211
+ path: |-
1212
+ __health
1213
+ cloudsql:
1214
+ enabled: true
1215
+ dbUser: |-
1216
+ postgres
1217
+ instanceConnectionName: |-
1218
+ myproject:europe-west6:instance-name
1219
+ proxyCredentials: |-
1220
+ $CL_stage_api_cloudsqlProxyCredentials
1221
+ fullDbName: |-
1222
+ pan-test-app-stage-api
1223
+ type: |-
1224
+ unmanaged
1225
+
1226
+ EOF
1227
+ - echo -e "\\e[0Ksection_end:$(date +%s):writeallvalues\\r\\e[0K"
1228
+ - kubernetesCreateSecret
1229
+ - kubernetesDeploy
1230
+ - echo 'Uploading SBOM to Dependency Track'
1231
+ - /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
1232
+ - echo deployment successful 😻
1233
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://api.stage.test-app.pan.panter.cloud" >> gitlab_environment.env
1234
+ environment:
1235
+ name: stage/api
1236
+ url: $CL_GITLAB_ENVIRONMENT_URL
1237
+ on_stop: 'api 🛑 Stop ⚠️ | stage '
1238
+ artifacts:
1239
+ reports:
1240
+ dotenv: gitlab_environment.env
1241
+ rules:
1242
+ - when: on_success
1243
+ if: $CI_COMMIT_TAG
1244
+ needs:
1245
+ - job: 'api 🔨 app | stage '
1246
+ artifacts: false
1247
+ - job: 'api 🔨 docker | stage '
1248
+ artifacts: false
1249
+ - job: 'api 🧾 sbom | stage '
1250
+ artifacts: true
1251
+ retry: *a1
1252
+ interruptible: true
1253
+ allow_failure: false
1254
+ 'api 🛑 Stop ⚠️ | stage ':
1255
+ stage: stop stage
1256
+ image: path/to/docker/kubernetes:the-version
1257
+ variables:
1258
+ KUBERNETES_CPU_REQUEST: '0.22'
1259
+ KUBERNETES_MEMORY_REQUEST: 200Mi
1260
+ KUBERNETES_MEMORY_LIMIT: 400Mi
1261
+ GIT_STRATEGY: none
1262
+ script:
1263
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1264
+ - export ENV_SHORT="stage"
1265
+ - export APP_DIR="api"
1266
+ - export ENV_TYPE="stage"
1267
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1268
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1269
+ - 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")"
1270
+ - export HOST="api.stage.test-app.pan.panter.cloud"
1271
+ - export ROOT_URL="https://api.stage.test-app.pan.panter.cloud"
1272
+ - export HOST_INTERNAL="api.stage.test-app.pan.panter.cloud"
1273
+ - export HOST_CANONICAL="api.stage.test-app.pan.panter.cloud"
1274
+ - export ROOT_URL_INTERNAL="https://api.stage.test-app.pan.panter.cloud"
1275
+ - export KUBE_NAMESPACE="pan-test-app-stage"
1276
+ - export KUBE_APP_NAME="api"
1277
+ - export KUBE_APP_NAME_PREFIX=""
1278
+ - export POSTGRESQL_PASSWORD="$CL_stage_api_POSTGRESQL_PASSWORD"
1279
+ - export cloudsqlProxyCredentials="$CL_stage_api_cloudsqlProxyCredentials"
1280
+ - 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\\"]"
1281
+ - export RELEASE_NAME="pan-test-app-stage-api"
1282
+ - export HELM_EXPERIMENTAL_OCI="1"
1283
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"
1284
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
1285
+ - export HELM_ARGS=""
1286
+ - export COMPONENT_NAME="api"
1287
+ - export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1288
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1289
+ - 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
1290
+ - kubectl config set-credentials "kube-pan-test-app-stage-api" --token="$CL_stage_api_KUBE_TOKEN"
1291
+ - 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"
1292
+ - kubectl config use-context "kube-pan-test-app-stage-api"
1293
+ - kubernetesDelete
1294
+ - echo 'Disabling component in Dependency Track'
1295
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/api" "https://api.stage.test-app.pan.panter.cloud" || true
1296
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://api.stage.test-app.pan.panter.cloud" >> gitlab_environment.env
1297
+ environment:
1298
+ name: stage/api
1299
+ url: $CL_GITLAB_ENVIRONMENT_URL
1300
+ action: stop
1301
+ artifacts:
1302
+ reports:
1303
+ dotenv: gitlab_environment.env
1304
+ rules:
1305
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
1306
+ when: on_success
1307
+ - when: manual
1308
+ if: $CI_COMMIT_TAG
1309
+ needs: []
1310
+ retry: *a1
1311
+ interruptible: true
1312
+ allow_failure: true
1313
+ 'api ↩️ Rollback ⚠️ | stage ':
1314
+ stage: rollback stage
1315
+ image: path/to/docker/kubernetes:the-version
1316
+ variables:
1317
+ KUBERNETES_CPU_REQUEST: '0.22'
1318
+ KUBERNETES_MEMORY_REQUEST: 200Mi
1319
+ KUBERNETES_MEMORY_LIMIT: 400Mi
1320
+ GIT_STRATEGY: none
1321
+ script:
1322
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1323
+ - export ENV_SHORT="stage"
1324
+ - export APP_DIR="api"
1325
+ - export ENV_TYPE="stage"
1326
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1327
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1328
+ - 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")"
1329
+ - export HOST="api.stage.test-app.pan.panter.cloud"
1330
+ - export ROOT_URL="https://api.stage.test-app.pan.panter.cloud"
1331
+ - export HOST_INTERNAL="api.stage.test-app.pan.panter.cloud"
1332
+ - export HOST_CANONICAL="api.stage.test-app.pan.panter.cloud"
1333
+ - export ROOT_URL_INTERNAL="https://api.stage.test-app.pan.panter.cloud"
1334
+ - export KUBE_NAMESPACE="pan-test-app-stage"
1335
+ - export KUBE_APP_NAME="api"
1336
+ - export KUBE_APP_NAME_PREFIX=""
1337
+ - export POSTGRESQL_PASSWORD="$CL_stage_api_POSTGRESQL_PASSWORD"
1338
+ - export cloudsqlProxyCredentials="$CL_stage_api_cloudsqlProxyCredentials"
1339
+ - 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\\"]"
1340
+ - export RELEASE_NAME="pan-test-app-stage-api"
1341
+ - export HELM_EXPERIMENTAL_OCI="1"
1342
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"
1343
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
1344
+ - export HELM_ARGS=""
1345
+ - export COMPONENT_NAME="api"
1346
+ - export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1347
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1348
+ - 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
1349
+ - kubectl config set-credentials "kube-pan-test-app-stage-api" --token="$CL_stage_api_KUBE_TOKEN"
1350
+ - 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"
1351
+ - kubectl config use-context "kube-pan-test-app-stage-api"
1352
+ - kubernetesRollback
1353
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://api.stage.test-app.pan.panter.cloud" >> gitlab_environment.env
1354
+ environment:
1355
+ name: stage/api
1356
+ url: $CL_GITLAB_ENVIRONMENT_URL
1357
+ action: access
1358
+ artifacts:
1359
+ reports:
1360
+ dotenv: gitlab_environment.env
1361
+ rules:
1362
+ - when: manual
1363
+ if: $CI_COMMIT_TAG
1364
+ needs: []
1365
+ retry: *a1
1366
+ interruptible: true
1367
+ allow_failure: true
1368
+ 'api 🔨 app | prod ':
1369
+ stage: build
1370
+ image: path/to/docker/jobs-default:the-version
1371
+ variables:
1372
+ KUBERNETES_CPU_REQUEST: '0.45'
1373
+ KUBERNETES_MEMORY_REQUEST: 1Gi
1374
+ KUBERNETES_MEMORY_LIMIT: 4Gi
1375
+ script:
1376
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1377
+ - export ENV_SHORT="prod"
1378
+ - export APP_DIR="api"
1379
+ - export ENV_TYPE="prod"
1380
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1381
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1382
+ - 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")"
1383
+ - export HOST="api.prod.test-app.pan.panter.cloud"
1384
+ - export ROOT_URL="https://api.prod.test-app.pan.panter.cloud"
1385
+ - export HOST_INTERNAL="api.prod.test-app.pan.panter.cloud"
1386
+ - export HOST_CANONICAL="api.prod.test-app.pan.panter.cloud"
1387
+ - export ROOT_URL_INTERNAL="https://api.prod.test-app.pan.panter.cloud"
1388
+ - export KUBE_NAMESPACE="pan-test-app-prod"
1389
+ - export KUBE_APP_NAME="api"
1390
+ - export KUBE_APP_NAME_PREFIX=""
1391
+ - export POSTGRESQL_PASSWORD="$CL_prod_api_POSTGRESQL_PASSWORD"
1392
+ - export cloudsqlProxyCredentials="$CL_prod_api_cloudsqlProxyCredentials"
1393
+ - 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\\"]"
1394
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1395
+ - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > api/__build_info.json
1396
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
1397
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1398
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1399
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
1400
+ - cd api
1401
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
1402
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1403
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1404
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
1405
+ - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
1406
+ - yarn install --immutable
1407
+ - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
1408
+ - yarn build
1409
+ cache:
1410
+ - key: api-yarn
1411
+ policy: pull-push
1412
+ paths:
1413
+ - api/.yarn
1414
+ - key: api-node-modules
1415
+ policy: pull-push
1416
+ paths:
1417
+ - api/node_modules
1418
+ - key: api-next-cache
1419
+ policy: pull-push
1420
+ paths:
1421
+ - api/.next/cache
1422
+ artifacts:
1423
+ paths:
1424
+ - api/__build_info.json
1425
+ - api/.next
1426
+ - api/dist
1427
+ expire_in: 1 day
1428
+ when: always
1429
+ reports: {}
1430
+ rules:
1431
+ - if: $CI_COMMIT_TAG
1432
+ needs: []
1433
+ retry: *a1
1434
+ interruptible: true
1435
+ 'api 🔨 docker | prod ':
1436
+ stage: build
1437
+ image: path/to/docker/docker-build:the-version
1438
+ services:
1439
+ - name: docker:24.0.6-dind
1440
+ command:
1441
+ - --tls=false
1442
+ variables:
1443
+ DOCKER_HOST: tcp://0.0.0.0:2375
1444
+ DOCKER_TLS_CERTDIR: ''
1445
+ DOCKER_DRIVER: overlay2
1446
+ DOCKER_BUILDKIT: '1'
1447
+ KUBERNETES_CPU_REQUEST: '0.45'
1448
+ KUBERNETES_MEMORY_REQUEST: 1Gi
1449
+ KUBERNETES_MEMORY_LIMIT: 2Gi
1450
+ script:
1451
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1452
+ - export APP_DIR="api"
1453
+ - export DOCKER_BUILD_CONTEXT="."
1454
+ - export DOCKER_REGISTRY="$CI_REGISTRY"
1455
+ - export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/api"
1456
+ - export DOCKER_IMAGE_NAME="prod/api"
1457
+ - export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
1458
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
1459
+ - |-
1460
+ export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
1461
+ RUN yarn plugin import workspace-tools
1462
+ RUN yarn workspaces focus --production && yarn rebuild"
1463
+ - |-
1464
+ export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node api/package.json /app/api/package.json
1465
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
1466
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
1467
+ COPY --chown=node:node .yarn /app/.yarn"
1468
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1469
+ - ensureNodeDockerfile
1470
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
1471
+ - docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY
1472
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
1473
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
1474
+ - 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
1475
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
1476
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
1477
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
1478
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
1479
+ - docker push $DOCKER_CACHE_IMAGE
1480
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
1481
+ cache:
1482
+ - key: api-yarn
1483
+ policy: pull
1484
+ paths:
1485
+ - api/.yarn
1486
+ rules:
1487
+ - if: $CI_COMMIT_TAG
1488
+ needs:
1489
+ - 'api 🔨 app | prod '
1490
+ retry: *a1
1491
+ interruptible: true
1492
+ 'api 🧾 sbom | prod ':
1493
+ stage: build
1494
+ image: aquasec/trivy:0.38.3
1495
+ variables: {}
1496
+ script:
1497
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1498
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1499
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" api
1500
+ artifacts:
1501
+ paths:
1502
+ - __sbom.json
1503
+ rules:
1504
+ - if: $CI_COMMIT_TAG
1505
+ needs: []
1506
+ retry: *a1
1507
+ interruptible: true
1508
+ allow_failure: true
1509
+ 'api 🚀 Deploy | prod ':
1510
+ stage: deploy prod
1511
+ image: path/to/docker/kubernetes:the-version
1512
+ variables:
1513
+ KUBERNETES_CPU_REQUEST: '0.22'
1514
+ KUBERNETES_MEMORY_REQUEST: 200Mi
1515
+ KUBERNETES_MEMORY_LIMIT: 400Mi
1516
+ script:
1517
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1518
+ - export ENV_SHORT="prod"
1519
+ - export APP_DIR="api"
1520
+ - export ENV_TYPE="prod"
1521
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1522
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1523
+ - 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")"
1524
+ - export HOST="api.prod.test-app.pan.panter.cloud"
1525
+ - export ROOT_URL="https://api.prod.test-app.pan.panter.cloud"
1526
+ - export HOST_INTERNAL="api.prod.test-app.pan.panter.cloud"
1527
+ - export HOST_CANONICAL="api.prod.test-app.pan.panter.cloud"
1528
+ - export ROOT_URL_INTERNAL="https://api.prod.test-app.pan.panter.cloud"
1529
+ - export KUBE_NAMESPACE="pan-test-app-prod"
1530
+ - export KUBE_APP_NAME="api"
1531
+ - export KUBE_APP_NAME_PREFIX=""
1532
+ - export POSTGRESQL_PASSWORD="$CL_prod_api_POSTGRESQL_PASSWORD"
1533
+ - export cloudsqlProxyCredentials="$CL_prod_api_cloudsqlProxyCredentials"
1534
+ - 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\\"]"
1535
+ - export DOCKER_REGISTRY="$CI_REGISTRY"
1536
+ - export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/api"
1537
+ - export DOCKER_IMAGE_NAME="prod/api"
1538
+ - export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
1539
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
1540
+ - export RELEASE_NAME="pan-test-app-prod-api"
1541
+ - export HELM_EXPERIMENTAL_OCI="1"
1542
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"
1543
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
1544
+ - export HELM_ARGS=""
1545
+ - export COMPONENT_NAME="api"
1546
+ - export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1547
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1548
+ - 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
1549
+ - kubectl config set-credentials "kube-pan-test-app-prod-api" --token="$CL_prod_api_KUBE_TOKEN"
1550
+ - 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"
1551
+ - kubectl config use-context "kube-pan-test-app-prod-api"
1552
+ - echo -e "\\e[0Ksection_start:$(date +%s):writeallvalues[collapsed=true]\\r\\e[0KWrite __all_values.yml for helm deployment"
1553
+ - |
1554
+ cat > __all_values.yml <<EOF
1555
+ env:
1556
+ secret:
1557
+ POSTGRESQL_PASSWORD: |-
1558
+ $(printf %s "$CL_prod_api_POSTGRESQL_PASSWORD" | sed 's/^/ /')
1559
+ cloudsqlProxyCredentials: |-
1560
+ $(printf %s "$CL_prod_api_cloudsqlProxyCredentials" | sed 's/^/ /')
1561
+ public:
1562
+ ENV_SHORT: |-
1563
+ prod
1564
+ APP_DIR: |-
1565
+ api
1566
+ ENV_TYPE: |-
1567
+ prod
1568
+ BUILD_INFO_BUILD_ID: |-
1569
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
1570
+ BUILD_INFO_BUILD_TIME: |-
1571
+ $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
1572
+ BUILD_INFO_CURRENT_VERSION: |-
1573
+ $(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/^/ /')
1574
+ HOST: |-
1575
+ api.prod.test-app.pan.panter.cloud
1576
+ ROOT_URL: |-
1577
+ https://api.prod.test-app.pan.panter.cloud
1578
+ HOST_INTERNAL: |-
1579
+ api.prod.test-app.pan.panter.cloud
1580
+ HOST_CANONICAL: |-
1581
+ api.prod.test-app.pan.panter.cloud
1582
+ ROOT_URL_INTERNAL: |-
1583
+ https://api.prod.test-app.pan.panter.cloud
1584
+ KUBE_NAMESPACE: |-
1585
+ pan-test-app-prod
1586
+ KUBE_APP_NAME: |-
1587
+ api
1588
+ KUBE_APP_NAME_PREFIX: ""
1589
+ _ALL_ENV_VAR_KEYS: |-
1590
+ ["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"]
1591
+ application:
1592
+ host: |-
1593
+ api.prod.test-app.pan.panter.cloud
1594
+ command: |-
1595
+ yarn start
1596
+ livenessProbe:
1597
+ httpGet:
1598
+ path: |-
1599
+ __health
1600
+ readinessProbe:
1601
+ httpGet:
1602
+ path: |-
1603
+ __health
1604
+ startupProbe:
1605
+ httpGet:
1606
+ path: |-
1607
+ __health
1608
+ cloudsql:
1609
+ enabled: true
1610
+ dbUser: |-
1611
+ postgres
1612
+ instanceConnectionName: |-
1613
+ myproject:europe-west6:instance-name
1614
+ proxyCredentials: |-
1615
+ $CL_prod_api_cloudsqlProxyCredentials
1616
+ fullDbName: |-
1617
+ pan-test-app-prod-api
1618
+ type: |-
1619
+ unmanaged
1620
+
1621
+ EOF
1622
+ - echo -e "\\e[0Ksection_end:$(date +%s):writeallvalues\\r\\e[0K"
1623
+ - kubernetesCreateSecret
1624
+ - kubernetesDeploy
1625
+ - echo 'Uploading SBOM to Dependency Track'
1626
+ - /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
1627
+ - echo deployment successful 😻
1628
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://api.prod.test-app.pan.panter.cloud" >> gitlab_environment.env
1629
+ environment:
1630
+ name: prod/api
1631
+ url: $CL_GITLAB_ENVIRONMENT_URL
1632
+ on_stop: 'api 🛑 Stop ⚠️ | prod '
1633
+ artifacts:
1634
+ reports:
1635
+ dotenv: gitlab_environment.env
1636
+ rules:
1637
+ - when: manual
1638
+ if: $CI_COMMIT_TAG
1639
+ needs:
1640
+ - job: 'api 🔨 app | prod '
1641
+ artifacts: false
1642
+ - job: 'api 🔨 docker | prod '
1643
+ artifacts: false
1644
+ - job: 'api 🧾 sbom | prod '
1645
+ artifacts: true
1646
+ retry: *a1
1647
+ interruptible: true
1648
+ allow_failure: true
1649
+ 'api 🛑 Stop ⚠️ | prod ':
1650
+ stage: stop prod
1651
+ image: path/to/docker/kubernetes:the-version
1652
+ variables:
1653
+ KUBERNETES_CPU_REQUEST: '0.22'
1654
+ KUBERNETES_MEMORY_REQUEST: 200Mi
1655
+ KUBERNETES_MEMORY_LIMIT: 400Mi
1656
+ GIT_STRATEGY: none
1657
+ script:
1658
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1659
+ - export ENV_SHORT="prod"
1660
+ - export APP_DIR="api"
1661
+ - export ENV_TYPE="prod"
1662
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1663
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1664
+ - 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")"
1665
+ - export HOST="api.prod.test-app.pan.panter.cloud"
1666
+ - export ROOT_URL="https://api.prod.test-app.pan.panter.cloud"
1667
+ - export HOST_INTERNAL="api.prod.test-app.pan.panter.cloud"
1668
+ - export HOST_CANONICAL="api.prod.test-app.pan.panter.cloud"
1669
+ - export ROOT_URL_INTERNAL="https://api.prod.test-app.pan.panter.cloud"
1670
+ - export KUBE_NAMESPACE="pan-test-app-prod"
1671
+ - export KUBE_APP_NAME="api"
1672
+ - export KUBE_APP_NAME_PREFIX=""
1673
+ - export POSTGRESQL_PASSWORD="$CL_prod_api_POSTGRESQL_PASSWORD"
1674
+ - export cloudsqlProxyCredentials="$CL_prod_api_cloudsqlProxyCredentials"
1675
+ - 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\\"]"
1676
+ - export RELEASE_NAME="pan-test-app-prod-api"
1677
+ - export HELM_EXPERIMENTAL_OCI="1"
1678
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"
1679
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
1680
+ - export HELM_ARGS=""
1681
+ - export COMPONENT_NAME="api"
1682
+ - export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1683
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1684
+ - 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
1685
+ - kubectl config set-credentials "kube-pan-test-app-prod-api" --token="$CL_prod_api_KUBE_TOKEN"
1686
+ - 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"
1687
+ - kubectl config use-context "kube-pan-test-app-prod-api"
1688
+ - kubernetesDelete
1689
+ - echo 'Disabling component in Dependency Track'
1690
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/api" "https://api.prod.test-app.pan.panter.cloud" || true
1691
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://api.prod.test-app.pan.panter.cloud" >> gitlab_environment.env
1692
+ environment:
1693
+ name: prod/api
1694
+ url: $CL_GITLAB_ENVIRONMENT_URL
1695
+ action: stop
1696
+ artifacts:
1697
+ reports:
1698
+ dotenv: gitlab_environment.env
1699
+ rules:
1700
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
1701
+ when: on_success
1702
+ - when: manual
1703
+ if: $CI_COMMIT_TAG
1704
+ needs: []
1705
+ retry: *a1
1706
+ interruptible: true
1707
+ allow_failure: true
1708
+ 'api ↩️ Rollback ⚠️ | prod ':
1709
+ stage: rollback prod
1710
+ image: path/to/docker/kubernetes:the-version
1711
+ variables:
1712
+ KUBERNETES_CPU_REQUEST: '0.22'
1713
+ KUBERNETES_MEMORY_REQUEST: 200Mi
1714
+ KUBERNETES_MEMORY_LIMIT: 400Mi
1715
+ GIT_STRATEGY: none
1716
+ script:
1717
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1718
+ - export ENV_SHORT="prod"
1719
+ - export APP_DIR="api"
1720
+ - export ENV_TYPE="prod"
1721
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1722
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1723
+ - 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")"
1724
+ - export HOST="api.prod.test-app.pan.panter.cloud"
1725
+ - export ROOT_URL="https://api.prod.test-app.pan.panter.cloud"
1726
+ - export HOST_INTERNAL="api.prod.test-app.pan.panter.cloud"
1727
+ - export HOST_CANONICAL="api.prod.test-app.pan.panter.cloud"
1728
+ - export ROOT_URL_INTERNAL="https://api.prod.test-app.pan.panter.cloud"
1729
+ - export KUBE_NAMESPACE="pan-test-app-prod"
1730
+ - export KUBE_APP_NAME="api"
1731
+ - export KUBE_APP_NAME_PREFIX=""
1732
+ - export POSTGRESQL_PASSWORD="$CL_prod_api_POSTGRESQL_PASSWORD"
1733
+ - export cloudsqlProxyCredentials="$CL_prod_api_cloudsqlProxyCredentials"
1734
+ - 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\\"]"
1735
+ - export RELEASE_NAME="pan-test-app-prod-api"
1736
+ - export HELM_EXPERIMENTAL_OCI="1"
1737
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"
1738
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
1739
+ - export HELM_ARGS=""
1740
+ - export COMPONENT_NAME="api"
1741
+ - export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1742
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1743
+ - 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
1744
+ - kubectl config set-credentials "kube-pan-test-app-prod-api" --token="$CL_prod_api_KUBE_TOKEN"
1745
+ - 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"
1746
+ - kubectl config use-context "kube-pan-test-app-prod-api"
1747
+ - kubernetesRollback
1748
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://api.prod.test-app.pan.panter.cloud" >> gitlab_environment.env
1749
+ environment:
1750
+ name: prod/api
1751
+ url: $CL_GITLAB_ENVIRONMENT_URL
1752
+ action: access
1753
+ artifacts:
1754
+ reports:
1755
+ dotenv: gitlab_environment.env
1756
+ rules:
1757
+ - when: manual
1758
+ if: $CI_COMMIT_TAG
1759
+ needs: []
1760
+ retry: *a1
1761
+ interruptible: true
1762
+ allow_failure: true
1763
+ create release:
1764
+ stage: release
1765
+ image: path/to/docker/semantic-release:the-version
1766
+ script:
1767
+ - semanticRelease
1768
+ after_script:
1769
+ - echo '👉 The project access token might be invald - run \`project-renew-token\` in catladder CLI to fix.'
1770
+ rules:
1771
+ - &a2
1772
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
1773
+ when: never
1774
+ - &a3
1775
+ if: $CI_PIPELINE_SOURCE == "schedule"
1776
+ when: never
1777
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $AUTO_RELEASE == "true"
1778
+ when: on_success
1779
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
1780
+ when: manual
1781
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+.([0-9]+|x).x$/
1782
+ when: manual
1783
+ ⚠️ force create release:
1784
+ stage: release
1785
+ image: path/to/docker/semantic-release:the-version
1786
+ script:
1787
+ - semanticRelease
1788
+ after_script:
1789
+ - echo '👉 The project access token might be invald - run \`project-renew-token\` in catladder CLI to fix.'
1790
+ rules:
1791
+ - *a2
1792
+ - *a3
1793
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
1794
+ when: manual
1795
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+.([0-9]+|x).x$/
1796
+ when: manual
1797
+ needs: []
1798
+ "
1799
+ `;
1800
+
3
1801
  exports[`matches snapshot for kubernetes-with-cloud-sql 1`] = `
4
1802
  {
5
1803
  "mainBranch": {