@@ -5,11 +5,13 @@ use crate::run::RunnerMode;
55use crate :: run:: instruments:: mongo_tracer:: MongoTracer ;
66use crate :: run:: runner:: executor:: Executor ;
77use crate :: run:: runner:: helpers:: command:: CommandBuilder ;
8- use crate :: run:: runner:: helpers:: env:: { get_base_injected_env, is_codspeed_debug_enabled} ;
8+ use crate :: run:: runner:: helpers:: env:: get_base_injected_env;
9+ use crate :: run:: runner:: helpers:: env:: is_codspeed_debug_enabled;
910use crate :: run:: runner:: helpers:: get_bench_command:: get_bench_command;
1011use crate :: run:: runner:: helpers:: introspected_golang;
1112use crate :: run:: runner:: helpers:: introspected_nodejs;
1213use crate :: run:: runner:: helpers:: run_command_with_log_pipe:: run_command_with_log_pipe;
14+ use crate :: run:: runner:: helpers:: run_with_env:: wrap_with_env;
1315use crate :: run:: runner:: helpers:: run_with_sudo:: wrap_with_sudo;
1416use crate :: run:: runner:: { ExecutorName , RunData } ;
1517use crate :: run:: { check_system:: SystemInfo , config:: Config } ;
@@ -69,25 +71,6 @@ impl Drop for HookScriptsGuard {
6971 }
7072}
7173
72- /// Returns a list of exported environment variables which can be loaded with `source` in a shell.
73- ///
74- /// Example: `declare -x outputs="out"`
75- fn get_exported_system_env ( ) -> Result < String > {
76- let output = Command :: new ( "bash" )
77- . arg ( "-c" )
78- . arg ( "export" )
79- . output ( )
80- . context ( "Failed to run `export`" ) ?;
81- if !output. status . success ( ) {
82- bail ! (
83- "Failed to get system environment variables: {}" ,
84- String :: from_utf8_lossy( & output. stderr)
85- ) ;
86- }
87-
88- String :: from_utf8 ( output. stdout ) . context ( "Failed to parse export output as UTF-8" )
89- }
90-
9174pub struct WallTimeExecutor {
9275 perf : Option < PerfRunner > ,
9376}
@@ -103,19 +86,10 @@ impl WallTimeExecutor {
10386 config : & Config ,
10487 run_data : & RunData ,
10588 ) -> Result < ( NamedTempFile , NamedTempFile , CommandBuilder ) > {
106- let bench_cmd = get_bench_command ( config) ?;
107-
108- let system_env = get_exported_system_env ( ) ?;
109- let base_injected_env =
110- get_base_injected_env ( RunnerMode :: Walltime , & run_data. profile_folder )
111- . into_iter ( )
112- . map ( |( k, v) | format ! ( "export {k}={v}" , ) )
113- . collect :: < Vec < _ > > ( )
114- . join ( "\n " ) ;
115-
89+ // Build additional PATH environment variables
11690 let path_env = std:: env:: var ( "PATH" ) . unwrap_or_default ( ) ;
117- let path_env = format ! (
118- "export PATH= {}:{}:{}" ,
91+ let path_value = format ! (
92+ "{}:{}:{}" ,
11993 introspected_nodejs:: setup( )
12094 . map_err( |e| anyhow!( "failed to setup NodeJS introspection. {e}" ) ) ?
12195 . to_string_lossy( ) ,
@@ -125,18 +99,17 @@ impl WallTimeExecutor {
12599 path_env
126100 ) ;
127101
128- let combined_env = format ! ( "{system_env}\n {base_injected_env}\n {path_env}" ) ;
102+ let mut extra_env = get_base_injected_env ( RunnerMode :: Walltime , & run_data. profile_folder ) ;
103+ extra_env. insert ( "PATH" , path_value) ;
129104
130- let mut env_file = NamedTempFile :: new ( ) ?;
131- env_file. write_all ( combined_env. as_bytes ( ) ) ?;
105+ // We have to write the benchmark command to a script, to ensure proper formatting
106+ // and to not have to manually escape everything.
107+ let mut script_file = NamedTempFile :: new ( ) ?;
108+ script_file. write_all ( get_bench_command ( config) ?. as_bytes ( ) ) ?;
132109
133- let script_file = {
134- let mut file = NamedTempFile :: new ( ) ?;
135- let bash_command = format ! ( "source {} && {}" , env_file. path( ) . display( ) , bench_cmd) ;
136- debug ! ( "Bash command: {bash_command}" ) ;
137- file. write_all ( bash_command. as_bytes ( ) ) ?;
138- file
139- } ;
110+ let mut bench_cmd = CommandBuilder :: new ( "bash" ) ;
111+ bench_cmd. arg ( script_file. path ( ) ) ;
112+ let ( mut bench_cmd, env_file) = wrap_with_env ( bench_cmd, & extra_env) ?;
140113
141114 let mut cmd_builder = CommandBuilder :: new ( "systemd-run" ) ;
142115 if let Some ( cwd) = & config. working_directory {
@@ -157,9 +130,11 @@ impl WallTimeExecutor {
157130 cmd_builder. arg ( "--same-dir" ) ;
158131 cmd_builder. arg ( format ! ( "--uid={}" , nix:: unistd:: Uid :: current( ) . as_raw( ) ) ) ;
159132 cmd_builder. arg ( format ! ( "--gid={}" , nix:: unistd:: Gid :: current( ) . as_raw( ) ) ) ;
160- cmd_builder. args ( [ "--" , "bash" ] ) ;
161- cmd_builder. arg ( script_file. path ( ) ) ;
162- Ok ( ( env_file, script_file, cmd_builder) )
133+ cmd_builder. args ( [ "--" ] ) ;
134+
135+ bench_cmd. wrap_with ( cmd_builder) ;
136+
137+ Ok ( ( env_file, script_file, bench_cmd) )
163138 }
164139}
165140
0 commit comments