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