Cross-release referenceΒΆ
Introduced in v0.43.0
Since v0.43.0, releases are built in dependency order. This means a release can reference the already-built manifests and values of its dependencies declared in depends_on.
This enables powerful cross-release data sharing:
- Access the entire plan configuration using
getPlan. Useful for accessing the field of other releases, liketagsorstore. - Access a dependency's rendered values using
getValues. - Access a dependency's rendered manifests using
getManifests. Useful for retrieving helm-generated secrets.
How it worksΒΆ
graph LR
redis[redis release] --> backend[backend release]
redis -->|build values| redis_values[redis values]
redis -->|build manifests| redis_manifests[redis manifests]
redis_values -->|getValues| backend
redis_manifests -->|getManifests| backend
When helmwave builds the plan:
- Releases are sorted by their dependency graph
- Each release's values are built immediately before its manifests
- Dependent releases can access their dependencies' built artifacts via template functions
ExampleΒΆ
Project Structure
docs/examples/cross-release-reference
βββ README.md
βββ helmwave.yml
βββ values
βββ backend.yml
βββ redis.yml
2 directories, 4 files
helmwave.yml
project: "Example: cross-release reference"
version: 0.44.4
repositories:
- name: bitnami
url: https://charts.bitnami.com/bitnami
.options: &options
namespace: my-namespace
wait: watcher
releases:
# redis is built first (no dependencies)
- name: redis
<<: *options
chart: bitnami/redis
store:
port: 6379
values:
- values/redis.yml
# backend depends on redis, so it's built after redis
# backend's values can reference redis's built manifests and values
- name: backend
<<: *options
chart: bitnami/nginx
depends_on:
- redis
values:
- values/backend.yml
values/redis.yml
connection:
host: redis-master
port: {{ .Release.store.port }}
values/backend.yml
# Example: Access redis's rendered values
{{ $redisValues := getValues "redis@my-namespace" "values/redis.yml" }}
# Example: Access redis's rendered manifests to get helm-generated secrets
{{ $manifests := getManifests "redis@my-namespace" }}
# Example: Access plan configuration
{{ $plan := getPlan }}
# Use data from redis release values
redis:
host: {{ $redisValues.connection.host }}
port: {{ $redisValues.connection.port }}
# Extract redis password from helm-generated secret
{{- range $manifests }}
{{- if eq .kind "Secret" }}
{{- if contains "redis" .metadata.name }}
password: {{ index .data "redis-password" }}
{{- end }}
{{- end }}
{{- end }}
# Access store from plan
{{- range $plan.releases }}
{{- if eq .name "redis" }}
store_port: {{ .store.port }}
{{- end }}
{{- end }}
Template functionsΒΆ
getPlanΒΆ
Access the entire plan configuration, including all releases' store fields:
{{ $plan := getPlan }}
{{ range $plan.releases }}
{{- if eq .name "redis" }}
redis_port: {{ .store.port }}
{{- end }}
{{ end }}
getValuesΒΆ
Fetch rendered values from a depending release:
{{ $redisValues := getValues "redis@my-namespace" "values/redis.yml" }}
redis_host: {{ $redisValues.connection.host }}
getManifestsΒΆ
Fetch rendered manifests from a depending release as an array of Kubernetes objects. This is useful for accessing helm-generated secrets like random passwords:
{{ $manifests := getManifests "redis@my-namespace" }}
{{- range $manifests }}
{{- if eq .kind "Secret" }}
redis_password: {{ index .data "redis-password" }}
{{- end }}
{{- end }}