@catladder/pipeline 1.82.2 → 1.83.1

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