{"id":49952,"date":"2025-07-05T10:21:15","date_gmt":"2025-07-05T10:21:15","guid":{"rendered":"https:\/\/www.devopsschool.com\/blog\/?p=49952"},"modified":"2025-07-05T10:21:15","modified_gmt":"2025-07-05T10:21:15","slug":"helmfile-tutorial-from-beginner-to-advanced","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/helmfile-tutorial-from-beginner-to-advanced\/","title":{"rendered":"Helmfile Tutorial: From Beginner to Advanced"},"content":{"rendered":"\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\"><\/h1>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>1. Introduction to Helmfile<\/strong><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>What is Helmfile?<\/strong><\/h3>\n\n\n\n<p>Helmfile is an open-source tool that lets you <strong>declare, manage, and deploy multiple Helm charts<\/strong> as a unified, version-controlled \u201cdesired state\u201d for your Kubernetes clusters.<br>It addresses the challenge of coordinating several Helm releases, environment variations, and values files with <strong>YAML-based configuration and automation<\/strong>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Why Use Helmfile?<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Declarative:<\/strong> Manage all Helm releases in one file.<\/li>\n\n\n\n<li><strong>Templating:<\/strong> Templatize values for different environments.<\/li>\n\n\n\n<li><strong>Idempotency:<\/strong> Ensure your clusters match your defined state.<\/li>\n\n\n\n<li><strong>GitOps-friendly:<\/strong> Store configs in Git for auditable deployments.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Common Use Cases<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Managing microservices where each service has its own Helm chart.<\/li>\n\n\n\n<li>Promoting app stacks across dev\/staging\/prod with environment-specific settings.<\/li>\n\n\n\n<li>Enabling repeatable, auditable, and automated deployments in CI\/CD pipelines.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>2. Installing and Setting Up Helmfile<\/strong><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Prerequisites<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/helm.sh\/docs\/intro\/install\/\" target=\"_blank\" rel=\"noopener\">Helm v3.x<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/kubernetes.io\/docs\/tasks\/tools\/\" target=\"_blank\" rel=\"noopener\">kubectl<\/a><\/li>\n\n\n\n<li>Kubernetes cluster access (minikube, KIND, EKS, GKE, etc.)<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Install Helmfile<\/strong><\/h3>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>Using Homebrew (macOS\/Linux):<\/strong><\/h4>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">brew install helmfile\n<\/code><\/span><\/pre>\n\n\n<h4 class=\"wp-block-heading\"><strong>Binary Download (All Platforms):<\/strong><\/h4>\n\n\n\n<p>Download the <a href=\"https:\/\/github.com\/helmfile\/helmfile\/releases\/latest\" target=\"_blank\" rel=\"noopener\">latest release<\/a> and move to your <code>PATH<\/code>.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>Check Installation:<\/strong><\/h4>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">helmfile --version\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>3. Understanding <code>helmfile.yaml<\/code> Structure and Syntax<\/strong><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Minimal Example<\/strong><\/h3>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\"># helmfile.yaml\nreleases:\n  - name: nginx\n    namespace: web\n    chart: bitnami\/nginx\n    version: 13.2.17\n    values:\n      - values\/nginx-values.yaml\n<\/code><\/span><\/pre>\n\n\n<h3 class=\"wp-block-heading\"><strong>Key Sections<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>releases:<\/strong> List of Helm releases to deploy.<\/li>\n\n\n\n<li><strong>chart:<\/strong> Chart reference (<code>repo\/chartname<\/code> or local path).<\/li>\n\n\n\n<li><strong>namespace:<\/strong> Kubernetes namespace for the release.<\/li>\n\n\n\n<li><strong>version:<\/strong> Chart version (optional).<\/li>\n\n\n\n<li><strong>values:<\/strong> List of values YAML files.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Other Useful Fields<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>secrets:<\/strong> Encrypted value files (see secret management).<\/li>\n\n\n\n<li><strong>dependsOn:<\/strong> Set deployment order.<\/li>\n\n\n\n<li><strong>labels:<\/strong> Tag releases for grouping\/selectors.<\/li>\n\n\n\n<li><strong>environment:<\/strong> Global and release-level environment overrides.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>4. Managing Single and Multiple Helm Releases<\/strong><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Single Release Example<\/strong><\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">releases:\n  - name: redis\n    <span class=\"hljs-keyword\">namespace<\/span>: <span class=\"hljs-title\">data<\/span>\n    <span class=\"hljs-title\">chart<\/span>: <span class=\"hljs-title\">bitnami<\/span>\/<span class=\"hljs-title\">redis<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\"><strong>Multiple Releases Example<\/strong><\/h3>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">releases:\n  - name: backend\n    chart: stable\/myapp-backend\n    namespace: myapp\n    values: &#91;values\/backend.yaml]\n  - name: frontend\n    chart: stable\/myapp-frontend\n    namespace: myapp\n    values: &#91;values\/frontend.yaml]\n<\/code><\/span><\/pre>\n\n\n<p>Helmfile will install\/upgrade both charts in order.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>5. Organizing and Templating Values Files (Per-Environment)<\/strong><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Directory Layout<\/strong><\/h3>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">helmfile.yaml\nenvironments\/\n  dev.yaml\n  staging.yaml\n  prod.yaml\nvalues\/\n  backend.yaml\n  frontend.yaml\n<\/code><\/span><\/pre>\n\n\n<h3 class=\"wp-block-heading\"><strong>Per-Environment Values<\/strong><\/h3>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">environments:\n  dev:\n    values:\n      - environments\/dev.yaml\n  prod:\n    values:\n      - environments\/prod.yaml\n<\/code><\/span><\/pre>\n\n\n<p>Run with:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">helmfile -e dev apply\nhelmfile -e prod apply\n<\/code><\/span><\/pre>\n\n\n<h3 class=\"wp-block-heading\"><strong>Templated Values Files<\/strong><\/h3>\n\n\n\n<p>Helmfile supports Go templating:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">releases:\n  - name: <span class=\"hljs-string\">\"{{ .Environment.Name }}-backend\"<\/span>\n    <span class=\"hljs-attr\">values<\/span>:\n      - <span class=\"hljs-string\">\"values\/backend-{{ .Environment.Name }}.yaml\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>6. Using Environment Variables and Secret Management<\/strong><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Environment Variables<\/strong><\/h3>\n\n\n\n<p>Reference in <code>helmfile.yaml<\/code> using Go templating:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">releases:\n  - name: api\n    <span class=\"hljs-attr\">chart<\/span>: myorg\/api\n    <span class=\"hljs-attr\">values<\/span>:\n      - db_password: <span class=\"hljs-string\">\"{{ requiredEnv \"<\/span>DB_PASSWORD<span class=\"hljs-string\">\" }}\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Set variables:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">export<\/span> DB_PASSWORD=supersecret\nhelmfile apply\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\"><strong>Secret Management<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Use <a href=\"https:\/\/github.com\/mozilla\/sops\" target=\"_blank\" rel=\"noopener\">sops<\/a> to encrypt secrets.<\/li>\n\n\n\n<li>Reference them in your <code>helmfile.yaml<\/code>:<\/li>\n<\/ul>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">releases:\n  - name: secure-app\n    chart: myorg\/app\n    secrets:\n      - secrets\/app-secrets.enc.yaml\n<\/code><\/span><\/pre>\n\n\n<p>Helmfile will decrypt at runtime.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>7. Handling Dependencies and Release Ordering<\/strong><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><strong><code>needs<\/code>\/<code>dependsOn<\/code> Example<\/strong><\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">releases:\n  - name: db\n    chart: bitnami\/postgresql\n    <span class=\"hljs-keyword\">namespace<\/span>: <span class=\"hljs-title\">core<\/span>\n  - <span class=\"hljs-title\">name<\/span>: <span class=\"hljs-title\">api<\/span>\n    <span class=\"hljs-title\">chart<\/span>: <span class=\"hljs-title\">myorg<\/span>\/<span class=\"hljs-title\">api<\/span>\n    <span class=\"hljs-title\">namespace<\/span>: <span class=\"hljs-title\">core<\/span>\n    <span class=\"hljs-title\">needs<\/span>:\n      - <span class=\"hljs-title\">core<\/span>\/<span class=\"hljs-title\">db<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Here, <code>api<\/code> is deployed only after <code>db<\/code> is ready.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>8. Grouping Releases and Using Selectors<\/strong><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Labeling and Selecting<\/strong><\/h3>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">releases:\n  - name: frontend\n    labels: { tier: web }\n    chart: myorg\/frontend\n  - name: backend\n    labels: { tier: api }\n    chart: myorg\/backend\n<\/code><\/span><\/pre>\n\n\n<p>Deploy only frontend:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">helmfile --selector tier=web apply\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>9. Advanced Templating Features (Go Templating)<\/strong><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Use Go template expressions almost anywhere:<\/li>\n<\/ul>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">releases:\n  - name: <span class=\"hljs-string\">\"{{ .Environment.Name }}-{{ .Release.Name }}\"<\/span>\n    <span class=\"hljs-attr\">values<\/span>:\n      - <span class=\"hljs-string\">\"values\/{{ .Release.Name }}-{{ .Environment.Name }}.yaml\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<ul class=\"wp-block-list\">\n<li>Use <code>{{ env \"ENV_VAR\" }}<\/code> for custom environment variables.<\/li>\n<\/ul>\n\n\n\n<p><strong>Pro Tip:<\/strong><br>You can also include other YAML files with <code>{{ readFile \"path\" }}<\/code>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>10. Best Practices for Multi-Environment Management<\/strong><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Keep environments in separate files\/folders.<\/strong><\/li>\n\n\n\n<li><strong>Don\u2019t duplicate values:<\/strong> Use templates, <code>environments:<\/code>, and overlays.<\/li>\n\n\n\n<li><strong>Version lock your charts<\/strong> for reproducibility.<\/li>\n\n\n\n<li><strong>Store secrets encrypted<\/strong> with SOPS or Sealed Secrets.<\/li>\n<\/ul>\n\n\n\n<p><strong>Example:<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">environments:\n  staging:\n    values:\n      - environments\/staging.yaml\n  prod:\n    values:\n      - environments\/prod.yaml\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>11. Integrating Helmfile into GitOps &amp; CI\/CD Pipelines<\/strong><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Sample GitHub Actions Workflow<\/strong><\/h3>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">- name: Install Helmfile\n  run: brew install helmfile\n\n- name: Deploy (staging)\n  env:\n    KUBECONFIG: ${{ secrets.KUBECONFIG }}\n  run: |\n    helmfile -e staging apply\n<\/code><\/span><\/pre>\n\n\n<ul class=\"wp-block-list\">\n<li>Store your <code>KUBECONFIG<\/code> and secrets as CI\/CD secrets.<\/li>\n\n\n\n<li>Pin chart and Helmfile versions for consistent builds.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>12. Troubleshooting, Debugging, and Optimization<\/strong><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Preview changes:<\/strong> <code>helmfile diff<\/code><\/li>\n\n\n\n<li><strong>Verbose\/debug logs:<\/strong> <code>helmfile --log-level=debug apply<\/code><\/li>\n\n\n\n<li><strong>Dry-run mode:<\/strong> <code>helmfile apply --dry-run<\/code><\/li>\n\n\n\n<li><strong>Clean up:<\/strong> <code>helmfile destroy<\/code><\/li>\n<\/ul>\n\n\n\n<p><strong>Common Issues:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ensure all values\/secrets files exist and are correct.<\/li>\n\n\n\n<li>Double-check environment variable usage.<\/li>\n\n\n\n<li>Use <code>helmfile lint<\/code> to validate configs.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>13. Real-World Examples, Sample Configs, and Pro Tips<\/strong><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Sample Microservices Stack<\/strong><\/h3>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">environments:\n  dev:\n    values: &#91;environments\/dev.yaml]\nreleases:\n  - name: users\n    chart: myorg\/users\n    namespace: micro\n    values: &#91;values\/users.yaml]\n  - name: orders\n    chart: myorg\/orders\n    namespace: micro\n    values: &#91;values\/orders.yaml]\n    needs:\n      - micro\/users\n<\/code><\/span><\/pre>\n\n\n<h3 class=\"wp-block-heading\"><strong>Pro Tips<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Store your <code>helmfile.yaml<\/code> and values in Git for audit and rollback.<\/li>\n\n\n\n<li>Use <code>selectors<\/code> to deploy\/update only what\u2019s needed.<\/li>\n\n\n\n<li>Use <code>dependsOn\/needs<\/code> to manage inter-chart relationships.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>14. Comparison with Similar Tools<\/strong><\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Feature<\/th><th>Helmfile<\/th><th>Helmsman<\/th><th>Helmwave<\/th><\/tr><\/thead><tbody><tr><td>Declarative YAML Config<\/td><td>\u2705<\/td><td>\u2705<\/td><td>\u2705<\/td><\/tr><tr><td>Helm Dependency Handling<\/td><td>\u2705<\/td><td>\u2705 (via priority)<\/td><td>\u2705 (graph-based)<\/td><\/tr><tr><td>Parallel Execution<\/td><td>\ud83d\udeab (serial)<\/td><td>\ud83d\udeab<\/td><td>\u2705<\/td><\/tr><tr><td>Secrets Management<\/td><td>\u2705 (SOPS, etc)<\/td><td>\u2705 (native)<\/td><td>\u2705 (SOPS)<\/td><\/tr><tr><td>Drift Detection<\/td><td>\ud83d\udeab<\/td><td>\u2705<\/td><td>\ud83d\udeab<\/td><\/tr><tr><td>Policy\/RBAC Enforcement<\/td><td>\u26a0\ufe0f (Helm only)<\/td><td>\u2705<\/td><td>\u26a0\ufe0f<\/td><\/tr><tr><td>Most Used in Community<\/td><td>\u2705<\/td><td>\u26a0\ufe0f<\/td><td>\u26a0\ufe0f<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Helmfile:<\/strong> Most popular, flexible, and GitOps-centric.<\/li>\n\n\n\n<li><strong>Helmsman:<\/strong> Strong in governance and drift detection.<\/li>\n\n\n\n<li><strong>Helmwave:<\/strong> Great for parallel, modular deployments.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Conclusion<\/strong><\/h2>\n\n\n\n<p><strong>Helmfile<\/strong> is your go-to tool for scalable, declarative, and environment-aware Kubernetes application management with Helm.<br>It\u2019s beginner-friendly, highly customizable, and fits right into modern GitOps and CI\/CD workflows\u2014making Kubernetes app lifecycle management predictable and repeatable.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><strong>Want code samples, a live demo, or troubleshooting for your specific use case? Just ask!<\/strong><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Further Reading &amp; Resources<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/github.com\/helmfile\/helmfile\" target=\"_blank\" rel=\"noopener\">Helmfile Official Docs<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/github.com\/roboll\/helmfile\/tree\/master\/examples\" target=\"_blank\" rel=\"noopener\">Helmfile Examples<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/artifacthub.io\/\" target=\"_blank\" rel=\"noopener\">Helm Charts on Artifact Hub<\/a><\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>1. Introduction to Helmfile What is Helmfile? Helmfile is an open-source tool that lets you declare, manage, and deploy multiple Helm charts as a unified, version-controlled \u201cdesired state\u201d for your&#8230; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[2],"tags":[],"class_list":["post-49952","post","type-post","status-publish","format-standard","hentry","category-uncategorised"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/49952","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/comments?post=49952"}],"version-history":[{"count":1,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/49952\/revisions"}],"predecessor-version":[{"id":49953,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/49952\/revisions\/49953"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=49952"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=49952"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=49952"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}