Multi apps for multi envs¶
If you want to manage a group of releases for several environments. This example will render all apps and all settings for all environments.
We can use one of two name conventions
- 🤔
values/$app/$env.yml
- 🤔
values/$env/$app.yml
But if we add some regions we will have
- ❌
values/$app/$env/$region.yml
- ❌
values/$app/$region/$env.yml
- ✅
values/$region/$env/$app.yml
- ❌
values/$region/$app/$env.yml
- ✅
values/$env/$region/$app.yml
- ❌
values/$env/$app/$region.yml
We see that next name convention is more suitable than others
- ✅
values/$region/$env/$app.yml
- ✅
values/$env/$region/$app.yml
Now we are dropping $region
- values/$env/
$region/$app.yml –>values/$env/$app.yml
- values/
$region/$env/$app.yml –>values/$env/$app.yml
Then the best name convention is 👍values/$env/$app.yml
This is also a good way when you will write your policy like:
prod/* @DevOps @SecOps
dev/* @Developers
Create the project¶
Project structure
docs/examples/multi-apps-multi-envs
├── README.md
├── envs.yml
├── helmwave.yml
├── helmwave.yml.tpl
└── values
├── _
│ ├── _.yml
│ ├── prod.yml
│ ├── qa.yml
│ └── stage.yml
├── my-app-a
│ └── prod.yml
├── my-app-b
│ ├── _.yml
│ ├── prod.yml
│ └── stage.yml
└── my-app-c
├── _.yml
├── prod.yml
├── qa.yml
└── stage.yml
5 directories, 16 files
helmwave.yml.tpl
version: "0.32.3"
{{- defineDatasource "envs" "envs.yml" }}
{{- $envs := (ds "envs") }}
# general options for all releases
.options: &options
wait: true
wait_for_jobs: true
force: false
chart: some-chart
atomic: false
max_history: 3
create_namespace: true
offline_kube_version: 1.25
pending_release_strategy: rollback
releases:
{{- range $env, $settings := $envs}}
###############################
# #
# {{ $env }}
# #
###############################
{{- range $app := (file.ReadDir "./values") }}
{{- if ne $app "_" }}
{{- if has $settings.releases $app}}
# use next command to deploy: helmwave up --build -t {{ $app }} -t {{ $env }}
- name: {{ $app }}
namespace: {{ $env }}
timeout: {{ $settings.timeout }}
kubecontext: {{ $settings.kubecontext }}
values:
- _/_.yml # values for all envs & all apps
- _/{{ $env }}.yml # default values for specific env
- {{ $app }}/_.yml # default values for an application
- {{ $app }}/{{ $env }}.yml # values for specific application and specific env
tags: [{{ $app }}, {{ $env }}]
<<: *options
{{- end }}
{{- end }}
{{ end }}
{{ end }}
envs.yml
prod:
kubecontext: prod-kube-context
timeout: 10m
releases:
my-app-a: {}
my-app-b: {}
my-app-c: {}
stage:
kubecontext: stage-kube-context
timeout: 4m
releases:
my-app-b: {}
my-app-c: {}
qa:
kubecontext: qa-kube-context
timeout: 4m
releases:
my-app-c: {}
Build
helmwave yml --templater gomplate
helmwave.yml
version: "0.32.3"
# general options for all releases
.options: &options
wait: true
wait_for_jobs: true
force: false
chart: some-chart
atomic: false
max_history: 3
create_namespace: true
offline_kube_version: 1.25
pending_release_strategy: rollback
releases:
###############################
# #
# prod
# #
###############################
# use next command to deploy: helmwave up --build -t my-app-a -t prod
- name: my-app-a
namespace: prod
timeout: 10m
kubecontext: prod-kube-context
values:
- _/_.yml # values for all envs & all apps
- _/prod.yml # default values for specific env
- my-app-a/_.yml # default values for an application
- my-app-a/prod.yml # values for specific application and specific env
tags: [my-app-a, prod]
<<: *options
# use next command to deploy: helmwave up --build -t my-app-c -t prod
- name: my-app-c
namespace: prod
timeout: 10m
kubecontext: prod-kube-context
values:
- _/_.yml # values for all envs & all apps
- _/prod.yml # default values for specific env
- my-app-c/_.yml # default values for an application
- my-app-c/prod.yml # values for specific application and specific env
tags: [my-app-c, prod]
<<: *options
# use next command to deploy: helmwave up --build -t my-app-b -t prod
- name: my-app-b
namespace: prod
timeout: 10m
kubecontext: prod-kube-context
values:
- _/_.yml # values for all envs & all apps
- _/prod.yml # default values for specific env
- my-app-b/_.yml # default values for an application
- my-app-b/prod.yml # values for specific application and specific env
tags: [my-app-b, prod]
<<: *options
###############################
# #
# qa
# #
###############################
# use next command to deploy: helmwave up --build -t my-app-c -t qa
- name: my-app-c
namespace: qa
timeout: 4m
kubecontext: qa-kube-context
values:
- _/_.yml # values for all envs & all apps
- _/qa.yml # default values for specific env
- my-app-c/_.yml # default values for an application
- my-app-c/qa.yml # values for specific application and specific env
tags: [my-app-c, qa]
<<: *options
###############################
# #
# stage
# #
###############################
# use next command to deploy: helmwave up --build -t my-app-c -t stage
- name: my-app-c
namespace: stage
timeout: 4m
kubecontext: stage-kube-context
values:
- _/_.yml # values for all envs & all apps
- _/stage.yml # default values for specific env
- my-app-c/_.yml # default values for an application
- my-app-c/stage.yml # values for specific application and specific env
tags: [my-app-c, stage]
<<: *options
# use next command to deploy: helmwave up --build -t my-app-b -t stage
- name: my-app-b
namespace: stage
timeout: 4m
kubecontext: stage-kube-context
values:
- _/_.yml # values for all envs & all apps
- _/stage.yml # default values for specific env
- my-app-b/_.yml # default values for an application
- my-app-b/stage.yml # values for specific application and specific env
tags: [my-app-b, stage]
<<: *options