CLI that creates Helm charts from kubernetes manifests.
Helmify reads a list of supported k8s objects from stdin and converts it to a helm chart. Designed to generate charts for k8s operators but not limited to. See examples of charts generated by helmify.
Supports Helm >=v3.6.0
Submit issue if some features missing for your use-case.
-
As pipe:
cat my-app.yaml | helmify mychart
Will create 'mychart' directory with Helm chart from yaml file with k8s objects.
awk 'FNR==1 && NR!=1 {print "---"}{print}' /<my_directory>/*.yaml | helmify mychart
Will create 'mychart' directory with Helm chart from all yaml files in
<my_directory>
directory. -
From filesystem:
helmify -f /my_directory/my-app.yaml mychart
Will create 'mychart' directory with Helm chart from
my_directory/my-app.yaml
.helmify -f /my_directory mychart
Will create 'mychart' directory with Helm chart from all yaml files in
<my_directory>
directory.helmify -f /my_directory -r mychart
Will create 'mychart' directory with Helm chart from all yaml files in
<my_directory>
directory recursively.helmify -f ./first_dir -f ./second_dir/my_deployment.yaml -f ./third_dir mychart
Will create 'mychart' directory with Helm chart from multiple directories and files.
-
From kustomize output:
kustomize build <kustomize_dir> | helmify mychart
Will create 'mychart' directory with Helm chart from kustomize output.
- Open
Makefile
in your operator project generated by Operator-SDK or Kubebuilder. - Add these lines to
Makefile
:
- With operator-sdk version < v1.23.0
HELMIFY = $(shell pwd)/bin/helmify helmify: $(call go-get-tool,$(HELMIFY),github.com/arttor/helmify/cmd/[email protected]) helm: manifests kustomize helmify $(KUSTOMIZE) build config/default | $(HELMIFY)
- With operator-sdk version >= v1.23.0
HELMIFY ?= $(LOCALBIN)/helmify .PHONY: helmify helmify: $(HELMIFY) ## Download helmify locally if necessary. $(HELMIFY): $(LOCALBIN) test -s $(LOCALBIN)/helmify || GOBIN=$(LOCALBIN) go install github.com/arttor/helmify/cmd/helmify@latest helm: manifests kustomize helmify $(KUSTOMIZE) build config/default | $(HELMIFY)
- Run
make helm
in project root. It will generate helm chart with name 'chart' in 'chart' directory.
With Homebrew (for MacOS or Linux): brew install arttor/tap/helmify
Or download suitable for your system binary from the Releases page. Unpack the helmify binary and add it to your PATH and you are good to go!
Helmify takes a chart name for an argument. Usage:
helmify [flags] CHART_NAME
- CHART_NAME
is optional. Default is 'chart'. Can be a directory, e.g. 'deploy/charts/mychart'.
flag | description | sample |
---|---|---|
-h -help | Prints help | helmify -h |
-f | File source for k8s manifests (directory or file), multiple sources supported | helmify -f ./test_data |
-r | Scan file directory recursively. Used only if -f provided | helmify -f ./test_data -r |
-v | Enable verbose output. Prints WARN and INFO. | helmify -v |
-vv | Enable very verbose output. Also prints DEBUG. | helmify -vv |
-version | Print helmify version. | helmify -version |
-crd-dir | Place crds in their own folder per Helm 3 docs. Caveat: CRDs templating is not supported by Helm. | helmify -crd-dir |
-image-pull-secrets | Allows the user to use existing secrets as imagePullSecrets | helmify -image-pull-secrets |
-original-name | Use the object's original name instead of adding the chart's release name as the common prefix. | helmify -original-name |
-cert-manager-as-subchart | Allows the user to install cert-manager as a subchart | helmify -cert-manager-as-subchart |
-cert-manager-version | Allows the user to specify cert-manager subchart version. Only useful with cert-manager-as-subchart. (default "v1.12.2") | helmify -cert-manager-version=v1.12.2 |
-cert-manager-install-crd | Allows the user to install cert-manager CRD as part of the cert-manager subchart.(default "true") | helmify -cert-manager-install-crd |
-preserve-ns | Allows users to use the object's original namespace instead of adding all the resources to a common namespace. (default "false") | helmify -preserve-ns |
-add-webhook-option | Adds an option to enable/disable webhook installation | helmify -add-webhook-option |
Supported k8s resources:
- Deployment, DaemonSet, StatefulSet
- Job, CronJob
- Service, Ingress
- PersistentVolumeClaim
- RBAC (ServiceAccount, (cluster-)role, (cluster-)roleBinding)
- configs (ConfigMap, Secret)
- webhooks (cert, issuer, ValidatingWebhookConfiguration)
- custom resource definitions (CRD)
- Helmify will not overwrite
Chart.yaml
file if presented. Done on purpose. - Helmify will not delete existing template files, only overwrite.
- Helmify overwrites templates and values files on every run. This means that all your manual changes in helm template files will be lost on the next run.
- if switching between the using the
-crd-dir
flag it is better to delete and regenerate the from scratch to ensure crds are not accidentally spliced/formatted into the same chart. Bear in mind you will want to update yourChart.yaml
thereafter.
To support a new type of k8s object template:
- Implement
helmify.Processor
interface. Place implementation inpkg/processor
. The package contains examples for most k8s objects. - Register your processor in the
pkg/app/app.go
- Add relevant input sample to
test_data/kustomize.output
.
Clone repo and execute command:
cat test_data/k8s-operator-kustomize.output | go run ./cmd/helmify mychart
Will generate mychart
Helm chart form file test_data/k8s-operator-kustomize.output
representing typical operator
kustomize output.
For manual testing, run program with debug output:
cat test_data/k8s-operator-kustomize.output | go run ./cmd/helmify -vv mychart
Then inspect logs and generated chart in ./mychart
directory.
To execute tests, run:
go test ./...
Beside unit-tests, project contains e2e test pkg/app/app_e2e_test.go
.
It's a go test, which uses test_data/*
to generate a chart in temporary directory.
Then runs helm lint --strict
to check if generated chart is valid.
Following rules will help changes to be accepted faster:
- For more than one-line bugfixes consider creating an issue with bug description or feature request
- For feature request try to think about and cover following topics (when applicable):
- Motivation: why feature is needed? Which problem does it solve? What is current workaround?
- Backward-compatibility: existing users expect that after upgrading helmify version their existing generated charts wont be changed without consent.
- For bugfix PR consider adding example to /test_data source yamls reproducing bug.
Check list before submitting PR:
- Run
go fmt ./...
- Run tests
go test ./...
- Update chart examples:
cat test_data/sample-app.yaml | go run ./cmd/helmify examples/app
cat test_data/k8s-operator-kustomize.output | go run ./cmd/helmify examples/operator
- In case of long commit history (more than 3) squash local commits into one