Skip to content

Commit bbca3fc

Browse files
committed
Added support for per-workspace environment variables.
1 parent 88a75db commit bbca3fc

2 files changed

Lines changed: 33 additions & 0 deletions

File tree

rtwcli/rtw_cmds/rtw_cmds/workspace/create_verb.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,7 @@ class CreateVerbArgs:
133133
env_file: str = ""
134134
proxy_server: str = ""
135135
proxy_ca_cert: str = ""
136+
env_vars: dict = field(default_factory=dict)
136137

137138
@property
138139
def ssh_abs_path_in_docker(self) -> str:
@@ -583,6 +584,12 @@ def add_arguments(self, parser: argparse.ArgumentParser, cli_name: str):
583584
help="Path to company CA certificate file for proxy (will be copied to container)",
584585
default=None,
585586
)
587+
parser.add_argument(
588+
"--env-vars",
589+
nargs="*",
590+
help="Additional environment variables to export in the workspace (format: KEY=VALUE)",
591+
default=[],
592+
)
586593

587594
def generate_intermediate_dockerfile_content(self, create_args: CreateVerbArgs) -> str:
588595
if create_args.apt_packages:
@@ -962,6 +969,7 @@ def setup_rtw_in_intermediate_image(
962969
distro=create_args.ros_distro,
963970
ws_folder=create_args.ws_abs_path_in_docker,
964971
base_ws=create_args.upstream_ws_name if create_args.has_upstream_ws else "",
972+
env_vars=create_args.env_vars,
965973
),
966974
)
967975

@@ -1156,6 +1164,20 @@ def main(self, *, args):
11561164
filtered_args = get_filtered_args(args, list(fields(CreateVerbArgs)))
11571165
filtered_args["ws_abs_path"] = os.path.normpath(os.path.abspath(args.ws_folder))
11581166
filtered_args["ws_name"] = ws_name
1167+
1168+
# Process env_vars
1169+
env_vars_dict = {}
1170+
if args.env_vars:
1171+
for env_var in args.env_vars:
1172+
if "=" not in env_var:
1173+
logger.warning(
1174+
f"Skipping invalid environment variable format: '{env_var}'. Expected format KEY=VALUE"
1175+
)
1176+
continue
1177+
key, value = env_var.split("=", 1)
1178+
env_vars_dict[key] = value
1179+
filtered_args["env_vars"] = env_vars_dict
1180+
11591181
create_args = CreateVerbArgs(**filtered_args)
11601182
logger.info("### CREATE ARGS ###")
11611183
rich.print(create_args)
@@ -1292,6 +1314,7 @@ def main(self, *, args):
12921314
base_ws=create_args.upstream_ws_name if create_args.has_upstream_ws else "",
12931315
docker_container_name=create_args.container_name if create_args.docker else "",
12941316
standalone=create_args.standalone,
1317+
env_vars=create_args.env_vars,
12951318
)
12961319
if not update_workspaces_config(WORKSPACES_PATH, local_main_ws):
12971320
raise RuntimeError("Failed to update workspaces config with main workspace.")

rtwcli/rtwcli/rtwcli/workspace_utils.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ class Workspace:
4444
docker_container_name: Optional[str] = None
4545
base_ws: Optional[str] = None
4646
standalone: bool = False
47+
env_vars: Dict[str, str] = dataclasses.field(default_factory=dict)
4748

4849
def __post_init__(self):
4950
if self.ws_folder == "":
@@ -209,10 +210,19 @@ def create_bash_script_content_for_using_ws(
209210
bash_script_content = "#!/bin/bash\n"
210211

211212
ws_data = workspace.to_dict()
213+
# Extract env_vars to handle separately
214+
env_vars = ws_data.pop("env_vars", {})
215+
212216
for ws_var, ws_var_value in ws_data.items():
213217
env_var, env_var_value = workspace_var_to_env_var(ws_var, ws_var_value)
214218
bash_script_content += f"export {env_var}='{env_var_value}'\n"
215219

220+
# Export custom environment variables without prefix
221+
if env_vars:
222+
for key, value in env_vars.items():
223+
if value is not None:
224+
bash_script_content += f"export {key}='{value}'\n"
225+
216226
bash_script_content += (
217227
f"source {use_workspace_script_path} {workspace.distro} {workspace.ws_folder}\n"
218228
)

0 commit comments

Comments
 (0)