Helm charts published as OCI artifacts to ghcr.io/vexxhost/charts.
| Chart | Description |
|---|---|
| loopback-block | Creates loopback block devices for Rook-Ceph OSDs |
External Helm charts are mirrored into ghcr.io/vexxhost/charts using ORAS.
Each mirror is declared in a YAML manifest under mirrors/, validated against
a JSON Schema.
| Chart | Source |
|---|---|
| cert-manager | quay.io/jetstack/charts/cert-manager |
- Resolve the upstream version tag to a content-addressable digest (
oras resolve). - Verify the upstream Helm provenance file (
.prov) using the keyring specified in the manifest (helm pull --prov --verify). - Copy the exact OCI artifact to the destination repository with
oras cp source@sha256:<digest> destination:<version>. ORAS preserves all layers including the Helm provenance layer. - Verify the destination digest matches the source.
- Sign the artifact with cosign using this repository's GitHub Actions OIDC identity.
Pull a chart with Helm:
helm pull oci://ghcr.io/vexxhost/charts/cert-manager --version v1.11.5Verify Helm provenance with the upstream keyring:
helm pull oci://ghcr.io/vexxhost/charts/cert-manager \
--version v1.11.5 --prov --verify \
--keyring <cert-manager-keyring.gpg>Verify the VEXXHOST cosign signature:
cosign verify ghcr.io/vexxhost/charts/cert-manager@sha256:<digest> \
--certificate-identity-regexp '^https://github.com/vexxhost/charts/.github/workflows/mirror.yaml@refs/heads/main$' \
--certificate-oidc-issuer https://token.actions.githubusercontent.comLint the charts:
ct lint --config ct.yamlRun integration tests with kind:
kind create cluster
ct install --config ct.yaml
kind delete clusterThe flake provides all required tools. Use nix develop to enter a shell with
uv, helm, oras, and cosign:
nix developValidate mirror manifests locally:
nix develop --command uv run hack/mirror_charts.py --validate-onlyDry-run the mirror process (resolves sources, verifies provenance, skips writes):
nix develop --command uv run hack/mirror_charts.py --dry-run --chart cert-manager- Create a YAML file in
mirrors/following the schema inschemas/chart-mirror.schema.json. Include the modeline:# yaml-language-server: $schema=../schemas/chart-mirror.schema.json - Test with
--validate-onlyand--dry-run. - Open a PR — CI will validate the manifest and verify upstream provenance.
- On merge to
main, the mirror workflow copies and signs the chart.