1use gh_workflow::{Event, Job, Run, Step, Use, Workflow, WorkflowCall};
2use indoc::indoc;
3
4use crate::tasks::workflows::{
5 extension_bump::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 (generate_token, generated_token) = generate_token(&app_id, &app_secret);
30 let (get_extension_id, extension_id) = get_extension_id();
31
32 let job = Job::default()
33 .with_repository_owner_guard()
34 .runs_on(runners::LINUX_LARGE)
35 .add_step(generate_token)
36 .add_step(checkout_repo())
37 .add_step(get_extension_id)
38 .add_step(release_action(extension_id, generated_token));
39
40 named::job(job)
41}
42
43fn get_extension_id() -> (Step<Run>, StepOutput) {
44 let step = named::bash(indoc! {
45 r#"
46 EXTENSION_ID="$(sed -n 's/id = \"\(.*\)\"/\1/p' < extension.toml)"
47
48 echo "extension_id=${EXTENSION_ID}" >> "$GITHUB_OUTPUT"
49 "#})
50 .id("get-extension-id");
51
52 let extension_id = StepOutput::new(&step, "extension_id");
53
54 (step, extension_id)
55}
56
57fn release_action(extension_id: StepOutput, generated_token: StepOutput) -> Step<Use> {
58 named::uses("huacnlee", "zed-extension-action", "v2")
59 .add_with(("extension-name", extension_id.to_string()))
60 .add_with(("push-to", "zed-industries/extensions"))
61 .add_env(("COMMITTER_TOKEN", generated_token.to_string()))
62}
63
64pub(crate) fn extension_workflow_secrets() -> (WorkflowSecret, WorkflowSecret) {
65 let app_id = WorkflowSecret::new("app-id", "The app ID used to create the PR");
66 let app_secret =
67 WorkflowSecret::new("app-secret", "The app secret for the corresponding app ID");
68
69 (app_id, app_secret)
70}