Skip to main content
Cloud DevOps Solutions
Get a quote Talk to an engineer

GitOps / Helm / ArgoCD

Setting Up a Private Helm Chart Repository

A Helm chart repository is where packaged, versioned charts are stored so clusters and pipelines can pull them. We set up an OCI registry in ECR, ACR or GitHub Packages, or ChartMuseum where it fits, then add publishing from CI, access control, retention and signing.

Key takeaways

  • OCI registries are the default choice now: you likely already run one for container images.
  • Publishing should happen from CI on a tag or merge, never from a laptop.
  • Immutable versions and retention rules make rollbacks and audits reliable.
  • GitOps controllers need read credentials to the registry, handled without long-lived passwords where possible.
  • Signing charts is a worthwhile add-on for regulated environments, less so for small internal teams.

Why chart storage deserves a decision

Charts start life in a git folder, and for a while that is fine. Then a second team wants to reuse one, or you need to deploy a specific older version to roll back, or an auditor asks who published what. Pointing at a branch of a git repository stops being good enough. You want immutable, versioned artefacts with access control: a chart repository.

This page covers how we choose, build and operate one as part of our GitOps, Helm, ArgoCD and Flux service. It sits directly after writing the charts and before promotion across environments.

What good looks like

  • Every released chart has an immutable version number and a trace back to a commit.
  • Publishing happens from CI with short-lived credentials.
  • Clusters pull charts using identity, not a password pasted into a secret.
  • Old versions are retained long enough for rollback and cleaned up after that.
  • Nobody installs a chart from a developer’s laptop.

Choosing where charts live

OptionGood fit whenWatch out for
OCI in ECRYou run on AWS and use ECR for imagesRepository per chart must exist before push, naming follows the chart
OCI in ACRYou run on AzureAuthentication through Azure identity, tier features vary
GitHub Packages (OCI via ghcr.io)Your code and pipelines are already on GitHubOrganisation permission model, package visibility defaults
HarborYou want one self-hosted registry with scanning and replicationYou now operate it
ChartMuseumYou need a classic index.yaml HTTP repositoryExtra service to run, less momentum than OCI

Our default is OCI in whichever registry you already operate. One system to secure, back up and pay for is better than two.

How it works in practice

Publishing to an OCI registry

With ECR, the flow looks like this. The chart version comes from Chart.yaml, and the push appends the chart name to the registry path:

aws ecr get-login-password --region eu-west-1 \
  | helm registry login --username AWS --password-stdin \
    123456789012.dkr.ecr.eu-west-1.amazonaws.com

helm package ./charts/payments-api
helm push payments-api-1.4.0.tgz \
  oci://123456789012.dkr.ecr.eu-west-1.amazonaws.com/charts

Here an ECR repository named charts/payments-api must exist. We create those with Terraform so naming and lifecycle rules are consistent, and tie the setup to your infrastructure as code.

CI that releases charts

A pipeline stage lints, packages and pushes only when Chart.yaml has a new version, and fails if the version already exists. In GitHub Actions the cloud login uses OIDC federation, so there are no stored access keys. The general pattern, and why it matters, is covered in our CI/CD best practices guide and under CI/CD pipeline services.

Consuming charts from the cluster

ArgoCD references the chart and an exact version in the Application source. Flux defines a HelmRepository with type: oci and a HelmRelease that pins the version:

apiVersion: source.toolkit.fluxcd.io/v1
kind: HelmRepository
metadata:
  name: internal-charts
  namespace: flux-system
spec:
  type: oci
  interval: 10m
  url: oci://123456789012.dkr.ecr.eu-west-1.amazonaws.com/charts
  provider: aws

Setting the provider to a cloud name lets Flux use the node or workload identity rather than a static secret. ArgoCD can obtain short-lived registry tokens too, though it commonly needs a small refresh mechanism for ECR because tokens expire after hours. We build that in and test it, since expired registry credentials are a classic cause of mysterious sync failures.

Governance and safety

Immutability and retention

Enable tag immutability on the registry so a published version can never be overwritten. A chart that changes under the same version is the single most confusing failure in Helm operations. Add lifecycle rules to keep a defined number of recent versions and everything referenced by a live environment.

Scanning and provenance

Rendered charts often reference images and sometimes bundle dependencies. We scan images in the pipeline and flag outdated chart dependencies. Where you need provenance, Cosign signs the OCI artefact and the cluster verifies it using an admission policy. This adds operational weight, so we recommend it for regulated environments or when third parties consume your charts.

Access control

Separate who can publish from who can pull. CI gets push rights to specific repositories; clusters get pull only; humans get read access for debugging. This lines up with the GitOps RBAC model.

Decisions and trade-offs

Chart in the application repository or its own. Keeping the chart with the code makes versioning together simple but couples release cycles. A shared library chart in its own repository suits many services. We pick per service shape.

Monorepo of charts versus one per chart. A single repository with chart-testing’s change detection works well up to a few dozen charts.

When not to bother. If one team deploys three internal charts to one cluster, git references pinned to a tag can work temporarily. Move to a registry when a second consumer or an audit requirement appears.

A worked example: releasing version 1.5.0

A developer changes the chart, bumps version in Chart.yaml to 1.5.0 and opens a pull request. CI lints and packages it, then runs a template check against a few values files. On merge, the pipeline pushes the package to the registry and tags the commit. A bot opens a pull request in the GitOps repository that moves staging to 1.5.0, and promotion continues from there. Nobody ran helm push by hand, and the registry shows exactly which pipeline produced each version.

Common failure modes

  • Overwritten versions. Fixed with immutability.
  • Expired registry tokens. Fixed with identity-based auth or scheduled refresh, and an alert.
  • Version bumps forgotten. CI blocks merges that change a chart without bumping its version.
  • Public by accident. Package visibility is verified in the setup and reviewed.
  • Floating dependencies. Chart dependencies use exact versions and a committed lock file.

Delivery and handover

The registry, naming scheme, publishing pipeline and cluster access are delivered as code in your repositories. A runbook covers releasing a chart, rolling back, rotating credentials and deleting versions safely. Your engineers publish a chart themselves before we hand it over.

How to tell it is working

Every deployed chart version can be traced to a pipeline run and a commit. Rollback is a one-line version change in git. Registry credential failures are rare, and when they occur an alert names them. If you want a second opinion on your setup, book a consultation.

References

How we deliver it

  1. 01

    Pick the storage

    We compare OCI in your existing registry, GitHub Packages and a traditional index-based repository against your cloud, tooling and compliance needs.

  2. 02

    Create and secure the registry

    Repositories, naming conventions, immutability settings and least-privilege access are configured.

  3. 03

    Automate publishing

    A CI job lints, packages, versions and pushes each chart on merge or tag, with identity from OIDC rather than stored keys.

  4. 04

    Configure consumption

    ArgoCD or Flux is given pull access, and charts are referenced by pinned version in the GitOps repository.

  5. 05

    Add lifecycle rules

    Retention, cleanup, vulnerability scanning on dependencies and optional signing are applied.

  6. 06

    Document the flow

    A short guide shows developers how to release a chart version and how to consume it.

Tools and technologies

HelmAmazon ECRAzure Container RegistryGitHub PackagesChartMuseumHarborCosignArgoCDFluxGitHub ActionsAzure DevOps

Frequently asked questions

Can I store Helm charts in ECR or ACR?
Yes. Both support OCI artefacts, and Helm can push and pull charts with helm push and helm pull using oci:// URLs. You authenticate with your cloud credentials. With ECR the repository must exist and match the chart name. This lets you keep charts beside your container images under the same access controls.
Is ChartMuseum still a good choice?
It still works, but OCI registries have become the mainstream approach and ChartMuseum has seen limited activity compared with the registries you probably already run. We recommend it mainly when you must serve a classic index.yaml repository to older tooling. For new setups we default to OCI.
How do ArgoCD and Flux pull charts from an OCI registry?
ArgoCD supports OCI sources for Helm charts, with registry credentials stored as a repository secret. Flux uses a HelmRepository of type oci or an OCIRepository, with a secret or cloud-native identity for authentication. In both, you pin an exact chart version in git so deployments are reproducible.
Should we use a public or private repository?
Private by default for charts containing internal structure or defaults. Public is fine for genuinely open-source charts you want others to consume. Even for private charts, avoid secrets inside them regardless of visibility, since anyone with pull access can read the packaged contents.
Do we need to sign Helm charts?
Not always. Signing with Cosign or Helm provenance gives consumers proof of origin and tamper detection, which matters in regulated or multi-party environments. For a single team publishing to its own cluster behind access control, strong registry permissions and immutable tags usually give most of the benefit with less overhead.

Talk to an engineer about helm chart repository setup

Book a free 30-minute call. We review your current setup and tell you honestly whether and how we can help.

Written by Saddique Khan, DevOps / SRE / Cloud Consultant Engineer. Last updated 2026-10-08.