specweave 0.3.13 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CLAUDE.md +17 -1
- package/README.md +1 -1
- package/bin/install-all.sh +9 -2
- package/bin/install-hooks.sh +57 -0
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +55 -0
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/core/agent-model-manager.d.ts +52 -0
- package/dist/core/agent-model-manager.d.ts.map +1 -0
- package/dist/core/agent-model-manager.js +120 -0
- package/dist/core/agent-model-manager.js.map +1 -0
- package/dist/core/cost-tracker.d.ts +108 -0
- package/dist/core/cost-tracker.d.ts.map +1 -0
- package/dist/core/cost-tracker.js +281 -0
- package/dist/core/cost-tracker.js.map +1 -0
- package/dist/core/model-selector.d.ts +57 -0
- package/dist/core/model-selector.d.ts.map +1 -0
- package/dist/core/model-selector.js +115 -0
- package/dist/core/model-selector.js.map +1 -0
- package/dist/core/phase-detector.d.ts +62 -0
- package/dist/core/phase-detector.d.ts.map +1 -0
- package/dist/core/phase-detector.js +229 -0
- package/dist/core/phase-detector.js.map +1 -0
- package/dist/types/cost-tracking.d.ts +43 -0
- package/dist/types/cost-tracking.d.ts.map +1 -0
- package/dist/types/cost-tracking.js +8 -0
- package/dist/types/cost-tracking.js.map +1 -0
- package/dist/types/model-selection.d.ts +53 -0
- package/dist/types/model-selection.d.ts.map +1 -0
- package/dist/types/model-selection.js +12 -0
- package/dist/types/model-selection.js.map +1 -0
- package/dist/utils/cost-reporter.d.ts +58 -0
- package/dist/utils/cost-reporter.d.ts.map +1 -0
- package/dist/utils/cost-reporter.js +224 -0
- package/dist/utils/cost-reporter.js.map +1 -0
- package/dist/utils/pricing-constants.d.ts +70 -0
- package/dist/utils/pricing-constants.d.ts.map +1 -0
- package/dist/utils/pricing-constants.js +71 -0
- package/dist/utils/pricing-constants.js.map +1 -0
- package/package.json +1 -1
- package/src/agents/architect/AGENT.md +3 -0
- package/src/agents/code-reviewer.md +156 -0
- package/src/agents/data-scientist/AGENT.md +181 -0
- package/src/agents/database-optimizer/AGENT.md +147 -0
- package/src/agents/devops/AGENT.md +3 -0
- package/src/agents/diagrams-architect/AGENT.md +3 -0
- package/src/agents/docs-writer/AGENT.md +3 -0
- package/src/agents/kubernetes-architect/AGENT.md +142 -0
- package/src/agents/ml-engineer/AGENT.md +150 -0
- package/src/agents/mlops-engineer/AGENT.md +201 -0
- package/src/agents/network-engineer/AGENT.md +149 -0
- package/src/agents/observability-engineer/AGENT.md +213 -0
- package/src/agents/payment-integration/AGENT.md +35 -0
- package/src/agents/performance/AGENT.md +3 -0
- package/src/agents/performance-engineer/AGENT.md +153 -0
- package/src/agents/pm/AGENT.md +3 -0
- package/src/agents/qa-lead/AGENT.md +3 -0
- package/src/agents/security/AGENT.md +3 -0
- package/src/agents/sre/AGENT.md +3 -0
- package/src/agents/tdd-orchestrator/AGENT.md +169 -0
- package/src/agents/tech-lead/AGENT.md +3 -0
- package/src/commands/specweave.costs.md +261 -0
- package/src/commands/specweave.ml-pipeline.md +292 -0
- package/src/commands/specweave.monitor-setup.md +501 -0
- package/src/commands/specweave.slo-implement.md +1055 -0
- package/src/commands/specweave.sync-github.md +1 -1
- package/src/commands/specweave.tdd-cycle.md +199 -0
- package/src/commands/specweave.tdd-green.md +842 -0
- package/src/commands/specweave.tdd-red.md +135 -0
- package/src/commands/specweave.tdd-refactor.md +165 -0
- package/src/skills/SKILLS-INDEX.md +18 -10
- package/src/skills/billing-automation/SKILL.md +559 -0
- package/src/skills/distributed-tracing/SKILL.md +438 -0
- package/src/skills/e2e-playwright/README.md +1 -1
- package/src/skills/e2e-playwright/package.json +1 -1
- package/src/skills/gitops-workflow/SKILL.md +285 -0
- package/src/skills/gitops-workflow/references/argocd-setup.md +134 -0
- package/src/skills/gitops-workflow/references/sync-policies.md +131 -0
- package/src/skills/grafana-dashboards/SKILL.md +369 -0
- package/src/skills/helm-chart-scaffolding/SKILL.md +544 -0
- package/src/skills/helm-chart-scaffolding/assets/Chart.yaml.template +42 -0
- package/src/skills/helm-chart-scaffolding/assets/values.yaml.template +185 -0
- package/src/skills/helm-chart-scaffolding/references/chart-structure.md +500 -0
- package/src/skills/helm-chart-scaffolding/scripts/validate-chart.sh +244 -0
- package/src/skills/k8s-manifest-generator/SKILL.md +511 -0
- package/src/skills/k8s-manifest-generator/assets/configmap-template.yaml +296 -0
- package/src/skills/k8s-manifest-generator/assets/deployment-template.yaml +203 -0
- package/src/skills/k8s-manifest-generator/assets/service-template.yaml +171 -0
- package/src/skills/k8s-manifest-generator/references/deployment-spec.md +753 -0
- package/src/skills/k8s-manifest-generator/references/service-spec.md +724 -0
- package/src/skills/k8s-security-policies/SKILL.md +334 -0
- package/src/skills/k8s-security-policies/assets/network-policy-template.yaml +177 -0
- package/src/skills/k8s-security-policies/references/rbac-patterns.md +187 -0
- package/src/skills/ml-pipeline-workflow/SKILL.md +245 -0
- package/src/skills/paypal-integration/SKILL.md +467 -0
- package/src/skills/pci-compliance/SKILL.md +466 -0
- package/src/skills/prometheus-configuration/SKILL.md +392 -0
- package/src/skills/slo-implementation/SKILL.md +329 -0
- package/src/skills/stripe-integration/SKILL.md +442 -0
- package/src/skills/tdd-workflow/SKILL.md +378 -0
- package/src/templates/README.md.template +1 -1
- package/src/skills/bmad-method-expert/SKILL.md +0 -626
- package/src/skills/bmad-method-expert/scripts/analyze-project.js +0 -318
- package/src/skills/bmad-method-expert/scripts/check-setup.js +0 -208
- package/src/skills/bmad-method-expert/scripts/generate-template.js +0 -1149
- package/src/skills/bmad-method-expert/scripts/validate-documents.js +0 -340
- package/src/skills/context-optimizer/SKILL.md +0 -588
- package/src/skills/figma-designer/SKILL.md +0 -149
- package/src/skills/figma-implementer/SKILL.md +0 -148
- package/src/skills/figma-mcp-connector/SKILL.md +0 -136
- package/src/skills/figma-to-code/SKILL.md +0 -128
- package/src/skills/spec-kit-expert/SKILL.md +0 -1010
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
# Global values shared with subcharts
|
|
2
|
+
global:
|
|
3
|
+
imageRegistry: docker.io
|
|
4
|
+
imagePullSecrets: []
|
|
5
|
+
storageClass: ""
|
|
6
|
+
|
|
7
|
+
# Image configuration
|
|
8
|
+
image:
|
|
9
|
+
registry: docker.io
|
|
10
|
+
repository: myapp/web
|
|
11
|
+
tag: "" # Defaults to .Chart.AppVersion
|
|
12
|
+
pullPolicy: IfNotPresent
|
|
13
|
+
|
|
14
|
+
# Override chart name
|
|
15
|
+
nameOverride: ""
|
|
16
|
+
fullnameOverride: ""
|
|
17
|
+
|
|
18
|
+
# Number of replicas
|
|
19
|
+
replicaCount: 3
|
|
20
|
+
revisionHistoryLimit: 10
|
|
21
|
+
|
|
22
|
+
# ServiceAccount
|
|
23
|
+
serviceAccount:
|
|
24
|
+
create: true
|
|
25
|
+
annotations: {}
|
|
26
|
+
name: ""
|
|
27
|
+
|
|
28
|
+
# Pod annotations
|
|
29
|
+
podAnnotations:
|
|
30
|
+
prometheus.io/scrape: "true"
|
|
31
|
+
prometheus.io/port: "9090"
|
|
32
|
+
prometheus.io/path: "/metrics"
|
|
33
|
+
|
|
34
|
+
# Pod security context
|
|
35
|
+
podSecurityContext:
|
|
36
|
+
runAsNonRoot: true
|
|
37
|
+
runAsUser: 1000
|
|
38
|
+
runAsGroup: 1000
|
|
39
|
+
fsGroup: 1000
|
|
40
|
+
seccompProfile:
|
|
41
|
+
type: RuntimeDefault
|
|
42
|
+
|
|
43
|
+
# Container security context
|
|
44
|
+
securityContext:
|
|
45
|
+
allowPrivilegeEscalation: false
|
|
46
|
+
readOnlyRootFilesystem: true
|
|
47
|
+
capabilities:
|
|
48
|
+
drop:
|
|
49
|
+
- ALL
|
|
50
|
+
|
|
51
|
+
# Service configuration
|
|
52
|
+
service:
|
|
53
|
+
type: ClusterIP
|
|
54
|
+
port: 80
|
|
55
|
+
targetPort: http
|
|
56
|
+
annotations: {}
|
|
57
|
+
sessionAffinity: None
|
|
58
|
+
|
|
59
|
+
# Ingress configuration
|
|
60
|
+
ingress:
|
|
61
|
+
enabled: false
|
|
62
|
+
className: nginx
|
|
63
|
+
annotations: {}
|
|
64
|
+
hosts:
|
|
65
|
+
- host: app.example.com
|
|
66
|
+
paths:
|
|
67
|
+
- path: /
|
|
68
|
+
pathType: Prefix
|
|
69
|
+
tls: []
|
|
70
|
+
|
|
71
|
+
# Resources
|
|
72
|
+
resources:
|
|
73
|
+
limits:
|
|
74
|
+
cpu: 500m
|
|
75
|
+
memory: 512Mi
|
|
76
|
+
requests:
|
|
77
|
+
cpu: 250m
|
|
78
|
+
memory: 256Mi
|
|
79
|
+
|
|
80
|
+
# Liveness probe
|
|
81
|
+
livenessProbe:
|
|
82
|
+
httpGet:
|
|
83
|
+
path: /health/live
|
|
84
|
+
port: http
|
|
85
|
+
initialDelaySeconds: 30
|
|
86
|
+
periodSeconds: 10
|
|
87
|
+
|
|
88
|
+
# Readiness probe
|
|
89
|
+
readinessProbe:
|
|
90
|
+
httpGet:
|
|
91
|
+
path: /health/ready
|
|
92
|
+
port: http
|
|
93
|
+
initialDelaySeconds: 5
|
|
94
|
+
periodSeconds: 5
|
|
95
|
+
|
|
96
|
+
# Autoscaling
|
|
97
|
+
autoscaling:
|
|
98
|
+
enabled: false
|
|
99
|
+
minReplicas: 2
|
|
100
|
+
maxReplicas: 10
|
|
101
|
+
targetCPUUtilizationPercentage: 80
|
|
102
|
+
targetMemoryUtilizationPercentage: 80
|
|
103
|
+
|
|
104
|
+
# Pod Disruption Budget
|
|
105
|
+
podDisruptionBudget:
|
|
106
|
+
enabled: true
|
|
107
|
+
minAvailable: 1
|
|
108
|
+
|
|
109
|
+
# Node selection
|
|
110
|
+
nodeSelector: {}
|
|
111
|
+
tolerations: []
|
|
112
|
+
affinity:
|
|
113
|
+
podAntiAffinity:
|
|
114
|
+
preferredDuringSchedulingIgnoredDuringExecution:
|
|
115
|
+
- weight: 100
|
|
116
|
+
podAffinityTerm:
|
|
117
|
+
labelSelector:
|
|
118
|
+
matchExpressions:
|
|
119
|
+
- key: app.kubernetes.io/name
|
|
120
|
+
operator: In
|
|
121
|
+
values:
|
|
122
|
+
- '{{ include "my-app.name" . }}'
|
|
123
|
+
topologyKey: kubernetes.io/hostname
|
|
124
|
+
|
|
125
|
+
# Environment variables
|
|
126
|
+
env: []
|
|
127
|
+
# - name: LOG_LEVEL
|
|
128
|
+
# value: "info"
|
|
129
|
+
|
|
130
|
+
# ConfigMap data
|
|
131
|
+
configMap:
|
|
132
|
+
enabled: true
|
|
133
|
+
data: {}
|
|
134
|
+
# APP_MODE: production
|
|
135
|
+
# DATABASE_HOST: postgres.example.com
|
|
136
|
+
|
|
137
|
+
# Secrets (use external secret management in production)
|
|
138
|
+
secrets:
|
|
139
|
+
enabled: false
|
|
140
|
+
data: {}
|
|
141
|
+
|
|
142
|
+
# Persistent Volume
|
|
143
|
+
persistence:
|
|
144
|
+
enabled: false
|
|
145
|
+
storageClass: ""
|
|
146
|
+
accessMode: ReadWriteOnce
|
|
147
|
+
size: 10Gi
|
|
148
|
+
annotations: {}
|
|
149
|
+
|
|
150
|
+
# PostgreSQL dependency
|
|
151
|
+
postgresql:
|
|
152
|
+
enabled: false
|
|
153
|
+
auth:
|
|
154
|
+
database: myapp
|
|
155
|
+
username: myapp
|
|
156
|
+
password: changeme
|
|
157
|
+
primary:
|
|
158
|
+
persistence:
|
|
159
|
+
enabled: true
|
|
160
|
+
size: 10Gi
|
|
161
|
+
|
|
162
|
+
# Redis dependency
|
|
163
|
+
redis:
|
|
164
|
+
enabled: false
|
|
165
|
+
auth:
|
|
166
|
+
enabled: false
|
|
167
|
+
master:
|
|
168
|
+
persistence:
|
|
169
|
+
enabled: false
|
|
170
|
+
|
|
171
|
+
# ServiceMonitor for Prometheus Operator
|
|
172
|
+
serviceMonitor:
|
|
173
|
+
enabled: false
|
|
174
|
+
interval: 30s
|
|
175
|
+
scrapeTimeout: 10s
|
|
176
|
+
labels: {}
|
|
177
|
+
|
|
178
|
+
# Network Policy
|
|
179
|
+
networkPolicy:
|
|
180
|
+
enabled: false
|
|
181
|
+
policyTypes:
|
|
182
|
+
- Ingress
|
|
183
|
+
- Egress
|
|
184
|
+
ingress: []
|
|
185
|
+
egress: []
|
|
@@ -0,0 +1,500 @@
|
|
|
1
|
+
# Helm Chart Structure Reference
|
|
2
|
+
|
|
3
|
+
Complete guide to Helm chart organization, file conventions, and best practices.
|
|
4
|
+
|
|
5
|
+
## Standard Chart Directory Structure
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
my-app/
|
|
9
|
+
├── Chart.yaml # Chart metadata (required)
|
|
10
|
+
├── Chart.lock # Dependency lock file (generated)
|
|
11
|
+
├── values.yaml # Default configuration values (required)
|
|
12
|
+
├── values.schema.json # JSON schema for values validation
|
|
13
|
+
├── .helmignore # Patterns to ignore when packaging
|
|
14
|
+
├── README.md # Chart documentation
|
|
15
|
+
├── LICENSE # Chart license
|
|
16
|
+
├── charts/ # Chart dependencies (bundled)
|
|
17
|
+
│ └── postgresql-12.0.0.tgz
|
|
18
|
+
├── crds/ # Custom Resource Definitions
|
|
19
|
+
│ └── my-crd.yaml
|
|
20
|
+
├── templates/ # Kubernetes manifest templates (required)
|
|
21
|
+
│ ├── NOTES.txt # Post-install instructions
|
|
22
|
+
│ ├── _helpers.tpl # Template helper functions
|
|
23
|
+
│ ├── deployment.yaml
|
|
24
|
+
│ ├── service.yaml
|
|
25
|
+
│ ├── ingress.yaml
|
|
26
|
+
│ ├── configmap.yaml
|
|
27
|
+
│ ├── secret.yaml
|
|
28
|
+
│ ├── serviceaccount.yaml
|
|
29
|
+
│ ├── hpa.yaml
|
|
30
|
+
│ ├── pdb.yaml
|
|
31
|
+
│ ├── networkpolicy.yaml
|
|
32
|
+
│ └── tests/
|
|
33
|
+
│ └── test-connection.yaml
|
|
34
|
+
└── files/ # Additional files to include
|
|
35
|
+
└── config/
|
|
36
|
+
└── app.conf
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## Chart.yaml Specification
|
|
40
|
+
|
|
41
|
+
### API Version v2 (Helm 3+)
|
|
42
|
+
|
|
43
|
+
```yaml
|
|
44
|
+
apiVersion: v2 # Required: API version
|
|
45
|
+
name: my-application # Required: Chart name
|
|
46
|
+
version: 1.2.3 # Required: Chart version (SemVer)
|
|
47
|
+
appVersion: "2.5.0" # Application version
|
|
48
|
+
description: A Helm chart for my application # Required
|
|
49
|
+
type: application # Chart type: application or library
|
|
50
|
+
keywords: # Search keywords
|
|
51
|
+
- web
|
|
52
|
+
- api
|
|
53
|
+
- backend
|
|
54
|
+
home: https://example.com # Project home page
|
|
55
|
+
sources: # Source code URLs
|
|
56
|
+
- https://github.com/example/my-app
|
|
57
|
+
maintainers: # Maintainer list
|
|
58
|
+
- name: John Doe
|
|
59
|
+
email: john@example.com
|
|
60
|
+
url: https://github.com/johndoe
|
|
61
|
+
icon: https://example.com/icon.png # Chart icon URL
|
|
62
|
+
kubeVersion: ">=1.24.0" # Compatible Kubernetes versions
|
|
63
|
+
deprecated: false # Mark chart as deprecated
|
|
64
|
+
annotations: # Arbitrary annotations
|
|
65
|
+
example.com/release-notes: https://example.com/releases/v1.2.3
|
|
66
|
+
dependencies: # Chart dependencies
|
|
67
|
+
- name: postgresql
|
|
68
|
+
version: "12.0.0"
|
|
69
|
+
repository: "https://charts.bitnami.com/bitnami"
|
|
70
|
+
condition: postgresql.enabled
|
|
71
|
+
tags:
|
|
72
|
+
- database
|
|
73
|
+
import-values:
|
|
74
|
+
- child: database
|
|
75
|
+
parent: database
|
|
76
|
+
alias: db
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
## Chart Types
|
|
80
|
+
|
|
81
|
+
### Application Chart
|
|
82
|
+
```yaml
|
|
83
|
+
type: application
|
|
84
|
+
```
|
|
85
|
+
- Standard Kubernetes applications
|
|
86
|
+
- Can be installed and managed
|
|
87
|
+
- Contains templates for K8s resources
|
|
88
|
+
|
|
89
|
+
### Library Chart
|
|
90
|
+
```yaml
|
|
91
|
+
type: library
|
|
92
|
+
```
|
|
93
|
+
- Shared template helpers
|
|
94
|
+
- Cannot be installed directly
|
|
95
|
+
- Used as dependency by other charts
|
|
96
|
+
- No templates/ directory
|
|
97
|
+
|
|
98
|
+
## Values Files Organization
|
|
99
|
+
|
|
100
|
+
### values.yaml (defaults)
|
|
101
|
+
```yaml
|
|
102
|
+
# Global values (shared with subcharts)
|
|
103
|
+
global:
|
|
104
|
+
imageRegistry: docker.io
|
|
105
|
+
imagePullSecrets: []
|
|
106
|
+
|
|
107
|
+
# Image configuration
|
|
108
|
+
image:
|
|
109
|
+
registry: docker.io
|
|
110
|
+
repository: myapp/web
|
|
111
|
+
tag: "" # Defaults to .Chart.AppVersion
|
|
112
|
+
pullPolicy: IfNotPresent
|
|
113
|
+
|
|
114
|
+
# Deployment settings
|
|
115
|
+
replicaCount: 1
|
|
116
|
+
revisionHistoryLimit: 10
|
|
117
|
+
|
|
118
|
+
# Pod configuration
|
|
119
|
+
podAnnotations: {}
|
|
120
|
+
podSecurityContext:
|
|
121
|
+
runAsNonRoot: true
|
|
122
|
+
runAsUser: 1000
|
|
123
|
+
fsGroup: 1000
|
|
124
|
+
|
|
125
|
+
# Container security
|
|
126
|
+
securityContext:
|
|
127
|
+
allowPrivilegeEscalation: false
|
|
128
|
+
readOnlyRootFilesystem: true
|
|
129
|
+
capabilities:
|
|
130
|
+
drop:
|
|
131
|
+
- ALL
|
|
132
|
+
|
|
133
|
+
# Service
|
|
134
|
+
service:
|
|
135
|
+
type: ClusterIP
|
|
136
|
+
port: 80
|
|
137
|
+
targetPort: http
|
|
138
|
+
annotations: {}
|
|
139
|
+
|
|
140
|
+
# Resources
|
|
141
|
+
resources:
|
|
142
|
+
limits:
|
|
143
|
+
cpu: 100m
|
|
144
|
+
memory: 128Mi
|
|
145
|
+
requests:
|
|
146
|
+
cpu: 100m
|
|
147
|
+
memory: 128Mi
|
|
148
|
+
|
|
149
|
+
# Autoscaling
|
|
150
|
+
autoscaling:
|
|
151
|
+
enabled: false
|
|
152
|
+
minReplicas: 1
|
|
153
|
+
maxReplicas: 100
|
|
154
|
+
targetCPUUtilizationPercentage: 80
|
|
155
|
+
|
|
156
|
+
# Node selection
|
|
157
|
+
nodeSelector: {}
|
|
158
|
+
tolerations: []
|
|
159
|
+
affinity: {}
|
|
160
|
+
|
|
161
|
+
# Monitoring
|
|
162
|
+
serviceMonitor:
|
|
163
|
+
enabled: false
|
|
164
|
+
interval: 30s
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
### values.schema.json (validation)
|
|
168
|
+
```json
|
|
169
|
+
{
|
|
170
|
+
"$schema": "https://json-schema.org/draft-07/schema#",
|
|
171
|
+
"type": "object",
|
|
172
|
+
"properties": {
|
|
173
|
+
"replicaCount": {
|
|
174
|
+
"type": "integer",
|
|
175
|
+
"minimum": 1
|
|
176
|
+
},
|
|
177
|
+
"image": {
|
|
178
|
+
"type": "object",
|
|
179
|
+
"required": ["repository"],
|
|
180
|
+
"properties": {
|
|
181
|
+
"repository": {
|
|
182
|
+
"type": "string"
|
|
183
|
+
},
|
|
184
|
+
"tag": {
|
|
185
|
+
"type": "string"
|
|
186
|
+
},
|
|
187
|
+
"pullPolicy": {
|
|
188
|
+
"type": "string",
|
|
189
|
+
"enum": ["Always", "IfNotPresent", "Never"]
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
},
|
|
194
|
+
"required": ["image"]
|
|
195
|
+
}
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
## Template Files
|
|
199
|
+
|
|
200
|
+
### Template Naming Conventions
|
|
201
|
+
|
|
202
|
+
- **Lowercase with hyphens**: `deployment.yaml`, `service-account.yaml`
|
|
203
|
+
- **Partial templates**: Prefix with underscore `_helpers.tpl`
|
|
204
|
+
- **Tests**: Place in `templates/tests/`
|
|
205
|
+
- **CRDs**: Place in `crds/` (not templated)
|
|
206
|
+
|
|
207
|
+
### Common Templates
|
|
208
|
+
|
|
209
|
+
#### _helpers.tpl
|
|
210
|
+
```yaml
|
|
211
|
+
{{/*
|
|
212
|
+
Standard naming helpers
|
|
213
|
+
*/}}
|
|
214
|
+
{{- define "my-app.name" -}}
|
|
215
|
+
{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}}
|
|
216
|
+
{{- end -}}
|
|
217
|
+
|
|
218
|
+
{{- define "my-app.fullname" -}}
|
|
219
|
+
{{- if .Values.fullnameOverride -}}
|
|
220
|
+
{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}}
|
|
221
|
+
{{- else -}}
|
|
222
|
+
{{- $name := default .Chart.Name .Values.nameOverride -}}
|
|
223
|
+
{{- if contains $name .Release.Name -}}
|
|
224
|
+
{{- .Release.Name | trunc 63 | trimSuffix "-" -}}
|
|
225
|
+
{{- else -}}
|
|
226
|
+
{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}}
|
|
227
|
+
{{- end -}}
|
|
228
|
+
{{- end -}}
|
|
229
|
+
{{- end -}}
|
|
230
|
+
|
|
231
|
+
{{- define "my-app.chart" -}}
|
|
232
|
+
{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}}
|
|
233
|
+
{{- end -}}
|
|
234
|
+
|
|
235
|
+
{{/*
|
|
236
|
+
Common labels
|
|
237
|
+
*/}}
|
|
238
|
+
{{- define "my-app.labels" -}}
|
|
239
|
+
helm.sh/chart: {{ include "my-app.chart" . }}
|
|
240
|
+
{{ include "my-app.selectorLabels" . }}
|
|
241
|
+
{{- if .Chart.AppVersion }}
|
|
242
|
+
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
|
|
243
|
+
{{- end }}
|
|
244
|
+
app.kubernetes.io/managed-by: {{ .Release.Service }}
|
|
245
|
+
{{- end -}}
|
|
246
|
+
|
|
247
|
+
{{- define "my-app.selectorLabels" -}}
|
|
248
|
+
app.kubernetes.io/name: {{ include "my-app.name" . }}
|
|
249
|
+
app.kubernetes.io/instance: {{ .Release.Name }}
|
|
250
|
+
{{- end -}}
|
|
251
|
+
|
|
252
|
+
{{/*
|
|
253
|
+
Image name helper
|
|
254
|
+
*/}}
|
|
255
|
+
{{- define "my-app.image" -}}
|
|
256
|
+
{{- $registry := .Values.global.imageRegistry | default .Values.image.registry -}}
|
|
257
|
+
{{- $repository := .Values.image.repository -}}
|
|
258
|
+
{{- $tag := .Values.image.tag | default .Chart.AppVersion -}}
|
|
259
|
+
{{- printf "%s/%s:%s" $registry $repository $tag -}}
|
|
260
|
+
{{- end -}}
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
#### NOTES.txt
|
|
264
|
+
```
|
|
265
|
+
Thank you for installing {{ .Chart.Name }}.
|
|
266
|
+
|
|
267
|
+
Your release is named {{ .Release.Name }}.
|
|
268
|
+
|
|
269
|
+
To learn more about the release, try:
|
|
270
|
+
|
|
271
|
+
$ helm status {{ .Release.Name }}
|
|
272
|
+
$ helm get all {{ .Release.Name }}
|
|
273
|
+
|
|
274
|
+
{{- if .Values.ingress.enabled }}
|
|
275
|
+
|
|
276
|
+
Application URL:
|
|
277
|
+
{{- range .Values.ingress.hosts }}
|
|
278
|
+
http{{ if $.Values.ingress.tls }}s{{ end }}://{{ .host }}{{ .path }}
|
|
279
|
+
{{- end }}
|
|
280
|
+
{{- else }}
|
|
281
|
+
|
|
282
|
+
Get the application URL by running:
|
|
283
|
+
export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app.kubernetes.io/name={{ include "my-app.name" . }}" -o jsonpath="{.items[0].metadata.name}")
|
|
284
|
+
kubectl port-forward $POD_NAME 8080:80
|
|
285
|
+
echo "Visit http://127.0.0.1:8080"
|
|
286
|
+
{{- end }}
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
## Dependencies Management
|
|
290
|
+
|
|
291
|
+
### Declaring Dependencies
|
|
292
|
+
|
|
293
|
+
```yaml
|
|
294
|
+
# Chart.yaml
|
|
295
|
+
dependencies:
|
|
296
|
+
- name: postgresql
|
|
297
|
+
version: "12.0.0"
|
|
298
|
+
repository: "https://charts.bitnami.com/bitnami"
|
|
299
|
+
condition: postgresql.enabled # Enable/disable via values
|
|
300
|
+
tags: # Group dependencies
|
|
301
|
+
- database
|
|
302
|
+
import-values: # Import values from subchart
|
|
303
|
+
- child: database
|
|
304
|
+
parent: database
|
|
305
|
+
alias: db # Reference as .Values.db
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
### Managing Dependencies
|
|
309
|
+
|
|
310
|
+
```bash
|
|
311
|
+
# Update dependencies
|
|
312
|
+
helm dependency update
|
|
313
|
+
|
|
314
|
+
# List dependencies
|
|
315
|
+
helm dependency list
|
|
316
|
+
|
|
317
|
+
# Build dependencies
|
|
318
|
+
helm dependency build
|
|
319
|
+
```
|
|
320
|
+
|
|
321
|
+
### Chart.lock
|
|
322
|
+
|
|
323
|
+
Generated automatically by `helm dependency update`:
|
|
324
|
+
|
|
325
|
+
```yaml
|
|
326
|
+
dependencies:
|
|
327
|
+
- name: postgresql
|
|
328
|
+
repository: https://charts.bitnami.com/bitnami
|
|
329
|
+
version: 12.0.0
|
|
330
|
+
digest: sha256:abcd1234...
|
|
331
|
+
generated: "2024-01-01T00:00:00Z"
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
## .helmignore
|
|
335
|
+
|
|
336
|
+
Exclude files from chart package:
|
|
337
|
+
|
|
338
|
+
```
|
|
339
|
+
# Development files
|
|
340
|
+
.git/
|
|
341
|
+
.gitignore
|
|
342
|
+
*.md
|
|
343
|
+
docs/
|
|
344
|
+
|
|
345
|
+
# Build artifacts
|
|
346
|
+
*.swp
|
|
347
|
+
*.bak
|
|
348
|
+
*.tmp
|
|
349
|
+
*.orig
|
|
350
|
+
|
|
351
|
+
# CI/CD
|
|
352
|
+
.travis.yml
|
|
353
|
+
.gitlab-ci.yml
|
|
354
|
+
Jenkinsfile
|
|
355
|
+
|
|
356
|
+
# Testing
|
|
357
|
+
test/
|
|
358
|
+
*.test
|
|
359
|
+
|
|
360
|
+
# IDE
|
|
361
|
+
.vscode/
|
|
362
|
+
.idea/
|
|
363
|
+
*.iml
|
|
364
|
+
```
|
|
365
|
+
|
|
366
|
+
## Custom Resource Definitions (CRDs)
|
|
367
|
+
|
|
368
|
+
Place CRDs in `crds/` directory:
|
|
369
|
+
|
|
370
|
+
```
|
|
371
|
+
crds/
|
|
372
|
+
├── my-app-crd.yaml
|
|
373
|
+
└── another-crd.yaml
|
|
374
|
+
```
|
|
375
|
+
|
|
376
|
+
**Important CRD notes:**
|
|
377
|
+
- CRDs are installed before any templates
|
|
378
|
+
- CRDs are NOT templated (no `{{ }}` syntax)
|
|
379
|
+
- CRDs are NOT upgraded or deleted with chart
|
|
380
|
+
- Use `helm install --skip-crds` to skip installation
|
|
381
|
+
|
|
382
|
+
## Chart Versioning
|
|
383
|
+
|
|
384
|
+
### Semantic Versioning
|
|
385
|
+
|
|
386
|
+
- **Chart Version**: Increment when chart changes
|
|
387
|
+
- MAJOR: Breaking changes
|
|
388
|
+
- MINOR: New features, backward compatible
|
|
389
|
+
- PATCH: Bug fixes
|
|
390
|
+
|
|
391
|
+
- **App Version**: Application version being deployed
|
|
392
|
+
- Can be any string
|
|
393
|
+
- Not required to follow SemVer
|
|
394
|
+
|
|
395
|
+
```yaml
|
|
396
|
+
version: 2.3.1 # Chart version
|
|
397
|
+
appVersion: "1.5.0" # Application version
|
|
398
|
+
```
|
|
399
|
+
|
|
400
|
+
## Chart Testing
|
|
401
|
+
|
|
402
|
+
### Test Files
|
|
403
|
+
|
|
404
|
+
```yaml
|
|
405
|
+
# templates/tests/test-connection.yaml
|
|
406
|
+
apiVersion: v1
|
|
407
|
+
kind: Pod
|
|
408
|
+
metadata:
|
|
409
|
+
name: "{{ include "my-app.fullname" . }}-test-connection"
|
|
410
|
+
annotations:
|
|
411
|
+
"helm.sh/hook": test
|
|
412
|
+
"helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded
|
|
413
|
+
spec:
|
|
414
|
+
containers:
|
|
415
|
+
- name: wget
|
|
416
|
+
image: busybox
|
|
417
|
+
command: ['wget']
|
|
418
|
+
args: ['{{ include "my-app.fullname" . }}:{{ .Values.service.port }}']
|
|
419
|
+
restartPolicy: Never
|
|
420
|
+
```
|
|
421
|
+
|
|
422
|
+
### Running Tests
|
|
423
|
+
|
|
424
|
+
```bash
|
|
425
|
+
helm test my-release
|
|
426
|
+
helm test my-release --logs
|
|
427
|
+
```
|
|
428
|
+
|
|
429
|
+
## Hooks
|
|
430
|
+
|
|
431
|
+
Helm hooks allow intervention at specific points:
|
|
432
|
+
|
|
433
|
+
```yaml
|
|
434
|
+
apiVersion: batch/v1
|
|
435
|
+
kind: Job
|
|
436
|
+
metadata:
|
|
437
|
+
name: {{ include "my-app.fullname" . }}-migration
|
|
438
|
+
annotations:
|
|
439
|
+
"helm.sh/hook": pre-upgrade,pre-install
|
|
440
|
+
"helm.sh/hook-weight": "-5"
|
|
441
|
+
"helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded
|
|
442
|
+
```
|
|
443
|
+
|
|
444
|
+
### Hook Types
|
|
445
|
+
|
|
446
|
+
- `pre-install`: Before templates rendered
|
|
447
|
+
- `post-install`: After all resources loaded
|
|
448
|
+
- `pre-delete`: Before any resources deleted
|
|
449
|
+
- `post-delete`: After all resources deleted
|
|
450
|
+
- `pre-upgrade`: Before upgrade
|
|
451
|
+
- `post-upgrade`: After upgrade
|
|
452
|
+
- `pre-rollback`: Before rollback
|
|
453
|
+
- `post-rollback`: After rollback
|
|
454
|
+
- `test`: Run with `helm test`
|
|
455
|
+
|
|
456
|
+
### Hook Weight
|
|
457
|
+
|
|
458
|
+
Controls hook execution order (-5 to 5, lower runs first)
|
|
459
|
+
|
|
460
|
+
### Hook Deletion Policies
|
|
461
|
+
|
|
462
|
+
- `before-hook-creation`: Delete previous hook before new one
|
|
463
|
+
- `hook-succeeded`: Delete after successful execution
|
|
464
|
+
- `hook-failed`: Delete if hook fails
|
|
465
|
+
|
|
466
|
+
## Best Practices
|
|
467
|
+
|
|
468
|
+
1. **Use helpers** for repeated template logic
|
|
469
|
+
2. **Quote strings** in templates: `{{ .Values.name | quote }}`
|
|
470
|
+
3. **Validate values** with values.schema.json
|
|
471
|
+
4. **Document all values** in values.yaml
|
|
472
|
+
5. **Use semantic versioning** for chart versions
|
|
473
|
+
6. **Pin dependency versions** exactly
|
|
474
|
+
7. **Include NOTES.txt** with usage instructions
|
|
475
|
+
8. **Add tests** for critical functionality
|
|
476
|
+
9. **Use hooks** for database migrations
|
|
477
|
+
10. **Keep charts focused** - one application per chart
|
|
478
|
+
|
|
479
|
+
## Chart Repository Structure
|
|
480
|
+
|
|
481
|
+
```
|
|
482
|
+
helm-charts/
|
|
483
|
+
├── index.yaml
|
|
484
|
+
├── my-app-1.0.0.tgz
|
|
485
|
+
├── my-app-1.1.0.tgz
|
|
486
|
+
├── my-app-1.2.0.tgz
|
|
487
|
+
└── another-chart-2.0.0.tgz
|
|
488
|
+
```
|
|
489
|
+
|
|
490
|
+
### Creating Repository Index
|
|
491
|
+
|
|
492
|
+
```bash
|
|
493
|
+
helm repo index . --url https://charts.example.com
|
|
494
|
+
```
|
|
495
|
+
|
|
496
|
+
## Related Resources
|
|
497
|
+
|
|
498
|
+
- [Helm Documentation](https://helm.sh/docs/)
|
|
499
|
+
- [Chart Template Guide](https://helm.sh/docs/chart_template_guide/)
|
|
500
|
+
- [Best Practices](https://helm.sh/docs/chart_best_practices/)
|