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("taiki-e", "install-action", "hyperfine")
46 }
47
48 fn compare_runs(head: &WorkflowInput, base: &WorkflowInput) -> Step<Run> {
49 named::bash(r#"cargo perf-compare --save=results.md "$BASE" "$HEAD""#)
50 .add_env(("BASE", base.to_string()))
51 .add_env(("HEAD", head.to_string()))
52 }
53
54 named::job(
55 Job::default()
56 .runs_on(runners::LINUX_DEFAULT)
57 .add_step(steps::checkout_repo())
58 .add_step(steps::setup_cargo_config(runners::Platform::Linux))
59 .map(steps::install_linux_dependencies)
60 .add_step(install_hyperfine())
61 .add_step(steps::git_checkout(base))
62 .add_step(cargo_perf_test(base, crate_name))
63 .add_step(steps::git_checkout(head))
64 .add_step(cargo_perf_test(head, crate_name))
65 .add_step(compare_runs(head, base))
66 .add_step(upload_artifact("results.md"))
67 .add_step(steps::cleanup_cargo_config(runners::Platform::Linux)),
68 )
69}