Skip to content

Handling Missing Secrets

Control what happens when a secret can't be resolved using the if_missing setting. This is especially useful for CI environments or when some secrets are optional.

Available Modes

  • error - Fail the command if a secret cannot be resolved (strictest)
  • warn - Print a warning and continue (default)
  • ignore - Silently skip missing secrets

Priority Chain

You can set if_missing at multiple levels. fnox uses the first match:

  1. CLI flag (highest priority): --if-missing error
  2. Environment variable: FNOX_IF_MISSING=warn
  3. Secret-level config: [secrets.MY_SECRET] with if_missing = "error"
  4. Top-level config: Global default for all secrets
  5. Base default environment variable: FNOX_IF_MISSING_DEFAULT=error
  6. Default: warn (lowest priority)

Per-Secret Configuration

Set different behaviors for different secrets:

toml
[secrets]
# Critical secrets must exist
DATABASE_URL = { provider = "aws", value = "database-url", if_missing = "error" }  # Fail if missing

# Optional secrets
ANALYTICS_KEY = { provider = "aws", value = "analytics-key", if_missing = "ignore" }  # Continue silently if missing

# Warn about missing secrets (default)
CACHE_URL = { provider = "aws", value = "cache-url", if_missing = "warn" }  # Print warning if missing

Top-Level Default

Set a default for all secrets:

toml
# Make all secrets strict by default
if_missing = "error"

[secrets]
DATABASE_URL = { provider = "age", value = "encrypted..." }  # Inherits if_missing = "error"
API_KEY = { provider = "age", value = "encrypted..." }  # Inherits if_missing = "error"
OPTIONAL_FEATURE_FLAG = { default = "false", if_missing = "ignore" }  # Override - this one can be missing

Runtime Override with CLI

Override config settings at runtime:

bash
# Override to be lenient (useful in CI with missing secrets)
fnox exec --if-missing ignore -- npm test

# Override to be strict (ensure all secrets are present)
fnox exec --if-missing error -- ./deploy.sh

# Use warnings (default)
fnox exec --if-missing warn -- npm start

Runtime Override with Environment Variable

bash
# Set globally for a session
export FNOX_IF_MISSING=warn
fnox exec -- npm start

# Or inline
FNOX_IF_MISSING=error fnox exec -- ./critical-task.sh

Base Default Behavior

Set a default behavior when if_missing is not configured anywhere:

bash
# Change the default from "warn" to "error"
export FNOX_IF_MISSING_DEFAULT=error

# Now all secrets without explicit if_missing will fail if missing
fnox exec -- ./my-app

This is useful for:

  • Making your entire project strict by default
  • CI/CD environments where you want failures by default
  • Development environments where you want warnings by default

Priority: This has the lowest priority and only applies when if_missing is not set in:

  • CLI flags
  • FNOX_IF_MISSING env var
  • Secret-level config
  • Top-level config

CI/CD Examples

Forked PRs (Secrets Unavailable)

yaml
# .github/workflows/test.yml
name: Test
on: [push, pull_request]

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Run tests (some secrets may be missing in forks)
        env:
          FNOX_IF_MISSING: ignore # Don't fail on missing secrets
        run: |
          fnox exec -- npm test

Production Deployment (Strict)

yaml
# .github/workflows/deploy.yml
name: Deploy
on:
  push:
    branches: [main]

jobs:
  deploy:
    runs-on: ubuntu-latest
    environment: production
    steps:
      - uses: actions/checkout@v4

      - name: Deploy to production
        env:
          FNOX_IF_MISSING: error # Fail if any secret is missing
          AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
          AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
        run: |
          fnox exec --profile production -- ./deploy.sh

Staging (Warn on Missing)

yaml
# .github/workflows/staging.yml
jobs:
  deploy-staging:
    runs-on: ubuntu-latest
    steps:
      - name: Deploy to staging
        env:
          FNOX_IF_MISSING: warn # Print warnings but continue
        run: |
          fnox exec --profile staging -- ./deploy.sh

Use Cases

Optional Analytics/Monitoring

toml
[secrets]
# Won't break the app if missing
SENTRY_DSN = { provider = "aws", value = "sentry-dsn", if_missing = "ignore" }
DATADOG_API_KEY = { provider = "aws", value = "datadog-key", if_missing = "ignore" }

Required Database

toml
[secrets]
DATABASE_URL = { provider = "aws", value = "database-url", if_missing = "error" }  # Must exist or fail

Development Defaults

toml
[secrets]
REDIS_URL = { default = "redis://localhost:6379", if_missing = "warn" }  # Warn if missing, but provide a default

Behavior Summary

ModeBehaviorUse Case
errorFail commandRequired secrets (database, API keys)
warnPrint warning, continueOptional but recommended secrets
ignoreSilent skipTruly optional features (analytics, etc.)

Next Steps

Released under the MIT License.