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}