Skip to repository content232 lines · 7.8 KB · rust
tenant.openagents/omega
No repository description is available.
OpenAgents Git authority 2026-07-28T06:49:35.178Z 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
publish_extension_cli.rs
1use gh_workflow::*;
2use indoc::{formatdoc, indoc};
3
4use crate::tasks::workflows::{
5 runners,
6 steps::{
7 self, CommonPermissionSets, DEFAULT_REPOSITORY_OWNER_GUARD, GitRef, NamedJob, RefSha,
8 RepositoryTarget, TokenPermissions, generate_token, named,
9 },
10 vars::{self, StepOutput, WorkflowInput},
11};
12
13const EXTENSION_CLI_TAG: &str = "extension-cli";
14
15pub fn publish_extension_cli() -> Workflow {
16 let message = WorkflowInput::string("message", None).description(
17 "Describe why the extension CLI is being bumped and/or what changes are included.",
18 );
19
20 let publish = publish_job();
21 let update_sha_in_zed = update_sha_in_zed(&publish, &message);
22 let update_sha_in_extensions = update_sha_in_extensions(&publish, &message);
23
24 named::workflow()
25 .with_minimal_permissions()
26 .on(Event::default().workflow_dispatch(
27 WorkflowDispatch::default().add_input(message.name, message.input()),
28 ))
29 .add_env(("CARGO_TERM_COLOR", "always"))
30 .add_env(("CARGO_INCREMENTAL", 0))
31 .add_job(publish.name, publish.job)
32 .add_job(update_sha_in_zed.name, update_sha_in_zed.job)
33 .add_job(update_sha_in_extensions.name, update_sha_in_extensions.job)
34}
35
36// `workflow_dispatch` can be triggered from any branch where this workflow file
37// exists, so we additionally guard the jobs to only run when dispatched from
38// `main`. Jobs that depend on `publish_job` inherit this guard transitively
39// because they are skipped when `publish_job` is skipped.
40fn dispatched_from_main_guard() -> Expression {
41 Expression::new(format!(
42 "{DEFAULT_REPOSITORY_OWNER_GUARD} && github.ref == 'refs/heads/main'"
43 ))
44}
45
46fn publish_job() -> NamedJob {
47 fn build_extension_cli() -> Step<Run> {
48 named::bash("cargo build --release --package extension_cli")
49 }
50
51 fn upload_binary() -> Step<Run> {
52 named::bash(r#"script/upload-extension-cli "$GITHUB_SHA""#)
53 .add_env((
54 "DIGITALOCEAN_SPACES_ACCESS_KEY",
55 vars::DIGITALOCEAN_SPACES_ACCESS_KEY,
56 ))
57 .add_env((
58 "DIGITALOCEAN_SPACES_SECRET_KEY",
59 vars::DIGITALOCEAN_SPACES_SECRET_KEY,
60 ))
61 }
62
63 let (authenticate, token) = steps::authenticate_as_zippy()
64 .for_repository(RepositoryTarget::current())
65 .with_permissions([(TokenPermissions::Contents, Level::Write)])
66 .into();
67
68 named::job(
69 Job::default()
70 .cond(dispatched_from_main_guard())
71 .runs_on(runners::LINUX_DEFAULT)
72 .add_step(steps::checkout_repo())
73 .add_step(steps::cache_rust_dependencies_namespace())
74 .add_step(steps::setup_linux())
75 .add_step(build_extension_cli())
76 .add_step(upload_binary())
77 .add_step(authenticate)
78 .add_step(steps::update_ref(
79 GitRef::tag(EXTENSION_CLI_TAG),
80 RefSha::Context,
81 &token,
82 true,
83 )),
84 )
85}
86
87fn update_sha_in_zed(publish_job: &NamedJob, message: &WorkflowInput) -> NamedJob {
88 let (generate_token, generated_token) =
89 generate_token(vars::ZED_ZIPPY_APP_ID, vars::ZED_ZIPPY_APP_PRIVATE_KEY)
90 .for_repository(RepositoryTarget::current())
91 .with_permissions([
92 (TokenPermissions::Contents, Level::Write),
93 (TokenPermissions::PullRequests, Level::Write),
94 (TokenPermissions::Workflows, Level::Write),
95 ])
96 .into();
97
98 fn replace_sha() -> Step<Run> {
99 named::bash(indoc! {r#"
100 sed -i "s/ZED_EXTENSION_CLI_SHA: &str = \"[a-f0-9]*\"/ZED_EXTENSION_CLI_SHA: \&str = \"$GITHUB_SHA\"/" \
101 tooling/xtask/src/tasks/workflows/extension_tests.rs
102 "#})
103 }
104
105 fn regenerate_workflows() -> Step<Run> {
106 named::bash("cargo xtask workflows")
107 }
108
109 let (get_short_sha_step, short_sha) = get_short_sha();
110
111 named::job(
112 Job::default()
113 .cond(dispatched_from_main_guard())
114 .needs(vec![publish_job.name.clone()])
115 .runs_on(runners::LINUX_LARGE)
116 .add_step(generate_token)
117 .add_step(steps::checkout_repo())
118 .add_step(steps::cache_rust_dependencies_namespace())
119 .add_step(get_short_sha_step)
120 .add_step(replace_sha())
121 .add_step(regenerate_workflows())
122 .add_step(create_pull_request_zed(
123 &generated_token,
124 &short_sha,
125 message,
126 )),
127 )
128}
129
130fn create_pull_request_zed(
131 generated_token: &StepOutput,
132 short_sha: &StepOutput,
133 message: &WorkflowInput,
134) -> Step<Use> {
135 let title = format!(
136 "extension_ci: Bump extension CLI version to `{}`",
137 short_sha
138 );
139
140 let body = formatdoc! {r#"
141 This PR bumps the extension CLI version used in the extension workflows to `${{{{ github.sha }}}}`.
142
143 {message}
144
145 Release Notes:
146
147 - N/A
148 "#};
149
150 steps::CreatePrStep::new(title, "update-extension-cli-sha", generated_token)
151 .with_body(body)
152 .into()
153}
154
155fn update_sha_in_extensions(publish_job: &NamedJob, message: &WorkflowInput) -> NamedJob {
156 let extensions_repo = RepositoryTarget::new("zed-industries", &["extensions"]);
157 let (generate_token, generated_token) =
158 generate_token(vars::ZED_ZIPPY_APP_ID, vars::ZED_ZIPPY_APP_PRIVATE_KEY)
159 .for_repository(extensions_repo)
160 .with_permissions([
161 (TokenPermissions::Contents, Level::Write),
162 (TokenPermissions::PullRequests, Level::Write),
163 (TokenPermissions::Workflows, Level::Write),
164 ])
165 .into();
166
167 fn checkout_extensions_repo(token: &StepOutput) -> Step<Use> {
168 named::uses(
169 "actions",
170 "checkout",
171 "11bd71901bbe5b1630ceea73d27597364c9af683", // v4
172 )
173 .add_with(("repository", "zed-industries/extensions"))
174 .add_with(("token", token.to_string()))
175 }
176
177 fn replace_sha() -> Step<Run> {
178 named::bash(indoc! {r#"
179 sed -i "s/ZED_EXTENSION_CLI_SHA: [a-f0-9]*/ZED_EXTENSION_CLI_SHA: $GITHUB_SHA/" \
180 .github/workflows/ci.yml
181 "#})
182 }
183
184 let (get_short_sha_step, short_sha) = get_short_sha();
185
186 named::job(
187 Job::default()
188 .cond(dispatched_from_main_guard())
189 .needs(vec![publish_job.name.clone()])
190 .runs_on(runners::LINUX_SMALL)
191 .add_step(generate_token)
192 .add_step(get_short_sha_step)
193 .add_step(checkout_extensions_repo(&generated_token))
194 .add_step(replace_sha())
195 .add_step(create_pull_request_extensions(
196 &generated_token,
197 &short_sha,
198 message,
199 )),
200 )
201}
202
203fn create_pull_request_extensions(
204 generated_token: &StepOutput,
205 short_sha: &StepOutput,
206 message: &WorkflowInput,
207) -> Step<Use> {
208 let title = format!("Bump extension CLI version to `{}`", short_sha);
209
210 let body = formatdoc! {r#"
211 This PR bumps the extension CLI version to https://github.com/zed-industries/zed/commit/${{{{ github.sha }}}}.
212
213 {message}
214 "#};
215
216 steps::CreatePrStep::new(title, "update-extension-cli-sha", generated_token)
217 .with_body(body)
218 .with_labels("allow-no-extension")
219 .into()
220}
221
222fn get_short_sha() -> (Step<Run>, StepOutput) {
223 let step = named::bash(indoc::indoc! {r#"
224 echo "sha_short=$(echo "$GITHUB_SHA" | cut -c1-7)" >> "$GITHUB_OUTPUT"
225 "#})
226 .id("short-sha");
227
228 let step_output = vars::StepOutput::new(&step, "sha_short");
229
230 (step, step_output)
231}
232