Skip to content

Commit 2113d60

Browse files
committed
Add extra-env input to propagate global env variables
Introduce a new `extra-env` input for passing environment variables as space-separated KEY=VALUE pairs to all workflow steps. These variables are treated as defaults and do not override existing step-specific values.
1 parent 08500c5 commit 2113d60

File tree

3 files changed

+51
-0
lines changed

3 files changed

+51
-0
lines changed

.github/workflows/experiment.yml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,10 @@ on:
2525
description: "Custom report name"
2626
required: false
2727
type: string
28+
extra_env:
29+
description: "Extra env (space-separated KEY=VALUE pairs passed to all steps)"
30+
required: false
31+
type: string
2832
notify_team:
2933
description: "Notify team (if you want the whole team to check the run)"
3034
type: boolean
@@ -90,13 +94,16 @@ jobs:
9094
echo "sandbox-digest=$DIGEST" >> $GITHUB_OUTPUT
9195
9296
- name: Create plan
97+
env:
98+
EXTRA_ENV: ${{ inputs.extra_env }}
9399
run:
94100
./maat plan
95101
--workspace "${{ inputs.workspace }}"
96102
--pull "${{ env.SANDBOX_DIGEST }}"
97103
--output maat-plan.json
98104
--partitions ${{ env.PARTITIONS_COUNT }}
99105
${{ inputs.report_name && format('--report-name "{0}"', inputs.report_name) }}
106+
${{ inputs.extra_env && '--extra-env "$EXTRA_ENV"' }}
100107

101108
- name: Generate partition array
102109
id: generate-partitions

src/maat/__init__.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,12 @@ def cli() -> None:
208208
default=None,
209209
help="Override report name.",
210210
)
211+
@click.option(
212+
"--extra-env",
213+
type=str,
214+
default=None,
215+
help="Extra environment variables passed to all steps, e.g. 'SCARB_INCREMENTAL=0 CAIRO_LS_LOG=debug'.",
216+
)
211217
@load_workspace
212218
@tool_versions(optional_if_pull=True)
213219
@load_sandbox_image
@@ -218,6 +224,7 @@ def run_local(
218224
sandbox_image: Image,
219225
jobs: int | None,
220226
report_name: str | None,
227+
extra_env: str | None,
221228
) -> None:
222229
log(f"🧪 Running experiment within workspace: {workspace}")
223230

@@ -227,6 +234,7 @@ def run_local(
227234
partitions=1,
228235
docker=docker,
229236
report_name=report_name,
237+
extra_env=extra_env,
230238
)
231239

232240
reporter = Reporter(plan)
@@ -505,6 +513,12 @@ def gc_reports() -> None:
505513
default=None,
506514
help="Override report name.",
507515
)
516+
@click.option(
517+
"--extra-env",
518+
type=str,
519+
default=None,
520+
help="Extra environment variables passed to all steps, e.g. 'SCARB_INCREMENTAL=0 CAIRO_LS_LOG=debug'.",
521+
)
508522
@load_workspace
509523
@tool_versions
510524
@load_sandbox_image
@@ -516,13 +530,15 @@ def plan(
516530
output: Path,
517531
partitions: int,
518532
report_name: str | None,
533+
extra_env: str | None,
519534
) -> None:
520535
plan = prepare_plan(
521536
workspace=workspace,
522537
sandbox=sandbox_image,
523538
partitions=partitions,
524539
docker=docker,
525540
report_name=report_name,
541+
extra_env=extra_env,
526542
)
527543

528544
json_data = plan.model_dump_json(indent=2) + "\n"

src/maat/runner/planner.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from dataclasses import dataclass
2+
import shlex
23

34
from maat.utils.log import track
45
from python_on_whales import DockerClient, Image
@@ -67,6 +68,7 @@ def prepare_plan(
6768
partitions: int,
6869
docker: DockerClient,
6970
report_name: str | None = None,
71+
extra_env: str | None = None,
7072
) -> Plan:
7173
scarb, foundry = tool_versions(sandbox, docker)
7274

@@ -77,6 +79,13 @@ def prepare_plan(
7779
test = Test(name=project.name, rev=project.fetch_rev(), steps=steps)
7880
tests.append(test)
7981

82+
# Parse and merge extra environment variables into every step
83+
if extra_env_map := _parse_extra_env(extra_env):
84+
for test in tests:
85+
for step in test.steps:
86+
# Do not override per-step variables; treat extra vars as defaults
87+
step.env = {**extra_env_map, **(step.env or {})}
88+
8089
suite = TestSuite(tests=tests)
8190

8291
# Explicitly provided report name takes precedence over workspace settings.
@@ -108,3 +117,22 @@ class _PlanningReportNameGenerationContext(ReportNameGenerationContext):
108117
workspace: str
109118
scarb: str
110119
foundry: str
120+
121+
122+
def _parse_extra_env(extra_env: str | None) -> dict[str, str] | None:
123+
"""Parse space-separated KEY=VALUE pairs into a dict.
124+
125+
Uses shlex.split to properly handle quotes (e.g., KEY="value with spaces").
126+
Returns None if no valid pairs are found.
127+
"""
128+
if not extra_env:
129+
return None
130+
131+
result: dict[str, str] = {}
132+
for token in shlex.split(extra_env):
133+
if "=" in token:
134+
key, value = token.split("=", 1)
135+
if key:
136+
result[key] = value
137+
138+
return result or None

0 commit comments

Comments
 (0)