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