compare_perf.rs

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