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(&[&refresh_zed_dev]);
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(refresh_zed_dev.name, refresh_zed_dev.job)
18 .add_job(post_to_discord.name, post_to_discord.job)
19 .add_job(publish_winget.name, publish_winget.job)
20 .add_job(create_sentry_release.name, create_sentry_release.job)
21}
22
23fn rebuild_releases_page() -> NamedJob {
24 fn refresh_cloud_releases() -> Step<Run> {
25 named::bash(
26 "curl -fX POST https://cloud.zed.dev/releases/refresh?expect_tag=${{ github.event.release.tag_name }}",
27 )
28 }
29
30 fn redeploy_zed_dev() -> Step<Run> {
31 named::bash("npm exec --yes -- vercel@37 --token=\"$VERCEL_TOKEN\" --scope zed-industries redeploy https://zed.dev")
32 .add_env(("VERCEL_TOKEN", vars::VERCEL_TOKEN))
33 }
34
35 named::job(
36 Job::default()
37 .runs_on(runners::LINUX_SMALL)
38 .cond(Expression::new(
39 "github.repository_owner == 'zed-industries'",
40 ))
41 .add_step(refresh_cloud_releases())
42 .add_step(redeploy_zed_dev()),
43 )
44}
45
46fn post_to_discord(deps: &[&NamedJob]) -> NamedJob {
47 fn get_release_url() -> Step<Run> {
48 named::bash(indoc::indoc! {r#"
49 if [ "${{ github.event.release.prerelease }}" == "true" ]; then
50 URL="https://zed.dev/releases/preview"
51 else
52 URL="https://zed.dev/releases/stable"
53 fi
54
55 echo "URL=$URL" >> "$GITHUB_OUTPUT"
56 "#})
57 .id("get-release-url")
58 }
59
60 fn get_content() -> Step<Use> {
61 named::uses(
62 "2428392",
63 "gh-truncate-string-action",
64 "b3ff790d21cf42af3ca7579146eedb93c8fb0757", // v1.4.1
65 )
66 .id("get-content")
67 .add_with((
68 "stringToTruncate",
69 indoc::indoc! {r#"
70 📣 Zed [${{ github.event.release.tag_name }}](<${{ steps.get-release-url.outputs.URL }}>) was just released!
71
72 ${{ github.event.release.body }}
73 "#},
74 ))
75 .add_with(("maxLength", 2000))
76 .add_with(("truncationSymbol", "..."))
77 }
78
79 fn discord_webhook_action() -> Step<Use> {
80 named::uses(
81 "tsickert",
82 "discord-webhook",
83 "c840d45a03a323fbc3f7507ac7769dbd91bfb164", // v5.3.0
84 )
85 .add_with(("webhook-url", vars::DISCORD_WEBHOOK_RELEASE_NOTES))
86 .add_with(("content", "${{ steps.get-content.outputs.string }}"))
87 }
88 let job = dependant_job(deps)
89 .runs_on(runners::LINUX_SMALL)
90 .cond(Expression::new(
91 "github.repository_owner == 'zed-industries'",
92 ))
93 .add_step(get_release_url())
94 .add_step(get_content())
95 .add_step(discord_webhook_action());
96 named::job(job)
97}
98
99fn publish_winget() -> NamedJob {
100 fn set_package_name() -> (Step<Run>, StepOutput) {
101 let step = named::bash(indoc::indoc! {r#"
102 if [ "${{ github.event.release.prerelease }}" == "true" ]; then
103 PACKAGE_NAME=ZedIndustries.Zed.Preview
104 else
105 PACKAGE_NAME=ZedIndustries.Zed
106 fi
107
108 echo "PACKAGE_NAME=$PACKAGE_NAME" >> "$GITHUB_OUTPUT"
109 "#})
110 .id("set-package-name");
111
112 let output = StepOutput::new(&step, "PACKAGE_NAME");
113 (step, output)
114 }
115
116 fn winget_releaser(package_name: &StepOutput) -> Step<Use> {
117 named::uses(
118 "vedantmgoyal9",
119 "winget-releaser",
120 "19e706d4c9121098010096f9c495a70a7518b30f", // v2
121 )
122 .add_with(("identifier", package_name.to_string()))
123 .add_with(("max-versions-to-keep", 5))
124 .add_with(("token", vars::WINGET_TOKEN))
125 }
126
127 let (set_package_name, package_name) = set_package_name();
128
129 named::job(
130 Job::default()
131 .runs_on(runners::WINDOWS_DEFAULT)
132 .add_step(set_package_name)
133 .add_step(winget_releaser(&package_name)),
134 )
135}
136
137fn create_sentry_release() -> NamedJob {
138 let job = Job::default()
139 .runs_on(runners::LINUX_SMALL)
140 .cond(Expression::new(
141 "github.repository_owner == 'zed-industries'",
142 ))
143 .add_step(checkout_repo())
144 .add_step(release::create_sentry_release());
145 named::job(job)
146}