<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Code &amp; Infra by Roberto Scudeller</title><description>About SRE/DevOps/Platform related topics</description><link>https://betorvs.github.io/</link><language>en</language><copyright>Copyright 2026, Roberto Scudeller</copyright><lastBuildDate>Mon, 01 Jun 2026 16:22:56 -0300</lastBuildDate><generator>Hugo - gohugo.io</generator><docs>http://cyber.harvard.edu/rss/rss.html</docs><atom:link href="https://betorvs.github.io//atom.xml" rel="self" type="application/atom+xml"/><item><title>E2E Helm Tests</title><link>https://betorvs.github.io/posts/e2e-helm-tests/</link><description>&lt;h1 id="moving-beyond-helm-lint-how-to-run-true-e2e-tests-on-your-charts"&gt;Moving Beyond Helm Lint: How to Run True E2E Tests on Your Charts&lt;/h1&gt;
&lt;p&gt;We’ve all been there: &lt;code&gt;helm lint&lt;/code&gt; passes perfectly, your syntax looks flawless, and you confidently push your chart to production—only for it to crash because of a misspelled environment variable or a misconfigured service account.&lt;/p&gt;
&lt;p&gt;Linting ensures your files are valid YAML and follow best practices. But it doesn&amp;rsquo;t tell you if your templates will &lt;em&gt;actually&lt;/em&gt; deploy and function correctly inside a real Kubernetes cluster.&lt;/p&gt;
&lt;p&gt;To fix that, we need automated End-to-End (E2E) testing. In this post, I’ll walk you through a simple, reproducible workflow to spin up a local ephemeral cluster, deploy your chart, run your test suites, and clean everything up.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="the-e2e-testing-workflow"&gt;The E2E Testing Workflow&lt;/h2&gt;
&lt;p&gt;First try to run this example create in this repository below then apply it to your own helm chart.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Clone it:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; git clone git@github.com:betorvs/article-e2e-helm-tests.git
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="2"&gt;
&lt;li&gt;Make sure you have all requirements and using &lt;a href="https://taskfile.dev/"&gt;Task&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; task init
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; task tidy
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; task e2e-tests
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="3"&gt;
&lt;li&gt;Check the content of &lt;code&gt;example_kind_test.go&lt;/code&gt; and verify &lt;code&gt;TestExample&lt;/code&gt; function to understand what you can improve to test your application better.&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75af00"&gt;podName&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; &lt;span style="color:#d88200"&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#00a8c8"&gt;for&lt;/span&gt; &lt;span style="color:#75af00"&gt;_&lt;/span&gt;&lt;span style="color:#111"&gt;,&lt;/span&gt; &lt;span style="color:#75af00"&gt;pod&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; &lt;span style="color:#00a8c8"&gt;range&lt;/span&gt; &lt;span style="color:#75af00"&gt;podList&lt;/span&gt;&lt;span style="color:#111"&gt;.&lt;/span&gt;&lt;span style="color:#75af00"&gt;Items&lt;/span&gt; &lt;span style="color:#111"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;if&lt;/span&gt; &lt;span style="color:#75af00"&gt;strings&lt;/span&gt;&lt;span style="color:#111"&gt;.&lt;/span&gt;&lt;span style="color:#75af00"&gt;HasPrefix&lt;/span&gt;&lt;span style="color:#111"&gt;(&lt;/span&gt;&lt;span style="color:#75af00"&gt;pod&lt;/span&gt;&lt;span style="color:#111"&gt;.&lt;/span&gt;&lt;span style="color:#75af00"&gt;Name&lt;/span&gt;&lt;span style="color:#111"&gt;,&lt;/span&gt; &lt;span style="color:#d88200"&gt;&amp;#34;example-e2e-kind&amp;#34;&lt;/span&gt;&lt;span style="color:#111"&gt;)&lt;/span&gt; &lt;span style="color:#111"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75af00"&gt;t&lt;/span&gt;&lt;span style="color:#111"&gt;.&lt;/span&gt;&lt;span style="color:#75af00"&gt;Logf&lt;/span&gt;&lt;span style="color:#111"&gt;(&lt;/span&gt;&lt;span style="color:#d88200"&gt;&amp;#34;Found pod %v with status %v&amp;#34;&lt;/span&gt;&lt;span style="color:#111"&gt;,&lt;/span&gt; &lt;span style="color:#75af00"&gt;pod&lt;/span&gt;&lt;span style="color:#111"&gt;.&lt;/span&gt;&lt;span style="color:#75af00"&gt;Name&lt;/span&gt;&lt;span style="color:#111"&gt;,&lt;/span&gt; &lt;span style="color:#75af00"&gt;pod&lt;/span&gt;&lt;span style="color:#111"&gt;.&lt;/span&gt;&lt;span style="color:#75af00"&gt;Status&lt;/span&gt;&lt;span style="color:#111"&gt;.&lt;/span&gt;&lt;span style="color:#75af00"&gt;Phase&lt;/span&gt;&lt;span style="color:#111"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75af00"&gt;podName&lt;/span&gt; &lt;span style="color:#111"&gt;=&lt;/span&gt; &lt;span style="color:#75af00"&gt;pod&lt;/span&gt;&lt;span style="color:#111"&gt;.&lt;/span&gt;&lt;span style="color:#75af00"&gt;Name&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#00a8c8"&gt;break&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#111"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#111"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#00a8c8"&gt;if&lt;/span&gt; &lt;span style="color:#75af00"&gt;podName&lt;/span&gt; &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#d88200"&gt;&amp;#34;&amp;#34;&lt;/span&gt; &lt;span style="color:#111"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75af00"&gt;t&lt;/span&gt;&lt;span style="color:#111"&gt;.&lt;/span&gt;&lt;span style="color:#75af00"&gt;Fatalf&lt;/span&gt;&lt;span style="color:#111"&gt;(&lt;/span&gt;&lt;span style="color:#d88200"&gt;&amp;#34;Failed to find pod with name prefix example-e2e-kind&amp;#34;&lt;/span&gt;&lt;span style="color:#111"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#111"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; In this case I was looking for this pod in any state, but you can be more precise here and even call specific commands to test your application.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="why-this-matters"&gt;Why This Matters&lt;/h2&gt;
&lt;p&gt;By wrapping this exact sequence into a local go script and re-use it in your CI pipeline (like GitHub Actions), you achieve absolute confidence in your deployments. If a template change breaks a deployment hook or an ingress configuration, you catch it in seconds on your local machine instead of minutes into a production outage.&lt;/p&gt;
&lt;p&gt;All the code, sample charts, and automated scripts for this setup are available in my repository.&lt;/p&gt;
&lt;p&gt;Check out the full implementation here: &lt;strong&gt;&lt;a href="https://github.com/betorvs/article-e2e-helm-tests"&gt;github.com/betorvs/article-e2e-helm-tests&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Happy deploying!&lt;/p&gt;</description><author>Roberto Scudeller</author><guid>https://betorvs.github.io/posts/e2e-helm-tests/</guid><pubDate>Mon, 01 Jun 2026 16:22:56 -0300</pubDate></item></channel></rss>