[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6F1EC3S2CK0ZQ8NFM9DXCPS":3,"skill-same:01M6F1EC3S2CK0ZQ8NFM9DXCPS":104},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":34,"publishedAt":50,"linkOnly":51,"markdownContent":52,"markdownBody":53,"frontMatter":54,"refName":55,"commitSha":56,"skillDirectory":57,"forksCount":58,"repositoryHtmlUrl":59,"repositoryHomepageUrl":60,"ownerHtmlUrl":61,"ownerBlogUrl":6,"ownerDescription":62,"updatedAt":63,"install":64,"resources":77},"01M6F1EC3S2CK0ZQ8NFM9DXCPS","helm-chart-scaffolding",null,"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.","ComeOnOliver\u002Fskillshub","ComeOnOliver","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F43215937?v=4","01M6E5JNFECJAAVFE0W7SMWWD2","Haoran Shu","01M6E5JNNDQS7AJZDYFQ8TPZCK",67,"MIT","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fwshobson\u002Fhelm-chart-scaffolding\u002FSKILL.md",[18,23,26,29],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000013","分析与可视化","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000015","视觉设计",{"categoryNo":27,"categoryName":28,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",{"categoryNo":30,"categoryName":31,"taxonomyType":32,"taxonomyTypeDesc":33},"01JBSEEDCAT000000000000033","数据分析师","PROFESSION","适用职业",[35,36,37,38,39,40,41,42,43,44,45,46,47,48,49],"helm chart scaffolding","helm","scaffolding","chart","design","kubernetes","applications","Charts","packaging","use","deployments","reusable","manage","organize","with","2026-11-10 10:12:30",false,"---\nname: helm-chart-scaffolding\ndescription: 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.\n---\n\n# Helm Chart Scaffolding\n\nComprehensive guidance for creating, organizing, and managing Helm charts for packaging and deploying Kubernetes applications.\n\n## Purpose\n\nThis skill provides step-by-step instructions for building production-ready Helm charts, including chart structure, templating patterns, values management, and validation strategies.\n\n## When to Use This Skill\n\nUse this skill when you need to:\n- Create new Helm charts from scratch\n- Package Kubernetes applications for distribution\n- Manage multi-environment deployments with Helm\n- Implement templating for reusable Kubernetes manifests\n- Set up Helm chart repositories\n- Follow Helm best practices and conventions\n\n## Helm Overview\n\n**Helm** is the package manager for Kubernetes that:\n- Templates Kubernetes manifests for reusability\n- Manages application releases and rollbacks\n- Handles dependencies between charts\n- Provides version control for deployments\n- Simplifies configuration management across environments\n\n## Step-by-Step Workflow\n\n### 1. Initialize Chart Structure\n\n**Create new chart:**\n```bash\nhelm create my-app\n```\n\n**Standard chart structure:**\n```\nmy-app\u002F\n├── Chart.yaml           # Chart metadata\n├── values.yaml          # Default configuration values\n├── charts\u002F              # Chart dependencies\n├── templates\u002F           # Kubernetes manifest templates\n│   ├── NOTES.txt       # Post-install notes\n│   ├── _helpers.tpl    # Template helpers\n│   ├── deployment.yaml\n│   ├── service.yaml\n│   ├── ingress.yaml\n│   ├── serviceaccount.yaml\n│   ├── hpa.yaml\n│   └── tests\u002F\n│       └── test-connection.yaml\n└── .helmignore         # Files to ignore\n```\n\n### 2. Configure Chart.yaml\n\n**Chart metadata defines the package:**\n\n```yaml\napiVersion: v2\nname: my-app\ndescription: A Helm chart for My Application\ntype: application\nversion: 1.0.0      # Chart version\nappVersion: \"2.1.0\" # Application version\n\n# Keywords for chart discovery\nkeywords:\n  - web\n  - api\n  - backend\n\n# Maintainer information\nmaintainers:\n  - name: DevOps Team\n    email: devops@example.com\n    url: https:\u002F\u002Fgithub.com\u002Fexample\u002Fmy-app\n\n# Source code repository\nsources:\n  - https:\u002F\u002Fgithub.com\u002Fexample\u002Fmy-app\n\n# Homepage\nhome: https:\u002F\u002Fexample.com\n\n# Chart icon\nicon: https:\u002F\u002Fexample.com\u002Ficon.png\n\n# Dependencies\ndependencies:\n  - name: postgresql\n    version: \"12.0.0\"\n    repository: \"https:\u002F\u002Fcharts.bitnami.com\u002Fbitnami\"\n    condition: postgresql.enabled\n  - name: redis\n    version: \"17.0.0\"\n    repository: \"https:\u002F\u002Fcharts.bitnami.com\u002Fbitnami\"\n    condition: redis.enabled\n```\n\n**Reference:** See `assets\u002FChart.yaml.template` for complete example\n\n### 3. Design values.yaml Structure\n\n**Organize values hierarchically:**\n\n```yaml\n# Image configuration\nimage:\n  repository: myapp\n  tag: \"1.0.0\"\n  pullPolicy: IfNotPresent\n\n# Number of replicas\nreplicaCount: 3\n\n# Service configuration\nservice:\n  type: ClusterIP\n  port: 80\n  targetPort: 8080\n\n# Ingress configuration\ningress:\n  enabled: false\n  className: nginx\n  hosts:\n    - host: app.example.com\n      paths:\n        - path: \u002F\n          pathType: Prefix\n\n# Resources\nresources:\n  requests:\n    memory: \"256Mi\"\n    cpu: \"250m\"\n  limits:\n    memory: \"512Mi\"\n    cpu: \"500m\"\n\n# Autoscaling\nautoscaling:\n  enabled: false\n  minReplicas: 2\n  maxReplicas: 10\n  targetCPUUtilizationPercentage: 80\n\n# Environment variables\nenv:\n  - name: LOG_LEVEL\n    value: \"info\"\n\n# ConfigMap data\nconfigMap:\n  data:\n    APP_MODE: production\n\n# Dependencies\npostgresql:\n  enabled: true\n  auth:\n    database: myapp\n    username: myapp\n\nredis:\n  enabled: false\n```\n\n**Reference:** See `assets\u002Fvalues.yaml.template` for complete structure\n\n### 4. Create Template Files\n\n**Use Go templating with Helm functions:**\n\n**templates\u002Fdeployment.yaml:**\n```yaml\napiVersion: apps\u002Fv1\nkind: Deployment\nmetadata:\n  name: {{ include \"my-app.fullname\" . }}\n  labels:\n    {{- include \"my-app.labels\" . | nindent 4 }}\nspec:\n  {{- if not .Values.autoscaling.enabled }}\n  replicas: {{ .Values.replicaCount }}\n  {{- end }}\n  selector:\n    matchLabels:\n      {{- include \"my-app.selectorLabels\" . | nindent 6 }}\n  template:\n    metadata:\n      labels:\n        {{- include \"my-app.selectorLabels\" . | nindent 8 }}\n    spec:\n      containers:\n      - name: {{ .Chart.Name }}\n        image: \"{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}\"\n        imagePullPolicy: {{ .Values.image.pullPolicy }}\n        ports:\n        - name: http\n          containerPort: {{ .Values.service.targetPort }}\n        resources:\n          {{- toYaml .Values.resources | nindent 12 }}\n        env:\n          {{- toYaml .Values.env | nindent 12 }}\n```\n\n### 5. Create Template Helpers\n\n**templates\u002F_helpers.tpl:**\n```yaml\n{{\u002F*\nExpand the name of the chart.\n*\u002F}}\n{{- define \"my-app.name\" -}}\n{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix \"-\" }}\n{{- end }}\n\n{{\u002F*\nCreate a default fully qualified app name.\n*\u002F}}\n{{- define \"my-app.fullname\" -}}\n{{- if .Values.fullnameOverride }}\n{{- .Values.fullnameOverride | trunc 63 | trimSuffix \"-\" }}\n{{- else }}\n{{- $name := default .Chart.Name .Values.nameOverride }}\n{{- if contains $name .Release.Name }}\n{{- .Release.Name | trunc 63 | trimSuffix \"-\" }}\n{{- else }}\n{{- printf \"%s-%s\" .Release.Name $name | trunc 63 | trimSuffix \"-\" }}\n{{- end }}\n{{- end }}\n{{- end }}\n\n{{\u002F*\nCommon labels\n*\u002F}}\n{{- define \"my-app.labels\" -}}\nhelm.sh\u002Fchart: {{ include \"my-app.chart\" . }}\n{{ include \"my-app.selectorLabels\" . }}\n{{- if .Chart.AppVersion }}\napp.kubernetes.io\u002Fversion: {{ .Chart.AppVersion | quote }}\n{{- end }}\napp.kubernetes.io\u002Fmanaged-by: {{ .Release.Service }}\n{{- end }}\n\n{{\u002F*\nSelector labels\n*\u002F}}\n{{- define \"my-app.selectorLabels\" -}}\napp.kubernetes.io\u002Fname: {{ include \"my-app.name\" . }}\napp.kubernetes.io\u002Finstance: {{ .Release.Name }}\n{{- end }}\n```\n\n### 6. Manage Dependencies\n\n**Add dependencies in Chart.yaml:**\n```yaml\ndependencies:\n  - name: postgresql\n    version: \"12.0.0\"\n    repository: \"https:\u002F\u002Fcharts.bitnami.com\u002Fbitnami\"\n    condition: postgresql.enabled\n```\n\n**Update dependencies:**\n```bash\nhelm dependency update\nhelm dependency build\n```\n\n**Override dependency values:**\n```yaml\n# values.yaml\npostgresql:\n  enabled: true\n  auth:\n    database: myapp\n    username: myapp\n    password: changeme\n  primary:\n    persistence:\n      enabled: true\n      size: 10Gi\n```\n\n### 7. Test and Validate\n\n**Validation commands:**\n```bash\n# Lint the chart\nhelm lint my-app\u002F\n\n# Dry-run installation\nhelm install my-app .\u002Fmy-app --dry-run --debug\n\n# Template rendering\nhelm template my-app .\u002Fmy-app\n\n# Template with values\nhelm template my-app .\u002Fmy-app -f values-prod.yaml\n\n# Show computed values\nhelm show values .\u002Fmy-app\n```\n\n**Validation script:**\n```bash\n#!\u002Fbin\u002Fbash\nset -e\n\necho \"Linting chart...\"\nhelm lint .\n\necho \"Testing template rendering...\"\nhelm template test-release . --dry-run\n\necho \"Checking for required values...\"\nhelm template test-release . --validate\n\necho \"All validations passed!\"\n```\n\n**Reference:** See `scripts\u002Fvalidate-chart.sh`\n\n### 8. Package and Distribute\n\n**Package the chart:**\n```bash\nhelm package my-app\u002F\n# Creates: my-app-1.0.0.tgz\n```\n\n**Create chart repository:**\n```bash\n# Create index\nhelm repo index .\n\n# Upload to repository\n# AWS S3 example\naws s3 sync . s3:\u002F\u002Fmy-helm-charts\u002F --exclude \"*\" --include \"*.tgz\" --include \"index.yaml\"\n```\n\n**Use the chart:**\n```bash\nhelm repo add my-repo https:\u002F\u002Fcharts.example.com\nhelm repo update\nhelm install my-app my-repo\u002Fmy-app\n```\n\n### 9. Multi-Environment Configuration\n\n**Environment-specific values files:**\n\n```\nmy-app\u002F\n├── values.yaml          # Defaults\n├── values-dev.yaml      # Development\n├── values-staging.yaml  # Staging\n└── values-prod.yaml     # Production\n```\n\n**values-prod.yaml:**\n```yaml\nreplicaCount: 5\n\nimage:\n  tag: \"2.1.0\"\n\nresources:\n  requests:\n    memory: \"512Mi\"\n    cpu: \"500m\"\n  limits:\n    memory: \"1Gi\"\n    cpu: \"1000m\"\n\nautoscaling:\n  enabled: true\n  minReplicas: 3\n  maxReplicas: 20\n\ningress:\n  enabled: true\n  hosts:\n    - host: app.example.com\n      paths:\n        - path: \u002F\n          pathType: Prefix\n\npostgresql:\n  enabled: true\n  primary:\n    persistence:\n      size: 100Gi\n```\n\n**Install with environment:**\n```bash\nhelm install my-app .\u002Fmy-app -f values-prod.yaml --namespace production\n```\n\n### 10. Implement Hooks and Tests\n\n**Pre-install hook:**\n```yaml\n# templates\u002Fpre-install-job.yaml\napiVersion: batch\u002Fv1\nkind: Job\nmetadata:\n  name: {{ include \"my-app.fullname\" . }}-db-setup\n  annotations:\n    \"helm.sh\u002Fhook\": pre-install\n    \"helm.sh\u002Fhook-weight\": \"-5\"\n    \"helm.sh\u002Fhook-delete-policy\": hook-succeeded\nspec:\n  template:\n    spec:\n      containers:\n      - name: db-setup\n        image: postgres:15\n        command: [\"psql\", \"-c\", \"CREATE DATABASE myapp\"]\n      restartPolicy: Never\n```\n\n**Test connection:**\n```yaml\n# templates\u002Ftests\u002Ftest-connection.yaml\napiVersion: v1\nkind: Pod\nmetadata:\n  name: \"{{ include \"my-app.fullname\" . }}-test-connection\"\n  annotations:\n    \"helm.sh\u002Fhook\": test\nspec:\n  containers:\n  - name: wget\n    image: busybox\n    command: ['wget']\n    args: ['{{ include \"my-app.fullname\" . }}:{{ .Values.service.port }}']\n  restartPolicy: Never\n```\n\n**Run tests:**\n```bash\nhelm test my-app\n```\n\n## Common Patterns\n\n### Pattern 1: Conditional Resources\n\n```yaml\n{{- if .Values.ingress.enabled }}\napiVersion: networking.k8s.io\u002Fv1\nkind: Ingress\nmetadata:\n  name: {{ include \"my-app.fullname\" . }}\nspec:\n  # ...\n{{- end }}\n```\n\n### Pattern 2: Iterating Over Lists\n\n```yaml\nenv:\n{{- range .Values.env }}\n- name: {{ .name }}\n  value: {{ .value | quote }}\n{{- end }}\n```\n\n### Pattern 3: Including Files\n\n```yaml\ndata:\n  config.yaml: |\n    {{- .Files.Get \"config\u002Fapplication.yaml\" | nindent 4 }}\n```\n\n### Pattern 4: Global Values\n\n```yaml\nglobal:\n  imageRegistry: docker.io\n  imagePullSecrets:\n    - name: regcred\n\n# Use in templates:\nimage: {{ .Values.global.imageRegistry }}\u002F{{ .Values.image.repository }}\n```\n\n## Best Practices\n\n1. **Use semantic versioning** for chart and app versions\n2. **Document all values** in values.yaml with comments\n3. **Use template helpers** for repeated logic\n4. **Validate charts** before packaging\n5. **Pin dependency versions** explicitly\n6. **Use conditions** for optional resources\n7. **Follow naming conventions** (lowercase, hyphens)\n8. **Include NOTES.txt** with usage instructions\n9. **Add labels** consistently using helpers\n10. **Test installations** in all environments\n\n## Troubleshooting\n\n**Template rendering errors:**\n```bash\nhelm template my-app .\u002Fmy-app --debug\n```\n\n**Dependency issues:**\n```bash\nhelm dependency update\nhelm dependency list\n```\n\n**Installation failures:**\n```bash\nhelm install my-app .\u002Fmy-app --dry-run --debug\nkubectl get events --sort-by='.lastTimestamp'\n```\n\n## Reference Files\n\n- `assets\u002FChart.yaml.template` - Chart metadata template\n- `assets\u002Fvalues.yaml.template` - Values structure template\n- `scripts\u002Fvalidate-chart.sh` - Validation script\n- `references\u002Fchart-structure.md` - Detailed chart organization\n\n## Related Skills\n\n- `k8s-manifest-generator` - For creating base Kubernetes manifests\n- `gitops-workflow` - For automated Helm chart deployments\n","# Helm Chart Scaffolding\n\nComprehensive guidance for creating, organizing, and managing Helm charts for packaging and deploying Kubernetes applications.\n\n## Purpose\n\nThis skill provides step-by-step instructions for building production-ready Helm charts, including chart structure, templating patterns, values management, and validation strategies.\n\n## When to Use This Skill\n\nUse this skill when you need to:\n- Create new Helm charts from scratch\n- Package Kubernetes applications for distribution\n- Manage multi-environment deployments with Helm\n- Implement templating for reusable Kubernetes manifests\n- Set up Helm chart repositories\n- Follow Helm best practices and conventions\n\n## Helm Overview\n\n**Helm** is the package manager for Kubernetes that:\n- Templates Kubernetes manifests for reusability\n- Manages application releases and rollbacks\n- Handles dependencies between charts\n- Provides version control for deployments\n- Simplifies configuration management across environments\n\n## Step-by-Step Workflow\n\n### 1. Initialize Chart Structure\n\n**Create new chart:**\n```bash\nhelm create my-app\n```\n\n**Standard chart structure:**\n```\nmy-app\u002F\n├── Chart.yaml           # Chart metadata\n├── values.yaml          # Default configuration values\n├── charts\u002F              # Chart dependencies\n├── templates\u002F           # Kubernetes manifest templates\n│   ├── NOTES.txt       # Post-install notes\n│   ├── _helpers.tpl    # Template helpers\n│   ├── deployment.yaml\n│   ├── service.yaml\n│   ├── ingress.yaml\n│   ├── serviceaccount.yaml\n│   ├── hpa.yaml\n│   └── tests\u002F\n│       └── test-connection.yaml\n└── .helmignore         # Files to ignore\n```\n\n### 2. Configure Chart.yaml\n\n**Chart metadata defines the package:**\n\n```yaml\napiVersion: v2\nname: my-app\ndescription: A Helm chart for My Application\ntype: application\nversion: 1.0.0      # Chart version\nappVersion: \"2.1.0\" # Application version\n\n# Keywords for chart discovery\nkeywords:\n  - web\n  - api\n  - backend\n\n# Maintainer information\nmaintainers:\n  - name: DevOps Team\n    email: devops@example.com\n    url: https:\u002F\u002Fgithub.com\u002Fexample\u002Fmy-app\n\n# Source code repository\nsources:\n  - https:\u002F\u002Fgithub.com\u002Fexample\u002Fmy-app\n\n# Homepage\nhome: https:\u002F\u002Fexample.com\n\n# Chart icon\nicon: https:\u002F\u002Fexample.com\u002Ficon.png\n\n# Dependencies\ndependencies:\n  - name: postgresql\n    version: \"12.0.0\"\n    repository: \"https:\u002F\u002Fcharts.bitnami.com\u002Fbitnami\"\n    condition: postgresql.enabled\n  - name: redis\n    version: \"17.0.0\"\n    repository: \"https:\u002F\u002Fcharts.bitnami.com\u002Fbitnami\"\n    condition: redis.enabled\n```\n\n**Reference:** See `assets\u002FChart.yaml.template` for complete example\n\n### 3. Design values.yaml Structure\n\n**Organize values hierarchically:**\n\n```yaml\n# Image configuration\nimage:\n  repository: myapp\n  tag: \"1.0.0\"\n  pullPolicy: IfNotPresent\n\n# Number of replicas\nreplicaCount: 3\n\n# Service configuration\nservice:\n  type: ClusterIP\n  port: 80\n  targetPort: 8080\n\n# Ingress configuration\ningress:\n  enabled: false\n  className: nginx\n  hosts:\n    - host: app.example.com\n      paths:\n        - path: \u002F\n          pathType: Prefix\n\n# Resources\nresources:\n  requests:\n    memory: \"256Mi\"\n    cpu: \"250m\"\n  limits:\n    memory: \"512Mi\"\n    cpu: \"500m\"\n\n# Autoscaling\nautoscaling:\n  enabled: false\n  minReplicas: 2\n  maxReplicas: 10\n  targetCPUUtilizationPercentage: 80\n\n# Environment variables\nenv:\n  - name: LOG_LEVEL\n    value: \"info\"\n\n# ConfigMap data\nconfigMap:\n  data:\n    APP_MODE: production\n\n# Dependencies\npostgresql:\n  enabled: true\n  auth:\n    database: myapp\n    username: myapp\n\nredis:\n  enabled: false\n```\n\n**Reference:** See `assets\u002Fvalues.yaml.template` for complete structure\n\n### 4. Create Template Files\n\n**Use Go templating with Helm functions:**\n\n**templates\u002Fdeployment.yaml:**\n```yaml\napiVersion: apps\u002Fv1\nkind: Deployment\nmetadata:\n  name: {{ include \"my-app.fullname\" . }}\n  labels:\n    {{- include \"my-app.labels\" . | nindent 4 }}\nspec:\n  {{- if not .Values.autoscaling.enabled }}\n  replicas: {{ .Values.replicaCount }}\n  {{- end }}\n  selector:\n    matchLabels:\n      {{- include \"my-app.selectorLabels\" . | nindent 6 }}\n  template:\n    metadata:\n      labels:\n        {{- include \"my-app.selectorLabels\" . | nindent 8 }}\n    spec:\n      containers:\n      - name: {{ .Chart.Name }}\n        image: \"{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}\"\n        imagePullPolicy: {{ .Values.image.pullPolicy }}\n        ports:\n        - name: http\n          containerPort: {{ .Values.service.targetPort }}\n        resources:\n          {{- toYaml .Values.resources | nindent 12 }}\n        env:\n          {{- toYaml .Values.env | nindent 12 }}\n```\n\n### 5. Create Template Helpers\n\n**templates\u002F_helpers.tpl:**\n```yaml\n{{\u002F*\nExpand the name of the chart.\n*\u002F}}\n{{- define \"my-app.name\" -}}\n{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix \"-\" }}\n{{- end }}\n\n{{\u002F*\nCreate a default fully qualified app name.\n*\u002F}}\n{{- define \"my-app.fullname\" -}}\n{{- if .Values.fullnameOverride }}\n{{- .Values.fullnameOverride | trunc 63 | trimSuffix \"-\" }}\n{{- else }}\n{{- $name := default .Chart.Name .Values.nameOverride }}\n{{- if contains $name .Release.Name }}\n{{- .Release.Name | trunc 63 | trimSuffix \"-\" }}\n{{- else }}\n{{- printf \"%s-%s\" .Release.Name $name | trunc 63 | trimSuffix \"-\" }}\n{{- end }}\n{{- end }}\n{{- end }}\n\n{{\u002F*\nCommon labels\n*\u002F}}\n{{- define \"my-app.labels\" -}}\nhelm.sh\u002Fchart: {{ include \"my-app.chart\" . }}\n{{ include \"my-app.selectorLabels\" . }}\n{{- if .Chart.AppVersion }}\napp.kubernetes.io\u002Fversion: {{ .Chart.AppVersion | quote }}\n{{- end }}\napp.kubernetes.io\u002Fmanaged-by: {{ .Release.Service }}\n{{- end }}\n\n{{\u002F*\nSelector labels\n*\u002F}}\n{{- define \"my-app.selectorLabels\" -}}\napp.kubernetes.io\u002Fname: {{ include \"my-app.name\" . }}\napp.kubernetes.io\u002Finstance: {{ .Release.Name }}\n{{- end }}\n```\n\n### 6. Manage Dependencies\n\n**Add dependencies in Chart.yaml:**\n```yaml\ndependencies:\n  - name: postgresql\n    version: \"12.0.0\"\n    repository: \"https:\u002F\u002Fcharts.bitnami.com\u002Fbitnami\"\n    condition: postgresql.enabled\n```\n\n**Update dependencies:**\n```bash\nhelm dependency update\nhelm dependency build\n```\n\n**Override dependency values:**\n```yaml\n# values.yaml\npostgresql:\n  enabled: true\n  auth:\n    database: myapp\n    username: myapp\n    password: changeme\n  primary:\n    persistence:\n      enabled: true\n      size: 10Gi\n```\n\n### 7. Test and Validate\n\n**Validation commands:**\n```bash\n# Lint the chart\nhelm lint my-app\u002F\n\n# Dry-run installation\nhelm install my-app .\u002Fmy-app --dry-run --debug\n\n# Template rendering\nhelm template my-app .\u002Fmy-app\n\n# Template with values\nhelm template my-app .\u002Fmy-app -f values-prod.yaml\n\n# Show computed values\nhelm show values .\u002Fmy-app\n```\n\n**Validation script:**\n```bash\n#!\u002Fbin\u002Fbash\nset -e\n\necho \"Linting chart...\"\nhelm lint .\n\necho \"Testing template rendering...\"\nhelm template test-release . --dry-run\n\necho \"Checking for required values...\"\nhelm template test-release . --validate\n\necho \"All validations passed!\"\n```\n\n**Reference:** See `scripts\u002Fvalidate-chart.sh`\n\n### 8. Package and Distribute\n\n**Package the chart:**\n```bash\nhelm package my-app\u002F\n# Creates: my-app-1.0.0.tgz\n```\n\n**Create chart repository:**\n```bash\n# Create index\nhelm repo index .\n\n# Upload to repository\n# AWS S3 example\naws s3 sync . s3:\u002F\u002Fmy-helm-charts\u002F --exclude \"*\" --include \"*.tgz\" --include \"index.yaml\"\n```\n\n**Use the chart:**\n```bash\nhelm repo add my-repo https:\u002F\u002Fcharts.example.com\nhelm repo update\nhelm install my-app my-repo\u002Fmy-app\n```\n\n### 9. Multi-Environment Configuration\n\n**Environment-specific values files:**\n\n```\nmy-app\u002F\n├── values.yaml          # Defaults\n├── values-dev.yaml      # Development\n├── values-staging.yaml  # Staging\n└── values-prod.yaml     # Production\n```\n\n**values-prod.yaml:**\n```yaml\nreplicaCount: 5\n\nimage:\n  tag: \"2.1.0\"\n\nresources:\n  requests:\n    memory: \"512Mi\"\n    cpu: \"500m\"\n  limits:\n    memory: \"1Gi\"\n    cpu: \"1000m\"\n\nautoscaling:\n  enabled: true\n  minReplicas: 3\n  maxReplicas: 20\n\ningress:\n  enabled: true\n  hosts:\n    - host: app.example.com\n      paths:\n        - path: \u002F\n          pathType: Prefix\n\npostgresql:\n  enabled: true\n  primary:\n    persistence:\n      size: 100Gi\n```\n\n**Install with environment:**\n```bash\nhelm install my-app .\u002Fmy-app -f values-prod.yaml --namespace production\n```\n\n### 10. Implement Hooks and Tests\n\n**Pre-install hook:**\n```yaml\n# templates\u002Fpre-install-job.yaml\napiVersion: batch\u002Fv1\nkind: Job\nmetadata:\n  name: {{ include \"my-app.fullname\" . }}-db-setup\n  annotations:\n    \"helm.sh\u002Fhook\": pre-install\n    \"helm.sh\u002Fhook-weight\": \"-5\"\n    \"helm.sh\u002Fhook-delete-policy\": hook-succeeded\nspec:\n  template:\n    spec:\n      containers:\n      - name: db-setup\n        image: postgres:15\n        command: [\"psql\", \"-c\", \"CREATE DATABASE myapp\"]\n      restartPolicy: Never\n```\n\n**Test connection:**\n```yaml\n# templates\u002Ftests\u002Ftest-connection.yaml\napiVersion: v1\nkind: Pod\nmetadata:\n  name: \"{{ include \"my-app.fullname\" . }}-test-connection\"\n  annotations:\n    \"helm.sh\u002Fhook\": test\nspec:\n  containers:\n  - name: wget\n    image: busybox\n    command: ['wget']\n    args: ['{{ include \"my-app.fullname\" . }}:{{ .Values.service.port }}']\n  restartPolicy: Never\n```\n\n**Run tests:**\n```bash\nhelm test my-app\n```\n\n## Common Patterns\n\n### Pattern 1: Conditional Resources\n\n```yaml\n{{- if .Values.ingress.enabled }}\napiVersion: networking.k8s.io\u002Fv1\nkind: Ingress\nmetadata:\n  name: {{ include \"my-app.fullname\" . }}\nspec:\n  # ...\n{{- end }}\n```\n\n### Pattern 2: Iterating Over Lists\n\n```yaml\nenv:\n{{- range .Values.env }}\n- name: {{ .name }}\n  value: {{ .value | quote }}\n{{- end }}\n```\n\n### Pattern 3: Including Files\n\n```yaml\ndata:\n  config.yaml: |\n    {{- .Files.Get \"config\u002Fapplication.yaml\" | nindent 4 }}\n```\n\n### Pattern 4: Global Values\n\n```yaml\nglobal:\n  imageRegistry: docker.io\n  imagePullSecrets:\n    - name: regcred\n\n# Use in templates:\nimage: {{ .Values.global.imageRegistry }}\u002F{{ .Values.image.repository }}\n```\n\n## Best Practices\n\n1. **Use semantic versioning** for chart and app versions\n2. **Document all values** in values.yaml with comments\n3. **Use template helpers** for repeated logic\n4. **Validate charts** before packaging\n5. **Pin dependency versions** explicitly\n6. **Use conditions** for optional resources\n7. **Follow naming conventions** (lowercase, hyphens)\n8. **Include NOTES.txt** with usage instructions\n9. **Add labels** consistently using helpers\n10. **Test installations** in all environments\n\n## Troubleshooting\n\n**Template rendering errors:**\n```bash\nhelm template my-app .\u002Fmy-app --debug\n```\n\n**Dependency issues:**\n```bash\nhelm dependency update\nhelm dependency list\n```\n\n**Installation failures:**\n```bash\nhelm install my-app .\u002Fmy-app --dry-run --debug\nkubectl get events --sort-by='.lastTimestamp'\n```\n\n## Reference Files\n\n- `assets\u002FChart.yaml.template` - Chart metadata template\n- `assets\u002Fvalues.yaml.template` - Values structure template\n- `scripts\u002Fvalidate-chart.sh` - Validation script\n- `references\u002Fchart-structure.md` - Detailed chart organization\n\n## Related Skills\n\n- `k8s-manifest-generator` - For creating base Kubernetes manifests\n- `gitops-workflow` - For automated Helm chart deployments\n",{"name":5,"description":7},"main","def8531e65114c0fca8fb8551c1871ee0eed705c","skills\u002Faiskillstore\u002Fmarketplace\u002Fwshobson\u002Fhelm-chart-scaffolding",24,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub","https:\u002F\u002Fskillshub.wtf","https:\u002F\u002Fgithub.com\u002FComeOnOliver","AI & Blockchain Engineer\r\n","2026-06-24 22:07:19",{"source":8,"skillName":5,"commands":65,"prompt":75,"zipAvailable":76},[66,69,72],{"tool":67,"command":68},"npx","npx skills add ComeOnOliver\u002Fskillshub --skill helm-chart-scaffolding",{"tool":70,"command":71},"bunx","bunx skills add ComeOnOliver\u002Fskillshub --skill helm-chart-scaffolding",{"tool":73,"command":74},"pnpm","pnpm dlx skills add ComeOnOliver\u002Fskillshub --skill helm-chart-scaffolding","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fwshobson\u002Fhelm-chart-scaffolding\u002FSKILL.md",true,[78,84,88,94,100],{"path":79,"resourceType":80,"resourceTypeDesc":81,"sizeBytes":82,"sourceHtmlUrl":83},"assets\u002FChart.yaml.template","ASSET","资产文件",801,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fwshobson\u002Fhelm-chart-scaffolding\u002Fassets\u002FChart.yaml.template",{"path":85,"resourceType":80,"resourceTypeDesc":81,"sizeBytes":86,"sourceHtmlUrl":87},"assets\u002Fvalues.yaml.template",3190,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fwshobson\u002Fhelm-chart-scaffolding\u002Fassets\u002Fvalues.yaml.template",{"path":89,"resourceType":90,"resourceTypeDesc":91,"sizeBytes":92,"sourceHtmlUrl":93},"references\u002Fchart-structure.md","REFERENCE","参考文档",11775,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fwshobson\u002Fhelm-chart-scaffolding\u002Freferences\u002Fchart-structure.md",{"path":95,"resourceType":96,"resourceTypeDesc":97,"sizeBytes":98,"sourceHtmlUrl":99},"scripts\u002Fvalidate-chart.sh","SCRIPT","脚本",6506,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fwshobson\u002Fhelm-chart-scaffolding\u002Fscripts\u002Fvalidate-chart.sh",{"path":101,"resourceType":90,"resourceTypeDesc":91,"sizeBytes":102,"sourceHtmlUrl":103},"skill-report.json",10364,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fwshobson\u002Fhelm-chart-scaffolding\u002Fskill-report.json",[105,115,125,134,140,147],{"skillNo":106,"name":107,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":108,"categories":109,"keywords":111,"publishedAt":50},"01M6FKJN13GMG4KY57J3QD8GY5","model-hierarchy-skill","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzscole\u002Fmodel-hierarchy-skill\u002Fmodel-hierarchy-skill\u002FSKILL.md",[110],{"categoryNo":27,"categoryName":28,"taxonomyType":21,"taxonomyTypeDesc":22},[112,113,114],"model","model hierarchy","model hierarchy skill",{"skillNo":116,"name":117,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":118,"categories":119,"keywords":121,"publishedAt":50},"01M6FKJJJ6GCAMR4PPPRD12M5X","zoom-mcp","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-mcp\u002FSKILL.md",[120],{"categoryNo":27,"categoryName":28,"taxonomyType":21,"taxonomyTypeDesc":22},[122,123,124],"MCP","zoom","zoom mcp",{"skillNo":126,"name":127,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":128,"categories":129,"keywords":130,"publishedAt":50},"01M6FKJE3KYT3KPEZMEEHYKA6K","zoom-apps-sdk","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-apps-sdk\u002FSKILL.md",[],[131,132,133,123],"sdk","zoom apps sdk","apps",{"skillNo":135,"name":136,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":137,"categories":138,"keywords":139,"publishedAt":50},"01M6FKJ9EDH9Q5VWDF8HAJRSP0","windows","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwindows\u002FSKILL.md",[],[136],{"skillNo":141,"name":142,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":143,"categories":144,"keywords":146,"publishedAt":50},"01M6FKJ666BEEFC3AE9GJ72Q93","whiteboard","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwhiteboard\u002FSKILL.md",[145],{"categoryNo":27,"categoryName":28,"taxonomyType":21,"taxonomyTypeDesc":22},[142],{"skillNo":148,"name":149,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":150,"categories":151,"keywords":152,"publishedAt":50},"01M6FKJ21WFCDGTJQ2Q91T9DVW","websockets","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwebsockets\u002FSKILL.md",[],[149]]