HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-03-10
1 <p><strong>Helm</strong>, как и<strong>Docker</strong>стал де-факто стандартом в индустрии. Тоже самое и с Kubernetes (52% доля в нише). И новость, что Docker is deprecated, вызвало волну обсуждений в сообществе. Настолько все привыкли к Docker.</p>
1 <p><strong>Helm</strong>, как и<strong>Docker</strong>стал де-факто стандартом в индустрии. Тоже самое и с Kubernetes (52% доля в нише). И новость, что Docker is deprecated, вызвало волну обсуждений в сообществе. Настолько все привыкли к Docker.</p>
2 <p>Для Docker есть замечательный по своей простоте docker-compose, в котором мы можем декларативно описать, что мы хотим от Docker. Для<strong>Kubernetes</strong>набор yaml-tpl файлов упаковывается в архив. И затем этот архив называется Helm-чартом. Но как это часто бывает приложение не может быть описано лишь одним Helm чартом. Требуется как-то управлять/композить/настраивать/шаблонизировать такие сеты.</p>
2 <p>Для Docker есть замечательный по своей простоте docker-compose, в котором мы можем декларативно описать, что мы хотим от Docker. Для<strong>Kubernetes</strong>набор yaml-tpl файлов упаковывается в архив. И затем этот архив называется Helm-чартом. Но как это часто бывает приложение не может быть описано лишь одним Helm чартом. Требуется как-то управлять/композить/настраивать/шаблонизировать такие сеты.</p>
3 <p>Одним из подходов по управлению является<strong>Umbrella Chart</strong>. Это helm chart который объединяет в себе все другие чарты.</p>
3 <p>Одним из подходов по управлению является<strong>Umbrella Chart</strong>. Это helm chart который объединяет в себе все другие чарты.</p>
4 <p>Очевидные минусы данного решения:</p>
4 <p>Очевидные минусы данного решения:</p>
5 <ol><li>Требуется поддерживать дополнительный чарт.</li>
5 <ol><li>Требуется поддерживать дополнительный чарт.</li>
6 <li>Новый слой согласования имен values переменных.</li>
6 <li>Новый слой согласования имен values переменных.</li>
7 <li>Umbrella-chart это все тот же чарт, поэтому о шаблонизации values и декларативном разделении на контуры (Окружения) не может быть и речи.</li>
7 <li>Umbrella-chart это все тот же чарт, поэтому о шаблонизации values и декларативном разделении на контуры (Окружения) не может быть и речи.</li>
8 <li>Когда обновляется саб-чарт, нужно идти в umbrella и обновлять еще версию umbrella чарта.</li>
8 <li>Когда обновляется саб-чарт, нужно идти в umbrella и обновлять еще версию umbrella чарта.</li>
9 </ol><p>Helmwave возник, как инструмент для декларативного описания всех чартов в одном yaml. Этот пост покажет как можно решить основные проблемы (use-cases) с помощью helmwave.</p>
9 </ol><p>Helmwave возник, как инструмент для декларативного описания всех чартов в одном yaml. Этот пост покажет как можно решить основные проблемы (use-cases) с помощью helmwave.</p>
10 <h2>Что такое HelmWave?</h2>
10 <h2>Что такое HelmWave?</h2>
11 <ol><li>Это бинарь, который устанавливает helm release из helmwave.yml.</li>
11 <ol><li>Это бинарь, который устанавливает helm release из helmwave.yml.</li>
12 <li>Кладешь helmwave.yml в git и применяешь его через CI.</li>
12 <li>Кладешь helmwave.yml в git и применяешь его через CI.</li>
13 <li>Можно шаблонизировать все c помощью (Go template), начиная от helmwave.yml до values.</li>
13 <li>Можно шаблонизировать все c помощью (Go template), начиная от helmwave.yml до values.</li>
14 <li>Helmwave понимает какие helm-repositories ему понадобятся для деплоя. И вытесняет лишние.</li>
14 <li>Helmwave понимает какие helm-repositories ему понадобятся для деплоя. И вытесняет лишние.</li>
15 </ol><p>Порядок команд</p>
15 </ol><p>Порядок команд</p>
16 graph TD; Start(helmwave.yml.tpl) --render--&gt; helmwave.yml; helmwave.yml --planfile--&gt; .helmwave; .helmwave --sync--&gt; Finish(Releases have been deployed!)<h2>Быстрый старт</h2>
16 graph TD; Start(helmwave.yml.tpl) --render--&gt; helmwave.yml; helmwave.yml --planfile--&gt; .helmwave; .helmwave --sync--&gt; Finish(Releases have been deployed!)<h2>Быстрый старт</h2>
17 <p>helmwave.yml.tpl имеет следующий вид:</p>
17 <p>helmwave.yml.tpl имеет следующий вид:</p>
18 project: my-project version: 0.5.0 repositories: - name: bitnami url: https://charts.bitnami.com/bitnami .options: &amp;options install: true namespace: my-namespace releases: - name: redis-a chart: bitnami/redis options: &lt;&lt;: *options - name: redis-b chart: bitnami/redis options: &lt;&lt;: *options<h4>Поздравляю, вы задеплоили с помощью helmwave!</h4>
18 project: my-project version: 0.5.0 repositories: - name: bitnami url: https://charts.bitnami.com/bitnami .options: &amp;options install: true namespace: my-namespace releases: - name: redis-a chart: bitnami/redis options: &lt;&lt;: *options - name: redis-b chart: bitnami/redis options: &lt;&lt;: *options<h4>Поздравляю, вы задеплоили с помощью helmwave!</h4>
19 $ helm list -n my-namespace NAME NAMESPACE REVISION STATUS CHART APP VERSION redis-a my-namespace 1 deployed redis-11.2.3 6.0.9 redis-b my-namespace 1 deployed redis-11.2.3 6.0.9 $ k get po -n my-namespace NAME READY STATUS RESTARTS AGE redis-a-master-0 1/1 Running 0 64s redis-a-slave-0 1/1 Running 0 31s redis-a-slave-1 1/1 Running 0 62s redis-b-master-0 1/1 Running 0 59s redis-b-slave-0 1/1 Running 0 32s redis-b-slave-1 1/1 Running 0 51s<h3>Переменные окружения</h3>
19 $ helm list -n my-namespace NAME NAMESPACE REVISION STATUS CHART APP VERSION redis-a my-namespace 1 deployed redis-11.2.3 6.0.9 redis-b my-namespace 1 deployed redis-11.2.3 6.0.9 $ k get po -n my-namespace NAME READY STATUS RESTARTS AGE redis-a-master-0 1/1 Running 0 64s redis-a-slave-0 1/1 Running 0 31s redis-a-slave-1 1/1 Running 0 62s redis-b-master-0 1/1 Running 0 59s redis-b-slave-0 1/1 Running 0 32s redis-b-slave-1 1/1 Running 0 51s<h3>Переменные окружения</h3>
20 <ul><li>$HELMWAVE_TPL_FILE - отвечает за путь к входному файлу для шаблонизации (helmwave.yml.tpl).</li>
20 <ul><li>$HELMWAVE_TPL_FILE - отвечает за путь к входному файлу для шаблонизации (helmwave.yml.tpl).</li>
21 <li>$HELMWAVE_FILE - указывает путь выходного файла после операции шаблонизации (helmwave.yml).</li>
21 <li>$HELMWAVE_FILE - указывает путь выходного файла после операции шаблонизации (helmwave.yml).</li>
22 <li>$HELMWAVE_PLAN_DIR - указывает путь к папке, в которой хранится или будет хранится план (.helmwave/).</li>
22 <li>$HELMWAVE_PLAN_DIR - указывает путь к папке, в которой хранится или будет хранится план (.helmwave/).</li>
23 <li>$HELMWAVE_TAGS - массив строк, на основании которого будет проводится планирование.</li>
23 <li>$HELMWAVE_TAGS - массив строк, на основании которого будет проводится планирование.</li>
24 <li>$HELMWAVE_PARALLEL - включает/выключает многопоточность (рекомендуется включать).</li>
24 <li>$HELMWAVE_PARALLEL - включает/выключает многопоточность (рекомендуется включать).</li>
25 <li>$HELMWAVE_LOG_FORMAT - позволяет выбрать один из предустановленных форматов вывода.</li>
25 <li>$HELMWAVE_LOG_FORMAT - позволяет выбрать один из предустановленных форматов вывода.</li>
26 <li>$HELMWAVE_LOG_LEVEL - позволяет управлять детализацией вывода.</li>
26 <li>$HELMWAVE_LOG_LEVEL - позволяет управлять детализацией вывода.</li>
27 <li>$HELMWAVE_LOG_COLOR - включает/выключает цвета для вывода.</li>
27 <li>$HELMWAVE_LOG_COLOR - включает/выключает цвета для вывода.</li>
28 </ul><h3>Use-Cases</h3>
28 </ul><h3>Use-Cases</h3>
29 <p>Примеры будут производиться, опираясь на gitlab-ci. Но это не помешает вам встроить helmwave в любой другой CI-инструмент.</p>
29 <p>Примеры будут производиться, опираясь на gitlab-ci. Но это не помешает вам встроить helmwave в любой другой CI-инструмент.</p>
30 <p>Чем ниже, тем сложнее будут примеры.</p>
30 <p>Чем ниже, тем сложнее будут примеры.</p>
31 <h3>Git tag -&gt; Docker tag</h3>
31 <h3>Git tag -&gt; Docker tag</h3>
32 <p>Допустим вы написали какой-то helm чарт для нашего приложения. Его values.yaml по умолчанию имеет вид:</p>
32 <p>Допустим вы написали какой-то helm чарт для нашего приложения. Его values.yaml по умолчанию имеет вид:</p>
33 image: repository: registry.gitlab.local/example/app tag: master<h4>Необходимо чтобы image.tag брался из переменной CI</h4>
33 image: repository: registry.gitlab.local/example/app tag: master<h4>Необходимо чтобы image.tag брался из переменной CI</h4>
34 <p>Приступим, создадим 2 файла.</p>
34 <p>Приступим, создадим 2 файла.</p>
35 . ├── helmwave.yml.tpl └── values.yml<p>helmwave.yml.tpl</p>
35 . ├── helmwave.yml.tpl └── values.yml<p>helmwave.yml.tpl</p>
36 project: my-project # Имя проекта version: 0.5.0 # Версия helmwave releases: - name: my-release chart: my-chart-repo/my-app values: - values.yml options: install: true namespace: my-namespace<p><strong>values.yml</strong></p>
36 project: my-project # Имя проекта version: 0.5.0 # Версия helmwave releases: - name: my-release chart: my-chart-repo/my-app values: - values.yml options: install: true namespace: my-namespace<p><strong>values.yml</strong></p>
37 image: tag: {{ env "CI_COMMIT_TAG" }}<h3>Git commit --&gt; PodAnnotations</h3>
37 image: tag: {{ env "CI_COMMIT_TAG" }}<h3>Git commit --&gt; PodAnnotations</h3>
38 <p>Требуется чтобы deployment обновлялся только если у нас есть новый коммит.</p>
38 <p>Требуется чтобы deployment обновлялся только если у нас есть новый коммит.</p>
39 <p><em>deployment</em>имеет примерно этот вид:</p>
39 <p><em>deployment</em>имеет примерно этот вид:</p>
40 ... metadata: {{- with .Values.podAnnotations }} annotations: {{- toYaml . | nindent 8 }} {{- end }} ...<p>Поэтому мы можем легко расширить предыдущий пример<strong>values.yml</strong></p>
40 ... metadata: {{- with .Values.podAnnotations }} annotations: {{- toYaml . | nindent 8 }} {{- end }} ...<p>Поэтому мы можем легко расширить предыдущий пример<strong>values.yml</strong></p>
41 image: tag: {{ requiredEnv "CI_COMMIT_TAG" }} podAnnotations: gitCommit: {{ requiredEnv "CI_COMMIT_SHORT_SHA" | quote }}<h3>Контуры, окружения, environments</h3>
41 image: tag: {{ requiredEnv "CI_COMMIT_TAG" }} podAnnotations: gitCommit: {{ requiredEnv "CI_COMMIT_SHORT_SHA" | quote }}<h3>Контуры, окружения, environments</h3>
42 <p>Структура каталога</p>
42 <p>Структура каталога</p>
43 . ├── helmwave.yml.tpl └── values ├── _.yml ├── prod.yml └── stage.yml<p>helmwave.yml.tpl</p>
43 . ├── helmwave.yml.tpl └── values ├── _.yml ├── prod.yml └── stage.yml<p>helmwave.yml.tpl</p>
44 project: my-project version: 0.5.0 releases: - name: my-release chart: my-chart-repo/my-app values: # Default - values/_.yml # For specific ENVIRONMENT - values/{{ env "CI_ENVIRONMENT_NAME" }}.yml options: install: true namespace: {{ env "CI_ENVIRONMENT_NAME" }}<p>values/_.yml - Будет запускаться для любого окружения</p>
44 project: my-project version: 0.5.0 releases: - name: my-release chart: my-chart-repo/my-app values: # Default - values/_.yml # For specific ENVIRONMENT - values/{{ env "CI_ENVIRONMENT_NAME" }}.yml options: install: true namespace: {{ env "CI_ENVIRONMENT_NAME" }}<p>values/_.yml - Будет запускаться для любого окружения</p>
45 image: tag: {{ requiredEnv "CI_COMMIT_TAG" }} podAnnotations: gitCommit: {{ requiredEnv "CI_COMMIT_SHORT_SHA" | quote }}<p>values/prod.yml - Будет запускаться только для prod</p>
45 image: tag: {{ requiredEnv "CI_COMMIT_TAG" }} podAnnotations: gitCommit: {{ requiredEnv "CI_COMMIT_SHORT_SHA" | quote }}<p>values/prod.yml - Будет запускаться только для prod</p>
46 <p>values/stage.yml - Будет запускаться только для stage</p>
46 <p>values/stage.yml - Будет запускаться только для stage</p>
47 <h3>Используем внешний yaml и .Release.Store</h3>
47 <h3>Используем внешний yaml и .Release.Store</h3>
48 <p>Store -- это просто хранилище, которое можно задавать в helmwave.yml и передавать дальше в шаблонизацию values.</p>
48 <p>Store -- это просто хранилище, которое можно задавать в helmwave.yml и передавать дальше в шаблонизацию values.</p>
49 <p>Допустим, мы хотим связать путь к секрету в vault и путь к проекту в gitlab или вы хотите переопределять путь к image.repository. Это можно удобно сделать через Store.</p>
49 <p>Допустим, мы хотим связать путь к секрету в vault и путь к проекту в gitlab или вы хотите переопределять путь к image.repository. Это можно удобно сделать через Store.</p>
50 . ├── helmwave.yml.tpl ├── values │ └── _.yml └── vars └── my-list.yaml<p>values/_.yml</p>
50 . ├── helmwave.yml.tpl ├── values │ └── _.yml └── vars └── my-list.yaml<p>values/_.yml</p>
51 vault: secret/{{ .Release.Store.path }}/{{ requiredEnv "CI_ENVIRONMENT_NAME" }} image: repository: {{ env "CI_REGISTRY" | default "localhost:5000" }}/{{ .Release.Store.path }}<p>Добавим произвольный yaml файл.</p>
51 vault: secret/{{ .Release.Store.path }}/{{ requiredEnv "CI_ENVIRONMENT_NAME" }} image: repository: {{ env "CI_REGISTRY" | default "localhost:5000" }}/{{ .Release.Store.path }}<p>Добавим произвольный yaml файл.</p>
52 <p>vars/my-list.yaml</p>
52 <p>vars/my-list.yaml</p>
53 releases: - name: adm-api path: main/product/adm/api - name: api path: main/product/api<p>helmwave.yml.tpl</p>
53 releases: - name: adm-api path: main/product/adm/api - name: api path: main/product/api<p>helmwave.yml.tpl</p>
54 project: my-project version: 0.5.0 .options: &amp;options install: true wait: true timeout: 5m releases: {{- with readFile "vars/my-list.yaml" | fromYaml | get "releases" }} {{- range $v := . }} - name: {{ $v | get "name" }} chart: my-project/{{ $v | get "name" }} options: &lt;&lt;: *options store: path: {{ $v | get "path" }} # Set .Release.Store.path tags: - {{ $v | get "name" }} - my values: # Default - values/_.yml # For specific ENVIRONMENT - values/{{ env "CI_ENVIRONMENT_NAME" }}.yml {{ end }} {{- end }}<p>Запускаем!</p>
54 project: my-project version: 0.5.0 .options: &amp;options install: true wait: true timeout: 5m releases: {{- with readFile "vars/my-list.yaml" | fromYaml | get "releases" }} {{- range $v := . }} - name: {{ $v | get "name" }} chart: my-project/{{ $v | get "name" }} options: &lt;&lt;: *options store: path: {{ $v | get "path" }} # Set .Release.Store.path tags: - {{ $v | get "name" }} - my values: # Default - values/_.yml # For specific ENVIRONMENT - values/{{ env "CI_ENVIRONMENT_NAME" }}.yml {{ end }} {{- end }}<p>Запускаем!</p>
55 $ CI_ENVIRONMENT_NAME=stage helmwave planfile<p>Появится helmwave.yml и папка .helmwave</p>
55 $ CI_ENVIRONMENT_NAME=stage helmwave planfile<p>Появится helmwave.yml и папка .helmwave</p>
56 $ tree .helmwave .helmwave ├── planfile └── values ├── _.yml.adm-api@.plan └── _.yml.api@.plan $ cat .helmwave/values/_.yml.api@.plan vault: secret/main/product/api/stage image: repository: localhost:5000/main/product/api $ cat .helmwave/values/_.yml.adm-api@.plan vault: secret/main/product/adm/api/stage image: repository: localhost:5000/main/product/adm/api<p>helmwave.yml</p>
56 $ tree .helmwave .helmwave ├── planfile └── values ├── _.yml.adm-api@.plan └── _.yml.api@.plan $ cat .helmwave/values/_.yml.api@.plan vault: secret/main/product/api/stage image: repository: localhost:5000/main/product/api $ cat .helmwave/values/_.yml.adm-api@.plan vault: secret/main/product/adm/api/stage image: repository: localhost:5000/main/product/adm/api<p>helmwave.yml</p>
57 project: my-project version: 0.5.0 .options: &amp;options install: true wait: true timeout: 5m releases: - name: adm-api chart: my/adm-api options: &lt;&lt;: *options store: path: main/product/adm/api tags: - adm-api - my values: # Default - values/_.yml # For specific ENVIRONMENT - values/stage.yml - name: api chart: my/api options: &lt;&lt;: *options store: path: main/product/api tags: - api - my values: # Default - values/_.yml # For specific ENVIRONMENT - values/stage.yml<h2>Отделяем продукты от инфраструктуры</h2>
57 project: my-project version: 0.5.0 .options: &amp;options install: true wait: true timeout: 5m releases: - name: adm-api chart: my/adm-api options: &lt;&lt;: *options store: path: main/product/adm/api tags: - adm-api - my values: # Default - values/_.yml # For specific ENVIRONMENT - values/stage.yml - name: api chart: my/api options: &lt;&lt;: *options store: path: main/product/api tags: - api - my values: # Default - values/_.yml # For specific ENVIRONMENT - values/stage.yml<h2>Отделяем продукты от инфраструктуры</h2>
58 <h3>Структура проекта</h3>
58 <h3>Структура проекта</h3>
59 <p>Создадим в папке values 2 папки:</p>
59 <p>Создадим в папке values 2 папки:</p>
60 <ul><li>product - здесь будут values для продуктов</li>
60 <ul><li>product - здесь будут values для продуктов</li>
61 <li>infrastructure - здесь будет инфраструктурные values</li>
61 <li>infrastructure - здесь будет инфраструктурные values</li>
62 </ul><p><strong>values/infrastructure</strong></p>
62 </ul><p><strong>values/infrastructure</strong></p>
63 <ul><li>adminer - веб морда для подключения к базе, полезна в основном только в dev-контурах</li>
63 <ul><li>adminer - веб морда для подключения к базе, полезна в основном только в dev-контурах</li>
64 <li>postgresql - база данных</li>
64 <li>postgresql - база данных</li>
65 <li>ns-ready - здесь LimitRange, ResourcseQuota, Secrets, NetworkPolicy, etc</li>
65 <li>ns-ready - здесь LimitRange, ResourcseQuota, Secrets, NetworkPolicy, etc</li>
66 <li>rabbitmq - общая шина между chat и api</li>
66 <li>rabbitmq - общая шина между chat и api</li>
67 </ul><p><strong>values/product</strong>Приложение состоит из 3 микросервисов</p>
67 </ul><p><strong>values/product</strong>Приложение состоит из 3 микросервисов</p>
68 <ul><li>api</li>
68 <ul><li>api</li>
69 <li>chat</li>
69 <li>chat</li>
70 <li>frontend</li>
70 <li>frontend</li>
71 </ul><p>И еще нам понадобятся 2 отдельных файла описывающие массив<strong>product</strong>и массив<strong>infrastructure</strong>.</p>
71 </ul><p>И еще нам понадобятся 2 отдельных файла описывающие массив<strong>product</strong>и массив<strong>infrastructure</strong>.</p>
72 <p><strong>Структура проекта</strong>:</p>
72 <p><strong>Структура проекта</strong>:</p>
73 . ├── helmwave.yml.tpl ├── values │ ├── infrastructure │ │ ├── adminer │ │ │ ├── _.yml │ │ │ ├── dev.yml │ │ │ └── stage.yml │ │ ├── ns-ready │ │ │ └── _.yml │ │ ├── postgresql │ │ │ ├── _.yml │ │ │ └── dev.yml │ │ └── rabbitmq │ │ ├── _.yml │ │ ├── dev.yml │ │ └── stage.yml │ └── product │ ├── _ │ │ ├── _.yml │ │ ├── dev.yml │ │ ├── prod.yml │ │ └── stage.yml │ ├── api │ │ ├── _.yml │ │ ├── dev.yml │ │ ├── prod.yml │ │ └── stage.yml │ ├── chat │ │ └── _.yml │ └── frontend │ ├── _.yml │ ├── dev.yml │ ├── prod.yml │ └── stage.yml └── vars ├── infrastructure.yaml └── products.yaml<p>vars/infrastructure.yaml -</p>
73 . ├── helmwave.yml.tpl ├── values │ ├── infrastructure │ │ ├── adminer │ │ │ ├── _.yml │ │ │ ├── dev.yml │ │ │ └── stage.yml │ │ ├── ns-ready │ │ │ └── _.yml │ │ ├── postgresql │ │ │ ├── _.yml │ │ │ └── dev.yml │ │ └── rabbitmq │ │ ├── _.yml │ │ ├── dev.yml │ │ └── stage.yml │ └── product │ ├── _ │ │ ├── _.yml │ │ ├── dev.yml │ │ ├── prod.yml │ │ └── stage.yml │ ├── api │ │ ├── _.yml │ │ ├── dev.yml │ │ ├── prod.yml │ │ └── stage.yml │ ├── chat │ │ └── _.yml │ └── frontend │ ├── _.yml │ ├── dev.yml │ ├── prod.yml │ └── stage.yml └── vars ├── infrastructure.yaml └── products.yaml<p>vars/infrastructure.yaml -</p>
74 releases: - name: postgresql repo: bitnami version: 8.6.13 - name: adminer repo: cetic version: 0.1.5 - name: rabbitmq repo: bitnami version: 7.6.6 - name: ns-ready repo: my-project version: 0.1.1<p>vars/products.yaml</p>
74 releases: - name: postgresql repo: bitnami version: 8.6.13 - name: adminer repo: cetic version: 0.1.5 - name: rabbitmq repo: bitnami version: 7.6.6 - name: ns-ready repo: my-project version: 0.1.1<p>vars/products.yaml</p>
75 releases: - name: adm-api path: rdw/sbs/adm/api - name: frontend path: my-project/internal/frontend - name: api path: my-project/internal/api - name: chat path: my-project/internal/chat<p>helmwave.yml.tpl</p>
75 releases: - name: adm-api path: rdw/sbs/adm/api - name: frontend path: my-project/internal/frontend - name: api path: my-project/internal/api - name: chat path: my-project/internal/chat<p>helmwave.yml.tpl</p>
76 project: my-project version: 0.5.0 repositories: - name: bitnami url: https://charts.bitnami.com/bitnami - name: cetic url: https://cetic.github.io/helm-charts .options: &amp;options install: true wait: true timeout: 5m atomic: false maxhistory: 10 namespace: {{ requiredEnv "HELM_NS" }} releases: {{- with readFile "vars/products.yaml" | fromYaml | get "releases" }} {{- range $v := . }} - name: {{ $v | get "name" }} chart: my-project/{{ $v | get "name" }} options: &lt;&lt;: *options store: path: {{ $v | get "path" }} tags: - {{ $v | get "name" }} - product values: # all products &amp; all envs - values/product/_/_.yml # all products &amp; an env - values/product/_/{{ requiredEnv "CI_ENVIRONMENT" }}.yml # a product &amp; all envs - values/product/{{ $v | get "name" }}/_.yml # a product &amp; an env - values/product/{{ $v | get "name" }}/{{ requiredEnv "CI_ENVIRONMENT" }}.yml {{ end }} {{- end }} {{- with readFile "vars/infrastructure.yaml" | fromYaml | get "releases" }} {{- range $v := . }} - name: {{ $v | get "name" }} chart: {{ $v | get "repo" }}/{{ $v | get "name" }} options: &lt;&lt;: *options chartpathoptions: version: {{ $v | get "version" }} tags: - {{ $v | get "name" }} - infrastructure values: # a svc &amp; all envs - values/infrastructure/{{ $v | get "name" }}/_.yml # a svc &amp; an env - values/infrastructure/{{ $v | get "name" }}/{{ requiredEnv "CI_ENVIRONMENT" }}.yml {{ end }} {{- end }}<h3>Контуры в Store</h3>
76 project: my-project version: 0.5.0 repositories: - name: bitnami url: https://charts.bitnami.com/bitnami - name: cetic url: https://cetic.github.io/helm-charts .options: &amp;options install: true wait: true timeout: 5m atomic: false maxhistory: 10 namespace: {{ requiredEnv "HELM_NS" }} releases: {{- with readFile "vars/products.yaml" | fromYaml | get "releases" }} {{- range $v := . }} - name: {{ $v | get "name" }} chart: my-project/{{ $v | get "name" }} options: &lt;&lt;: *options store: path: {{ $v | get "path" }} tags: - {{ $v | get "name" }} - product values: # all products &amp; all envs - values/product/_/_.yml # all products &amp; an env - values/product/_/{{ requiredEnv "CI_ENVIRONMENT" }}.yml # a product &amp; all envs - values/product/{{ $v | get "name" }}/_.yml # a product &amp; an env - values/product/{{ $v | get "name" }}/{{ requiredEnv "CI_ENVIRONMENT" }}.yml {{ end }} {{- end }} {{- with readFile "vars/infrastructure.yaml" | fromYaml | get "releases" }} {{- range $v := . }} - name: {{ $v | get "name" }} chart: {{ $v | get "repo" }}/{{ $v | get "name" }} options: &lt;&lt;: *options chartpathoptions: version: {{ $v | get "version" }} tags: - {{ $v | get "name" }} - infrastructure values: # a svc &amp; all envs - values/infrastructure/{{ $v | get "name" }}/_.yml # a svc &amp; an env - values/infrastructure/{{ $v | get "name" }}/{{ requiredEnv "CI_ENVIRONMENT" }}.yml {{ end }} {{- end }}<h3>Контуры в Store</h3>
77 <p>Допустим, у нас есть 2 окружения dev и prod. И в prod'e нам не нужна база данных.</p>
77 <p>Допустим, у нас есть 2 окружения dev и prod. И в prod'e нам не нужна база данных.</p>
78 <p>vars/infrastructure.yaml</p>
78 <p>vars/infrastructure.yaml</p>
79 releases: - name: rabbitmq repo: stable version: 6.18.2 envs: - _ # all environments tags: - queue - name: postgresql repo: bitnami version: 8.6.13 envs: - dev # only dev tags: - db # vim: set filetype=yaml: {{- $env := requiredEnv "CI_ENVIRONMENT" }} # Look at this first project: insider version: 0.5.0 repositories: - name: stable url: https://kubernetes-charts.storage.googleapis.com - name: bitnami url: https://charts.bitnami.com/bitnami .options: &amp;options install: true wait: true force: false timeout: 5m atomic: false maxhistory: 10 namespace: {{ requiredEnv "HELM_NS" }} releases: {{- with readFile "vars/infrastructure.yaml" | fromYaml | get "releases" }} {{- range $v := . }} {{- $envs := $v | get "envs" }} {{- if or (has "_" $envs) (has $env $envs) }} - name: {{ $v | get "name" }} chart: {{ $v | get "repo" }}/{{ $v | get "name" }} options: &lt;&lt;: *options chartpathoptions: version: {{ $v | get "version" }} tags: - {{ $v | get "name" }} - infrastructure {{- if $v | hasKey "tags" }} - {{ $v | get "tags" | toYaml }} {{- end }} values: # a svc &amp; all envs - values/infrastructure/{{ $v | get "name" }}/_.yml # a svc &amp; an env - values/infrastructure/{{ $v | get "name" }}/{{ $env }}.yml {{ end }} {{- end }} {{- end }}<p>База по умолчанию выключена.</p>
79 releases: - name: rabbitmq repo: stable version: 6.18.2 envs: - _ # all environments tags: - queue - name: postgresql repo: bitnami version: 8.6.13 envs: - dev # only dev tags: - db # vim: set filetype=yaml: {{- $env := requiredEnv "CI_ENVIRONMENT" }} # Look at this first project: insider version: 0.5.0 repositories: - name: stable url: https://kubernetes-charts.storage.googleapis.com - name: bitnami url: https://charts.bitnami.com/bitnami .options: &amp;options install: true wait: true force: false timeout: 5m atomic: false maxhistory: 10 namespace: {{ requiredEnv "HELM_NS" }} releases: {{- with readFile "vars/infrastructure.yaml" | fromYaml | get "releases" }} {{- range $v := . }} {{- $envs := $v | get "envs" }} {{- if or (has "_" $envs) (has $env $envs) }} - name: {{ $v | get "name" }} chart: {{ $v | get "repo" }}/{{ $v | get "name" }} options: &lt;&lt;: *options chartpathoptions: version: {{ $v | get "version" }} tags: - {{ $v | get "name" }} - infrastructure {{- if $v | hasKey "tags" }} - {{ $v | get "tags" | toYaml }} {{- end }} values: # a svc &amp; all envs - values/infrastructure/{{ $v | get "name" }}/_.yml # a svc &amp; an env - values/infrastructure/{{ $v | get "name" }}/{{ $env }}.yml {{ end }} {{- end }} {{- end }}<p>База по умолчанию выключена.</p>
80 <p>Чтобы postgresql включился.</p>
80 <p>Чтобы postgresql включился.</p>
81 $ CI_ENVIRONMENT=dev helmwave planfile<h3>Giltab-CI Pipelines</h3>
81 $ CI_ENVIRONMENT=dev helmwave planfile<h3>Giltab-CI Pipelines</h3>
82 <p>Рассмотрим шаблон gitlab-ci с использованием helmwave из проекта g-ci</p>
82 <p>Рассмотрим шаблон gitlab-ci с использованием helmwave из проекта g-ci</p>
83 variables: HELMWAVE_LOG_LEVEL: debug .helmwave-deploy: stage: deploy environment: name: ref/$CI_COMMIT_REF_SLUG image: name: diamon/helmwave:0.5.0 entrypoint: [""] script: - helmwave deploy helmwave deploy: extends: .helmwave-deploy<p>С использованием include</p>
83 variables: HELMWAVE_LOG_LEVEL: debug .helmwave-deploy: stage: deploy environment: name: ref/$CI_COMMIT_REF_SLUG image: name: diamon/helmwave:0.5.0 entrypoint: [""] script: - helmwave deploy helmwave deploy: extends: .helmwave-deploy<p>С использованием include</p>
84 include: https://gitlab.com/g-ci/deploy/-/raw/master/helmwave.yml helmwave deploy: environment: name: prod
84 include: https://gitlab.com/g-ci/deploy/-/raw/master/helmwave.yml helmwave deploy: environment: name: prod