So that you don't have to write values.schema.json by hand from scratch for your Helm 3 charts
Helm plugin to generate JSON Schema for values yaml
Nothing fancy about the code, all the heavy lifting is done by:
- go-jsonschema-generator - for generating JSON schema. It's a fork of this. Thanks to @mcuadros
- go-yaml - for YAML parsing
- cobra - for CLI stuff
- The Go stdlib - for everything else
The plugin works with both Helm v2 and v3 versions as it's agnostic to the Helm binary version
$ helm plugin install https://github.com/hajowieland/helm-schema-gen
hajowieland/helm-schema-gen info checking GitHub for tag '0.0.11'
hajowieland/helm-schema-gen info found version: 0.0.11 for 0.0.11/Darwin/arm64
hajowieland/helm-schema-gen info installed ./bin/helm-schema-gen
Installed plugin: schema-gen
But note that the schema feature is present only in Helm v3 charts, so Helm chart still has to be v3, meaning - based on the Helm chart v3 spec. And the schema validation is only done in Helm v3. Read more in the Schema Files section of the Helm official docs.
The plugin works with both Helm v2 and v3 versions
Let's take a sample values.yaml
like the below
replicaCount: 1
image:
repository: nginx
pullPolicy: IfNotPresent
imagePullSecrets: []
nameOverride: ""
fullnameOverride: ""
serviceAccount:
# Specifies whether a service account should be created
create: true
# The name of the service account to use.
# If not set and create is true, a name is generated using the fullname template
name:
podSecurityContext: {}
# fsGroup: 2000
securityContext: {}
# capabilities:
# drop:
# - ALL
# readOnlyRootFilesystem: true
# runAsNonRoot: true
# runAsUser: 1000
service:
type: ClusterIP
port: 80
ingress:
enabled: false
annotations: {}
# kubernetes.io/ingress.class: nginx
# kubernetes.io/tls-acme: "true"
hosts:
- host: chart-example.local
paths: []
tls: []
# - secretName: chart-example-tls
# hosts:
# - chart-example.local
resources: {}
# We usually recommend not to specify default resources and to leave this as a conscious
# choice for the user. This also increases chances charts run on environments with little
# resources, such as Minikube. If you do want to specify resources, uncomment the following
# lines, adjust them as necessary, and remove the curly braces after 'resources:'.
# limits:
# cpu: 100m
# memory: 128Mi
# requests:
# cpu: 100m
# memory: 128Mi
nodeSelector: {}
tolerations: []
affinity: {}
Now if you use the plugin and pass the values.yaml
to it, you will
get the JSON Schema for the values.yaml
$ helm schema-gen values.yaml
{
"$schema": "http://json-schema.org/schema#",
"type": "object",
"properties": {
"affinity": {
"type": "object"
},
"fullnameOverride": {
"type": "string"
},
"image": {
"type": "object",
"properties": {
"pullPolicy": {
"type": "string"
},
"repository": {
"type": "string"
}
}
},
"imagePullSecrets": {
"type": "array"
},
"ingress": {
"type": "object",
"properties": {
"annotations": {
"type": "object"
},
"enabled": {
"type": "boolean"
},
"hosts": {
"type": "array",
"items": {
"type": "object",
"properties": {
"host": {
"type": "string"
},
"paths": {
"type": "array"
}
}
}
},
"tls": {
"type": "array"
}
}
},
"nameOverride": {
"type": "string"
},
"nodeSelector": {
"type": "object"
},
"podSecurityContext": {
"type": "object"
},
"replicaCount": {
"type": "integer"
},
"resources": {
"type": "object"
},
"securityContext": {
"type": "object"
},
"service": {
"type": "object",
"properties": {
"port": {
"type": "integer"
},
"type": {
"type": "string"
}
}
},
"serviceAccount": {
"type": "object",
"properties": {
"create": {
"type": "boolean"
},
"name": {
"type": "null"
}
}
},
"tolerations": {
"type": "array"
}
}
}
You can save it to a file like this
helm schema-gen values.yaml > values.schema.json
- Update version in
plugin.yaml
- Update version in
scripts/install_version.sh
- Release a git tag with version
Put them all in GitHub issues