Skip to main content
helm-chart-scaffolding Design, organize, and manage Helm charts for templating and packaging Kubernetes applications with reusable configurations. Use when creating Helm charts, packaging Kubernetes applications, or implementing templated deployments.
跳到安装 Skills Marketplace 发现并探索由社区构建的 Agent Skills
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/oimiragieo/agent-studio --skill helm-chart-scaffolding命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
下载 Zip 下载中... name helm-chart-scaffolding description Design, organize, and manage Helm charts for templating and packaging Kubernetes applications with reusable configurations. Use when creating Helm charts, packaging Kubernetes applications, or implementing templated deployments. version 1.0.0 model sonnet invoked_by ["devops"] tools ["Read","Write","Edit","Bash","Glob","Grep"] verified false lastVerifiedAt "2026-02-19T05:29:09.098Z" source builtin trust_score 100 provenance_sha e86dfc4613a714f3
Helm Chart Scaffolding
Comprehensive guidance for creating, organizing, and managing Helm charts for packaging and deploying Kubernetes applications.
Purpose
This skill provides step-by-step instructions for building production-ready Helm charts, including chart structure, templating patterns, values management, and validation strategies.
When to Use This Skill
Use this skill when you need to:
Create new Helm charts from scratch
Package Kubernetes applications for distribution
Manage multi-environment deployments with Helm
Implement templating for reusable Kubernetes manifests
Set up Helm chart repositories
Follow Helm best practices and conventions
Helm Overview
Helm is the package manager for Kubernetes that:
Templates Kubernetes manifests for reusability
Manages application releases and rollbacks
Handles dependencies between charts
Provides version control for deployments
Simplifies configuration management across environments
Step-by-Step Workflow
1. Initialize Chart Structure
Create new chart:
helm create my-app
Standard chart structure:
my-app/
├── Chart.yaml # Chart metadata
├── values.yaml # Default configuration values
├── charts/ # Chart dependencies
├── templates/ # Kubernetes manifest templates
│ ├── NOTES.txt # Post-install notes
│ ├── _helpers.tpl # Template helpers
│ ├── deployment.yaml
│ ├── service.yaml
│ ├── ingress.yaml
│ ├── serviceaccount.yaml
│ ├── hpa.yaml
│ └── tests/
│ └── test-connection.yaml
└── .helmignore # Files to ignore
2. Configure Chart.yaml
Chart metadata defines the package:
apiVersion: v2
name: my-app
description: A Helm chart for My Application
type: application
version:
1.0
.0
appVersion:
'2.1.0'
keywords:
-
web
-
api
-
backend
maintainers:
-
name:
DevOps
Team
email:
devops@example.com
url:
https://github.com/example/my-app
sources:
-
https://github.com/example/my-app
home:
https://example.com
icon:
https://example.com/icon.png
dependencies:
-
name:
postgresql
version:
'12.0.0'
repository:
'https://charts.bitnami.com/bitnami'
condition:
postgresql.enabled
-
name:
redis
version:
'17.0.0'
repository:
'https://charts.bitnami.com/bitnami'
condition:
redis.enabled
Reference: See assets/Chart.yaml.template for complete example
3. Design values.yaml Structure Organize values hierarchically:
image:
repository: myapp
tag: '1.0.0'
pullPolicy: IfNotPresent
replicaCount: 3
service:
type: ClusterIP
port: 80
targetPort: 8080
ingress:
enabled: false
className: nginx
hosts:
- host: app.example.com
paths:
- path: /
pathType: Prefix
resources:
requests:
memory: '256Mi'
cpu: '250m'
limits:
memory: '512Mi'
cpu: '500m'
autoscaling:
enabled: false
minReplicas: 2
maxReplicas: 10
targetCPUUtilizationPercentage: 80
env:
- name: LOG_LEVEL
value: 'info'
configMap:
data:
APP_MODE: production
postgresql:
enabled: true
auth:
database: myapp
username: myapp
redis:
enabled: false
Reference: See assets/values.yaml.template for complete structure
4. Create Template Files Use Go templating with Helm functions:
templates/deployment.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ include "my-app.fullname" . }}
labels:
{{- include "my-app.labels" . | nindent 4 }}
spec:
{{- if not .Values.autoscaling.enabled }}
replicas: {{ .Values.replicaCount }}
{{- end }}
selector:
matchLabels:
{{- include "my-app.selectorLabels" . | nindent 6 }}
template:
metadata:
labels:
{{- include "my-app.selectorLabels" . | nindent 8 }}
spec:
containers:
- name: {{ .Chart.Name }}
image: "{{ .Values.image.repository }} :{{ .Values.image.tag | default .Chart.AppVersion }} "
imagePullPolicy: {{ .Values.image.pullPolicy }}
ports:
- name: http
containerPort: {{ .Values.service.targetPort }}
resources:
{{- toYaml .Values.resources | nindent 12 }}
env:
{{- toYaml .Values.env | nindent 12 }}
5. Create Template Helpers {{/*
Expand the name of the chart.
*/ }}
{{- define "my-app.name" - }}
{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }}
{{- end }}
{{/*
Create a default fully qualified app name.
*/ }}
{{- define "my-app.fullname" - }}
{{- if .Values.fullnameOverride }}
{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }}
{{- else }}
{{- $name := default .Chart.Name .Values.nameOverride }}
{{- if contains $name .Release.Name }}
{{- .Release.Name | trunc 63 | trimSuffix "-" }}
{{- else }}
{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }}
{{- end }}
{{- end }}
{{- end }}
{{/*
Common labels
*/ }}
{{- define "my-app.labels" - }}
helm.sh/chart: {{ include "my-app.chart" . }}
{{ include "my-app.selectorLabels" . }}
{{- if .Chart.AppVersion }}
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
{{- end }}
app.kubernetes.io/managed-by: {{ .Release.Service }}
{{- end }}
{{/*
Selector labels
*/ }}
{{- define "my-app.selectorLabels" - }}
app.kubernetes.io/name: {{ include "my-app.name" . }}
app.kubernetes.io/instance: {{ .Release.Name }}
{{- end }}
6. Manage Dependencies Add dependencies in Chart.yaml:
dependencies:
- name: postgresql
version: '12.0.0'
repository: 'https://charts.bitnami.com/bitnami'
condition: postgresql.enabled
helm dependency update
helm dependency build
Override dependency values:
postgresql:
enabled: true
auth:
database: myapp
username: myapp
password: changeme
primary:
persistence:
enabled: true
size: 10Gi
7. Test and Validate
helm lint my-app/
helm install my-app ./my-app --dry-run --debug
helm template my-app ./my-app
helm template my-app ./my-app -f values-prod.yaml
helm show values ./my-app
#!/bin/bash
set -e
echo "Linting chart..."
helm lint .
echo "Testing template rendering..."
helm template test-release . --dry-run
echo "Checking for required values..."
helm template test-release . --validate
echo "All validations passed!"
Reference: See scripts/validate-chart.sh
8. Package and Distribute
helm repo index .
aws s3 sync . s3://my-helm-charts/ --exclude "*" --include "*.tgz" --include "index.yaml"
helm repo add my-repo https://charts.example.com
helm repo update
helm install my-app my-repo/my-app
9. Multi-Environment Configuration Environment-specific values files:
my-app/
├── values.yaml # Defaults
├── values-dev.yaml # Development
├── values-staging.yaml # Staging
└── values-prod.yaml # Production
replicaCount: 5
image:
tag: '2.1.0'
resources:
requests:
memory: '512Mi'
cpu: '500m'
limits:
memory: '1Gi'
cpu: '1000m'
autoscaling:
enabled: true
minReplicas: 3
maxReplicas: 20
ingress:
enabled: true
hosts:
- host: app.example.com
paths:
- path: /
pathType: Prefix
postgresql:
enabled: true
primary:
persistence:
size: 100Gi
Install with environment:
helm install my-app ./my-app -f values-prod.yaml --namespace production
10. Implement Hooks and Tests
apiVersion: batch/v1
kind: Job
metadata:
name: {{ include "my-app.fullname" . }}-db-setup
annotations:
"helm.sh/hook": pre-install
"helm.sh/hook-weight": "-5"
"helm.sh/hook-delete-policy": hook-succeeded
spec:
template:
spec:
containers:
- name: db-setup
image: postgres:15
command: ["psql" , "-c" , "CREATE DATABASE myapp" ]
restartPolicy: Never
apiVersion: v1
kind: Pod
metadata:
name: "{{ include "my-app.fullname" . }} -test-connection"
annotations:
"helm.sh/hook": test
spec:
containers:
- name: wget
image: busybox
command: ['wget' ]
args: ['{{ include "my-app.fullname" . }}:{{ .Values.service.port }}' ]
restartPolicy: Never
Common Patterns
Pattern 1: Conditional Resources {{- if .Values.ingress.enabled }}
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: {{ include "my-app.fullname" . }}
spec:
{{- end }}
Pattern 2: Iterating Over Lists env:
{{- range .Values.env }}
- name: {{ .name }}
value: {{ .value | quote }}
{{- end }}
Pattern 3: Including Files data:
config.yaml: |
{{- .Files.Get "config/application.yaml" | nindent 4 }}
Pattern 4: Global Values global:
imageRegistry: docker.io
imagePullSecrets:
- name: regcred
image: {{ .Values.global.imageRegistry }}/{{ .Values.image.repository }}
Best Practices
Use semantic versioning for chart and app versions
Document all values in values.yaml with comments
Use template helpers for repeated logic
Validate charts before packaging
Pin dependency versions explicitly
Use conditions for optional resources
Follow naming conventions (lowercase, hyphens)
Include NOTES.txt with usage instructions
Add labels consistently using helpers
Test installations in all environments
Troubleshooting Template rendering errors:
helm template my-app ./my-app --debug
helm dependency update
helm dependency list
helm install my-app ./my-app --dry-run --debug
kubectl get events --sort-by='.lastTimestamp'
Reference Files
assets/Chart.yaml.template - Chart metadata template
assets/values.yaml.template - Values structure template
scripts/validate-chart.sh - Validation script
references/chart-structure.md - Detailed chart organization
Related Skills
k8s-manifest-generator - For creating base Kubernetes manifests
gitops-workflow - For automated Helm chart deployments
Memory Protocol (MANDATORY) cat C:\dev\projects\agent-studio\.claude\context\memory\learnings.md
New pattern -> C:\dev\projects\agent-studio\.claude\context\memory\learnings.md
Issue found -> C:\dev\projects\agent-studio\.claude\context\memory\issues.md
Decision made -> C:\dev\projects\agent-studio\.claude\context\memory\decisions.md
ASSUME INTERRUPTION: If it's not in memory, it didn't happen.