Skip to content
Back to skills

Helm Charts

ASecurity

Design, structure, and test production-grade Helm charts with multi-environment overlays.

  • 19 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added October 19, 2026
ai-agentsgobashkubernetestestinggitapisecurity

Works with

  • cli
  • api

Security analysis

A100/100

Scanned October 19, 2026

npx -y skills add sawrus/agent-guides --skill helm-charts --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Helm Charts?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Helm Charts
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/sawrus-helm-charts/badge)](https://www.skillsdirectory.com/skills/sawrus-helm-charts)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: helm-charts
type: skill
description: Design, structure, and test production-grade Helm charts with multi-environment overlays.
related-rules:
  - workload-security.md
  - resource-governance.md
allowed-tools: Read, Write, Edit, Bash
---

# Skill: Helm Charts

> **Expertise:** Helm 3 chart structure, values hierarchy, multi-environment overlays, chart testing, ArgoCD integration.

## When to load

When creating a new Helm chart, reviewing an existing chart, setting up multi-env values, or integrating with ArgoCD.

## Chart Structure (Standard)

```
charts/my-service/
├── Chart.yaml
├── values.yaml            ← defaults (all envs inherit)
├── values-staging.yaml    ← staging overrides
├── values-prod.yaml       ← production overrides
├── templates/
│   ├── _helpers.tpl       ← named templates
│   ├── deployment.yaml
│   ├── service.yaml
│   ├── ingress.yaml
│   ├── hpa.yaml
│   ├── pdb.yaml
│   ├── serviceaccount.yaml
│   ├── networkpolicy.yaml
│   └── NOTES.txt
└── tests/
    └── test-connection.yaml
```

## values.yaml Conventions

```yaml
# Always provide a complete, renderable default set
replicaCount: 2

image:
  repository: registry.example.com/my-service
  tag: ""              # overridden by CI with digest
  digest: ""           # prefer digest over tag in prod
  pullPolicy: IfNotPresent

serviceAccount:
  create: true
  name: ""             # auto-generated from chart name if empty

resources:
  requests: { cpu: 100m, memory: 128Mi }
  limits:   { cpu: 500m, memory: 512Mi }

autoscaling:
  enabled: true
  minReplicas: 2
  maxReplicas: 10
  targetCPUUtilizationPercentage: 70

ingress:
  enabled: false
  className: nginx
  hosts: []
  tls: []

podDisruptionBudget:
  enabled: true
  minAvailable: 1
```

## _helpers.tpl Essentials

```yaml
{{/* Selector labels — must be stable across upgrades */}}
{{- define "app.selectorLabels" -}}
app.kubernetes.io/name: {{ include "app.name" . }}
app.kubernetes.io/instance: {{ .Release.Name }}
{{- end }}

{{/* Use digest when available, fall back to tag */}}
{{- define "app.image" -}}
{{- if .Values.image.digest -}}
{{ .Values.image.repository }}@{{ .Values.image.digest }}
{{- else -}}
{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}
{{- end -}}
{{- end }}
```

## Multi-Environment with ArgoCD

```yaml
# argocd/apps/my-service-prod.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: my-service-prod
  namespace: argocd
spec:
  project: production
  source:
    repoURL: https://git.example.com/infra/charts
    targetRevision: HEAD
    path: charts/my-service
    helm:
      valueFiles:
        - values.yaml
        - values-prod.yaml
  destination:
    server: https://kubernetes.default.svc
    namespace: my-service-prod
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
    syncOptions:
      - CreateNamespace=true
      - ServerSideApply=true
```

## Chart Testing

```bash
# Lint (catches YAML errors + best practice violations)
helm lint charts/my-service/ -f charts/my-service/values-prod.yaml

# Render and inspect (no cluster needed)
helm template my-service charts/my-service/ \
  -f charts/my-service/values-prod.yaml \
  --debug | kubectl apply --dry-run=client -f -

# Integration test with chart-testing (ct)
ct lint --chart-dirs charts/ --config ct.yaml
ct install --chart-dirs charts/ --config ct.yaml   # deploys to kind cluster
```

## Anti-Patterns

| Anti-pattern | Fix |
|:---|:---|
| `image.tag: latest` | Use content digest `image.digest: sha256:...` |
| Hardcoded namespace in templates | Use `.Release.Namespace` |
| All config in one values.yaml | Split by environment; prod values in separate file |
| No `resources` block | Always set requests + limits in values defaults |
| `helm install` without `--atomic` in CI | Use `--atomic --timeout 5m` for automatic rollback |

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.