compare_perf.rs

 1use gh_workflow::*;
 2
 3use crate::tasks::workflows::steps::FluentBuilder;
 4use crate::tasks::workflows::{
 5    runners,
 6    steps::{self, NamedJob, named, upload_artifact},
 7    vars::Input,
 8};
 9
10pub fn compare_perf() -> Workflow {
11    let head = Input::string("head", None);
12    let base = Input::string("base", None);
13    let run_perf = run_perf(&base, &head);
14    named::workflow()
15        .on(Event::default().workflow_dispatch(
16            WorkflowDispatch::default()
17                .add_input(head.name, head.input())
18                .add_input(base.name, base.input()),
19        ))
20        .add_job(run_perf.name, run_perf.job)
21}
22
23pub fn run_perf(base: &Input, head: &Input) -> NamedJob {
24    fn cargo_perf_test(ref_name: String) -> Step<Run> {
25        // TODO: vim not gpui, and ideally allow args
26        named::bash(&format!("cargo perf-test -p gpui -- --json={ref_name}"))
27    }
28
29    fn install_hyperfine() -> Step<Run> {
30        named::bash("cargo install hyperfine")
31    }
32
33    fn git_checkout(ref_name: String) -> Step<Run> {
34        named::bash(&format!(
35            "git fetch origin {ref_name} && git checkout {ref_name}"
36        ))
37    }
38
39    fn compare_runs(head: String, base: String) -> Step<Run> {
40        // TODO: this should really be swapped...
41        named::bash(&format!(
42            "cargo perf-compare {base} {head} --save=results.md"
43        ))
44    }
45
46    named::job(
47        Job::default()
48            .runs_on(runners::LINUX_DEFAULT)
49            .add_step(steps::checkout_repo())
50            .add_step(steps::setup_cargo_config(runners::Platform::Linux))
51            .map(steps::install_linux_dependencies)
52            .add_step(install_hyperfine())
53            .add_step(git_checkout(base.var()))
54            .add_step(cargo_perf_test(base.var()))
55            .add_step(git_checkout(head.var()))
56            .add_step(cargo_perf_test(head.var()))
57            .add_step(compare_runs(head.var(), base.var()))
58            .add_step(upload_artifact("results.md", "results.md"))
59            .add_step(steps::cleanup_cargo_config(runners::Platform::Linux)),
60    )
61}