Documentation
¶
Overview ¶
Package chart provides utilities for reading and modifying Chainguard Helm charts stored as OCI artifacts or on the filesystem.
Chainguard Helm charts embed metadata that describes how container image references map to values.yaml paths. This package uses that metadata to read, inspect, and patch charts without requiring knowledge of the underlying template format.
Inspecting a Chart Package ¶
To read chart metadata and image mappings from a chart filesystem (typically an expanded Chainguard chart APK), use Read:
chartData, err := chart.Read(expandedAPK.TarFS)
if err != nil {
return err
}
// chartData.Meta has Chart.yaml fields (name, version, dependencies, etc.)
// chartData.Mapping has the parsed image mapping template
// chartData.Subcharts has recursive subchart data, keyed by dependency alias
Extracting values.yaml from an OCI Artifact ¶
img, err := remote.Image(ref)
if err != nil {
return err
}
values, err := chart.ReadValues(img)
if err != nil {
return err
}
// values is nil if the chart has no values.yaml
Reading and Modifying Chart.yaml Metadata ¶
To read and parse Chart.yaml metadata from an OCI artifact:
meta, err := chart.ReadChartMeta(img)
if err != nil {
return err
}
// meta contains APIVersion, Name, Version, AppVersion, Description, Dependencies
To modify Chart.yaml metadata and create a new chart artifact:
meta.Version = "2.0.0"
meta.AppVersion = "1.5.0"
patched, err := chart.ReplaceChartMeta(img, meta)
if err != nil {
return err
}
// patched is a new OCI artifact with updated Chart.yaml
Patching Image References into a Chart ¶
To replace image references in a chart's values.yaml using a mapping template and a set of concrete refs, use ReplaceValues. It returns a new OCI artifact with the updated values.yaml — all other files, annotations, and metadata are preserved:
refs := map[string]string{
"nginx": "cgr.dev/chainguard/nginx:latest@sha256:abc123...",
}
patched, err := chart.ReplaceValues(img, mapping, refs)
if err != nil {
return err
}
if err := remote.Write(dstRef, patched); err != nil {
return err
}
Detecting Helm Charts ¶
Use the MediaType constant to identify Helm chart content layers when inspecting OCI manifests:
mt, _ := layers[0].MediaType()
if mt == chart.MediaType {
// this is a Helm chart
}
Example (MediaType) ¶
ExampleMediaType demonstrates using the Helm chart media type constant.
package main
import (
"fmt"
"chainguard.dev/sdk/helm/chart"
)
func main() {
// The MediaType constant identifies Helm chart content layers in OCI images
fmt.Println(chart.MediaType)
}
Output: application/vnd.cncf.helm.chart.content.v1.tar+gzip
Index ¶
- Constants
- Variables
- func PatchChartImages(chart v1.Image, ci *helmv1.ChartImages, resolve ResolveFunc, ...) (v1.Image, *helmv1.ChartDigests, error)
- func ReadChangelog(chart v1.Image) ([]byte, error)
- func ReadValues(chart v1.Image) ([]byte, error)
- func ReplaceChartMeta(chart v1.Image, meta *Meta) (v1.Image, error)
- func ReplaceValues(chart v1.Image, m *images.Mapping, refs map[string]string, ...) (v1.Image, error)
- type Chart
- type Dependency
- type Meta
- type PathMatcher
- type ResolveFunc
Examples ¶
Constants ¶
const HelmMetadataFilename = "Chart.yaml"
HelmMetadataFilename is the standard Helm chart metadata filename.
const MediaType types.MediaType = "application/vnd.cncf.helm.chart.content.v1.tar+gzip"
MediaType is the OCI media type for Helm chart content layers.
Variables ¶
var ErrSkipImage = errors.New("skip image")
ErrSkipImage is returned by a ResolveFunc to indicate that an image should be excluded from patching (e.g., an optional image that is missing).
Functions ¶
func PatchChartImages ¶ added in v0.1.56
func PatchChartImages(chart v1.Image, ci *helmv1.ChartImages, resolve ResolveFunc, opts ...images.ResolveOption) (v1.Image, *helmv1.ChartDigests, error)
PatchChartImages resolves all image references in a helmv1.ChartImages tree and patches them into the chart's values.yaml.
Root image values are replaced strictly — an error is returned if a template path does not exist in the chart's values.yaml. Subchart image overrides use images.WithAddMissing: existing paths are replaced, missing paths are added at the deepest existing ancestor.
Both paths preserve YAML comments and formatting via yamlpatch.
Returns the patched chart image and a ChartDigests tree for attestation.
func ReadChangelog ¶ added in v0.1.98
ReadChangelog extracts the top-level CHANGELOG.md from a Helm chart OCI artifact. Returns nil, nil if the chart has no CHANGELOG.md.
func ReadValues ¶
ReadValues extracts the top-level values.yaml from a Helm chart OCI artifact. Returns nil, nil if the chart has no values.yaml.
Example ¶
ExampleReadValues demonstrates reading the values.yaml file from a Helm chart OCI image.
package main
import (
"fmt"
"log"
"chainguard.dev/sdk/helm/chart"
"github.com/google/go-containerregistry/pkg/name"
"github.com/google/go-containerregistry/pkg/v1/remote"
)
func main() {
ref, err := name.ParseReference("cgr.dev/chainguard/helm-charts/nginx:latest")
if err != nil {
log.Fatal(err)
}
chartImage, err := remote.Image(ref)
if err != nil {
log.Fatal(err)
}
values, err := chart.ReadValues(chartImage)
if err != nil {
log.Fatal(err)
}
if values == nil {
fmt.Println("Chart has no values.yaml")
return
}
fmt.Printf("values.yaml content:\n%s\n", values)
}
Output:
func ReplaceChartMeta ¶ added in v0.1.53
ReplaceChartMeta returns a new Helm chart OCI artifact with the top-level Chart.yaml replaced with the provided metadata.
func ReplaceValues ¶
func ReplaceValues(chart v1.Image, m *images.Mapping, refs map[string]string, opts ...images.ResolveOption) (v1.Image, error)
ReplaceValues returns a new Helm chart OCI artifact with the top-level values.yaml transformed by applying the given mapping template with the provided image refs.
Example ¶
ExampleReplaceValues demonstrates replacing values.yaml with image reference resolution.
package main
import (
"fmt"
"log"
"chainguard.dev/sdk/helm/chart"
"chainguard.dev/sdk/helm/images"
"github.com/google/go-containerregistry/pkg/name"
"github.com/google/go-containerregistry/pkg/v1/remote"
)
func main() {
ref, err := name.ParseReference("cgr.dev/chainguard/helm-charts/nginx:latest")
if err != nil {
log.Fatal(err)
}
chartImage, err := remote.Image(ref)
if err != nil {
log.Fatal(err)
}
// Define the mapping template for image references
mapping := &images.Mapping{
Images: map[string]*images.Image{
"nginx": {
Values: map[string]any{
"image": map[string]any{
"registry": "${registry}",
"repository": "${repo}",
"tag": "${tag}",
},
},
},
},
}
// Provide the actual image references to resolve
refs := map[string]string{
"nginx": "cgr.dev/chainguard/nginx:latest@sha256:0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef",
}
// Replace values.yaml with resolved image references
patched, err := chart.ReplaceValues(chartImage, mapping, refs)
if err != nil {
log.Fatal(err)
}
// Write the patched chart to a new location
dstRef, err := name.ParseReference("cgr.dev/my-org/nginx-chart:patched")
if err != nil {
log.Fatal(err)
}
if err := remote.Write(dstRef, patched); err != nil {
log.Fatal(err)
}
fmt.Println("Chart values.yaml updated and pushed successfully")
}
Output:
Types ¶
type Chart ¶ added in v0.1.51
type Chart struct {
Meta *Meta
Mapping *images.Mapping
Subcharts map[string]*Chart // dep.Key() -> subchart
}
Chart holds metadata and image mappings extracted from a chart filesystem.
type Dependency ¶ added in v0.1.51
type Dependency struct {
Name string `yaml:"name" json:"name"`
Alias string `yaml:"alias,omitempty" json:"alias,omitempty"`
}
Dependency represents a dependency entry in Chart.yaml.
func (Dependency) Key ¶ added in v0.1.51
func (d Dependency) Key() string
Key returns the Helm values namespace key for this dependency — the alias if set, otherwise the name.
type Meta ¶ added in v0.1.51
type Meta struct {
APIVersion string `yaml:"apiVersion" json:"apiVersion"`
Name string `yaml:"name" json:"name"`
Version string `yaml:"version" json:"version"`
AppVersion string `yaml:"appVersion,omitempty" json:"appVersion,omitempty"`
Description string `yaml:"description,omitempty" json:"description,omitempty"`
Dependencies []Dependency `yaml:"dependencies,omitempty" json:"dependencies,omitempty"`
}
Meta holds metadata from Chart.yaml.
type PathMatcher ¶ added in v0.1.53
PathMatcher defines a function type for matching file paths in a chart tarball. Used to identify specific files like values.yaml or Chart.yaml while iterating through tarball contents.
type ResolveFunc ¶ added in v0.1.56
type ResolveFunc func(ci *helmv1.ChartImages, imageID string, ref *helmv1.ChartImage) (fullRef, resolvedDigest string, err error)
ResolveFunc resolves a single chart image to its full OCI reference string and the resolved digest. Callers provide their own resolution logic (e.g., registry lookups, custom assembly checks) via this callback.
The ci parameter is the helmv1.ChartImages that owns this image, allowing callers to check level-specific metadata (e.g., whether the image is optional at this level of the chart tree).
Return ErrSkipImage to exclude the image from patching.