A pure Python 3 (stdlib only) linter and validator for Helm chart directories. Checks structure, security, dependencies, and best practices across 22 rules.
text
python3 scripts/helm_chart_linter.py <command> <chart-dir> [options]
CommandDescriptionlintLint chart structure and best practices (all rules)securityRun security-focused checks onlydependenciesValidate Chart.yaml/Chart.lock dependenciesvalidateFull validation: structure + security + dependencies
OptionDescription--format text|json|markdownOutput format (default: text)--strictExit 1 on warnings as well as errors (CI mode)
bash
# Basic lint
python3 scripts/helm_chart_linter.py lint ./my-chart
# Full validation with JSON output
python3 scripts/helm_chart_linter.py validate ./my-chart --format json
# Security audit, strict mode for CI
python3 scripts/helm_chart_linter.py security ./my-chart --strict
# Dependency check with Markdown report
python3 scripts/helm_chart_linter.py dependencies ./my-chart --format markdown
CHART001 — Chart.yaml exists and has required fields (apiVersion, name, version, description)CHART002 — Version is valid semverCHART003 — values.yaml existsCHART004 — templates/ directory existsCHART005 — NOTES.txt exists in templates/ (warning)CHART006 — .helmignore exists (warning)SEC001 — No hardcoded secrets in values.yaml (passwords, tokens, keys)SEC002 — No privileged containers (securityContext.privileged: true)SEC003 — No hostNetwork, hostPID, or hostIPC enabledSEC004 — Resource limits defined in templatesSEC005 — No runAsRoot without explicit runAsNonRootSEC006 — Image tags not "latest"DEP001 — Chart.lock present and matches Chart.yaml dependenciesDEP002 — No wildcard version constraintsDEP003 — Repository URLs use HTTPSDEP004 — No duplicate dependency namesBP001 — Labels include app.kubernetes.io/name, version, managed-byBP002 — Liveness and readiness probes definedBP003 — Service account name configuredBP004 — Namespace not hardcoded in templatesBP005 — No deprecated API versions (extensions/v1beta1, apps/v1beta1, etc.)BP006 — Values documented with commentsCodeMeaning0No issues (or only warnings in normal mode)1Errors found (or warnings found in --strict)2Script/usage error