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_no_filter},
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_no_filter(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(steps::checkout_repo().with_full_history())
76 .add_step(steps::cargo_fmt())
77 .add_step(steps::script("./script/clippy"));
78
79 named::job(job)
80}
81
82fn release_job(deps: &[&NamedJob]) -> Job {
83 let job = Job::default()
84 .with_repository_owner_guard()
85 .timeout_minutes(60u32);
86 if deps.len() > 0 {
87 job.needs(deps.iter().map(|j| j.name.clone()).collect::<Vec<_>>())
88 } else {
89 job
90 }
91}
92
93fn update_nightly_tag_job(bundle: &ReleaseBundleJobs) -> NamedJob {
94 fn update_nightly_tag() -> Step<Run> {
95 named::bash(indoc::indoc! {r#"
96 if [ "$(git rev-parse nightly)" = "$(git rev-parse HEAD)" ]; then
97 echo "Nightly tag already points to current commit. Skipping tagging."
98 exit 0
99 fi
100 git config user.name github-actions
101 git config user.email github-actions@github.com
102 git tag -f nightly
103 git push origin nightly --force
104 "#})
105 }
106
107 NamedJob {
108 name: "update_nightly_tag".to_owned(),
109 job: steps::release_job(&bundle.jobs())
110 .runs_on(runners::LINUX_MEDIUM)
111 .add_step(steps::checkout_repo().with_full_history())
112 .add_step(download_workflow_artifacts())
113 .add_step(steps::script("ls -lR ./artifacts"))
114 .add_step(prep_release_artifacts())
115 .add_step(
116 steps::script("./script/upload-nightly")
117 .add_env((
118 "DIGITALOCEAN_SPACES_ACCESS_KEY",
119 vars::DIGITALOCEAN_SPACES_ACCESS_KEY,
120 ))
121 .add_env((
122 "DIGITALOCEAN_SPACES_SECRET_KEY",
123 vars::DIGITALOCEAN_SPACES_SECRET_KEY,
124 )),
125 )
126 .add_step(update_nightly_tag())
127 .add_step(create_sentry_release()),
128 }
129}