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        // TODO: vim not gpui, and ideally allow args
29        named::bash(&format!("cargo perf-test -p gpui -- --json={ref_name}"))
30    }
31
32    fn git_checkout(ref_name: String) -> Step<Run> {
33        named::bash(
34            &format!("git fetch origin {ref_name} && git checkout {ref_name}"))
35    }
36
37    fn compare_runs(head: String, base: String) -> Step<Run> {
38        // TODO: this should really be swapped...
39        named::bash(&format!("cargo perf-compare {base} {head} --save=results.md"))
40    }
41
42    named::job(
43        Job::default()
44            .runs_on(runners::LINUX_DEFAULT)
45            .add_step(steps::checkout_repo())
46            .add_step(echo_inputs(base, head))
47            .add_step(git_checkout(base.var()))
48            .add_step(cargo_perf_test(base.var()))
49            .add_step(git_checkout(head.var()))
50            .add_step(cargo_perf_test(head.var()))
51            .add_step(compare_runs(head.var(), base.var()))
52            .add_step(upload_artifact("results.md", "results.md")),
53    )
54}