Declaratively deploy your Kubernetes manifests, Kustomize configs, and Charts as Helm releases in one shot
Go to file
Yusuke Kuoka 6664f01596
Use goccy/go-yaml for v1 / Prep bringing back go-yaml v2 for v0.x (#604)
This is a successor to #596. We need a smooth migration path from `gopkg.in/yaml.v2`, and this pull request moves it forward with `goccy/go-yaml` instead of `gopkg.in/yaml.v3`. Merging this unblocks users stuck in Helmfile v0.146.x or earlier due to #435, so that they can upgrade to 0.147.x or greater without updating their helmfile configs.

We previously tried to upgrade to `yaml.v3` (https://github.com/helmfile/helmfile/issues/394) in Helmfile v0.x, presuming it won't break anything. Apparently, it broke use-cases where you want to layer release's `values` field over three or more release templates and releases (#435).

We then tried to bring back `yaml.v2` for Helmfile v0.x and keep `yaml.v3` for the upcoming Helmfile v1. However, it failed due to incompatibility in the Unmarshaller interface between `yaml.v2` and `yaml.v3` (https://github.com/helmfile/helmfile/pull/596).

`goccy/go-yaml` is, from my observation, a well-maintained alternative to `yaml.v2`. One of its premises is that it enables us to swap the implementation from `gopkg.in/yaml.v2` to `goccy/go-yaml` just by replacing the import directive. It seems to use the same `Unmarshaller` interface as yaml.v2 too.

Once this PR gets merged, I'd like to follow-up with adding a new build-time variable and an envvar to set the proper default for the yaml parser Helmfile uses and the ability to switch the parser at runtime. All in all, the next Helmfile release, v0.150.0 will get reverted to use `gopkg.in/yaml.v2` by default which resolves #435.

New users who started using Helmfile since any of v0.148.0, v0.148.1, and v0.149.0 might be already relying on the new behavior, They might need to specify a new envvar to enable `goccy/go-yaml`.

Signed-off-by: yxxhero <aiopsclub@163.com>
Signed-off-by: yxxhero <aiopsclub@163.com>
Co-authored-by: yxxhero <aiopsclub@163.com>
2022-12-27 10:14:35 +09:00
.github feat: Helmfile V1 mode (#594) 2022-12-22 20:30:44 +09:00
cmd Re: Remove deprecated args and cmd for v1.0.0 (#598) 2022-12-23 08:29:03 +08:00
docs add goreportcard (#595) 2022-12-21 23:46:31 +08:00
examples Rename module to github.com/helmfile/helmfile 2022-05-18 10:05:07 -04:00
hack release: fix hack/semtag when there are one or more git remotes before `origin` 2019-01-22 01:29:28 +09:00
logo Add logo as .png and .ai (Adobe Illustrator) files (#263) 2022-08-24 07:37:52 +09:00
pkg Use goccy/go-yaml for v1 / Prep bringing back go-yaml v2 for v0.x (#604) 2022-12-27 10:14:35 +09:00
test Use goccy/go-yaml for v1 / Prep bringing back go-yaml v2 for v0.x (#604) 2022-12-27 10:14:35 +09:00
.dockerignore rework dockerfiles (#519) 2022-11-25 10:14:27 +09:00
.editorconfig Improve capitalization and formats of README.md. (#1545) 2020-10-19 08:47:19 +09:00
.gitignore use dyff as yamldiff tool (#542) 2022-11-27 09:47:09 +09:00
.golangci.yaml optimize lint logic (#586) 2022-12-18 08:39:45 +08:00
.goreleaser.yml feat: Helmfile V1 mode (#594) 2022-12-22 20:30:44 +09:00
.readthedocs.yaml Documentation site based on mkdocs and Read the Docs 2022-04-03 05:04:54 +00:00
CODEOWNERS add xiaomudk as maintainer (#504) 2022-12-13 13:12:07 +08:00
CONTRIBUTING.md Rename module to github.com/helmfile/helmfile 2022-05-18 10:05:07 -04:00
Dockerfile Sops and gpg command (#597) 2022-12-23 21:51:53 +08:00
Dockerfile.debian-stable-slim Sops and gpg command (#597) 2022-12-23 21:51:53 +08:00
Dockerfile.ubuntu Sops and gpg command (#597) 2022-12-23 21:51:53 +08:00
LICENSE Create LICENSE 2017-11-10 16:07:38 -05:00
Makefile feat: Helmfile V1 mode (#594) 2022-12-22 20:30:44 +09:00
README.md add goreportcard (#595) 2022-12-21 23:46:31 +08:00
SECURITY.md Create SECURITY.md (#135) 2022-06-05 17:11:54 +09:00
USERS.md add NDR to USERS.md 2022-08-30 11:20:08 +02:00
Vagrantfile Enable `helmfile-diff` to pass the output format to helm-diff (#1784) 2021-04-24 08:07:24 +09:00
go.mod Use goccy/go-yaml for v1 / Prep bringing back go-yaml v2 for v0.x (#604) 2022-12-27 10:14:35 +09:00
go.sum Use goccy/go-yaml for v1 / Prep bringing back go-yaml v2 for v0.x (#604) 2022-12-27 10:14:35 +09:00
main.go fix typo 2022-10-24 20:01:13 +08:00
mkdocs.yml fix docs site issue 2022-07-08 08:36:02 +08:00

README.md

Helmfile

Tests Container Image Repository on GHCR Go Report Card Slack Community #helmfile Documentation

Deploy Kubernetes Helm Charts

About

Helmfile is a declarative spec for deploying helm charts. It lets you...

  • Keep a directory of chart value files and maintain changes in version control.
  • Apply CI/CD to configuration changes.
  • Periodically sync to avoid skew in environments.

To avoid upgrades for each iteration of helm, the helmfile executable delegates to helm - as a result, helm must be installed.

Highlights

Declarative: Write, version-control, apply the desired state file for visibility and reproducibility.

Modules: Modularize common patterns of your infrastructure, distribute it via Git, S3, etc. to be reused across the entire company (See #648)

Versatility: Manage your cluster consisting of charts, kustomizations, and directories of Kubernetes resources, turning everything to Helm releases (See #673)

Patch: JSON/Strategic-Merge Patch Kubernetes resources before helm-installing, without forking upstream charts (See #673)

Status

March 2022 Update - The helmfile project has been moved to helmfile/helmfile from the former home roboll/helmfile. Please see roboll/helmfile#1824 for more information.

Even though Helmfile is used in production environments across multiple organizations, it is still in its early stage of development, hence versioned 0.x.

Helmfile complies to Semantic Versioning 2.0.0 in which v0.x means that there could be backward-incompatible changes for every release.

Note that we will try our best to document any backward incompatibility. And in reality, helmfile had no breaking change for a year or so.

Installation

  • download one of releases
  • run as a container
  • Archlinux: install via pacman -S helmfile
  • openSUSE: install via zypper in helmfile assuming you are on Tumbleweed; if you are on Leap you must add the kubic repo for your distribution version once before that command, e.g. zypper ar https://download.opensuse.org/repositories/devel:/kubic/openSUSE_Leap_\$releasever kubic
  • Windows (using scoop): scoop install helmfile
  • macOS (using homebrew): brew install helmfile

Getting Started

Let's start with a simple helmfile and gradually improve it to fit your use-case!

Suppose the helmfile.yaml representing the desired state of your helm releases looks like:

repositories:
 - name: prometheus-community
   url: https://prometheus-community.github.io/helm-charts

releases:
- name: prom-norbac-ubuntu
  namespace: prometheus
  chart: prometheus-community/prometheus
  set:
  - name: rbac.create
    value: false

Sync your Kubernetes cluster state to the desired one by running:

helmfile apply

Congratulations! You now have your first Prometheus deployment running inside your cluster.

Iterate on the helmfile.yaml by referencing:

Docs

Please read complete documentation

Contributing

Welcome to contribute together to make helmfile better: contributing doc

Attribution

We use:

  • semtag for automated semver tagging. I greatly appreciate the author(pnikosis)'s effort on creating it and their kindness to share it!

Users

Helmfile has been used by many users in production:

For more users, please see: Users