after_release.rs

  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}