Skip to repository content

tenant.openagents/omega

No repository description is available.

OpenAgents Git authority 2026-07-28T05:41:39.641Z Public web read
NIP-34 coordinate30617:7649603503856e5148d571eac2766b288a8ff1e9e35d380337a1d2b0015b4f92:omega
MaintainersHidden in public view
References2 branches · 1 tag
Read-only clonegit clone https://openagents.com/git/tenant.openagents/omega.git
Browse files

publish_extension_cli.rs

232 lines · 7.8 KB · rust
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
Served at tenant.openagents/omega Member data and write actions are omitted.