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::WorkflowInput,
 9};
10
11pub fn compare_perf() -> Workflow {
12    let head = WorkflowInput::string("head", None);
13    let base = WorkflowInput::string("base", None);
14    let crate_name = WorkflowInput::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(
27    base: &WorkflowInput,
28    head: &WorkflowInput,
29    crate_name: &WorkflowInput,
30) -> NamedJob {
31    fn cargo_perf_test(ref_name: &WorkflowInput, crate_name: &WorkflowInput) -> Step<Run> {
32        named::bash(
33            r#"
34            if [ -n "$CRATE_NAME" ]; then
35                cargo perf-test -p "$CRATE_NAME" -- --json="$REF_NAME";
36            else
37                cargo perf-test -p vim -- --json="$REF_NAME";
38            fi"#,
39        )
40        .add_env(("REF_NAME", ref_name.to_string()))
41        .add_env(("CRATE_NAME", crate_name.to_string()))
42    }
43
44    fn install_hyperfine() -> Step<Use> {
45        named::uses(
46            "taiki-e",
47            "install-action",
48            "b4f2d5cb8597b15997c8ede873eb6185efc5f0ad", // hyperfine
49        )
50    }
51
52    fn compare_runs(head: &WorkflowInput, base: &WorkflowInput) -> Step<Run> {
53        named::bash(r#"cargo perf-compare --save=results.md "$BASE" "$HEAD""#)
54            .add_env(("BASE", base.to_string()))
55            .add_env(("HEAD", head.to_string()))
56    }
57
58    named::job(
59        Job::default()
60            .runs_on(runners::LINUX_DEFAULT)
61            .add_step(steps::checkout_repo())
62            .add_step(steps::setup_cargo_config(runners::Platform::Linux))
63            .map(steps::install_linux_dependencies)
64            .add_step(install_hyperfine())
65            .add_step(steps::git_checkout(base))
66            .add_step(cargo_perf_test(base, crate_name))
67            .add_step(steps::git_checkout(head))
68            .add_step(cargo_perf_test(head, crate_name))
69            .add_step(compare_runs(head, base))
70            .add_step(upload_artifact("results.md"))
71            .add_step(steps::cleanup_cargo_config(runners::Platform::Linux)),
72    )
73}