Skip to main content

yaml2helm

Tests Python Version License: MIT Code style: ruff

Convert Kubernetes YAML manifests into Helm charts automatically.

Features

  • Multiple input formats: File, directory, stdin, or Kustomize with multi-document YAML support
  • Smart value extraction: Automatically extracts common fields (image, replicas, resources, etc.)
  • Resource-scoped values: Zero conflicts by organizing values per resource
  • CRD support: Separate CRDs into crds/ directory per Helm best practices
  • Namespace handling: Template namespaces or preserve originals
  • Name templating: Preserve original names or add release name prefix
  • Deterministic output: Stable ordering and idempotent reruns
  • JSON Schema generation: Optional values.schema.json for validation
  • Helm integration: Built-in helm lint and helm template validation
  • Kustomize support: Direct integration with kustomize build
  • Makefile generation: Optional Makefile with helm workflow targets
  • Enhanced helpers: Comprehensive _helpers.tpl with apiVersion helpers
  • Comprehensive reporting: Track conversions with detailed statistics

Installation

pip install -e .

For development:

pip install -e ".[dev]"

Usage

Basic conversion

yaml2helm --name myapp --in ./manifests --out ./charts

From stdin

kubectl get deployment nginx -o yaml | yaml2helm --name nginx --out ./charts

From Kustomize

yaml2helm --name myapp --kustomize ./overlays/production --out ./charts

With Makefile generation

yaml2helm --name myapp --in ./manifests --out ./charts --makefile

This creates a Makefile.helm with targets for building and managing your Helm chart:

make -f Makefile.helm help      # Show available targets
make -f Makefile.helm helm      # Generate chart
make -f Makefile.helm helm-lint # Lint the chart

With CRD separation

yaml2helm --name myapp --in ./manifests --out ./charts --crd-dir

This places CustomResourceDefinitions in crds/ directory per Helm best practices.

Preserve original namespaces

yaml2helm --name myapp --in ./manifests --out ./charts --preserve-ns

Keeps original namespaces instead of templating to {{ .Release.Namespace }}.

Add release name prefix

yaml2helm --name myapp --in ./manifests --out ./charts --prefix-release-name

Prefixes resource names with {{ include "myapp.fullname" . }}.

Advanced options

yaml2helm \
  --name myapp \
  --in ./manifests \
  --out ./charts \
  --resource-scoped \
  --crd-dir \
  --preserve-ns \
  --schema \
  --strict \
  --makefile

CLI Options

Option Description Default
--name, -n Chart name (required) -
--in, -i Input file/directory (stdin if omitted) stdin
--kustomize, -k Run kustomize build on directory -
--out, -o Output directory ./charts
--resource-scoped/--field-scoped Scope values to resources (recommended) true
--crd-dir Place CRDs in separate crds/ directory false
--preserve-ns Preserve original namespaces (don't template) false
--original-name/--prefix-release-name Preserve names or add release prefix true
--include-cluster Include cluster-specific fields false
--schema/--no-schema Generate values.schema.json true
--lint/--no-lint Run helm lint true
--template/--no-template Run helm template true
--strict Fail on helm errors false
--makefile Generate Makefile.helm false

Output Structure

charts/
└── myapp/
    ├── Chart.yaml
    ├── values.yaml
    ├── values.schema.json
    ├── README.md
    ├── .helmignore
    └── templates/
        ├── _helpers.tpl
        ├── NOTES.txt
        ├── 01-deployment-nginx.yaml
        └── 02-service-nginx.yaml

Extracted Values

yaml2helm automatically extracts and templates:

  • Image: repository and tag
  • Replicas: for Deployments, StatefulSets
  • Resources: CPU/memory limits and requests
  • Service: type and ports
  • Ingress: rules and TLS
  • Environment variables: from containers
  • Node affinity: nodeSelector, tolerations, affinity
  • HPA: min/max replicas and target CPU

Examples

Convert a deployment

# Input: deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 3
  template:
    spec:
      containers:
      - name: nginx
        image: nginx:1.19

# Run conversion
yaml2helm --name nginx --in deployment.yaml --out ./charts

# Output: charts/nginx/values.yaml
image:
  repository: nginx
  tag: "1.19"
replicas: 3

# Output: charts/nginx/templates/01-deployment-nginx.yaml (templated)
spec:
  replicas: {{ .Values.replicas }}
  template:
    spec:
      containers:
      - image: {{ .Values.image.repository }}:{{ .Values.image.tag }}

Multi-document YAML

# Input file with multiple resources separated by ---
yaml2helm --name myapp --in multi.yaml --out ./charts

Directory of manifests

# Convert all YAML files in a directory
yaml2helm --name myapp --in ./k8s-manifests --out ./charts

Testing

Run tests:

pytest tests/ -v

With coverage:

pytest tests/ --cov=yaml2helm --cov-report=term-missing

Algorithm

  1. Discovery: Find YAML files, split multi-docs, parse with ruamel.yaml
  2. Validation: Check for apiVersion, kind, metadata.name
  3. Normalization: Sort maps and lists for deterministic output
  4. Extraction: Extract values per heuristics, replace with Helm templates
  5. Writing: Generate template files as NN-<kind>-<name>.yaml
  6. Schema: Create values.schema.json from extracted values
  7. Validation: Run helm lint and helm template if available

Requirements

  • Python 3.11+
  • Optional: helm CLI for validation

Dependencies

  • typer: CLI framework
  • ruamel.yaml: YAML parsing with comments preservation
  • jinja2: Template rendering
  • jsonschema: Schema validation
  • rich: Terminal formatting

Development

# Install dev dependencies
pip install -e ".[dev]"

# Run tests
pytest

# Run with coverage
pytest --cov=yaml2helm

# Test with helm integration
yaml2helm --name demo --in tests/data/input --out /tmp/charts
helm lint /tmp/charts/demo
helm template test /tmp/charts/demo

License

MIT

Release files for yaml2helm 0.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for yaml2helm 0.1.0
File Size Uploaded
yaml2helm-0.1.0.tar.gz 27.7 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for yaml2helm 0.1.0
File Interpreter ABI Platform
yaml2helm-0.1.0-py3-none-any.whl Python 3 none any Details

Total release size: 57.1 kB

Release files / yaml2helm-0.1.0.tar.gz

Download URL yaml2helm-0.1.0.tar.gz
Size 27.7 kB
Tags Source
SHA-256 checksum
How to use checksums
7bbbc6a58f9dd8cda4ae7d50eaf0523d7c38452a47502bb2bac090f5984ec643
BLAKE2b-256 checksum
How to use checksums
edeb2c8e3e13011bab3d250dd4fa3213b13fed2a39aa25292eb02eaae4cffe0b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.13.7

Release files / yaml2helm-0.1.0-py3-none-any.whl

Download URL yaml2helm-0.1.0-py3-none-any.whl
Size 29.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
5c85c683fb719a4331cccab553d1df0de22868ffaa6cbd6370cc086257a3eab6
BLAKE2b-256 checksum
How to use checksums
dcb8d5bfdbb702030febff3d3889a9b57ad73b2efa1f98ecc70820bd1bd593d0
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.13.7

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page