extension_release.rs

 1use gh_workflow::{Event, Job, Run, Step, Use, Workflow, WorkflowCall};
 2use indoc::indoc;
 3
 4use crate::tasks::workflows::{
 5    extension_bump::{RepositoryTarget, generate_token},
 6    runners,
 7    steps::{CommonJobConditions, NamedJob, checkout_repo, named},
 8    vars::{StepOutput, WorkflowSecret},
 9};
10
11pub(crate) fn extension_release() -> Workflow {
12    let (app_id, app_secret) = extension_workflow_secrets();
13
14    let create_release = create_release(&app_id, &app_secret);
15    named::workflow()
16        .on(
17            Event::default().workflow_call(WorkflowCall::default().secrets([
18                (app_id.name.to_owned(), app_id.secret_configuration()),
19                (
20                    app_secret.name.to_owned(),
21                    app_secret.secret_configuration(),
22                ),
23            ])),
24        )
25        .add_job(create_release.name, create_release.job)
26}
27
28fn create_release(app_id: &WorkflowSecret, app_secret: &WorkflowSecret) -> NamedJob {
29    let extension_registry = RepositoryTarget::new("zed-industries", &["extensions"]);
30    let (generate_token, generated_token) = generate_token(
31        &app_id.to_string(),
32        &app_secret.to_string(),
33        Some(extension_registry),
34    );
35    let (get_extension_id, extension_id) = get_extension_id();
36
37    let job = Job::default()
38        .with_repository_owner_guard()
39        .runs_on(runners::LINUX_SMALL)
40        .add_step(generate_token)
41        .add_step(checkout_repo())
42        .add_step(get_extension_id)
43        .add_step(release_action(extension_id, generated_token));
44
45    named::job(job)
46}
47
48fn get_extension_id() -> (Step<Run>, StepOutput) {
49    let step = named::bash(indoc! {
50    r#"
51        EXTENSION_ID="$(sed -n 's/id = \"\(.*\)\"/\1/p' < extension.toml)"
52
53        echo "extension_id=${EXTENSION_ID}" >> "$GITHUB_OUTPUT"
54    "#})
55    .id("get-extension-id");
56
57    let extension_id = StepOutput::new(&step, "extension_id");
58
59    (step, extension_id)
60}
61
62fn release_action(extension_id: StepOutput, generated_token: StepOutput) -> Step<Use> {
63    named::uses("huacnlee", "zed-extension-action", "v2")
64        .add_with(("extension-name", extension_id.to_string()))
65        .add_with(("push-to", "zed-industries/extensions"))
66        .add_env(("COMMITTER_TOKEN", generated_token.to_string()))
67}
68
69pub(crate) fn extension_workflow_secrets() -> (WorkflowSecret, WorkflowSecret) {
70    let app_id = WorkflowSecret::new("app-id", "The app ID used to create the PR");
71    let app_secret =
72        WorkflowSecret::new("app-secret", "The app secret for the corresponding app ID");
73
74    (app_id, app_secret)
75}