1use crate::tasks::workflows::steps::named;
2
3use super::{runners, steps, vars};
4use gh_workflow::*;
5
6pub fn run_bundling() -> Workflow {
7 named::workflow()
8 .on(Event::default().pull_request(
9 PullRequest::default().types([PullRequestType::Labeled, PullRequestType::Synchronize]),
10 ))
11 .concurrency(
12 Concurrency::new(Expression::new(
13 "${{ github.workflow }}-${{ github.head_ref || github.ref }}",
14 ))
15 .cancel_in_progress(true),
16 )
17 .add_env(("CARGO_TERM_COLOR", "always"))
18 .add_env(("CARGO_INCREMENTAL", "0"))
19 .add_env(("RUST_BACKTRACE", "1"))
20 .add_env(("ZED_CLIENT_CHECKSUM_SEED", vars::ZED_CLIENT_CHECKSUM_SEED))
21 .add_env(("ZED_MINIDUMP_ENDPOINT", vars::ZED_SENTRY_MINIDUMP_ENDPOINT))
22 .add_job("bundle_mac", bundle_mac())
23 .add_job("bundle_linux_x86_64", bundle_linux(runners::Arch::X86_64))
24 .add_job("bundle_linux_arm64", bundle_linux(runners::Arch::AARCH64))
25 .add_job(
26 "bundle_windows_x86_64",
27 bundle_windows_job(runners::Arch::X86_64),
28 )
29 .add_job(
30 "bundle_windows_arm64",
31 bundle_windows_job(runners::Arch::AARCH64),
32 )
33}
34
35fn bundle_job() -> Job {
36 Job::default()
37 .cond(Expression::new(
38 "(github.event.action == 'labeled' && github.event.label.name == 'run-bundling') ||
39 (github.event.action == 'synchronize' && contains(github.event.pull_request.labels.*.name, 'run-bundling'))",
40 ))
41 .timeout_minutes(60u32)
42}
43
44fn bundle_mac() -> Job {
45 bundle_job()
46 .runs_on(runners::MAC_DEFAULT)
47 .add_env(("MACOS_CERTIFICATE", vars::MACOS_CERTIFICATE))
48 .add_env((
49 "MACOS_CERTIFICATE_PASSWORD",
50 vars::MACOS_CERTIFICATE_PASSWORD,
51 ))
52 .add_env(("APPLE_NOTARIZATION_KEY", vars::APPLE_NOTARIZATION_KEY))
53 .add_env(("APPLE_NOTARIZATION_KEY_ID", vars::APPLE_NOTARIZATION_KEY_ID))
54 .add_env((
55 "APPLE_NOTARIZATION_ISSUER_ID",
56 vars::APPLE_NOTARIZATION_ISSUER_ID,
57 ))
58 .add_step(steps::checkout_repo())
59 .add_step(steps::setup_node())
60 .add_step(steps::setup_sentry())
61 .add_step(steps::clear_target_dir_if_large())
62 .add_step(steps::script("./script/bundle-mac"))
63 .add_step(steps::upload_artifact(
64 "Zed_${{ github.event.pull_request.head.sha || github.sha }}-aarch64.dmg",
65 "target/aarch64-apple-darwin/release/Zed.dmg",
66 ))
67 .add_step(steps::upload_artifact(
68 "Zed_${{ github.event.pull_request.head.sha || github.sha }}-x86_64.dmg",
69 "target/x86_64-apple-darwin/release/Zed.dmg",
70 ))
71}
72
73fn bundle_linux(arch: runners::Arch) -> Job {
74 let artifact_name = format!("zed-{}-{}.tar.gz", vars::GITHUB_SHA, arch.triple());
75 let remote_server_artifact_name = format!(
76 "zed-remote-server-{}-{}.tar.gz",
77 vars::GITHUB_SHA,
78 arch.triple()
79 );
80 let mut job = bundle_job()
81 .runs_on(arch.linux_bundler())
82 .add_step(steps::checkout_repo())
83 .add_step(steps::setup_sentry())
84 .add_step(steps::script("./script/linux"));
85 // todo(ci) can we do this on arm too?
86 if arch == runners::Arch::X86_64 {
87 job = job.add_step(steps::script("./script/install-mold"));
88 }
89 job.add_step(steps::script("./script/bundle-linux"))
90 .add_step(steps::upload_artifact(
91 &artifact_name,
92 "target/release/zed-*.tar.gz",
93 ))
94 .add_step(steps::upload_artifact(
95 &remote_server_artifact_name,
96 "target/release/zed-remote-server-*.tar.gz",
97 ))
98}
99
100fn bundle_windows_job(arch: runners::Arch) -> Job {
101 use vars::GITHUB_SHA;
102 bundle_job()
103 .runs_on(runners::WINDOWS_DEFAULT)
104 .add_env(("AZURE_TENANT_ID", vars::AZURE_SIGNING_TENANT_ID))
105 .add_env(("AZURE_CLIENT_ID", vars::AZURE_SIGNING_CLIENT_ID))
106 .add_env(("AZURE_CLIENT_SECRET", vars::AZURE_SIGNING_CLIENT_SECRET))
107 .add_env(("ACCOUNT_NAME", vars::AZURE_SIGNING_ACCOUNT_NAME))
108 .add_env(("CERT_PROFILE_NAME", vars::AZURE_SIGNING_CERT_PROFILE_NAME))
109 .add_env(("ENDPOINT", vars::AZURE_SIGNING_ENDPOINT))
110 .add_env(("FILE_DIGEST", "SHA256"))
111 .add_env(("TIMESTAMP_DIGEST", "SHA256"))
112 .add_env(("TIMESTAMP_SERVER", "http://timestamp.acs.microsoft.com"))
113 .add_step(steps::checkout_repo())
114 .add_step(steps::setup_sentry())
115 .add_step(bundle_windows(arch))
116 .add_step(steps::upload_artifact(
117 &format!("Zed_{GITHUB_SHA}-{arch}.exe"),
118 "${{ env.SETUP_PATH }}",
119 ))
120}
121
122fn bundle_windows(arch: runners::Arch) -> Step<Run> {
123 let step = match arch {
124 runners::Arch::X86_64 => named::pwsh("script/bundle-windows.ps1 -Architecture x86_64"),
125 runners::Arch::AARCH64 => named::pwsh("script/bundle-windows.ps1 -Architecture aarch64"),
126 };
127 step.working_directory("${{ env.ZED_WORKSPACE }}")
128}