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(&[]);
 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}