Ответ
В DevOps-практике Helm-чарты (включая их шаблоны в директории templates/) всегда хранятся в системах контроля версий, обычно Git. Способ организации зависит от зрелости процесса.
Основные подходы:
-
Монорепозиторий (Monorepo):
- Как: Все чарты проекта лежат в одном репозитории, например, в папке
charts/. - Плюсы: Простота, атомарные коммиты, легче отслеживать зависимости между чартами.
- Минусы: Может вырасти в размерах, сложнее разграничить права.
infra-repo/ ├── charts/ │ ├── frontend-app/ │ │ ├── Chart.yaml │ │ ├── values.yaml │ │ └── templates/ # <-- Шаблоны хранятся здесь │ │ ├── deployment.yaml │ │ └── service.yaml │ └── redis-cache/ │ └── ... └── applications/
- Как: Все чарты проекта лежат в одном репозитории, например, в папке
-
Отдельный репозиторий на чарт:
- Как: Каждый чарт (например,
company/nginx-ingress) имеет свой собственный Git-репозиторий. - Плюсы: Чёткое разделение ответственности, независимый жизненный цикл и версионирование.
- Минусы: Больше репозиториев, сложнее вносить кросс-чарт изменения.
- Как: Каждый чарт (например,
Далее — публикация в реестр (Helm Repository):
Просто хранить в Git недостаточно для использования в CI/CD. Собранные чарты (.tgz-пакеты) я публикую в реестр:
- ChartMuseum / Harbor: Специализированные приватные реестры для Helm.
- OCI-репозитории (современный стандарт с Helm 3.8+): Храню чарты как OCI-артефакты в том же реестре, что и образы контейнеров (например, AWS ECR, Google Artifact Registry, Harbor).
# Упаковка и публикация в OCI-репозиторий helm package ./my-chart helm push my-chart-1.0.0.tgz oci://registry.my-company.com/charts
Мой workflow:
- Разрабатываю шаблоны в Git-репозитории.
- CI-пайплайн (например, GitHub Actions) на тег запускает
helm lint,helm package, подписывает чарт (если нужно) и пушит артефакт в OCI-репозиторий. - В пайплайне развёртывания приложения просто указываю
helm upgrade --install my-app oci://registry.my-company.com/charts/my-chart --version 1.0.0.