compare_perf.rs

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