Last modified July 2, 2026
Group multiple HelmReleases together
There are three idiomatic ways to deploy a related group of HelmReleases together. Pick the one that fits your coupling level:
- Helm umbrella chart. Package the components as sub-charts of one parent chart. Deploy as a single HelmRelease. Strongest coupling: every component upgrades together, on one Helm history.
- Kustomize over multiple HelmReleases. Keep each component as a separate HelmRelease and OCIRepository, then use a Kustomize base to apply shared labels, a common namespace, and version pins. Closest to the Giant Swarm App Sets pattern.
dependsOn. Independent HelmReleases that need to install in a specific order. A native Flux feature with no App CR equivalent.
These three patterns compose. An umbrella chart can be wrapped in a Kustomize base, and a Kustomize-grouped set of releases can use dependsOn between members.
Helm umbrella chart
If the components belong to the same product and ship on the same cadence, package them as a single Helm chart with dependencies declared in Chart.yaml:
# Chart.yaml of the umbrella chart
apiVersion: v2
name: hello-web-app
version: 0.1.0
dependencies:
- name: hello-world
version: 0.1.9
repository: oci://gsoci.azurecr.io/charts/giantswarm
- name: simple-db
version: 0.1.1
repository: oci://gsoci.azurecr.io/charts/giantswarm
Publish the umbrella chart to your OCI registry. Then deploy it with one OCIRepository and one HelmRelease, the same way you would any other chart. Shared values and per-subchart values both live in the umbrella chart’s values.yaml, with subchart values nested under each dependency name:
# values.yaml of the umbrella chart
hello-world:
replicaCount: 2
simple-db:
storage:
size: 5Gi
See the upstream Helm chart dependencies documentation for the full mechanics, including global values shared across sub-charts.
Kustomize over multiple HelmReleases
When the components ship independently but still need to be deployed and configured together, keep each one as its own HelmRelease and OCIRepository, then group them with a Kustomize base.
Create a base directory with the per-component manifests (one HelmRelease + one OCIRepository per component), and a kustomization.yaml that pulls them together:
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
commonLabels:
gitops.giantswarm.io/releaseGroup: hello-web-app
namespace: hello-web
patches:
- patch: |-
- op: replace
path: /spec/ref/tag
value: "0.1.9"
target:
kind: OCIRepository
name: hello-world
- patch: |-
- op: replace
path: /spec/ref/tag
value: "0.1.1"
target:
kind: OCIRepository
name: simple-db
resources:
- ../../components/hello-world
- ../../components/simple-db
What this base provides:
commonLabelsstamps a single label across every HelmRelease and OCIRepository in the group, so you can filter the developer portal orkubectlqueries by that label.namespaceenforces the same target namespace for the HelmRelease and OCIRepository resources themselves. The Helm install target namespace is a separate field (spec.targetNamespaceon the HelmRelease).- Inline patches pin the chart versions on each OCIRepository, so the group uses a known-good combination.
resourcesreferences the per-component bases. Each component base contains its own HelmRelease, OCIRepository, and optionalConfigMaporSecret.
Consumers use this base by referencing it from a workload-cluster-level Kustomization, the same way they would a single-component base.
Ordering with dependsOn
If one release must finish installing before another starts (for example, cert-manager before anything that needs certificates), use the dependsOn field on the dependent HelmRelease:
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: dev01-hello-world
namespace: org-acmedev
spec:
dependsOn:
- name: dev01-cert-manager
namespace: org-acmedev
chartRef:
kind: OCIRepository
name: dev01-hello-world
# ...
Flux waits for dev01-cert-manager to report Ready=True before reconciling dev01-hello-world. dependsOn supports cross-namespace references and chained dependencies. See the HelmRelease dependencies reference for the full semantics, including timeout behavior.
Need help, got feedback?
We listen to your Slack support channel. You can also reach us at support@giantswarm.io. And of course, we welcome your pull requests!