Environment Configuration
Environment Configuration¶
Environment variables can be configured at multiple levels in Prodigy workflows, providing flexible control over workflow execution across different environments and contexts.
Source: Configuration structures defined in src/cook/environment/config.rs:11-144, workflow configuration in src/config/workflow.rs:12-39.
Overview¶
Prodigy supports comprehensive environment configuration including: - Global environment variables with static, dynamic, and conditional values - Secret management with automatic log masking - Environment profiles for different deployment contexts - Environment files (.env format) - Step-level environment overrides - Variable interpolation in commands
This subsection provides a quick introduction to environment configuration. For comprehensive coverage, see the Environment chapter.
Global Environment Variables¶
Define environment variables in the env: block at the workflow root. Variables can be static strings, dynamically computed from commands, or conditionally set based on expressions.
Source: workflows/environment-example.yml:4-18
env:
# Static environment variables
NODE_ENV: production
API_URL: https://api.example.com
# Dynamic environment variable (computed from command)
WORKERS:
command: "nproc 2>/dev/null || echo 4"
cache: true
# Conditional environment variable
DEPLOY_ENV:
condition: "${branch} == 'main'"
when_true: "production"
when_false: "staging"
Type Definitions (src/cook/environment/config.rs:38-81):
- EnvValue::Static(String) - Static string value
- EnvValue::Dynamic(DynamicEnv) - Computed from command with optional caching
- EnvValue::Conditional(ConditionalEnv) - Based on condition expression
Environment Files¶
Load environment variables from .env format files using the env_files: field.
Source: workflows/environment-example.yml:25-27, src/cook/environment/config.rs:22-23
Variables from env files are merged with global env variables, with explicit env: block taking precedence.
For detailed information about .env file format and loading behavior, see Environment Files.
Secrets Management¶
Secret environment variables are automatically masked in all log output, preventing accidental credential leaks.
Source: workflows/mapreduce-env-example.yml:23-26, src/cook/environment/config.rs:86-112
secrets:
# Simple secret reference
API_KEY: "${env:SECRET_API_KEY}"
# Provider-based secret
API_TOKEN:
provider: env
key: "GITHUB_TOKEN"
Secret Providers (src/cook/environment/config.rs:101-112):
- env - Environment variable
- file - File-based secret
- vault - HashiCorp Vault
- aws - AWS Secrets Manager
- Custom providers
For comprehensive secrets management documentation, see Secrets Management.
Environment Profiles¶
Profiles enable different environment configurations for various deployment contexts (development, staging, production).
Source: workflows/environment-example.yml:30-39, src/cook/environment/config.rs:116-124
profiles:
development:
description: "Development environment with debug enabled"
NODE_ENV: development
API_URL: http://localhost:3000
DEBUG: "true"
production:
description: "Production environment"
NODE_ENV: production
API_URL: https://api.example.com
DEBUG: "false"
Activate a profile:
# Via command line flag
prodigy run workflow.yml --profile development
# Via environment variable
export PRODIGY_PROFILE=production
prodigy run workflow.yml
For detailed profile configuration and best practices, see Environment Profiles.
Step-Level Environment Overrides¶
Commands can define their own environment variables that override global and profile settings.
Source: workflows/environment-example.yml:47-60, src/cook/environment/config.rs:126-144
commands:
- name: "Build frontend"
shell: "echo 'Building with NODE_ENV='$NODE_ENV"
env:
BUILD_TARGET: production
OPTIMIZE: "true"
working_dir: ./frontend
- name: "Run tests"
shell: "pytest"
env:
PYTHONPATH: "./src:./tests"
TEST_ENV: "true"
working_dir: ./backend
temporary: true # Environment restored after this step
Step Environment Fields (src/cook/environment/config.rs:128-144):
- env: HashMap<String, String> - Step-specific variables
- working_dir: Option<PathBuf> - Working directory for this step
- clear_env: bool - Clear parent environment before applying step env
- temporary: bool - Restore environment after step completes
For detailed step-level configuration, see Per-Command Environment Overrides.
Variable Interpolation¶
Environment variables can be referenced in commands using two syntaxes: $VAR or ${VAR}.
Source: workflows/mapreduce-env-example.yml:44-80
env:
PROJECT_NAME: "my-project"
OUTPUT_DIR: "output"
commands:
# Both syntaxes work
- shell: "echo Starting $PROJECT_NAME"
- shell: "echo Output directory: ${OUTPUT_DIR}"
# Use ${} for complex expressions
- shell: "cp summary.json ${OUTPUT_DIR}/${PROJECT_NAME}-report.json"
Variable interpolation is available in: - Shell commands - Claude commands - File paths - MapReduce configuration (max_parallel, timeout, etc.)
For comprehensive variable interpolation documentation, see Variable Interpolation.
Environment Precedence¶
When the same variable is defined at multiple levels, precedence is:
- Step-level env (highest priority)
- Profile env
- Global env
- System environment (lowest priority)
Source: Precedence logic in src/cook/environment/builder.rs:48-53, tests in tests/environment_workflow_test.rs:62-132
For detailed precedence rules and examples, see Environment Precedence.
MapReduce Environment Variables¶
Environment variables are available across all MapReduce workflow phases: setup, map, reduce, and merge.
Source: workflows/mapreduce-env-example.yml:1-95, src/config/mapreduce.rs:24-38
name: mapreduce-workflow
mode: mapreduce
env:
PROJECT_NAME: "my-project"
MAX_RETRIES: "3"
setup:
- shell: "echo Starting $PROJECT_NAME"
map:
agent_template:
- claude: "/process --project $PROJECT_NAME --retries $MAX_RETRIES"
reduce:
- shell: "echo Completed $PROJECT_NAME workflow"
merge:
commands:
- shell: "echo Merging $PROJECT_NAME changes"
For comprehensive MapReduce environment documentation, see MapReduce Environment Variables.
Complete Example¶
This example demonstrates multiple environment features working together.
Source: Complete workflow in workflows/environment-example.yml:1-70
# Global environment with static, dynamic, and conditional values
env:
NODE_ENV: production
API_URL: https://api.example.com
WORKERS:
command: "nproc 2>/dev/null || echo 4"
cache: true
DEPLOY_ENV:
condition: "${branch} == 'main'"
when_true: "production"
when_false: "staging"
# Secrets (masked in logs)
secrets:
API_KEY: "${env:SECRET_API_KEY}"
# Environment files
env_files:
- .env.production
# Profiles
profiles:
development:
NODE_ENV: development
API_URL: http://localhost:3000
DEBUG: "true"
# Commands with step-level overrides
commands:
- name: "Build"
shell: "npm run build"
env:
BUILD_TARGET: production
working_dir: ./frontend
- name: "Deploy"
shell: "echo Deploying to $DEPLOY_ENV"