chart

package
v0.1.124 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jul 14, 2026 License: Apache-2.0 Imports: 19 Imported by: 0

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

Examples

Constants

View Source
const HelmMetadataFilename = "Chart.yaml"

HelmMetadataFilename is the standard Helm chart metadata filename.

View Source
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

View Source
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

func ReadChangelog(chart v1.Image) ([]byte, error)

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

func ReadValues(chart v1.Image) ([]byte, error)

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)
}

func ReplaceChartMeta added in v0.1.53

func ReplaceChartMeta(chart v1.Image, meta *Meta) (v1.Image, error)

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")
}

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.

func Read added in v0.1.51

func Read(fsys fs.FS) (*Chart, error)

Read extracts Chart.yaml metadata and cg.json image mappings from a chart filesystem. Subcharts are discovered from Chart.yaml dependencies and populated in Chart.Subcharts recursively.

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.

func ReadChartMeta added in v0.1.53

func ReadChartMeta(chart v1.Image) (*Meta, error)

ReadChartMeta extracts and parses the top-level Chart.yaml metadata from a Helm chart OCI artifact.

type PathMatcher added in v0.1.53

type PathMatcher func(string) bool

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.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL