release_nightly.rs

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