release_nightly.rs

  1use crate::tasks::workflows::{
  2    nix_build::build_nix,
  3    release::{ReleaseBundleJobs, download_workflow_artifacts, prep_release_artifacts},
  4    run_bundling::{bundle_linux, bundle_mac, bundle_windows},
  5    run_tests::run_platform_tests,
  6    runners::{Arch, Platform, ReleaseChannel},
  7    steps::{FluentBuilder, NamedJob},
  8};
  9
 10use super::{runners, steps, steps::named, vars};
 11use gh_workflow::*;
 12
 13/// Generates the release_nightly.yml workflow
 14pub fn release_nightly() -> Workflow {
 15    let style = check_style();
 16    // run only on windows as that's our fastest platform right now.
 17    let tests = run_platform_tests(Platform::Windows);
 18    let nightly = Some(ReleaseChannel::Nightly);
 19
 20    let bundle = ReleaseBundleJobs {
 21        linux_aarch64: bundle_linux(Arch::AARCH64, nightly, &[&style, &tests]),
 22        linux_x86_64: bundle_linux(Arch::X86_64, nightly, &[&style, &tests]),
 23        mac_aarch64: bundle_mac(Arch::AARCH64, nightly, &[&style, &tests]),
 24        mac_x86_64: bundle_mac(Arch::X86_64, nightly, &[&style, &tests]),
 25        windows_aarch64: bundle_windows(Arch::AARCH64, nightly, &[&style, &tests]),
 26        windows_x86_64: bundle_windows(Arch::X86_64, nightly, &[&style, &tests]),
 27    };
 28
 29    let nix_linux_x86 = build_nix(
 30        Platform::Linux,
 31        Arch::X86_64,
 32        "default",
 33        None,
 34        &[&style, &tests],
 35    );
 36    let nix_mac_arm = build_nix(
 37        Platform::Mac,
 38        Arch::AARCH64,
 39        "default",
 40        None,
 41        &[&style, &tests],
 42    );
 43    let update_nightly_tag = update_nightly_tag_job(&bundle);
 44
 45    named::workflow()
 46        .on(Event::default()
 47            // Fire every day at 7:00am UTC (Roughly before EU workday and after US workday)
 48            .schedule([Schedule::new("0 7 * * *")])
 49            .push(Push::default().add_tag("nightly")))
 50        .add_env(("CARGO_TERM_COLOR", "always"))
 51        .add_env(("RUST_BACKTRACE", "1"))
 52        .add_job(style.name, style.job)
 53        .add_job(tests.name, tests.job)
 54        .map(|mut workflow| {
 55            for job in bundle.into_jobs() {
 56                workflow = workflow.add_job(job.name, job.job);
 57            }
 58            workflow
 59        })
 60        .add_job(nix_linux_x86.name, nix_linux_x86.job)
 61        .add_job(nix_mac_arm.name, nix_mac_arm.job)
 62        .add_job(update_nightly_tag.name, update_nightly_tag.job)
 63}
 64
 65fn check_style() -> NamedJob {
 66    let job = release_job(&[])
 67        .runs_on(runners::MAC_DEFAULT)
 68        .add_step(
 69            steps::checkout_repo()
 70                .add_with(("clean", false))
 71                .add_with(("fetch-depth", 0)),
 72        )
 73        .add_step(steps::cargo_fmt())
 74        .add_step(steps::script("./script/clippy"));
 75
 76    named::job(job)
 77}
 78
 79fn release_job(deps: &[&NamedJob]) -> Job {
 80    let job = Job::default()
 81        .cond(Expression::new(
 82            "github.repository_owner == 'zed-industries'",
 83        ))
 84        .timeout_minutes(60u32);
 85    if deps.len() > 0 {
 86        job.needs(deps.iter().map(|j| j.name.clone()).collect::<Vec<_>>())
 87    } else {
 88        job
 89    }
 90}
 91
 92fn update_nightly_tag_job(bundle: &ReleaseBundleJobs) -> NamedJob {
 93    fn update_nightly_tag() -> Step<Run> {
 94        named::bash(indoc::indoc! {r#"
 95            if [ "$(git rev-parse nightly)" = "$(git rev-parse HEAD)" ]; then
 96              echo "Nightly tag already points to current commit. Skipping tagging."
 97              exit 0
 98            fi
 99            git config user.name github-actions
100            git config user.email github-actions@github.com
101            git tag -f nightly
102            git push origin nightly --force
103        "#})
104    }
105
106    fn create_sentry_release() -> Step<Use> {
107        named::uses(
108            "getsentry",
109            "action-release",
110            "526942b68292201ac6bbb99b9a0747d4abee354c", // v3
111        )
112        .add_env(("SENTRY_ORG", "zed-dev"))
113        .add_env(("SENTRY_PROJECT", "zed"))
114        .add_env(("SENTRY_AUTH_TOKEN", vars::SENTRY_AUTH_TOKEN))
115        .add_with(("environment", "production"))
116    }
117
118    NamedJob {
119        name: "update_nightly_tag".to_owned(),
120        job: steps::release_job(&bundle.jobs())
121            .runs_on(runners::LINUX_MEDIUM)
122            .add_step(steps::checkout_repo().add_with(("fetch-depth", 0)))
123            .add_step(download_workflow_artifacts())
124            .add_step(steps::script("ls -lR ./artifacts"))
125            .add_step(prep_release_artifacts(bundle))
126            .add_step(
127                steps::script("./script/upload-nightly")
128                    .add_env((
129                        "DIGITALOCEAN_SPACES_ACCESS_KEY",
130                        vars::DIGITALOCEAN_SPACES_ACCESS_KEY,
131                    ))
132                    .add_env((
133                        "DIGITALOCEAN_SPACES_SECRET_KEY",
134                        vars::DIGITALOCEAN_SPACES_SECRET_KEY,
135                    )),
136            )
137            .add_step(update_nightly_tag())
138            .add_step(create_sentry_release()),
139    }
140}