Skip to repository content208 lines · 7.4 KB · rust
tenant.openagents/omega
No repository description is available.
OpenAgents Git authority 2026-07-28T05:40:13.557Z Public web read
NIP-34 coordinate
30617:7649603503856e5148d571eac2766b288a8ff1e9e35d380337a1d2b0015b4f92:omegaMaintainersHidden in public view
References2 branches · 1 tag
Read-only clone
git clone https://openagents.com/git/tenant.openagents/omega.gitBrowse files
extension_tests.rs
1use gh_workflow::*;
2use indoc::indoc;
3
4use crate::tasks::workflows::{
5 extension_bump::compare_versions,
6 run_tests::{
7 RunContext, fetch_ts_query_ls, orchestrate_for_extension, run_ts_query_ls, tests_pass,
8 },
9 runners,
10 steps::{
11 self, BASH_SHELL, CommonJobConditions, CommonPermissionSets, FluentBuilder, NamedJob,
12 cache_rust_dependencies_namespace, named,
13 },
14 vars::{PathCondition, StepOutput, WorkflowInput, one_workflow_per_non_main_branch_and_token},
15};
16
17pub(crate) const ZED_EXTENSION_CLI_SHA: &str = "9ee3c503a4bbbc6b4a0f8a789acca4871d773223";
18
19// This should follow the set target in crates/extension/src/extension_builder.rs
20const EXTENSION_RUST_TARGET: &str = "wasm32-wasip2";
21
22// This is used by various extensions repos in the zed-extensions org to run automated tests.
23pub(crate) fn extension_tests() -> Workflow {
24 let should_check_rust = PathCondition::new("check_rust", r"^(Cargo.lock|Cargo.toml|.*\.rs)$");
25 let should_check_extension =
26 PathCondition::new("check_extension", r"^(extension\.toml|.*\.scm)$");
27
28 let orchestrate = with_extension_defaults(orchestrate_for_extension(&[
29 &should_check_rust,
30 &should_check_extension,
31 ]));
32
33 let jobs = [
34 orchestrate,
35 should_check_rust.and_always().then(check_rust()),
36 should_check_extension.and_always().then(check_extension()),
37 ];
38
39 let tests_pass = tests_pass(&jobs, &[]);
40
41 let working_directory = WorkflowInput::string("working-directory", Some(".".to_owned()));
42
43 named::workflow()
44 .with_minimal_permissions()
45 .add_event(
46 Event::default().workflow_call(
47 WorkflowCall::default()
48 .add_input(working_directory.name, working_directory.call_input()),
49 ),
50 )
51 .concurrency(one_workflow_per_non_main_branch_and_token(
52 "extension-tests",
53 ))
54 .add_env(("CARGO_TERM_COLOR", "always"))
55 .add_env(("RUST_BACKTRACE", 1))
56 .add_env(("CARGO_INCREMENTAL", 0))
57 .add_env(("ZED_EXTENSION_CLI_SHA", ZED_EXTENSION_CLI_SHA))
58 .add_env(("RUSTUP_TOOLCHAIN", "stable"))
59 .add_env(("CARGO_BUILD_TARGET", EXTENSION_RUST_TARGET))
60 .map(|workflow| {
61 jobs.into_iter()
62 .chain([tests_pass])
63 .fold(workflow, |workflow, job| {
64 workflow.add_job(job.name, job.job)
65 })
66 })
67}
68
69fn install_rust_target() -> Step<Run> {
70 named::bash(format!("rustup target add {EXTENSION_RUST_TARGET}",))
71}
72
73fn get_package_name() -> (Step<Run>, StepOutput) {
74 let step = named::bash(indoc! {r#"
75 PACKAGE_NAME="$(sed -n 's/^name = "\(.*\)"/\1/p' < Cargo.toml | head -1 | tr -d '[:space:]')"
76 echo "package_name=${PACKAGE_NAME}" >> "$GITHUB_OUTPUT"
77 "#})
78 .id("get-package-name");
79
80 let output = StepOutput::new(&step, "package_name");
81 (step, output)
82}
83
84fn cargo_fmt_package(package_name: &StepOutput) -> Step<Run> {
85 named::bash(r#"cargo fmt -p "$PACKAGE_NAME" -- --check"#)
86 .add_env(("PACKAGE_NAME", package_name.to_string()))
87}
88
89fn run_clippy(package_name: &StepOutput) -> Step<Run> {
90 named::bash(r#"cargo clippy -p "$PACKAGE_NAME" --release --all-features -- --deny warnings"#)
91 .add_env(("PACKAGE_NAME", package_name.to_string()))
92}
93
94fn run_nextest(package_name: &StepOutput) -> Step<Run> {
95 named::bash(
96 r#"cargo nextest run -p "$PACKAGE_NAME" --no-fail-fast --no-tests=warn --target "$(rustc -vV | sed -n 's|host: ||p')""#,
97 )
98 .add_env(("PACKAGE_NAME", package_name.to_string()))
99 .add_env(("NEXTEST_NO_TESTS", "warn"))
100}
101
102fn extension_job_defaults() -> Defaults {
103 Defaults::default().run(
104 RunDefaults::default()
105 .shell(BASH_SHELL)
106 .working_directory("${{ inputs.working-directory }}"),
107 )
108}
109
110fn with_extension_defaults(named_job: NamedJob) -> NamedJob {
111 NamedJob {
112 name: named_job.name,
113 job: named_job.job.defaults(extension_job_defaults()),
114 }
115}
116
117fn check_rust() -> NamedJob {
118 let (get_package, package_name) = get_package_name();
119
120 let job = Job::default()
121 .defaults(extension_job_defaults())
122 .with_repository_owner_guard()
123 .runs_on(runners::LINUX_LARGE_RAM)
124 .timeout_minutes(6u32)
125 .add_step(steps::checkout_repo())
126 .add_step(steps::cache_rust_dependencies_namespace())
127 .add_step(install_rust_target())
128 .add_step(get_package)
129 .add_step(cargo_fmt_package(&package_name))
130 .add_step(run_clippy(&package_name))
131 .add_step(steps::cargo_install_nextest())
132 .add_step(run_nextest(&package_name));
133
134 named::job(job)
135}
136
137pub(crate) fn check_extension() -> NamedJob {
138 let (cache_download, cache_hit) = cache_zed_extension_cli();
139 let (check_version_job, version_changed, _) = compare_versions();
140
141 let job = Job::default()
142 .defaults(extension_job_defaults())
143 .with_repository_owner_guard()
144 .runs_on(runners::LINUX_LARGE_RAM)
145 .timeout_minutes(6u32)
146 .add_step(steps::checkout_repo().with_full_history())
147 .add_step(cache_download)
148 .add_step(download_zed_extension_cli(cache_hit))
149 .add_step(cache_rust_dependencies_namespace()) // Extensions can compile Rust, so provide the cache if needed.
150 .add_step(check())
151 .add_step(fetch_ts_query_ls())
152 .add_step(run_ts_query_ls(RunContext::Extension))
153 .add_step(check_version_job)
154 .add_step(verify_version_did_not_change(version_changed));
155
156 named::job(job)
157}
158
159pub fn cache_zed_extension_cli() -> (Step<Use>, StepOutput) {
160 let step = named::uses(
161 "actions",
162 "cache",
163 "0057852bfaa89a56745cba8c7296529d2fc39830",
164 )
165 .id("cache-zed-extension-cli")
166 .with(
167 Input::default()
168 .add("path", "zed-extension")
169 .add("key", "zed-extension-${{ env.ZED_EXTENSION_CLI_SHA }}"),
170 );
171 let output = StepOutput::new(&step, "cache-hit");
172 (step, output)
173}
174
175pub fn download_zed_extension_cli(cache_hit: StepOutput) -> Step<Run> {
176 named::bash(
177 indoc! {
178 r#"
179 wget --quiet "https://zed-extension-cli.nyc3.digitaloceanspaces.com/$ZED_EXTENSION_CLI_SHA/x86_64-unknown-linux-gnu/zed-extension" -O "$GITHUB_WORKSPACE/zed-extension"
180 chmod +x "$GITHUB_WORKSPACE/zed-extension"
181 "#,
182 }
183 ).if_condition(Expression::new(format!("{} != 'true'", cache_hit.expr())))
184}
185
186pub fn check() -> Step<Run> {
187 named::bash(indoc! {
188 r#"
189 mkdir -p /tmp/ext-scratch
190 mkdir -p /tmp/ext-output
191 "$GITHUB_WORKSPACE/zed-extension" --source-dir . --scratch-dir /tmp/ext-scratch --output-dir /tmp/ext-output
192 "#
193 })
194}
195
196fn verify_version_did_not_change(version_changed: StepOutput) -> Step<Run> {
197 named::bash(indoc! {r#"
198 if [[ "$VERSION_CHANGED" == "true" && "$GITHUB_EVENT_NAME" == "pull_request" && "$PR_USER_LOGIN" != "zed-zippy[bot]" ]] ; then
199 echo "Version change detected in your change!"
200 echo "Version changes happen in separate PRs and will be performed by the zed-zippy bot"
201 exit 42
202 fi
203 "#
204 })
205 .add_env(("VERSION_CHANGED", version_changed.to_string()))
206 .add_env(("PR_USER_LOGIN", "${{ github.event.pull_request.user.login }}"))
207}
208