1+ #! /bin/bash
2+
3+ # Script to check that all environment variables used in Helm templates and Terraform scripts
4+ # are defined in yarn-project/foundation/src/config/env_var.ts
5+ #
6+ # This script scans:
7+ # - Helm templates in spartan/aztec-network/templates/ for "- name: VAR_NAME" patterns
8+ # - Terraform files in spartan/terraform/ for "VAR_NAME = var.VAR_NAME" and variable definitions
9+ #
10+ # It then checks if each found environment variable is defined in the TypeScript EnvVar union type.
11+ # Variables in the exclusion list (system/k8s/deployment-specific vars) are ignored.
12+ #
13+ # Usage:
14+ # ./check-env-vars.sh # Basic check
15+ # VERBOSE=1 ./check-env-vars.sh # Show all found variables
16+ #
17+ # Exit codes:
18+ # 0 - All environment variables are properly defined
19+ # 1 - Some environment variables are missing from env_var.ts
20+
21+ set -euo pipefail
22+
23+ # Colors for output
24+ RED=' \033[0;31m'
25+ GREEN=' \033[0;32m'
26+ YELLOW=' \033[1;33m'
27+ NC=' \033[0m' # No Color
28+
29+ # Get the project root directory (assuming script is in spartan/scripts)
30+ SCRIPT_DIR=" $( cd " $( dirname " ${BASH_SOURCE[0]} " ) " && pwd) "
31+ PROJECT_ROOT=" $( cd " $SCRIPT_DIR /../.." && pwd) "
32+
33+ # Files to check
34+ ENV_VAR_FILE=" $PROJECT_ROOT /yarn-project/foundation/src/config/env_var.ts"
35+ HELM_TEMPLATES_DIR=" $PROJECT_ROOT /spartan/aztec-network/templates"
36+ TERRAFORM_DIR=" $PROJECT_ROOT /spartan/terraform"
37+
38+ echo -e " ${YELLOW} Checking environment variables in Helm templates and Terraform scripts...${NC} "
39+
40+ # Variables that are excluded from validation (system vars, k8s vars, deployment vars, etc.)
41+ # Build the regex pattern from an array for better readability
42+ EXCLUDED_VARS_ARRAY=(
43+ # Kubernetes injected variables
44+ " K8S_POD_NAME"
45+ " K8S_POD_UID"
46+ " K8S_NAMESPACE_NAME"
47+ " POD_IP"
48+ " POD_NAME"
49+
50+ # System environment variables
51+ " PATH"
52+ " HOME"
53+ " USER"
54+ " SHELL"
55+
56+ # Service/container specific vars that may not be in env_var.ts
57+ " OTEL_SERVICE_NAME"
58+ " OTEL_RESOURCE_ATTRIBUTES"
59+ " SERVICE_NAME"
60+ " NAMESPACE"
61+ " OTEL_COLLECTOR_ENDPOINT"
62+
63+ # Helm template variables (not actual env vars)
64+ " RELEASE_NAME"
65+ " CHART_NAME"
66+
67+ # External service variables that may not be managed by the app
68+ " ETH_BEACON_URL"
69+ " ETH_EXECUTION_URL"
70+ " ENGINE_PORT"
71+ " HTTP_PORT"
72+ " WS_PORT"
73+ " BEACON_HTTP_PORT"
74+ " MAX_TX_INPUT_SIZE_BYTES"
75+
76+ # Network/infrastructure variables
77+ " NETWORK_PUBLIC"
78+ " EXTERNAL_ETHEREUM_HOSTS"
79+ " EXTERNAL_ETHEREUM_CONSENSUS_HOST"
80+ " EXTERNAL_ETHEREUM_CONSENSUS_HOST_API_KEY"
81+ " EXTERNAL_ETHEREUM_CONSENSUS_HOST_API_KEY_HEADER"
82+ " EXTERNAL_BOOT_NODE_HOST"
83+ " EXTERNAL_FULL_NODE_HOST"
84+ " EXTERNAL_PROVER_NODE_HOST"
85+ " ETHEREUM_PORT"
86+ " ETHEREUM_CONSENSUS_PORT"
87+ " BOOT_NODE_PORT"
88+ " FULL_NODE_PORT"
89+ " PROVER_NODE_PORT"
90+ " PROVER_BROKER_PORT"
91+ " BOOT_NODE_HOST"
92+ " FULL_NODE_HOST"
93+
94+ # Deployment and CI/CD specific variables
95+ " ACCELERATED_TEST_DEPLOYMENTS"
96+ " ARCHIVE_NODE_VALUES"
97+ " AZTEC_DOCKER_IMAGE"
98+ " AZTEC_PROOF_SUBMISSION_WINDOW"
99+ " BLOCK_TIME"
100+ " BOOTNODE_IP_REGION"
101+ " BOT_VALUES"
102+ " CHAIN_ID"
103+ " CREATE_STATIC_IPS"
104+ " DEPLOYMENT_MNEMONIC"
105+ " ETH_DEVNET_VALUES"
106+ " EXPOSE_HTTPS_BOOTNODE"
107+ " GAS_LIMIT"
108+ " GCP_PROJECT"
109+ " GCP_REGION"
110+ " GKE_CLUSTER_CONTEXT"
111+ " GRAFANA_PASSWORD_SECRET_NAME"
112+ " HOSTNAME"
113+ " INIT_VALIDATORS"
114+
115+ # Job/workflow specific variables
116+ " JOB_BACKOFF_LIMIT"
117+ " JOB_NAME"
118+ " JOB_TTL_SECONDS_AFTER_FINISHED"
119+ " K8S_CLUSTER_CONTEXT"
120+ " K8S_MODE"
121+ " KEY_INDEX_START"
122+ " L1_DEPLOYMENT_MNEMONIC"
123+ " L1_DEPLOYMENT_PRIVATE_KEY"
124+ " L1_DEPLOYMENT_SALT"
125+ " L1_RPC_URLS"
126+ " LOGS"
127+ " METRICS_NAMESPACE"
128+ " MNEMONIC_SECRET_NAME"
129+ " NODE_OPTIONS"
130+ " NODE_RPC_VALUES"
131+ " NUMBER_OF_VALIDATOR_NODES"
132+
133+ # Resource and configuration variables
134+ " P2P_BOOTSTRAP_RESOURCE_PROFILE"
135+ " PREFUNDED_MNEMONIC_INDICES"
136+ " PROVER_KEY_START"
137+ " PROVER_MNEMONIC"
138+ " PROVER_MNEMONIC_START_INDEX"
139+ " PROVER_RESOURCE_PROFILE"
140+ " PROVER_VALUES"
141+ " REAL_VERIFIER"
142+ " RELEASE_PREFIX"
143+ " RESOURCE_PROFILE"
144+ " RESOURCES_FILE"
145+ " RPC_EXTERNAL_INGRESS"
146+ " RPC_HOSTNAME"
147+ " RPC_RESOURCE_PROFILE"
148+ " RPC_VALUES"
149+ " SALT"
150+ " SERVICE"
151+ " SLACK_WEBHOOK_SECRET_NAME"
152+ " SLASHER_KEY_INDEX_START"
153+ " SNAPSHOT_VALUES"
154+
155+ # Validator and node specific variables
156+ " VALIDATOR_KEY_START"
157+ " VALIDATOR_MNEMONIC"
158+ " VALIDATOR_MNEMONIC_START_INDEX"
159+ " VALIDATOR_REPLICAS"
160+ " VALIDATOR_RESOURCE_PROFILE"
161+ " VALIDATORS"
162+ " VALIDATORS_PER_NODE"
163+ " VALIDATOR_VALUES"
164+ " VALUES_FILE"
165+ )
166+
167+ # Join array elements with | for regex
168+ EXCLUDED_VARS=$( IFS=' |' ; echo " ${EXCLUDED_VARS_ARRAY[*]} " )
169+
170+ # Extract environment variables from Helm templates
171+ echo " Scanning Helm templates..."
172+ helm_vars=" "
173+ if [[ -d " $HELM_TEMPLATES_DIR " ]]; then
174+ helm_vars=$( find " $HELM_TEMPLATES_DIR " -name " *.yaml" -o -name " *.yml" -o -name " *.tpl" | \
175+ xargs grep -hE " ^\s*- name:\s+[A-Z][A-Z0-9_]*\s*$" 2> /dev/null | \
176+ sed -E ' s/.*- name:\s+([A-Z][A-Z0-9_]*).*/\1/' | \
177+ sort -u || true)
178+ fi
179+
180+ # Extract environment variables from Terraform scripts
181+ echo " Scanning Terraform scripts..."
182+ terraform_vars=" "
183+ if [[ -d " $TERRAFORM_DIR " ]]; then
184+ terraform_vars=$( find " $TERRAFORM_DIR " -name " *.tf" | \
185+ xargs grep -hE " (^\s*[A-Z][A-Z0-9_]*\s*=|^variable \" [A-Z][A-Z0-9_]*\" )" 2> /dev/null | \
186+ sed -E ' s/^\s*([A-Z][A-Z0-9_]*)\s*=.*/\1/; s/^variable "([A-Z][A-Z0-9_]*)".*/\1/' | \
187+ sort -u || true)
188+ fi
189+
190+ # Combine and deduplicate all found variables
191+ echo " Processing found variables..."
192+ all_vars=$( echo -e " $helm_vars \n$terraform_vars " | grep -v " ^$" | sort -u)
193+
194+ # Extract defined variables from env_var.ts
195+ echo " Extracting defined variables..."
196+ if [[ ! -f " $ENV_VAR_FILE " ]]; then
197+ echo -e " ${RED} Error: env_var.ts file not found: $ENV_VAR_FILE ${NC} "
198+ exit 1
199+ fi
200+
201+ defined_vars=$( grep -E " ^\s*\|\s+'[A-Z][A-Z0-9_]*'" " $ENV_VAR_FILE " | \
202+ sed -E " s/.*'([A-Z][A-Z0-9_]*)'.*/\1/" | \
203+ sort)
204+
205+ # Check for missing variables (excluding known system/k8s vars)
206+ echo " Checking for undefined variables..."
207+ missing_vars=" "
208+ if [[ -n " $all_vars " ]]; then
209+ # Filter out excluded variables and check against defined vars
210+ filtered_vars=$( echo " $all_vars " | grep -vE " ^($EXCLUDED_VARS )$" || true)
211+
212+ if [[ -n " $filtered_vars " ]]; then
213+ missing_vars=$( comm -23 <( echo " $filtered_vars " ) <( echo " $defined_vars " ) )
214+ fi
215+ fi
216+
217+ # Report results
218+ echo
219+ echo " === RESULTS ==="
220+ found_count=$( echo " $all_vars " | wc -l)
221+ defined_count=$( echo " $defined_vars " | wc -l)
222+
223+ echo " Found $found_count unique environment variables in Helm templates and Terraform scripts"
224+ echo " Found $defined_count defined environment variables in env_var.ts"
225+
226+ if [[ -z " $missing_vars " ]]; then
227+ echo -e " ${GREEN} ✅ All environment variables are properly defined!${NC} "
228+ exit_code=0
229+ else
230+ missing_count=$( echo " $missing_vars " | wc -l)
231+ echo -e " ${RED} ❌ Found $missing_count undefined environment variables:${NC} "
232+ echo
233+ echo " $missing_vars " | while IFS= read -r var; do
234+ [[ -n " $var " ]] && echo -e " ${RED} - $var ${NC} "
235+ done
236+ echo
237+ echo -e " ${YELLOW} These variables should be added to yarn-project/foundation/src/config/env_var.ts${NC} "
238+ exit_code=1
239+ fi
240+
241+ # Show debug info if verbose
242+ if [[ " ${VERBOSE:- } " == " 1" ]]; then
243+ echo
244+ echo " === DEBUG INFO ==="
245+ echo " All found variables:"
246+ echo " $all_vars "
247+ fi
248+
249+ exit $exit_code
0 commit comments