extension_tests.rs

  1use gh_workflow::*;
  2use indoc::indoc;
  3
  4use crate::tasks::workflows::{
  5    run_tests::{orchestrate, tests_pass},
  6    runners,
  7    steps::{self, CommonJobConditions, FluentBuilder, NamedJob, named},
  8    vars::{PathCondition, StepOutput, one_workflow_per_non_main_branch},
  9};
 10
 11pub(crate) const ZED_EXTENSION_CLI_SHA: &str = "7cfce605704d41ca247e3f84804bf323f6c6caaf";
 12
 13// This is used by various extensions repos in the zed-extensions org to run automated tests.
 14pub(crate) fn extension_tests() -> Workflow {
 15    let should_check_rust = PathCondition::new("check_rust", r"^(Cargo.lock|Cargo.toml|.*\.rs)$");
 16    let should_check_extension = PathCondition::new("check_extension", r"^.*\.scm$");
 17
 18    let orchestrate = orchestrate(&[&should_check_rust, &should_check_extension]);
 19
 20    let jobs = [
 21        orchestrate,
 22        should_check_rust.guard(check_rust()),
 23        should_check_extension.guard(check_extension()),
 24    ];
 25
 26    let tests_pass = tests_pass(&jobs);
 27
 28    named::workflow()
 29        .add_event(Event::default().workflow_call(WorkflowCall::default()))
 30        .concurrency(one_workflow_per_non_main_branch())
 31        .add_env(("CARGO_TERM_COLOR", "always"))
 32        .add_env(("RUST_BACKTRACE", 1))
 33        .add_env(("CARGO_INCREMENTAL", 0))
 34        .add_env(("ZED_EXTENSION_CLI_SHA", ZED_EXTENSION_CLI_SHA))
 35        .add_env(("RUSTUP_TOOLCHAIN", "stable"))
 36        .add_env((
 37            "CARGO_BUILD_TARGET",
 38            extension::extension_builder::RUST_TARGET,
 39        ))
 40        .map(|workflow| {
 41            jobs.into_iter()
 42                .chain([tests_pass])
 43                .fold(workflow, |workflow, job| {
 44                    workflow.add_job(job.name, job.job)
 45                })
 46        })
 47}
 48
 49fn run_clippy() -> Step<Run> {
 50    named::bash("cargo clippy --release --all-targets --all-features -- --deny warnings")
 51}
 52
 53fn check_rust() -> NamedJob {
 54    let job = Job::default()
 55        .with_repository_owner_guard()
 56        .runs_on(runners::LINUX_LARGE)
 57        .timeout_minutes(6u32)
 58        .add_step(steps::checkout_repo())
 59        .add_step(steps::cache_rust_dependencies_namespace())
 60        .add_step(steps::cargo_fmt())
 61        .add_step(run_clippy())
 62        .add_step(steps::cargo_install_nextest())
 63        .add_step(
 64            steps::cargo_nextest(runners::Platform::Linux).add_env(("NEXTEST_NO_TESTS", "warn")),
 65        );
 66
 67    named::job(job)
 68}
 69
 70pub(crate) fn check_extension() -> NamedJob {
 71    let (cache_download, cache_hit) = cache_zed_extension_cli();
 72    let job = Job::default()
 73        .with_repository_owner_guard()
 74        .runs_on(runners::LINUX_LARGE_RAM)
 75        .timeout_minutes(4u32)
 76        .add_step(steps::checkout_repo())
 77        .add_step(cache_download)
 78        .add_step(download_zed_extension_cli(cache_hit))
 79        .add_step(check());
 80
 81    named::job(job)
 82}
 83
 84pub fn cache_zed_extension_cli() -> (Step<Use>, StepOutput) {
 85    let step = named::uses(
 86        "actions",
 87        "cache",
 88        "0057852bfaa89a56745cba8c7296529d2fc39830",
 89    )
 90    .id("cache-zed-extension-cli")
 91    .with(
 92        Input::default()
 93            .add("path", "zed-extension")
 94            .add("key", "zed-extension-${{ env.ZED_EXTENSION_CLI_SHA }}"),
 95    );
 96    let output = StepOutput::new(&step, "cache-hit");
 97    (step, output)
 98}
 99
100pub fn download_zed_extension_cli(cache_hit: StepOutput) -> Step<Run> {
101    named::bash(
102    indoc! {
103        r#"
104        wget --quiet "https://zed-extension-cli.nyc3.digitaloceanspaces.com/$ZED_EXTENSION_CLI_SHA/x86_64-unknown-linux-gnu/zed-extension"
105        chmod +x zed-extension
106        "#,
107    }
108    ).if_condition(Expression::new(format!("{} != 'true'", cache_hit.expr())))
109}
110
111pub fn check() -> Step<Run> {
112    named::bash(indoc! {
113        r#"
114        mkdir -p /tmp/ext-scratch
115        mkdir -p /tmp/ext-output
116        ./zed-extension --source-dir . --scratch-dir /tmp/ext-scratch --output-dir /tmp/ext-output
117        "#
118    })
119}