after_release.rs

  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}