@catladder/pipeline 1.163.0 → 1.163.2

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