<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Daniel</title>
    <description>The latest articles on DEV Community by Daniel (@danielox_83).</description>
    <link>https://dev.to/danielox_83</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3775594%2F02087504-dd83-43b9-b0d1-370edf0be9b0.png</url>
      <title>DEV Community: Daniel</title>
      <link>https://dev.to/danielox_83</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/danielox_83"/>
    <language>en</language>
    <item>
      <title>How to Prevent 'Undefined Environment Variable' Errors in Production (+ CI/CD Integration)</title>
      <dc:creator>Daniel</dc:creator>
      <pubDate>Mon, 16 Feb 2026 11:42:47 +0000</pubDate>
      <link>https://dev.to/danielox_83/how-to-prevent-undefined-environment-variable-errors-in-production-cicd-integration-1d8b</link>
      <guid>https://dev.to/danielox_83/how-to-prevent-undefined-environment-variable-errors-in-production-cicd-integration-1d8b</guid>
      <description>&lt;p&gt;We've all been there - your Node.js app works perfectly locally, you deploy to production, and suddenly:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Error: Cannot read property 'API_KEY' of undefined&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Or worse - your app starts but silently fails because &lt;code&gt;process.env.DATABASE_URL&lt;/code&gt; is undefined, and you only notice when users start complaining.&lt;/p&gt;

&lt;p&gt;Here's how to catch these issues before they reach production.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;Environment variables are essential for Node.js apps, but they're easy to mess up:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Typos&lt;/strong&gt;: &lt;code&gt;process.env.API_KEy&lt;/code&gt; instead of &lt;code&gt;process.env.API_KEY&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unused variables&lt;/strong&gt; cluttering your .env file (security risk)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Missing variables&lt;/strong&gt; in production that exist locally&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Variables defined but never used&lt;/strong&gt; (confusing for new team members)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AWS Secrets Manager mismatches&lt;/strong&gt; - your code expects variables that don't exist in Parameter Store&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Real-World Example
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// In your code&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;dbHost&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;AURORA_HOST&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;dbPort&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;AURORA_PORT&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// In your serverless.yml&lt;/span&gt;
&lt;span class="nl"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="nl"&gt;AURORA_HOST&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;self&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;custom&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;secrets_AURORA&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;host&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nl"&gt;AURORA_PORT&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;self&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;custom&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;secrets_AURORA&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;port&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// But did you actually create those nested keys in AWS Secrets Manager?&lt;/span&gt;
&lt;span class="c1"&gt;// You won't know until deployment fails... 💥&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Solutions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Manual Approach
&lt;/h3&gt;

&lt;p&gt;Create a checklist, review .env files before each deployment, manually verify AWS resources... boring, error-prone, and doesn't scale.&lt;/p&gt;

&lt;h3&gt;
  
  
  Automated Verification
&lt;/h3&gt;

&lt;p&gt;I built a tool to automate this (because I kept making these mistakes):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; @danielszlaski/envguard
envguard scan
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What it catches:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;✅ Variables used in code but not defined&lt;br&gt;&lt;br&gt;
✅ Variables defined but never used&lt;br&gt;&lt;br&gt;
✅ Typos in variable names&lt;br&gt;&lt;br&gt;
✅ Missing fallback handling  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example output:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;❌ Missing Variables:
  • DATABASE_URL (used in src/db/connection.js:12)
  • API_KEY (used in src/services/api.js:8)

⚠ Unused Variables:
  • OLD_LEGACY_VAR (defined in .env but never used)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Taking It Further: CI/CD Integration
&lt;/h2&gt;

&lt;p&gt;Finding issues on your laptop is good. &lt;strong&gt;Preventing them from reaching your repo is better.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Git Hooks (Pre-Commit/Pre-Push)
&lt;/h3&gt;

&lt;p&gt;The pro version includes automatic Git hook installation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install pre-commit hook&lt;/span&gt;
envguard install-hook

&lt;span class="c"&gt;# Install pre-push hook instead&lt;/span&gt;
envguard install-hook &lt;span class="nt"&gt;--type&lt;/span&gt; pre-push
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now every commit/push automatically runs validation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Running envguard scan...
❌ Missing Variables:
  • NEW_FEATURE_FLAG (used in src/features/new.js:5)

Pre-commit hook failed. Fix the issues above or use --no-verify to skip.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  GitHub Actions / CI Pipeline
&lt;/h3&gt;

&lt;p&gt;Add to your &lt;code&gt;.github/workflows/ci.yml&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Validate Environment Variables&lt;/span&gt;
  &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
    &lt;span class="s"&gt;npm install -g @danielszlaski/envguard&lt;/span&gt;
    &lt;span class="s"&gt;envguard scan --ci&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;--ci&lt;/code&gt; flag makes the command exit with code 1 if issues are found, failing your pipeline.&lt;/p&gt;

&lt;h3&gt;
  
  
  SARIF Output for GitHub Security Tab
&lt;/h3&gt;

&lt;p&gt;For compliance and security tracking:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;envguard scan &lt;span class="nt"&gt;--format&lt;/span&gt; sarif &lt;span class="nt"&gt;--output&lt;/span&gt; results.sarif
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then upload to GitHub Security:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Upload SARIF results&lt;/span&gt;
  &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;github/codeql-action/upload-sarif@v2&lt;/span&gt;
  &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;sarif_file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;results.sarif&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now environment variable issues appear in your Security tab alongside other vulnerabilities.&lt;/p&gt;

&lt;h2&gt;
  
  
  AWS Integration: The Missing Piece
&lt;/h2&gt;

&lt;p&gt;Here's a scenario I've seen too many times:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You define variables in &lt;code&gt;serverless.yml&lt;/code&gt; referencing AWS Secrets Manager&lt;/li&gt;
&lt;li&gt;You deploy successfully (because Serverless just reads the config)&lt;/li&gt;
&lt;li&gt;Your app starts but &lt;strong&gt;crashes at runtime&lt;/strong&gt; because the secrets don't exist in AWS&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Solution: Pre-Deployment AWS Validation
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Validate that AWS resources exist&lt;/span&gt;
envguard scan &lt;span class="nt"&gt;--aws&lt;/span&gt;

&lt;span class="c"&gt;# Also validate nested keys within secrets (deep validation)&lt;/span&gt;
envguard scan &lt;span class="nt"&gt;--aws&lt;/span&gt; &lt;span class="nt"&gt;--aws-deep&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Example serverless.yml:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;custom&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;secrets_AURORA&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${ssm:/aws/reference/secretsmanager/myapp/dev/aurora}&lt;/span&gt;

&lt;span class="na"&gt;provider&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;AURORA_HOST&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${self:custom.secrets_AURORA.host}&lt;/span&gt;
    &lt;span class="na"&gt;AURORA_PORT&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${self:custom.secrets_AURORA.port}&lt;/span&gt;
    &lt;span class="na"&gt;AURORA_USER&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${self:custom.secrets_AURORA.username}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Without validation:&lt;/strong&gt; Deploy → Runtime crash → "Secret key 'username' not found"&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;With &lt;code&gt;--aws-deep&lt;/code&gt;:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;✔ All AWS resources validated successfully
  Secrets Manager (1):
    • myapp/dev/aurora
      ├─ host ✔
      ├─ port ✔
      └─ username ✘ MISSING

❌ Missing Secret Keys:
   • myapp/dev/aurora.username (used by AURORA_USER)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You catch the issue &lt;strong&gt;before deployment&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Required IAM Permissions
&lt;/h3&gt;

&lt;p&gt;For basic validation (&lt;code&gt;--aws&lt;/code&gt;):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ssm:GetParameter&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;secretsmanager:DescribeSecret&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For deep validation (&lt;code&gt;--aws-deep&lt;/code&gt;):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;secretsmanager:GetSecretValue&lt;/code&gt; (to fetch and parse JSON)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Smart Fallback Detection
&lt;/h2&gt;

&lt;p&gt;Not all missing variables are critical. EnvGuard detects defensive coding patterns:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// These are warnings (not errors)&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;apiUrl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;API_URL&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://default-api.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;timeout&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;TIMEOUT&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="mi"&gt;5000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;debug&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;DEBUG&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// This is an error (no fallback)&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;dbUrl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;DATABASE_URL&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Will be undefined!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why this matters:&lt;/strong&gt; You can prioritize fixing actual errors while staying aware of all env var usage.&lt;/p&gt;

&lt;p&gt;Disable this if you want strict checking:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;envguard scan &lt;span class="nt"&gt;--no-detect-fallbacks&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Configuration File
&lt;/h2&gt;

&lt;p&gt;Create &lt;code&gt;.envguardrc.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"ignoreVars"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"NODE_ENV"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"CI"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"strict"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"detectFallbacks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"exclude"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"**/node_modules/**"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"**/dist/**"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"envFiles"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"set-env.sh"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Pro tip:&lt;/strong&gt; The &lt;code&gt;envFiles&lt;/code&gt; option lets you scan shell scripts too:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# In your set-env.sh&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"abc123"&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;DATABASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"postgres://..."&lt;/span&gt;

&lt;span class="c"&gt;# EnvGuard will pick these up&lt;/span&gt;
envguard scan &lt;span class="nt"&gt;--env-files&lt;/span&gt; set-env.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Complete CI/CD Workflow
&lt;/h2&gt;

&lt;p&gt;Here's my production setup:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Local development:&lt;/strong&gt; Pre-commit hook catches issues immediately&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. GitHub Actions:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Validate Environment&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;pull_request&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;validate&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v3&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Validate env vars&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;npm install -g @danielszlaski/envguard&lt;/span&gt;
          &lt;span class="s"&gt;envguard scan --ci --aws --aws-deep&lt;/span&gt;
        &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;AWS_REGION&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;eu-west-1&lt;/span&gt;
          &lt;span class="na"&gt;AWS_ACCESS_KEY_ID&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.AWS_ACCESS_KEY_ID }}&lt;/span&gt;
          &lt;span class="na"&gt;AWS_SECRET_ACCESS_KEY&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.AWS_SECRET_ACCESS_KEY }}&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Upload SARIF&lt;/span&gt;
        &lt;span class="na"&gt;if&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;always()&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;github/codeql-action/upload-sarif@v2&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;sarif_file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;results.sarif&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;3. Pre-deployment:&lt;/strong&gt; Final check before Serverless deploy&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;envguard scan &lt;span class="nt"&gt;--ci&lt;/span&gt; &lt;span class="nt"&gt;--aws&lt;/span&gt; &lt;span class="nt"&gt;--aws-deep&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; serverless deploy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Best Practices Summary
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Automate validation&lt;/strong&gt; - don't rely on manual checks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fail fast&lt;/strong&gt; - catch issues in Git hooks, not production&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Validate AWS resources&lt;/strong&gt; - don't assume secrets exist&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Track in Security tab&lt;/strong&gt; - use SARIF for compliance&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use fallbacks wisely&lt;/strong&gt; - but be aware of all env usage&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Document required variables&lt;/strong&gt; - &lt;code&gt;.envguardrc.json&lt;/code&gt; serves as documentation&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Try It Out
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Free version:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; @danielszlaski/envguard
envguard scan
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Pro version&lt;/strong&gt; (AWS integration, Git hooks, SARIF output):&lt;br&gt;&lt;br&gt;
&lt;a href="https://envguard.pl" rel="noopener noreferrer"&gt;https://envguard.pl&lt;/a&gt; - 39 PLN (~€9)&lt;/p&gt;

&lt;h2&gt;
  
  
  What Environment Variable Nightmares Have You Experienced?
&lt;/h2&gt;

&lt;p&gt;Drop a comment below - I'd love to hear your war stories and add more detection patterns to the tool!&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Links:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Free version: &lt;a href="https://www.npmjs.com/package/@danielszlaski/envguard" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/@danielszlaski/envguard&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Documentation: &lt;a href="https://envguard.pl" rel="noopener noreferrer"&gt;https://envguard.pl&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/szlaskidaniel/envguard" rel="noopener noreferrer"&gt;https://github.com/szlaskidaniel/envguard&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>cicd</category>
      <category>devops</category>
      <category>javascript</category>
      <category>node</category>
    </item>
  </channel>
</rss>
