Skip to content

Commit 0aefe9c

Browse files
committed
feat(runner): add go-runner-version CLI argument
1 parent 3150477 commit 0aefe9c

8 files changed

Lines changed: 54 additions & 7 deletions

File tree

src/executor/config.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ use crate::prelude::*;
44
use crate::run::{RunArgs, UnwindingMode};
55
use crate::run_environment::RepositoryProvider;
66
use crate::runner_mode::RunnerMode;
7+
use semver::Version;
78
use std::path::PathBuf;
89
use url::Url;
910

@@ -34,6 +35,8 @@ pub struct Config {
3435
pub skip_setup: bool,
3536
/// If true, allow execution even when no benchmarks are found
3637
pub allow_empty: bool,
38+
/// The version of go-runner to install (if None, installs latest)
39+
pub go_runner_version: Option<Version>,
3740
}
3841

3942
#[derive(Debug, PartialEq, Clone)]
@@ -85,6 +88,7 @@ impl Config {
8588
skip_run: false,
8689
skip_setup: false,
8790
allow_empty: false,
91+
go_runner_version: None,
8892
}
8993
}
9094
}
@@ -121,6 +125,7 @@ impl TryFrom<RunArgs> for Config {
121125
skip_run: args.shared.skip_run,
122126
skip_setup: args.shared.skip_setup,
123127
allow_empty: args.shared.allow_empty,
128+
go_runner_version: args.shared.go_runner_version.clone(),
124129
})
125130
}
126131
}
@@ -154,6 +159,7 @@ impl Config {
154159
skip_run: args.shared.skip_run,
155160
skip_setup: args.shared.skip_setup,
156161
allow_empty: args.shared.allow_empty,
162+
go_runner_version: args.shared.go_runner_version.clone(),
157163
})
158164
}
159165
}
@@ -188,6 +194,7 @@ mod tests {
188194
skip_run: false,
189195
skip_setup: false,
190196
allow_empty: false,
197+
go_runner_version: None,
191198
perf_run_args: PerfRunArgs {
192199
enable_perf: false,
193200
perf_unwinding_mode: None,
@@ -226,6 +233,7 @@ mod tests {
226233
skip_run: true,
227234
skip_setup: true,
228235
allow_empty: true,
236+
go_runner_version: None,
229237
perf_run_args: PerfRunArgs {
230238
enable_perf: false,
231239
perf_unwinding_mode: Some(UnwindingMode::FramePointer),
@@ -308,6 +316,7 @@ mod tests {
308316
skip_run: false,
309317
skip_setup: false,
310318
allow_empty: false,
319+
go_runner_version: None,
311320
perf_run_args: PerfRunArgs {
312321
enable_perf: false,
313322
perf_unwinding_mode: None,

src/executor/helpers/env.rs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
use std::{collections::HashMap, env::consts::ARCH, path::Path};
22

3+
use crate::executor::Config;
34
use crate::runner_mode::RunnerMode;
45

56
pub fn get_base_injected_env(
67
mode: RunnerMode,
78
profile_folder: &Path,
9+
config: &Config,
810
) -> HashMap<&'static str, String> {
911
let runner_mode_internal_env_value = match mode {
1012
// While the runner now deprecates the usage of instrumentation with a message, we
@@ -17,7 +19,7 @@ pub fn get_base_injected_env(
1719
RunnerMode::Walltime => "walltime",
1820
RunnerMode::Memory => "memory",
1921
};
20-
HashMap::from([
22+
let mut env = HashMap::from([
2123
("PYTHONHASHSEED", "0".into()),
2224
(
2325
"PYTHON_PERF_JIT_SUPPORT",
@@ -37,7 +39,13 @@ pub fn get_base_injected_env(
3739
"CODSPEED_PROFILE_FOLDER",
3840
profile_folder.to_string_lossy().to_string(),
3941
),
40-
])
42+
]);
43+
44+
if let Some(version) = &config.go_runner_version {
45+
env.insert("CODSPEED_GO_RUNNER_VERSION", version.to_string());
46+
}
47+
48+
env
4149
}
4250

4351
pub fn is_codspeed_debug_enabled() -> bool {

src/executor/helpers/introspected_golang/go.sh

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,16 @@ if [ "$1" = "test" ]; then
3939
# Find go-runner or install if not found
4040
GO_RUNNER=$(which codspeed-go-runner 2>/dev/null || true)
4141
if [ -z "$GO_RUNNER" ]; then
42-
curl -fsSL http://github.com/CodSpeedHQ/codspeed-go/releases/latest/download/codspeed-go-runner-installer.sh | bash -s -- --quiet
42+
# Build the installer URL with the specified version or use latest
43+
INSTALLER_VERSION="${CODSPEED_GO_RUNNER_VERSION:-latest}"
44+
if [ "$INSTALLER_VERSION" = "latest" ]; then
45+
DOWNLOAD_URL="http://github.com/CodSpeedHQ/codspeed-go/releases/latest/download/codspeed-go-runner-installer.sh"
46+
else
47+
DOWNLOAD_URL="http://github.com/CodSpeedHQ/codspeed-go/releases/download/v${INSTALLER_VERSION}/codspeed-go-runner-installer.sh"
48+
fi
49+
50+
debug_log "Installing go-runner from: $DOWNLOAD_URL"
51+
curl -fsSL "$DOWNLOAD_URL" | bash -s -- --quiet
4352
GO_RUNNER=$(which codspeed-go-runner 2>/dev/null || true)
4453
fi
4554

src/executor/memory/executor.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,11 @@ impl MemoryExecutor {
4848
cmd_builder.arg(get_bench_command(&execution_context.config)?);
4949

5050
// Wrap command with environment forwarding
51-
let extra_env =
52-
get_base_injected_env(RunnerMode::Memory, &execution_context.profile_folder);
51+
let extra_env = get_base_injected_env(
52+
RunnerMode::Memory,
53+
&execution_context.profile_folder,
54+
&execution_context.config,
55+
);
5356
let (cmd_builder, env_file) = wrap_with_env(cmd_builder, &extra_env)?;
5457

5558
Ok((ipc_server, cmd_builder, env_file))

src/executor/valgrind/measure.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ pub async fn measure(
8989
cmd.envs(get_base_injected_env(
9090
RunnerMode::Simulation,
9191
profile_folder,
92+
config,
9293
));
9394

9495
// Only set PYTHONMALLOC=malloc for non-free-threaded Python builds.

src/executor/wall_time/executor.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -105,8 +105,11 @@ impl WallTimeExecutor {
105105
path_env
106106
);
107107

108-
let mut extra_env =
109-
get_base_injected_env(RunnerMode::Walltime, &execution_context.profile_folder);
108+
let mut extra_env = get_base_injected_env(
109+
RunnerMode::Walltime,
110+
&execution_context.profile_folder,
111+
&execution_context.config,
112+
);
110113
extra_env.insert("PATH", path_value);
111114

112115
// We have to write the benchmark command to a script, to ensure proper formatting

src/project_config/merger.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,7 @@ mod tests {
163163
skip_run: false,
164164
skip_setup: false,
165165
allow_empty: false,
166+
go_runner_version: None,
166167
perf_run_args: PerfRunArgs {
167168
enable_perf: true,
168169
perf_unwinding_mode: None,
@@ -195,6 +196,7 @@ mod tests {
195196
skip_run: false,
196197
skip_setup: false,
197198
allow_empty: false,
199+
go_runner_version: None,
198200
perf_run_args: PerfRunArgs {
199201
enable_perf: true,
200202
perf_unwinding_mode: None,
@@ -229,6 +231,7 @@ mod tests {
229231
skip_run: false,
230232
skip_setup: false,
231233
allow_empty: false,
234+
go_runner_version: None,
232235
perf_run_args: PerfRunArgs {
233236
enable_perf: false,
234237
perf_unwinding_mode: None,

src/run/mod.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,10 +120,20 @@ pub struct ExecAndRunSharedArgs {
120120
#[arg(long, default_value = "false", hide = true)]
121121
pub allow_empty: bool,
122122

123+
/// The version of the go-runner to use (e.g., 1.2.3, 1.0.0-beta.1)
124+
/// If not specified, the latest version will be installed
125+
#[arg(long, env = "CODSPEED_GO_RUNNER_VERSION", value_parser = parse_version)]
126+
pub go_runner_version: Option<semver::Version>,
127+
123128
#[command(flatten)]
124129
pub perf_run_args: PerfRunArgs,
125130
}
126131

132+
/// Parser for go-runner version that validates semver format
133+
fn parse_version(s: &str) -> Result<semver::Version, String> {
134+
semver::Version::parse(s).map_err(|e| format!("Invalid semantic version: {e}"))
135+
}
136+
127137
#[derive(Args, Debug)]
128138
pub struct RunArgs {
129139
#[command(flatten)]
@@ -182,6 +192,7 @@ impl RunArgs {
182192
skip_run: false,
183193
skip_setup: false,
184194
allow_empty: false,
195+
go_runner_version: None,
185196
perf_run_args: PerfRunArgs {
186197
enable_perf: false,
187198
perf_unwinding_mode: None,

0 commit comments

Comments
 (0)