Manage Helm chart dependencies without keeping the child charts in the 'parent/charts' directory?

12/16/2019

I currently have 3 Helm repositories with the following structure:

repoA/
├── templates/
├── Chart.yaml
├── values.yaml

repoB/
├── templates/
├── Chart.yaml
├── values.yaml

masterRepo/
├── templates/
├── Chart.yaml
├── values.yaml
├── requirements.yaml

The requirements.yaml file from masterRepo is something like below:

dependencies:
- name: repoA
  version: "1.0"
  repository: "file://../repoA"
  condition: repoA.enabled
- name: repoB
  version: "1.0"
  repository: "file://../repoB"
  condition: repoB.enabled

I would like to only use masterRepo to deploy the dependent Helm charts. I have tried the dependent charts (repoA and repoB) individually and all of them work without any issue.

I know I can manually put the three child repositories in the masterRepo/charts and it will work but I wanna keep these repositories independent so that other master-repositories can use any of them.

I am not sure what I am doing wrong but helm dependency update doesn't work for me. It simply does nothing.

Also, if I install the masterRepo using helm install release-name -f values.yaml it only installs the masterRepo/templates resources and ignores the child repository.

What to do to make the parent Helm chart detect the children and install them conditionally (based on repoX.enabled variable) without keeping the dependent repositories inside the charts directory of the Master-helm-chart?

-- Amit Yadav
kubernetes-helm
yaml

1 Answer

12/27/2019

Okay, this is pretty easy. If you have multiple Helm charts here and there in the system, you can create dependencies without changing their location.

With the structure specified in the question, we can add dependencies in requirements.yaml (Helm version: 2.x.x) or Chart.yaml (Helm version:3.x.x). I am currently using Helm v2.16.1.

Now simply run helm dependency update or helm dep up and a charts directory gets created in masterRepo. Now the updated structure of masterRepo is as follows:

masterRepo/
├── charts/
       └── chartA-1.tgz
       └── chartB-1.tgz
├── templates/
├── Chart.yaml
├── requirements.lock
├── requirements.yaml
├── values.yaml

The new files/directories added are:

  1. ChartA-1.tgz and ChartB-1.tgz TAR Archive files which are nothing but zipped chartA and chartB charts.
  2. requirements.lock: Used to rebuild the charts/ directory. Read more about this file in this SO post.

To install the child charts conditionally, you can the following the values.yaml file of the masterRepo:

repoA:
  enabled: True
repoB:
  enabled: True

Now a simple helm install command from inside the masterRepo will deploy masterRepo as well as it's dependencies (chartA and chartB).

Hope this helps. Happy Helming!

-- Amit Yadav
Source: StackOverflow