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}