1use gh_workflow::*;
2
3use crate::tasks::workflows::{
4 release, runners,
5 steps::{NamedJob, checkout_repo, dependant_job, named},
6 vars::{self, StepOutput},
7};
8
9pub fn after_release() -> Workflow {
10 // let refresh_zed_dev = rebuild_releases_page();
11 let post_to_discord = post_to_discord(&[]);
12 let publish_winget = publish_winget();
13 let create_sentry_release = create_sentry_release();
14
15 named::workflow()
16 .on(Event::default().release(Release::default().types(vec![ReleaseType::Published])))
17 .add_job(post_to_discord.name, post_to_discord.job)
18 .add_job(publish_winget.name, publish_winget.job)
19 .add_job(create_sentry_release.name, create_sentry_release.job)
20}
21
22#[allow(unused)]
23fn rebuild_releases_page() -> NamedJob {
24 named::job(
25 Job::default()
26 .runs_on(runners::LINUX_SMALL)
27 .cond(Expression::new(
28 "github.repository_owner == 'zed-industries'",
29 ))
30 .add_step(named::bash(
31 "curl https://zed.dev/api/revalidate-releases -H \"Authorization: Bearer ${RELEASE_NOTES_API_TOKEN}\"",
32 ).add_env(("RELEASE_NOTES_API_TOKEN", vars::RELEASE_NOTES_API_TOKEN))),
33 )
34}
35
36fn post_to_discord(deps: &[&NamedJob]) -> NamedJob {
37 fn get_release_url() -> Step<Run> {
38 named::bash(indoc::indoc! {r#"
39 if [ "${{ github.event.release.prerelease }}" == "true" ]; then
40 URL="https://zed.dev/releases/preview"
41 else
42 URL="https://zed.dev/releases/stable"
43 fi
44
45 echo "URL=$URL" >> "$GITHUB_OUTPUT"
46 "#})
47 .id("get-release-url")
48 }
49
50 fn get_content() -> Step<Use> {
51 named::uses(
52 "2428392",
53 "gh-truncate-string-action",
54 "b3ff790d21cf42af3ca7579146eedb93c8fb0757", // v1.4.1
55 )
56 .id("get-content")
57 .add_with((
58 "stringToTruncate",
59 indoc::indoc! {r#"
60 📣 Zed [${{ github.event.release.tag_name }}](<${{ steps.get-release-url.outputs.URL }}>) was just released!
61
62 ${{ github.event.release.body }}
63 "#},
64 ))
65 .add_with(("maxLength", 2000))
66 .add_with(("truncationSymbol", "..."))
67 }
68
69 fn discord_webhook_action() -> Step<Use> {
70 named::uses(
71 "tsickert",
72 "discord-webhook",
73 "c840d45a03a323fbc3f7507ac7769dbd91bfb164", // v5.3.0
74 )
75 .add_with(("webhook-url", vars::DISCORD_WEBHOOK_RELEASE_NOTES))
76 .add_with(("content", "${{ steps.get-content.outputs.string }}"))
77 }
78 let job = dependant_job(deps)
79 .runs_on(runners::LINUX_SMALL)
80 .cond(Expression::new(
81 "github.repository_owner == 'zed-industries'",
82 ))
83 .add_step(get_release_url())
84 .add_step(get_content())
85 .add_step(discord_webhook_action());
86 named::job(job)
87}
88
89fn publish_winget() -> NamedJob {
90 fn set_package_name() -> (Step<Run>, StepOutput) {
91 let step = named::bash(indoc::indoc! {r#"
92 if [ "${{ github.event.release.prerelease }}" == "true" ]; then
93 PACKAGE_NAME=ZedIndustries.Zed.Preview
94 else
95 PACKAGE_NAME=ZedIndustries.Zed
96 fi
97
98 echo "PACKAGE_NAME=$PACKAGE_NAME" >> "$GITHUB_OUTPUT"
99 "#})
100 .id("set-package-name");
101
102 let output = StepOutput::new(&step, "PACKAGE_NAME");
103 (step, output)
104 }
105
106 fn winget_releaser(package_name: &StepOutput) -> Step<Use> {
107 named::uses(
108 "vedantmgoyal9",
109 "winget-releaser",
110 "19e706d4c9121098010096f9c495a70a7518b30f", // v2
111 )
112 .add_with(("identifier", package_name.to_string()))
113 .add_with(("max-versions-to-keep", 5))
114 .add_with(("token", vars::WINGET_TOKEN))
115 }
116
117 let (set_package_name, package_name) = set_package_name();
118
119 named::job(
120 Job::default()
121 .runs_on(runners::WINDOWS_DEFAULT)
122 .add_step(set_package_name)
123 .add_step(winget_releaser(&package_name)),
124 )
125}
126
127fn create_sentry_release() -> NamedJob {
128 let job = Job::default()
129 .runs_on(runners::LINUX_SMALL)
130 .cond(Expression::new(
131 "github.repository_owner == 'zed-industries'",
132 ))
133 .add_step(checkout_repo())
134 .add_step(release::create_sentry_release());
135 named::job(job)
136}