@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,1475 @@
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
+ app 🛡 audit:
49
+ stage: test
50
+ image: ruby:3.2.1
51
+ variables: {}
52
+ script:
53
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
54
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
55
+ - cd .
56
+ - gem install bundler-audit
57
+ - bundle audit check
58
+ rules:
59
+ - when: never
60
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
61
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
62
+ - if: $CI_MERGE_REQUEST_ID
63
+ needs: []
64
+ retry: &a1
65
+ max: 2
66
+ when:
67
+ - runner_system_failure
68
+ - stuck_or_timeout_failure
69
+ interruptible: true
70
+ allow_failure: true
71
+ app 👮 lint:
72
+ stage: test
73
+ image: ruby:3.2.1
74
+ variables: {}
75
+ script:
76
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
77
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
78
+ - cd .
79
+ - bundle config set path 'tmp/cache'
80
+ - bundle install -j $(nproc)
81
+ - bundle exec rubocop
82
+ cache: &a2
83
+ key:
84
+ files:
85
+ - Gemfile.lock
86
+ prefix: $CI_JOB_IMAGE
87
+ paths:
88
+ - tmp/cache
89
+ rules:
90
+ - when: never
91
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
92
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
93
+ - if: $CI_MERGE_REQUEST_ID
94
+ needs: []
95
+ retry: *a1
96
+ interruptible: true
97
+ app 🧪 test:
98
+ stage: test
99
+ image: ruby:3.2.1
100
+ variables: {}
101
+ script:
102
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
103
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
104
+ - cd .
105
+ - bundle config set path 'tmp/cache'
106
+ - bundle install -j $(nproc)
107
+ - bundle exec rspec
108
+ cache: *a2
109
+ rules:
110
+ - when: never
111
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
112
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
113
+ - if: $CI_MERGE_REQUEST_ID
114
+ needs: []
115
+ retry: *a1
116
+ interruptible: true
117
+ 'app 🔨 docker | dev ':
118
+ stage: build
119
+ image: path/to/docker/docker-build:the-version
120
+ services:
121
+ - name: docker:24.0.6-dind
122
+ command:
123
+ - --tls=false
124
+ variables:
125
+ DOCKER_HOST: tcp://0.0.0.0:2375
126
+ DOCKER_TLS_CERTDIR: ''
127
+ DOCKER_DRIVER: overlay2
128
+ DOCKER_BUILDKIT: '1'
129
+ KUBERNETES_CPU_REQUEST: '0.45'
130
+ KUBERNETES_MEMORY_REQUEST: 1Gi
131
+ KUBERNETES_MEMORY_LIMIT: 2Gi
132
+ script:
133
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
134
+ - export APP_DIR="."
135
+ - export DOCKER_BUILD_CONTEXT="."
136
+ - export DOCKER_REGISTRY="$CI_REGISTRY"
137
+ - export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/app"
138
+ - export DOCKER_IMAGE_NAME="dev/app"
139
+ - export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
140
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
141
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
142
+ - docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY
143
+ - cd .
144
+ - docker pull $DOCKER_CACHE_IMAGE || true
145
+ - wget --output-document=- https://github.com/buildpacks/pack/releases/download/v0.32.1/pack-v0.32.1-linux.tgz | tar -zx --directory /usr/local/bin pack
146
+ - chmod +x /usr/local/bin/pack
147
+ - sed --in-place 's|git@\\([^:]*\\):|https://\\1/|g' Gemfile Gemfile.lock
148
+ - 'pack build "$DOCKER_IMAGE:$DOCKER_IMAGE_TAG" --builder ''heroku/builder:22'' --publish --cache-image "$DOCKER_CACHE_IMAGE" --env ''SECRET_KEY_BASE=dummy-value'' '
149
+ rules:
150
+ - when: never
151
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
152
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
153
+ needs: []
154
+ retry: *a1
155
+ interruptible: true
156
+ 'app 🧾 sbom | dev ':
157
+ stage: build
158
+ image: aquasec/trivy:0.38.3
159
+ variables: {}
160
+ script:
161
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
162
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
163
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" .
164
+ artifacts:
165
+ paths:
166
+ - __sbom.json
167
+ rules:
168
+ - when: never
169
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
170
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
171
+ needs: []
172
+ retry: *a1
173
+ interruptible: true
174
+ allow_failure: true
175
+ 'app 🚀 Deploy | dev ':
176
+ stage: deploy dev
177
+ image: path/to/docker/kubernetes:the-version
178
+ variables:
179
+ KUBERNETES_CPU_REQUEST: '0.22'
180
+ KUBERNETES_MEMORY_REQUEST: 200Mi
181
+ KUBERNETES_MEMORY_LIMIT: 400Mi
182
+ script:
183
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
184
+ - export ENV_SHORT="dev"
185
+ - export APP_DIR="."
186
+ - export ENV_TYPE="dev"
187
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
188
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
189
+ - 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")"
190
+ - export ROOT_URL="https://app.dev.test-app.pan.panter.cloud"
191
+ - export HOST_INTERNAL="app.dev.test-app.pan.panter.cloud"
192
+ - export HOST_CANONICAL="app.dev.test-app.pan.panter.cloud"
193
+ - export ROOT_URL_INTERNAL="https://app.dev.test-app.pan.panter.cloud"
194
+ - export KUBE_NAMESPACE="pan-test-app-dev"
195
+ - export KUBE_APP_NAME="app"
196
+ - export KUBE_APP_NAME_PREFIX=""
197
+ - export SECRET_KEY_BASE="$CL_dev_app_SECRET_KEY_BASE"
198
+ - export POSTGRESQL_PASSWORD="$CL_dev_app_POSTGRESQL_PASSWORD"
199
+ - export cloudsqlProxyCredentials="$CL_dev_app_cloudsqlProxyCredentials"
200
+ - export RAILS_ENV="production"
201
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"SECRET_KEY_BASE\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\",\\"RAILS_ENV\\"]"
202
+ - export DOCKER_REGISTRY="$CI_REGISTRY"
203
+ - export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/app"
204
+ - export DOCKER_IMAGE_NAME="dev/app"
205
+ - export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
206
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
207
+ - export RELEASE_NAME="pan-test-app-dev-app"
208
+ - export HELM_EXPERIMENTAL_OCI="1"
209
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-app"
210
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
211
+ - export HELM_ARGS=""
212
+ - export COMPONENT_NAME="app"
213
+ - export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
214
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
215
+ - kubectl config set-cluster "kube-pan-test-app-dev-app" --server="$CL_dev_app_KUBE_URL" --certificate-authority <(echo $CL_dev_app_KUBE_CA_PEM | base64 -d) --embed-certs=true
216
+ - kubectl config set-credentials "kube-pan-test-app-dev-app" --token="$CL_dev_app_KUBE_TOKEN"
217
+ - kubectl config set-context "kube-pan-test-app-dev-app" --cluster="kube-pan-test-app-dev-app" --user="kube-pan-test-app-dev-app" --namespace="pan-test-app-dev"
218
+ - kubectl config use-context "kube-pan-test-app-dev-app"
219
+ - echo -e "\\e[0Ksection_start:$(date +%s):writeallvalues[collapsed=true]\\r\\e[0KWrite __all_values.yml for helm deployment"
220
+ - |
221
+ cat > __all_values.yml <<EOF
222
+ env:
223
+ secret:
224
+ SECRET_KEY_BASE: |-
225
+ $(printf %s "$CL_dev_app_SECRET_KEY_BASE" | sed 's/^/ /')
226
+ POSTGRESQL_PASSWORD: |-
227
+ $(printf %s "$CL_dev_app_POSTGRESQL_PASSWORD" | sed 's/^/ /')
228
+ cloudsqlProxyCredentials: |-
229
+ $(printf %s "$CL_dev_app_cloudsqlProxyCredentials" | sed 's/^/ /')
230
+ public:
231
+ ENV_SHORT: |-
232
+ dev
233
+ APP_DIR: |-
234
+ .
235
+ ENV_TYPE: |-
236
+ dev
237
+ BUILD_INFO_BUILD_ID: |-
238
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
239
+ BUILD_INFO_BUILD_TIME: |-
240
+ $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
241
+ BUILD_INFO_CURRENT_VERSION: |-
242
+ $(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/^/ /')
243
+ ROOT_URL: |-
244
+ https://app.dev.test-app.pan.panter.cloud
245
+ HOST_INTERNAL: |-
246
+ app.dev.test-app.pan.panter.cloud
247
+ HOST_CANONICAL: |-
248
+ app.dev.test-app.pan.panter.cloud
249
+ ROOT_URL_INTERNAL: |-
250
+ https://app.dev.test-app.pan.panter.cloud
251
+ KUBE_NAMESPACE: |-
252
+ pan-test-app-dev
253
+ KUBE_APP_NAME: |-
254
+ app
255
+ KUBE_APP_NAME_PREFIX: ""
256
+ RAILS_ENV: |-
257
+ production
258
+ _ALL_ENV_VAR_KEYS: |-
259
+ ["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","ROOT_URL","HOST_INTERNAL","HOST_CANONICAL","ROOT_URL_INTERNAL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","SECRET_KEY_BASE","POSTGRESQL_PASSWORD","cloudsqlProxyCredentials","RAILS_ENV"]
260
+ application:
261
+ host: |-
262
+ app.dev.test-app.pan.panter.cloud
263
+ command: |-
264
+ /cnb/process/web
265
+ livenessProbe:
266
+ httpGet:
267
+ path: |-
268
+ __health
269
+ readinessProbe:
270
+ httpGet:
271
+ path: |-
272
+ __health
273
+ startupProbe:
274
+ httpGet:
275
+ path: |-
276
+ __health
277
+ worker:
278
+ enabled: true
279
+ command: |-
280
+ launcher bundle exec rake jobs:work
281
+ livenessProbe: false
282
+ cloudsql:
283
+ enabled: true
284
+ dbUser: |-
285
+ postgres
286
+ instanceConnectionName: |-
287
+ some-project-id:europe-west6:pan-test-app-dev
288
+ proxyCredentials: |-
289
+ $CL_dev_app_cloudsqlProxyCredentials
290
+ fullDbName: |-
291
+ app
292
+ projectId: |-
293
+ some-project-id
294
+ jobs:
295
+ db-migrate:
296
+ hook: |-
297
+ post-install,post-upgrade
298
+ command: |-
299
+ launcher bundle exec rake db:migrate
300
+
301
+ EOF
302
+ - echo -e "\\e[0Ksection_end:$(date +%s):writeallvalues\\r\\e[0K"
303
+ - kubernetesCreateSecret
304
+ - kubernetesDeploy
305
+ - echo 'Uploading SBOM to Dependency Track'
306
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/app" "https://app.dev.test-app.pan.panter.cloud" "__sbom.json" vex.json || true
307
+ - echo deployment successful 😻
308
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://app.dev.test-app.pan.panter.cloud" >> gitlab_environment.env
309
+ environment:
310
+ name: dev/app
311
+ url: $CL_GITLAB_ENVIRONMENT_URL
312
+ on_stop: 'app 🛑 Stop ⚠️ | dev '
313
+ auto_stop_in: 4 weeks
314
+ artifacts:
315
+ reports:
316
+ dotenv: gitlab_environment.env
317
+ rules:
318
+ - when: never
319
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
320
+ - when: on_success
321
+ if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
322
+ needs:
323
+ - job: app 👮 lint
324
+ artifacts: false
325
+ - job: 'app 🔨 docker | dev '
326
+ artifacts: false
327
+ - job: app 🧪 test
328
+ artifacts: false
329
+ - job: 'app 🧾 sbom | dev '
330
+ artifacts: true
331
+ - job: app 🛡 audit
332
+ artifacts: false
333
+ retry: *a1
334
+ interruptible: true
335
+ allow_failure: false
336
+ 'app 🛑 Stop ⚠️ | dev ':
337
+ stage: stop dev
338
+ image: path/to/docker/kubernetes:the-version
339
+ variables:
340
+ KUBERNETES_CPU_REQUEST: '0.22'
341
+ KUBERNETES_MEMORY_REQUEST: 200Mi
342
+ KUBERNETES_MEMORY_LIMIT: 400Mi
343
+ GIT_STRATEGY: none
344
+ script:
345
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
346
+ - export ENV_SHORT="dev"
347
+ - export APP_DIR="."
348
+ - export ENV_TYPE="dev"
349
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
350
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
351
+ - 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")"
352
+ - export ROOT_URL="https://app.dev.test-app.pan.panter.cloud"
353
+ - export HOST_INTERNAL="app.dev.test-app.pan.panter.cloud"
354
+ - export HOST_CANONICAL="app.dev.test-app.pan.panter.cloud"
355
+ - export ROOT_URL_INTERNAL="https://app.dev.test-app.pan.panter.cloud"
356
+ - export KUBE_NAMESPACE="pan-test-app-dev"
357
+ - export KUBE_APP_NAME="app"
358
+ - export KUBE_APP_NAME_PREFIX=""
359
+ - export SECRET_KEY_BASE="$CL_dev_app_SECRET_KEY_BASE"
360
+ - export POSTGRESQL_PASSWORD="$CL_dev_app_POSTGRESQL_PASSWORD"
361
+ - export cloudsqlProxyCredentials="$CL_dev_app_cloudsqlProxyCredentials"
362
+ - export RAILS_ENV="production"
363
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"SECRET_KEY_BASE\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\",\\"RAILS_ENV\\"]"
364
+ - export RELEASE_NAME="pan-test-app-dev-app"
365
+ - export HELM_EXPERIMENTAL_OCI="1"
366
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-app"
367
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
368
+ - export HELM_ARGS=""
369
+ - export COMPONENT_NAME="app"
370
+ - export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
371
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
372
+ - kubectl config set-cluster "kube-pan-test-app-dev-app" --server="$CL_dev_app_KUBE_URL" --certificate-authority <(echo $CL_dev_app_KUBE_CA_PEM | base64 -d) --embed-certs=true
373
+ - kubectl config set-credentials "kube-pan-test-app-dev-app" --token="$CL_dev_app_KUBE_TOKEN"
374
+ - kubectl config set-context "kube-pan-test-app-dev-app" --cluster="kube-pan-test-app-dev-app" --user="kube-pan-test-app-dev-app" --namespace="pan-test-app-dev"
375
+ - kubectl config use-context "kube-pan-test-app-dev-app"
376
+ - kubernetesDelete
377
+ - echo 'Disabling component in Dependency Track'
378
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/app" "https://app.dev.test-app.pan.panter.cloud" || true
379
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://app.dev.test-app.pan.panter.cloud" >> gitlab_environment.env
380
+ environment:
381
+ name: dev/app
382
+ url: $CL_GITLAB_ENVIRONMENT_URL
383
+ action: stop
384
+ artifacts:
385
+ reports:
386
+ dotenv: gitlab_environment.env
387
+ rules:
388
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
389
+ when: on_success
390
+ - when: never
391
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
392
+ - when: manual
393
+ if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
394
+ needs: []
395
+ retry: *a1
396
+ interruptible: true
397
+ allow_failure: true
398
+ 'app ↩️ Rollback ⚠️ | dev ':
399
+ stage: rollback dev
400
+ image: path/to/docker/kubernetes:the-version
401
+ variables:
402
+ KUBERNETES_CPU_REQUEST: '0.22'
403
+ KUBERNETES_MEMORY_REQUEST: 200Mi
404
+ KUBERNETES_MEMORY_LIMIT: 400Mi
405
+ GIT_STRATEGY: none
406
+ script:
407
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
408
+ - export ENV_SHORT="dev"
409
+ - export APP_DIR="."
410
+ - export ENV_TYPE="dev"
411
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
412
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
413
+ - 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")"
414
+ - export ROOT_URL="https://app.dev.test-app.pan.panter.cloud"
415
+ - export HOST_INTERNAL="app.dev.test-app.pan.panter.cloud"
416
+ - export HOST_CANONICAL="app.dev.test-app.pan.panter.cloud"
417
+ - export ROOT_URL_INTERNAL="https://app.dev.test-app.pan.panter.cloud"
418
+ - export KUBE_NAMESPACE="pan-test-app-dev"
419
+ - export KUBE_APP_NAME="app"
420
+ - export KUBE_APP_NAME_PREFIX=""
421
+ - export SECRET_KEY_BASE="$CL_dev_app_SECRET_KEY_BASE"
422
+ - export POSTGRESQL_PASSWORD="$CL_dev_app_POSTGRESQL_PASSWORD"
423
+ - export cloudsqlProxyCredentials="$CL_dev_app_cloudsqlProxyCredentials"
424
+ - export RAILS_ENV="production"
425
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"SECRET_KEY_BASE\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\",\\"RAILS_ENV\\"]"
426
+ - export RELEASE_NAME="pan-test-app-dev-app"
427
+ - export HELM_EXPERIMENTAL_OCI="1"
428
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-app"
429
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
430
+ - export HELM_ARGS=""
431
+ - export COMPONENT_NAME="app"
432
+ - export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
433
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
434
+ - kubectl config set-cluster "kube-pan-test-app-dev-app" --server="$CL_dev_app_KUBE_URL" --certificate-authority <(echo $CL_dev_app_KUBE_CA_PEM | base64 -d) --embed-certs=true
435
+ - kubectl config set-credentials "kube-pan-test-app-dev-app" --token="$CL_dev_app_KUBE_TOKEN"
436
+ - kubectl config set-context "kube-pan-test-app-dev-app" --cluster="kube-pan-test-app-dev-app" --user="kube-pan-test-app-dev-app" --namespace="pan-test-app-dev"
437
+ - kubectl config use-context "kube-pan-test-app-dev-app"
438
+ - kubernetesRollback
439
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://app.dev.test-app.pan.panter.cloud" >> gitlab_environment.env
440
+ environment:
441
+ name: dev/app
442
+ url: $CL_GITLAB_ENVIRONMENT_URL
443
+ action: access
444
+ artifacts:
445
+ reports:
446
+ dotenv: gitlab_environment.env
447
+ rules:
448
+ - when: never
449
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
450
+ - when: manual
451
+ if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
452
+ needs: []
453
+ retry: *a1
454
+ interruptible: true
455
+ allow_failure: true
456
+ 'app 🔨 docker | review ':
457
+ stage: build
458
+ image: path/to/docker/docker-build:the-version
459
+ services:
460
+ - name: docker:24.0.6-dind
461
+ command:
462
+ - --tls=false
463
+ variables:
464
+ DOCKER_HOST: tcp://0.0.0.0:2375
465
+ DOCKER_TLS_CERTDIR: ''
466
+ DOCKER_DRIVER: overlay2
467
+ DOCKER_BUILDKIT: '1'
468
+ KUBERNETES_CPU_REQUEST: '0.45'
469
+ KUBERNETES_MEMORY_REQUEST: 1Gi
470
+ KUBERNETES_MEMORY_LIMIT: 2Gi
471
+ script:
472
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
473
+ - export APP_DIR="."
474
+ - export DOCKER_BUILD_CONTEXT="."
475
+ - export DOCKER_REGISTRY="$CI_REGISTRY"
476
+ - export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/app"
477
+ - export DOCKER_IMAGE_NAME="review/app"
478
+ - export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
479
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
480
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
481
+ - docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY
482
+ - cd .
483
+ - docker pull $DOCKER_CACHE_IMAGE || true
484
+ - wget --output-document=- https://github.com/buildpacks/pack/releases/download/v0.32.1/pack-v0.32.1-linux.tgz | tar -zx --directory /usr/local/bin pack
485
+ - chmod +x /usr/local/bin/pack
486
+ - sed --in-place 's|git@\\([^:]*\\):|https://\\1/|g' Gemfile Gemfile.lock
487
+ - 'pack build "$DOCKER_IMAGE:$DOCKER_IMAGE_TAG" --builder ''heroku/builder:22'' --publish --cache-image "$DOCKER_CACHE_IMAGE" --env ''SECRET_KEY_BASE=dummy-value'' '
488
+ rules:
489
+ - if: $CI_MERGE_REQUEST_ID
490
+ needs: []
491
+ retry: *a1
492
+ interruptible: true
493
+ 'app 🧾 sbom | review ':
494
+ stage: build
495
+ image: aquasec/trivy:0.38.3
496
+ variables: {}
497
+ script:
498
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
499
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
500
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" .
501
+ artifacts:
502
+ paths:
503
+ - __sbom.json
504
+ rules:
505
+ - if: $CI_MERGE_REQUEST_ID
506
+ needs: []
507
+ retry: *a1
508
+ interruptible: true
509
+ allow_failure: true
510
+ 'app 🚀 Deploy | review ':
511
+ stage: deploy review
512
+ image: path/to/docker/kubernetes:the-version
513
+ variables:
514
+ KUBERNETES_CPU_REQUEST: '0.22'
515
+ KUBERNETES_MEMORY_REQUEST: 200Mi
516
+ KUBERNETES_MEMORY_LIMIT: 400Mi
517
+ script:
518
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
519
+ - export ENV_SHORT="review"
520
+ - export APP_DIR="."
521
+ - export ENV_TYPE="review"
522
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
523
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
524
+ - 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")"
525
+ - export ROOT_URL="https://app.$([ -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"
526
+ - export HOST_INTERNAL="app.$([ -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"
527
+ - export HOST_CANONICAL="app.$([ -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"
528
+ - export ROOT_URL_INTERNAL="https://app.$([ -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"
529
+ - export KUBE_NAMESPACE="pan-test-app-review"
530
+ - 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"; })-app"
531
+ - 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"; })-"
532
+ - export SECRET_KEY_BASE="$CL_review_app_SECRET_KEY_BASE"
533
+ - export POSTGRESQL_PASSWORD="$CL_review_app_POSTGRESQL_PASSWORD"
534
+ - export cloudsqlProxyCredentials="$CL_review_app_cloudsqlProxyCredentials"
535
+ - export RAILS_ENV="production"
536
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"SECRET_KEY_BASE\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\",\\"RAILS_ENV\\"]"
537
+ - export DOCKER_REGISTRY="$CI_REGISTRY"
538
+ - export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/app"
539
+ - export DOCKER_IMAGE_NAME="review/app"
540
+ - export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
541
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
542
+ - 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"; })-app"
543
+ - export HELM_EXPERIMENTAL_OCI="1"
544
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-app"
545
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
546
+ - export HELM_ARGS=""
547
+ - export COMPONENT_NAME="app"
548
+ - export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
549
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
550
+ - 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"; })-app" --server="$CL_review_app_KUBE_URL" --certificate-authority <(echo $CL_review_app_KUBE_CA_PEM | base64 -d) --embed-certs=true
551
+ - 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"; })-app" --token="$CL_review_app_KUBE_TOKEN"
552
+ - 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"; })-app" --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"; })-app" --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"; })-app" --namespace="pan-test-app-review"
553
+ - 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"; })-app"
554
+ - echo -e "\\e[0Ksection_start:$(date +%s):writeallvalues[collapsed=true]\\r\\e[0KWrite __all_values.yml for helm deployment"
555
+ - |
556
+ cat > __all_values.yml <<EOF
557
+ env:
558
+ secret:
559
+ SECRET_KEY_BASE: |-
560
+ $(printf %s "$CL_review_app_SECRET_KEY_BASE" | sed 's/^/ /')
561
+ POSTGRESQL_PASSWORD: |-
562
+ $(printf %s "$CL_review_app_POSTGRESQL_PASSWORD" | sed 's/^/ /')
563
+ cloudsqlProxyCredentials: |-
564
+ $(printf %s "$CL_review_app_cloudsqlProxyCredentials" | sed 's/^/ /')
565
+ public:
566
+ ENV_SHORT: |-
567
+ review
568
+ APP_DIR: |-
569
+ .
570
+ ENV_TYPE: |-
571
+ review
572
+ BUILD_INFO_BUILD_ID: |-
573
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
574
+ BUILD_INFO_BUILD_TIME: |-
575
+ $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
576
+ BUILD_INFO_CURRENT_VERSION: |-
577
+ $(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/^/ /')
578
+ ROOT_URL: |-
579
+ $(printf %s "https://app.$([ -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/^/ /')
580
+ HOST_INTERNAL: |-
581
+ $(printf %s "app.$([ -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/^/ /')
582
+ HOST_CANONICAL: |-
583
+ $(printf %s "app.$([ -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/^/ /')
584
+ ROOT_URL_INTERNAL: |-
585
+ $(printf %s "https://app.$([ -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/^/ /')
586
+ KUBE_NAMESPACE: |-
587
+ pan-test-app-review
588
+ KUBE_APP_NAME: |-
589
+ $(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"; })-app" | sed 's/^/ /')
590
+ KUBE_APP_NAME_PREFIX: |-
591
+ $(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/^/ /')
592
+ RAILS_ENV: |-
593
+ production
594
+ _ALL_ENV_VAR_KEYS: |-
595
+ ["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","ROOT_URL","HOST_INTERNAL","HOST_CANONICAL","ROOT_URL_INTERNAL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","SECRET_KEY_BASE","POSTGRESQL_PASSWORD","cloudsqlProxyCredentials","RAILS_ENV"]
596
+ application:
597
+ host: |-
598
+ $(printf %s "app.$([ -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/^/ /')
599
+ command: |-
600
+ /cnb/process/web
601
+ livenessProbe:
602
+ httpGet:
603
+ path: |-
604
+ __health
605
+ readinessProbe:
606
+ httpGet:
607
+ path: |-
608
+ __health
609
+ startupProbe:
610
+ httpGet:
611
+ path: |-
612
+ __health
613
+ worker:
614
+ enabled: true
615
+ command: |-
616
+ launcher bundle exec rake jobs:work
617
+ livenessProbe: false
618
+ cloudsql:
619
+ enabled: true
620
+ dbUser: |-
621
+ postgres
622
+ instanceConnectionName: |-
623
+ some-project-id:europe-west6:pan-test-app-review
624
+ proxyCredentials: |-
625
+ $CL_review_app_cloudsqlProxyCredentials
626
+ fullDbName: |-
627
+ $(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"; })-app" | sed 's/^/ /')
628
+ projectId: |-
629
+ some-project-id
630
+ jobs:
631
+ db-migrate:
632
+ hook: |-
633
+ post-upgrade
634
+ command: |-
635
+ launcher bundle exec rake db:migrate
636
+ db-prepare-seed:
637
+ hook: |-
638
+ post-install
639
+ command: |-
640
+ launcher bundle exec rake db:prepare db:seed
641
+
642
+ EOF
643
+ - echo -e "\\e[0Ksection_end:$(date +%s):writeallvalues\\r\\e[0K"
644
+ - kubernetesCreateSecret
645
+ - kubernetesDeploy
646
+ - echo 'Uploading SBOM to Dependency Track'
647
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/app" "https://app.$([ -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
648
+ - echo deployment successful 😻
649
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://app.$([ -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
650
+ environment:
651
+ name: review/$CI_COMMIT_REF_NAME/app
652
+ url: $CL_GITLAB_ENVIRONMENT_URL
653
+ on_stop: 'app 🛑 Stop ⚠️ | review '
654
+ auto_stop_in: 1 week
655
+ artifacts:
656
+ reports:
657
+ dotenv: gitlab_environment.env
658
+ rules:
659
+ - when: on_success
660
+ if: $CI_MERGE_REQUEST_ID
661
+ needs:
662
+ - job: app 👮 lint
663
+ artifacts: false
664
+ - job: 'app 🔨 docker | review '
665
+ artifacts: false
666
+ - job: app 🧪 test
667
+ artifacts: false
668
+ - job: 'app 🧾 sbom | review '
669
+ artifacts: true
670
+ - job: app 🛡 audit
671
+ artifacts: false
672
+ retry: *a1
673
+ interruptible: true
674
+ allow_failure: false
675
+ 'app 🛑 Stop ⚠️ | review ':
676
+ stage: stop review
677
+ image: path/to/docker/kubernetes:the-version
678
+ variables:
679
+ KUBERNETES_CPU_REQUEST: '0.22'
680
+ KUBERNETES_MEMORY_REQUEST: 200Mi
681
+ KUBERNETES_MEMORY_LIMIT: 400Mi
682
+ GIT_STRATEGY: none
683
+ script:
684
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
685
+ - export ENV_SHORT="review"
686
+ - export APP_DIR="."
687
+ - export ENV_TYPE="review"
688
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
689
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
690
+ - 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")"
691
+ - export ROOT_URL="https://app.$([ -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"
692
+ - export HOST_INTERNAL="app.$([ -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"
693
+ - export HOST_CANONICAL="app.$([ -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"
694
+ - export ROOT_URL_INTERNAL="https://app.$([ -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"
695
+ - export KUBE_NAMESPACE="pan-test-app-review"
696
+ - 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"; })-app"
697
+ - 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"; })-"
698
+ - export SECRET_KEY_BASE="$CL_review_app_SECRET_KEY_BASE"
699
+ - export POSTGRESQL_PASSWORD="$CL_review_app_POSTGRESQL_PASSWORD"
700
+ - export cloudsqlProxyCredentials="$CL_review_app_cloudsqlProxyCredentials"
701
+ - export RAILS_ENV="production"
702
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"SECRET_KEY_BASE\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\",\\"RAILS_ENV\\"]"
703
+ - 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"; })-app"
704
+ - export HELM_EXPERIMENTAL_OCI="1"
705
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-app"
706
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
707
+ - export HELM_ARGS=""
708
+ - export COMPONENT_NAME="app"
709
+ - export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
710
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
711
+ - 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"; })-app" --server="$CL_review_app_KUBE_URL" --certificate-authority <(echo $CL_review_app_KUBE_CA_PEM | base64 -d) --embed-certs=true
712
+ - 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"; })-app" --token="$CL_review_app_KUBE_TOKEN"
713
+ - 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"; })-app" --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"; })-app" --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"; })-app" --namespace="pan-test-app-review"
714
+ - 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"; })-app"
715
+ - kubernetesDelete
716
+ - echo 'Disabling component in Dependency Track'
717
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/app" "https://app.$([ -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
718
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://app.$([ -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
719
+ environment:
720
+ name: review/$CI_COMMIT_REF_NAME/app
721
+ url: $CL_GITLAB_ENVIRONMENT_URL
722
+ action: stop
723
+ artifacts:
724
+ reports:
725
+ dotenv: gitlab_environment.env
726
+ rules:
727
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
728
+ when: on_success
729
+ - when: manual
730
+ if: $CI_MERGE_REQUEST_ID
731
+ needs: []
732
+ retry: *a1
733
+ interruptible: true
734
+ allow_failure: true
735
+ 'app ↩️ Rollback ⚠️ | review ':
736
+ stage: rollback review
737
+ image: path/to/docker/kubernetes:the-version
738
+ variables:
739
+ KUBERNETES_CPU_REQUEST: '0.22'
740
+ KUBERNETES_MEMORY_REQUEST: 200Mi
741
+ KUBERNETES_MEMORY_LIMIT: 400Mi
742
+ GIT_STRATEGY: none
743
+ script:
744
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
745
+ - export ENV_SHORT="review"
746
+ - export APP_DIR="."
747
+ - export ENV_TYPE="review"
748
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
749
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
750
+ - 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")"
751
+ - export ROOT_URL="https://app.$([ -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"
752
+ - export HOST_INTERNAL="app.$([ -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"
753
+ - export HOST_CANONICAL="app.$([ -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"
754
+ - export ROOT_URL_INTERNAL="https://app.$([ -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"
755
+ - export KUBE_NAMESPACE="pan-test-app-review"
756
+ - 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"; })-app"
757
+ - 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"; })-"
758
+ - export SECRET_KEY_BASE="$CL_review_app_SECRET_KEY_BASE"
759
+ - export POSTGRESQL_PASSWORD="$CL_review_app_POSTGRESQL_PASSWORD"
760
+ - export cloudsqlProxyCredentials="$CL_review_app_cloudsqlProxyCredentials"
761
+ - export RAILS_ENV="production"
762
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"SECRET_KEY_BASE\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\",\\"RAILS_ENV\\"]"
763
+ - 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"; })-app"
764
+ - export HELM_EXPERIMENTAL_OCI="1"
765
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-app"
766
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
767
+ - export HELM_ARGS=""
768
+ - export COMPONENT_NAME="app"
769
+ - export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
770
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
771
+ - 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"; })-app" --server="$CL_review_app_KUBE_URL" --certificate-authority <(echo $CL_review_app_KUBE_CA_PEM | base64 -d) --embed-certs=true
772
+ - 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"; })-app" --token="$CL_review_app_KUBE_TOKEN"
773
+ - 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"; })-app" --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"; })-app" --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"; })-app" --namespace="pan-test-app-review"
774
+ - 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"; })-app"
775
+ - kubernetesRollback
776
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://app.$([ -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
777
+ environment:
778
+ name: review/$CI_COMMIT_REF_NAME/app
779
+ url: $CL_GITLAB_ENVIRONMENT_URL
780
+ action: access
781
+ artifacts:
782
+ reports:
783
+ dotenv: gitlab_environment.env
784
+ rules:
785
+ - when: manual
786
+ if: $CI_MERGE_REQUEST_ID
787
+ needs: []
788
+ retry: *a1
789
+ interruptible: true
790
+ allow_failure: true
791
+ 'app 🔨 docker | stage ':
792
+ stage: build
793
+ image: path/to/docker/docker-build:the-version
794
+ services:
795
+ - name: docker:24.0.6-dind
796
+ command:
797
+ - --tls=false
798
+ variables:
799
+ DOCKER_HOST: tcp://0.0.0.0:2375
800
+ DOCKER_TLS_CERTDIR: ''
801
+ DOCKER_DRIVER: overlay2
802
+ DOCKER_BUILDKIT: '1'
803
+ KUBERNETES_CPU_REQUEST: '0.45'
804
+ KUBERNETES_MEMORY_REQUEST: 1Gi
805
+ KUBERNETES_MEMORY_LIMIT: 2Gi
806
+ script:
807
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
808
+ - export APP_DIR="."
809
+ - export DOCKER_BUILD_CONTEXT="."
810
+ - export DOCKER_REGISTRY="$CI_REGISTRY"
811
+ - export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/app"
812
+ - export DOCKER_IMAGE_NAME="stage/app"
813
+ - export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
814
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
815
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
816
+ - docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY
817
+ - cd .
818
+ - docker pull $DOCKER_CACHE_IMAGE || true
819
+ - wget --output-document=- https://github.com/buildpacks/pack/releases/download/v0.32.1/pack-v0.32.1-linux.tgz | tar -zx --directory /usr/local/bin pack
820
+ - chmod +x /usr/local/bin/pack
821
+ - sed --in-place 's|git@\\([^:]*\\):|https://\\1/|g' Gemfile Gemfile.lock
822
+ - 'pack build "$DOCKER_IMAGE:$DOCKER_IMAGE_TAG" --builder ''heroku/builder:22'' --publish --cache-image "$DOCKER_CACHE_IMAGE" --env ''SECRET_KEY_BASE=dummy-value'' '
823
+ rules:
824
+ - if: $CI_COMMIT_TAG
825
+ needs: []
826
+ retry: *a1
827
+ interruptible: true
828
+ 'app 🧾 sbom | stage ':
829
+ stage: build
830
+ image: aquasec/trivy:0.38.3
831
+ variables: {}
832
+ script:
833
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
834
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
835
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" .
836
+ artifacts:
837
+ paths:
838
+ - __sbom.json
839
+ rules:
840
+ - if: $CI_COMMIT_TAG
841
+ needs: []
842
+ retry: *a1
843
+ interruptible: true
844
+ allow_failure: true
845
+ 'app 🚀 Deploy | stage ':
846
+ stage: deploy stage
847
+ image: path/to/docker/kubernetes:the-version
848
+ variables:
849
+ KUBERNETES_CPU_REQUEST: '0.22'
850
+ KUBERNETES_MEMORY_REQUEST: 200Mi
851
+ KUBERNETES_MEMORY_LIMIT: 400Mi
852
+ script:
853
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
854
+ - export ENV_SHORT="stage"
855
+ - export APP_DIR="."
856
+ - export ENV_TYPE="stage"
857
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
858
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
859
+ - 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")"
860
+ - export ROOT_URL="https://app.stage.test-app.pan.panter.cloud"
861
+ - export HOST_INTERNAL="app.stage.test-app.pan.panter.cloud"
862
+ - export HOST_CANONICAL="app.stage.test-app.pan.panter.cloud"
863
+ - export ROOT_URL_INTERNAL="https://app.stage.test-app.pan.panter.cloud"
864
+ - export KUBE_NAMESPACE="pan-test-app-stage"
865
+ - export KUBE_APP_NAME="app"
866
+ - export KUBE_APP_NAME_PREFIX=""
867
+ - export SECRET_KEY_BASE="$CL_stage_app_SECRET_KEY_BASE"
868
+ - export POSTGRESQL_PASSWORD="$CL_stage_app_POSTGRESQL_PASSWORD"
869
+ - export cloudsqlProxyCredentials="$CL_stage_app_cloudsqlProxyCredentials"
870
+ - export RAILS_ENV="production"
871
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"SECRET_KEY_BASE\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\",\\"RAILS_ENV\\"]"
872
+ - export DOCKER_REGISTRY="$CI_REGISTRY"
873
+ - export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/app"
874
+ - export DOCKER_IMAGE_NAME="stage/app"
875
+ - export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
876
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
877
+ - export RELEASE_NAME="pan-test-app-stage-app"
878
+ - export HELM_EXPERIMENTAL_OCI="1"
879
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-app"
880
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
881
+ - export HELM_ARGS=""
882
+ - export COMPONENT_NAME="app"
883
+ - export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
884
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
885
+ - kubectl config set-cluster "kube-pan-test-app-stage-app" --server="$CL_stage_app_KUBE_URL" --certificate-authority <(echo $CL_stage_app_KUBE_CA_PEM | base64 -d) --embed-certs=true
886
+ - kubectl config set-credentials "kube-pan-test-app-stage-app" --token="$CL_stage_app_KUBE_TOKEN"
887
+ - kubectl config set-context "kube-pan-test-app-stage-app" --cluster="kube-pan-test-app-stage-app" --user="kube-pan-test-app-stage-app" --namespace="pan-test-app-stage"
888
+ - kubectl config use-context "kube-pan-test-app-stage-app"
889
+ - echo -e "\\e[0Ksection_start:$(date +%s):writeallvalues[collapsed=true]\\r\\e[0KWrite __all_values.yml for helm deployment"
890
+ - |
891
+ cat > __all_values.yml <<EOF
892
+ env:
893
+ secret:
894
+ SECRET_KEY_BASE: |-
895
+ $(printf %s "$CL_stage_app_SECRET_KEY_BASE" | sed 's/^/ /')
896
+ POSTGRESQL_PASSWORD: |-
897
+ $(printf %s "$CL_stage_app_POSTGRESQL_PASSWORD" | sed 's/^/ /')
898
+ cloudsqlProxyCredentials: |-
899
+ $(printf %s "$CL_stage_app_cloudsqlProxyCredentials" | sed 's/^/ /')
900
+ public:
901
+ ENV_SHORT: |-
902
+ stage
903
+ APP_DIR: |-
904
+ .
905
+ ENV_TYPE: |-
906
+ stage
907
+ BUILD_INFO_BUILD_ID: |-
908
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
909
+ BUILD_INFO_BUILD_TIME: |-
910
+ $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
911
+ BUILD_INFO_CURRENT_VERSION: |-
912
+ $(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/^/ /')
913
+ ROOT_URL: |-
914
+ https://app.stage.test-app.pan.panter.cloud
915
+ HOST_INTERNAL: |-
916
+ app.stage.test-app.pan.panter.cloud
917
+ HOST_CANONICAL: |-
918
+ app.stage.test-app.pan.panter.cloud
919
+ ROOT_URL_INTERNAL: |-
920
+ https://app.stage.test-app.pan.panter.cloud
921
+ KUBE_NAMESPACE: |-
922
+ pan-test-app-stage
923
+ KUBE_APP_NAME: |-
924
+ app
925
+ KUBE_APP_NAME_PREFIX: ""
926
+ RAILS_ENV: |-
927
+ production
928
+ _ALL_ENV_VAR_KEYS: |-
929
+ ["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","ROOT_URL","HOST_INTERNAL","HOST_CANONICAL","ROOT_URL_INTERNAL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","SECRET_KEY_BASE","POSTGRESQL_PASSWORD","cloudsqlProxyCredentials","RAILS_ENV"]
930
+ application:
931
+ host: |-
932
+ app.stage.test-app.pan.panter.cloud
933
+ command: |-
934
+ /cnb/process/web
935
+ livenessProbe:
936
+ httpGet:
937
+ path: |-
938
+ __health
939
+ readinessProbe:
940
+ httpGet:
941
+ path: |-
942
+ __health
943
+ startupProbe:
944
+ httpGet:
945
+ path: |-
946
+ __health
947
+ worker:
948
+ enabled: true
949
+ command: |-
950
+ launcher bundle exec rake jobs:work
951
+ livenessProbe: false
952
+ cloudsql:
953
+ enabled: true
954
+ dbUser: |-
955
+ postgres
956
+ instanceConnectionName: |-
957
+ some-project-id:europe-west6:pan-test-app-stage
958
+ proxyCredentials: |-
959
+ $CL_stage_app_cloudsqlProxyCredentials
960
+ fullDbName: |-
961
+ app
962
+ projectId: |-
963
+ some-project-id
964
+ jobs:
965
+ db-migrate:
966
+ hook: |-
967
+ post-install,post-upgrade
968
+ command: |-
969
+ launcher bundle exec rake db:migrate
970
+
971
+ EOF
972
+ - echo -e "\\e[0Ksection_end:$(date +%s):writeallvalues\\r\\e[0K"
973
+ - kubernetesCreateSecret
974
+ - kubernetesDeploy
975
+ - echo 'Uploading SBOM to Dependency Track'
976
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/app" "https://app.stage.test-app.pan.panter.cloud" "__sbom.json" vex.json || true
977
+ - echo deployment successful 😻
978
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://app.stage.test-app.pan.panter.cloud" >> gitlab_environment.env
979
+ environment:
980
+ name: stage/app
981
+ url: $CL_GITLAB_ENVIRONMENT_URL
982
+ on_stop: 'app 🛑 Stop ⚠️ | stage '
983
+ artifacts:
984
+ reports:
985
+ dotenv: gitlab_environment.env
986
+ rules:
987
+ - when: on_success
988
+ if: $CI_COMMIT_TAG
989
+ needs:
990
+ - job: 'app 🔨 docker | stage '
991
+ artifacts: false
992
+ - job: 'app 🧾 sbom | stage '
993
+ artifacts: true
994
+ retry: *a1
995
+ interruptible: true
996
+ allow_failure: false
997
+ 'app 🛑 Stop ⚠️ | stage ':
998
+ stage: stop stage
999
+ image: path/to/docker/kubernetes:the-version
1000
+ variables:
1001
+ KUBERNETES_CPU_REQUEST: '0.22'
1002
+ KUBERNETES_MEMORY_REQUEST: 200Mi
1003
+ KUBERNETES_MEMORY_LIMIT: 400Mi
1004
+ GIT_STRATEGY: none
1005
+ script:
1006
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1007
+ - export ENV_SHORT="stage"
1008
+ - export APP_DIR="."
1009
+ - export ENV_TYPE="stage"
1010
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1011
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1012
+ - 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")"
1013
+ - export ROOT_URL="https://app.stage.test-app.pan.panter.cloud"
1014
+ - export HOST_INTERNAL="app.stage.test-app.pan.panter.cloud"
1015
+ - export HOST_CANONICAL="app.stage.test-app.pan.panter.cloud"
1016
+ - export ROOT_URL_INTERNAL="https://app.stage.test-app.pan.panter.cloud"
1017
+ - export KUBE_NAMESPACE="pan-test-app-stage"
1018
+ - export KUBE_APP_NAME="app"
1019
+ - export KUBE_APP_NAME_PREFIX=""
1020
+ - export SECRET_KEY_BASE="$CL_stage_app_SECRET_KEY_BASE"
1021
+ - export POSTGRESQL_PASSWORD="$CL_stage_app_POSTGRESQL_PASSWORD"
1022
+ - export cloudsqlProxyCredentials="$CL_stage_app_cloudsqlProxyCredentials"
1023
+ - export RAILS_ENV="production"
1024
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"SECRET_KEY_BASE\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\",\\"RAILS_ENV\\"]"
1025
+ - export RELEASE_NAME="pan-test-app-stage-app"
1026
+ - export HELM_EXPERIMENTAL_OCI="1"
1027
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-app"
1028
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
1029
+ - export HELM_ARGS=""
1030
+ - export COMPONENT_NAME="app"
1031
+ - export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1032
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1033
+ - kubectl config set-cluster "kube-pan-test-app-stage-app" --server="$CL_stage_app_KUBE_URL" --certificate-authority <(echo $CL_stage_app_KUBE_CA_PEM | base64 -d) --embed-certs=true
1034
+ - kubectl config set-credentials "kube-pan-test-app-stage-app" --token="$CL_stage_app_KUBE_TOKEN"
1035
+ - kubectl config set-context "kube-pan-test-app-stage-app" --cluster="kube-pan-test-app-stage-app" --user="kube-pan-test-app-stage-app" --namespace="pan-test-app-stage"
1036
+ - kubectl config use-context "kube-pan-test-app-stage-app"
1037
+ - kubernetesDelete
1038
+ - echo 'Disabling component in Dependency Track'
1039
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/app" "https://app.stage.test-app.pan.panter.cloud" || true
1040
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://app.stage.test-app.pan.panter.cloud" >> gitlab_environment.env
1041
+ environment:
1042
+ name: stage/app
1043
+ url: $CL_GITLAB_ENVIRONMENT_URL
1044
+ action: stop
1045
+ artifacts:
1046
+ reports:
1047
+ dotenv: gitlab_environment.env
1048
+ rules:
1049
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
1050
+ when: on_success
1051
+ - when: manual
1052
+ if: $CI_COMMIT_TAG
1053
+ needs: []
1054
+ retry: *a1
1055
+ interruptible: true
1056
+ allow_failure: true
1057
+ 'app ↩️ Rollback ⚠️ | stage ':
1058
+ stage: rollback stage
1059
+ image: path/to/docker/kubernetes:the-version
1060
+ variables:
1061
+ KUBERNETES_CPU_REQUEST: '0.22'
1062
+ KUBERNETES_MEMORY_REQUEST: 200Mi
1063
+ KUBERNETES_MEMORY_LIMIT: 400Mi
1064
+ GIT_STRATEGY: none
1065
+ script:
1066
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1067
+ - export ENV_SHORT="stage"
1068
+ - export APP_DIR="."
1069
+ - export ENV_TYPE="stage"
1070
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1071
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1072
+ - 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")"
1073
+ - export ROOT_URL="https://app.stage.test-app.pan.panter.cloud"
1074
+ - export HOST_INTERNAL="app.stage.test-app.pan.panter.cloud"
1075
+ - export HOST_CANONICAL="app.stage.test-app.pan.panter.cloud"
1076
+ - export ROOT_URL_INTERNAL="https://app.stage.test-app.pan.panter.cloud"
1077
+ - export KUBE_NAMESPACE="pan-test-app-stage"
1078
+ - export KUBE_APP_NAME="app"
1079
+ - export KUBE_APP_NAME_PREFIX=""
1080
+ - export SECRET_KEY_BASE="$CL_stage_app_SECRET_KEY_BASE"
1081
+ - export POSTGRESQL_PASSWORD="$CL_stage_app_POSTGRESQL_PASSWORD"
1082
+ - export cloudsqlProxyCredentials="$CL_stage_app_cloudsqlProxyCredentials"
1083
+ - export RAILS_ENV="production"
1084
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"SECRET_KEY_BASE\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\",\\"RAILS_ENV\\"]"
1085
+ - export RELEASE_NAME="pan-test-app-stage-app"
1086
+ - export HELM_EXPERIMENTAL_OCI="1"
1087
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-app"
1088
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
1089
+ - export HELM_ARGS=""
1090
+ - export COMPONENT_NAME="app"
1091
+ - export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1092
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1093
+ - kubectl config set-cluster "kube-pan-test-app-stage-app" --server="$CL_stage_app_KUBE_URL" --certificate-authority <(echo $CL_stage_app_KUBE_CA_PEM | base64 -d) --embed-certs=true
1094
+ - kubectl config set-credentials "kube-pan-test-app-stage-app" --token="$CL_stage_app_KUBE_TOKEN"
1095
+ - kubectl config set-context "kube-pan-test-app-stage-app" --cluster="kube-pan-test-app-stage-app" --user="kube-pan-test-app-stage-app" --namespace="pan-test-app-stage"
1096
+ - kubectl config use-context "kube-pan-test-app-stage-app"
1097
+ - kubernetesRollback
1098
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://app.stage.test-app.pan.panter.cloud" >> gitlab_environment.env
1099
+ environment:
1100
+ name: stage/app
1101
+ url: $CL_GITLAB_ENVIRONMENT_URL
1102
+ action: access
1103
+ artifacts:
1104
+ reports:
1105
+ dotenv: gitlab_environment.env
1106
+ rules:
1107
+ - when: manual
1108
+ if: $CI_COMMIT_TAG
1109
+ needs: []
1110
+ retry: *a1
1111
+ interruptible: true
1112
+ allow_failure: true
1113
+ 'app 🔨 docker | prod ':
1114
+ stage: build
1115
+ image: path/to/docker/docker-build:the-version
1116
+ services:
1117
+ - name: docker:24.0.6-dind
1118
+ command:
1119
+ - --tls=false
1120
+ variables:
1121
+ DOCKER_HOST: tcp://0.0.0.0:2375
1122
+ DOCKER_TLS_CERTDIR: ''
1123
+ DOCKER_DRIVER: overlay2
1124
+ DOCKER_BUILDKIT: '1'
1125
+ KUBERNETES_CPU_REQUEST: '0.45'
1126
+ KUBERNETES_MEMORY_REQUEST: 1Gi
1127
+ KUBERNETES_MEMORY_LIMIT: 2Gi
1128
+ script:
1129
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1130
+ - export APP_DIR="."
1131
+ - export DOCKER_BUILD_CONTEXT="."
1132
+ - export DOCKER_REGISTRY="$CI_REGISTRY"
1133
+ - export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/app"
1134
+ - export DOCKER_IMAGE_NAME="prod/app"
1135
+ - export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
1136
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
1137
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1138
+ - docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY
1139
+ - cd .
1140
+ - docker pull $DOCKER_CACHE_IMAGE || true
1141
+ - wget --output-document=- https://github.com/buildpacks/pack/releases/download/v0.32.1/pack-v0.32.1-linux.tgz | tar -zx --directory /usr/local/bin pack
1142
+ - chmod +x /usr/local/bin/pack
1143
+ - sed --in-place 's|git@\\([^:]*\\):|https://\\1/|g' Gemfile Gemfile.lock
1144
+ - 'pack build "$DOCKER_IMAGE:$DOCKER_IMAGE_TAG" --builder ''heroku/builder:22'' --publish --cache-image "$DOCKER_CACHE_IMAGE" --env ''SECRET_KEY_BASE=dummy-value'' '
1145
+ rules:
1146
+ - if: $CI_COMMIT_TAG
1147
+ needs: []
1148
+ retry: *a1
1149
+ interruptible: true
1150
+ 'app 🧾 sbom | prod ':
1151
+ stage: build
1152
+ image: aquasec/trivy:0.38.3
1153
+ variables: {}
1154
+ script:
1155
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1156
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1157
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" .
1158
+ artifacts:
1159
+ paths:
1160
+ - __sbom.json
1161
+ rules:
1162
+ - if: $CI_COMMIT_TAG
1163
+ needs: []
1164
+ retry: *a1
1165
+ interruptible: true
1166
+ allow_failure: true
1167
+ 'app 🚀 Deploy | prod ':
1168
+ stage: deploy prod
1169
+ image: path/to/docker/kubernetes:the-version
1170
+ variables:
1171
+ KUBERNETES_CPU_REQUEST: '0.22'
1172
+ KUBERNETES_MEMORY_REQUEST: 200Mi
1173
+ KUBERNETES_MEMORY_LIMIT: 400Mi
1174
+ script:
1175
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1176
+ - export ENV_SHORT="prod"
1177
+ - export APP_DIR="."
1178
+ - export ENV_TYPE="prod"
1179
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1180
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1181
+ - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
1182
+ - export ROOT_URL="https://my-fancy-website.com"
1183
+ - export HOST_INTERNAL="app.prod.test-app.pan.panter.cloud"
1184
+ - export HOST_CANONICAL="app.prod.test-app.pan.panter.cloud"
1185
+ - export ROOT_URL_INTERNAL="https://app.prod.test-app.pan.panter.cloud"
1186
+ - export KUBE_NAMESPACE="pan-test-app-prod"
1187
+ - export KUBE_APP_NAME="app"
1188
+ - export KUBE_APP_NAME_PREFIX=""
1189
+ - export SECRET_KEY_BASE="$CL_prod_app_SECRET_KEY_BASE"
1190
+ - export POSTGRESQL_PASSWORD="$CL_prod_app_POSTGRESQL_PASSWORD"
1191
+ - export cloudsqlProxyCredentials="$CL_prod_app_cloudsqlProxyCredentials"
1192
+ - export RAILS_ENV="production"
1193
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"SECRET_KEY_BASE\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\",\\"RAILS_ENV\\"]"
1194
+ - export DOCKER_REGISTRY="$CI_REGISTRY"
1195
+ - export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/app"
1196
+ - export DOCKER_IMAGE_NAME="prod/app"
1197
+ - export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
1198
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
1199
+ - export RELEASE_NAME="pan-test-app-prod-app"
1200
+ - export HELM_EXPERIMENTAL_OCI="1"
1201
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-app"
1202
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
1203
+ - export HELM_ARGS=""
1204
+ - export COMPONENT_NAME="app"
1205
+ - export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1206
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1207
+ - kubectl config set-cluster "kube-pan-test-app-prod-app" --server="$CL_prod_app_KUBE_URL" --certificate-authority <(echo $CL_prod_app_KUBE_CA_PEM | base64 -d) --embed-certs=true
1208
+ - kubectl config set-credentials "kube-pan-test-app-prod-app" --token="$CL_prod_app_KUBE_TOKEN"
1209
+ - kubectl config set-context "kube-pan-test-app-prod-app" --cluster="kube-pan-test-app-prod-app" --user="kube-pan-test-app-prod-app" --namespace="pan-test-app-prod"
1210
+ - kubectl config use-context "kube-pan-test-app-prod-app"
1211
+ - echo -e "\\e[0Ksection_start:$(date +%s):writeallvalues[collapsed=true]\\r\\e[0KWrite __all_values.yml for helm deployment"
1212
+ - |
1213
+ cat > __all_values.yml <<EOF
1214
+ env:
1215
+ secret:
1216
+ SECRET_KEY_BASE: |-
1217
+ $(printf %s "$CL_prod_app_SECRET_KEY_BASE" | sed 's/^/ /')
1218
+ POSTGRESQL_PASSWORD: |-
1219
+ $(printf %s "$CL_prod_app_POSTGRESQL_PASSWORD" | sed 's/^/ /')
1220
+ cloudsqlProxyCredentials: |-
1221
+ $(printf %s "$CL_prod_app_cloudsqlProxyCredentials" | sed 's/^/ /')
1222
+ public:
1223
+ ENV_SHORT: |-
1224
+ prod
1225
+ APP_DIR: |-
1226
+ .
1227
+ ENV_TYPE: |-
1228
+ prod
1229
+ BUILD_INFO_BUILD_ID: |-
1230
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
1231
+ BUILD_INFO_BUILD_TIME: |-
1232
+ $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
1233
+ BUILD_INFO_CURRENT_VERSION: |-
1234
+ $(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/^/ /')
1235
+ ROOT_URL: |-
1236
+ https://my-fancy-website.com
1237
+ HOST_INTERNAL: |-
1238
+ app.prod.test-app.pan.panter.cloud
1239
+ HOST_CANONICAL: |-
1240
+ app.prod.test-app.pan.panter.cloud
1241
+ ROOT_URL_INTERNAL: |-
1242
+ https://app.prod.test-app.pan.panter.cloud
1243
+ KUBE_NAMESPACE: |-
1244
+ pan-test-app-prod
1245
+ KUBE_APP_NAME: |-
1246
+ app
1247
+ KUBE_APP_NAME_PREFIX: ""
1248
+ RAILS_ENV: |-
1249
+ production
1250
+ _ALL_ENV_VAR_KEYS: |-
1251
+ ["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","ROOT_URL","HOST_INTERNAL","HOST_CANONICAL","ROOT_URL_INTERNAL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","SECRET_KEY_BASE","POSTGRESQL_PASSWORD","cloudsqlProxyCredentials","RAILS_ENV"]
1252
+ application:
1253
+ host: |-
1254
+ my-fancy-website.com
1255
+ command: |-
1256
+ /cnb/process/web
1257
+ livenessProbe:
1258
+ httpGet:
1259
+ path: |-
1260
+ __health
1261
+ readinessProbe:
1262
+ httpGet:
1263
+ path: |-
1264
+ __health
1265
+ startupProbe:
1266
+ httpGet:
1267
+ path: |-
1268
+ __health
1269
+ worker:
1270
+ enabled: true
1271
+ command: |-
1272
+ launcher bundle exec rake jobs:work
1273
+ livenessProbe: false
1274
+ cloudsql:
1275
+ enabled: true
1276
+ dbUser: |-
1277
+ postgres
1278
+ instanceConnectionName: |-
1279
+ some-project-id:europe-west6:pan-test-app-prod
1280
+ proxyCredentials: |-
1281
+ $CL_prod_app_cloudsqlProxyCredentials
1282
+ fullDbName: |-
1283
+ app
1284
+ projectId: |-
1285
+ some-project-id
1286
+ jobs:
1287
+ db-migrate:
1288
+ hook: |-
1289
+ post-install,post-upgrade
1290
+ command: |-
1291
+ launcher bundle exec rake db:migrate
1292
+
1293
+ EOF
1294
+ - echo -e "\\e[0Ksection_end:$(date +%s):writeallvalues\\r\\e[0K"
1295
+ - kubernetesCreateSecret
1296
+ - kubernetesDeploy
1297
+ - echo 'Uploading SBOM to Dependency Track'
1298
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/app" "https://my-fancy-website.com" "__sbom.json" vex.json || true
1299
+ - echo deployment successful 😻
1300
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://my-fancy-website.com" >> gitlab_environment.env
1301
+ environment:
1302
+ name: prod/app
1303
+ url: $CL_GITLAB_ENVIRONMENT_URL
1304
+ on_stop: 'app 🛑 Stop ⚠️ | prod '
1305
+ artifacts:
1306
+ reports:
1307
+ dotenv: gitlab_environment.env
1308
+ rules:
1309
+ - when: manual
1310
+ if: $CI_COMMIT_TAG
1311
+ needs:
1312
+ - job: 'app 🔨 docker | prod '
1313
+ artifacts: false
1314
+ - job: 'app 🧾 sbom | prod '
1315
+ artifacts: true
1316
+ retry: *a1
1317
+ interruptible: true
1318
+ allow_failure: true
1319
+ 'app 🛑 Stop ⚠️ | prod ':
1320
+ stage: stop prod
1321
+ image: path/to/docker/kubernetes:the-version
1322
+ variables:
1323
+ KUBERNETES_CPU_REQUEST: '0.22'
1324
+ KUBERNETES_MEMORY_REQUEST: 200Mi
1325
+ KUBERNETES_MEMORY_LIMIT: 400Mi
1326
+ GIT_STRATEGY: none
1327
+ script:
1328
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1329
+ - export ENV_SHORT="prod"
1330
+ - export APP_DIR="."
1331
+ - export ENV_TYPE="prod"
1332
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1333
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1334
+ - 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")"
1335
+ - export ROOT_URL="https://my-fancy-website.com"
1336
+ - export HOST_INTERNAL="app.prod.test-app.pan.panter.cloud"
1337
+ - export HOST_CANONICAL="app.prod.test-app.pan.panter.cloud"
1338
+ - export ROOT_URL_INTERNAL="https://app.prod.test-app.pan.panter.cloud"
1339
+ - export KUBE_NAMESPACE="pan-test-app-prod"
1340
+ - export KUBE_APP_NAME="app"
1341
+ - export KUBE_APP_NAME_PREFIX=""
1342
+ - export SECRET_KEY_BASE="$CL_prod_app_SECRET_KEY_BASE"
1343
+ - export POSTGRESQL_PASSWORD="$CL_prod_app_POSTGRESQL_PASSWORD"
1344
+ - export cloudsqlProxyCredentials="$CL_prod_app_cloudsqlProxyCredentials"
1345
+ - export RAILS_ENV="production"
1346
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"SECRET_KEY_BASE\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\",\\"RAILS_ENV\\"]"
1347
+ - export RELEASE_NAME="pan-test-app-prod-app"
1348
+ - export HELM_EXPERIMENTAL_OCI="1"
1349
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-app"
1350
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
1351
+ - export HELM_ARGS=""
1352
+ - export COMPONENT_NAME="app"
1353
+ - export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1354
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1355
+ - kubectl config set-cluster "kube-pan-test-app-prod-app" --server="$CL_prod_app_KUBE_URL" --certificate-authority <(echo $CL_prod_app_KUBE_CA_PEM | base64 -d) --embed-certs=true
1356
+ - kubectl config set-credentials "kube-pan-test-app-prod-app" --token="$CL_prod_app_KUBE_TOKEN"
1357
+ - kubectl config set-context "kube-pan-test-app-prod-app" --cluster="kube-pan-test-app-prod-app" --user="kube-pan-test-app-prod-app" --namespace="pan-test-app-prod"
1358
+ - kubectl config use-context "kube-pan-test-app-prod-app"
1359
+ - kubernetesDelete
1360
+ - echo 'Disabling component in Dependency Track'
1361
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/app" "https://my-fancy-website.com" || true
1362
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://my-fancy-website.com" >> gitlab_environment.env
1363
+ environment:
1364
+ name: prod/app
1365
+ url: $CL_GITLAB_ENVIRONMENT_URL
1366
+ action: stop
1367
+ artifacts:
1368
+ reports:
1369
+ dotenv: gitlab_environment.env
1370
+ rules:
1371
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
1372
+ when: on_success
1373
+ - when: manual
1374
+ if: $CI_COMMIT_TAG
1375
+ needs: []
1376
+ retry: *a1
1377
+ interruptible: true
1378
+ allow_failure: true
1379
+ 'app ↩️ Rollback ⚠️ | prod ':
1380
+ stage: rollback prod
1381
+ image: path/to/docker/kubernetes:the-version
1382
+ variables:
1383
+ KUBERNETES_CPU_REQUEST: '0.22'
1384
+ KUBERNETES_MEMORY_REQUEST: 200Mi
1385
+ KUBERNETES_MEMORY_LIMIT: 400Mi
1386
+ GIT_STRATEGY: none
1387
+ script:
1388
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1389
+ - export ENV_SHORT="prod"
1390
+ - export APP_DIR="."
1391
+ - export ENV_TYPE="prod"
1392
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1393
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1394
+ - 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")"
1395
+ - export ROOT_URL="https://my-fancy-website.com"
1396
+ - export HOST_INTERNAL="app.prod.test-app.pan.panter.cloud"
1397
+ - export HOST_CANONICAL="app.prod.test-app.pan.panter.cloud"
1398
+ - export ROOT_URL_INTERNAL="https://app.prod.test-app.pan.panter.cloud"
1399
+ - export KUBE_NAMESPACE="pan-test-app-prod"
1400
+ - export KUBE_APP_NAME="app"
1401
+ - export KUBE_APP_NAME_PREFIX=""
1402
+ - export SECRET_KEY_BASE="$CL_prod_app_SECRET_KEY_BASE"
1403
+ - export POSTGRESQL_PASSWORD="$CL_prod_app_POSTGRESQL_PASSWORD"
1404
+ - export cloudsqlProxyCredentials="$CL_prod_app_cloudsqlProxyCredentials"
1405
+ - export RAILS_ENV="production"
1406
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"SECRET_KEY_BASE\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\",\\"RAILS_ENV\\"]"
1407
+ - export RELEASE_NAME="pan-test-app-prod-app"
1408
+ - export HELM_EXPERIMENTAL_OCI="1"
1409
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-app"
1410
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
1411
+ - export HELM_ARGS=""
1412
+ - export COMPONENT_NAME="app"
1413
+ - export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1414
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1415
+ - kubectl config set-cluster "kube-pan-test-app-prod-app" --server="$CL_prod_app_KUBE_URL" --certificate-authority <(echo $CL_prod_app_KUBE_CA_PEM | base64 -d) --embed-certs=true
1416
+ - kubectl config set-credentials "kube-pan-test-app-prod-app" --token="$CL_prod_app_KUBE_TOKEN"
1417
+ - kubectl config set-context "kube-pan-test-app-prod-app" --cluster="kube-pan-test-app-prod-app" --user="kube-pan-test-app-prod-app" --namespace="pan-test-app-prod"
1418
+ - kubectl config use-context "kube-pan-test-app-prod-app"
1419
+ - kubernetesRollback
1420
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://my-fancy-website.com" >> gitlab_environment.env
1421
+ environment:
1422
+ name: prod/app
1423
+ url: $CL_GITLAB_ENVIRONMENT_URL
1424
+ action: access
1425
+ artifacts:
1426
+ reports:
1427
+ dotenv: gitlab_environment.env
1428
+ rules:
1429
+ - when: manual
1430
+ if: $CI_COMMIT_TAG
1431
+ needs: []
1432
+ retry: *a1
1433
+ interruptible: true
1434
+ allow_failure: true
1435
+ create release:
1436
+ stage: release
1437
+ image: path/to/docker/semantic-release:the-version
1438
+ script:
1439
+ - semanticRelease
1440
+ after_script:
1441
+ - echo '👉 The project access token might be invald - run \`project-renew-token\` in catladder CLI to fix.'
1442
+ rules:
1443
+ - &a3
1444
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
1445
+ when: never
1446
+ - &a4
1447
+ if: $CI_PIPELINE_SOURCE == "schedule"
1448
+ when: never
1449
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $AUTO_RELEASE == "true"
1450
+ when: on_success
1451
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
1452
+ when: manual
1453
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+.([0-9]+|x).x$/
1454
+ when: manual
1455
+ ⚠️ force create release:
1456
+ stage: release
1457
+ image: path/to/docker/semantic-release:the-version
1458
+ script:
1459
+ - semanticRelease
1460
+ after_script:
1461
+ - echo '👉 The project access token might be invald - run \`project-renew-token\` in catladder CLI to fix.'
1462
+ rules:
1463
+ - *a3
1464
+ - *a4
1465
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
1466
+ when: manual
1467
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+.([0-9]+|x).x$/
1468
+ when: manual
1469
+ needs: []
1470
+ "
1471
+ `;
1472
+
3
1473
  exports[`matches snapshot for rails-k8s-with-worker 1`] = `
4
1474
  {
5
1475
  "mainBranch": {