History

Initial Linux nightly bundles upload (#8913)

Changes Zed CI to build and upload Linux nightly bundles. * `todo!(linux)` are replaced with `TODO linux` to make `todo!`-based workflows more convenient * renames `run-build-dmg` label into `run-bundling`, also renames a few GH Actions entries to be more generic * make another upload path for Linux, which keeps a separate file with SHA to version the nightly artifact. * adds a `*.deb` package building with a couple of caveats, marked with new `TODO linux` entries: 1. `cargo-bundle` is not very flexible, so it generates artifacts with the structure and names that we're unable to alter before/during the generation. For that, a set of extra steps is made by repacking the *.deb package — this is not very portable between different Linux distros, so later one needs to find a way to combine multiple package types in this script. 2. `cargo-bundle` is not able to properly generate the *.msi bundle despite declaring it in the features: https://github.com/burtonageo/cargo-bundle/issues/116 Windows needs to invent its own way of bundling or fix the tool. 3. Both `cli` and `zed` binaries are added into the archive under `/usr/local/bin/` path with their `-$channel` suffix (-nightly/-preview/-dev/-stable) and a `/usr/local/bin/zed -> /usr/local/bin/cli-nightly` symlink is made to make CLI work as Zed launcher: ``` ~/work/zed kb/linux-nightly:origin/kb/linux-nightly*​ ❯ dpkg -c target/zed_amd64.deb drwxr-xr-x allaptop/allaptop 0 2024-03-06 00:53 ./ drwxr-xr-x allaptop/allaptop 0 2024-03-06 00:53 ./usr/ drwxr-xr-x allaptop/allaptop 0 2024-03-06 00:53 ./usr/local/ drwxr-xr-x allaptop/allaptop 0 2024-03-06 00:53 ./usr/local/bin/ -rwxr-xr-x allaptop/allaptop 8746832 2024-03-06 00:53 ./usr/local/bin/cli-nightly -rwxr-xr-x allaptop/allaptop 689078560 2024-03-06 00:53 ./usr/local/bin/zed-nightly drwxr-xr-x allaptop/allaptop 0 2024-03-06 00:53 ./usr/share/ drwxr-xr-x allaptop/allaptop 0 2024-03-06 00:53 ./usr/share/applications/ -rw-r--r-- allaptop/allaptop 153 2024-03-06 00:53 ./usr/share/applications/zed.desktop drwxr-xr-x allaptop/allaptop 0 2024-03-06 00:53 ./usr/share/icons/ drwxr-xr-x allaptop/allaptop 0 2024-03-06 00:53 ./usr/share/icons/hicolor/ drwxr-xr-x allaptop/allaptop 0 2024-03-06 00:53 ./usr/share/icons/hicolor/1024x1024@2x/ drwxr-xr-x allaptop/allaptop 0 2024-03-06 00:53 ./usr/share/icons/hicolor/1024x1024@2x/apps/ -rw-r--r-- allaptop/allaptop 716288 2024-03-06 00:53 ./usr/share/icons/hicolor/1024x1024@2x/apps/zed.png drwxr-xr-x allaptop/allaptop 0 2024-03-06 00:53 ./usr/share/icons/hicolor/512x512/ drwxr-xr-x allaptop/allaptop 0 2024-03-06 00:53 ./usr/share/icons/hicolor/512x512/apps/ -rw-r--r-- allaptop/allaptop 239870 2024-03-06 00:53 ./usr/share/icons/hicolor/512x512/apps/zed.png lrwxrwxrwx allaptop/allaptop 0 2024-03-06 00:53 ./usr/local/bin/zed -> /usr/local/bin/cli-nightly ``` But the CLI does not work under Linux yet and there's no way to install that CLI from Zed now; Zed binary itself is not able to open `file/location:12:34`-like things and set up the env properly, but is able to start or open a directory. So, this structure can be considered temporary and changed, if needed. 4. Zed Nightly on Linux does not know how to update itself, so all nightly publishing is not picked up automatically. 5. Rust cache from `main` builds does not get shared between CI jobs, due to being run in a different CI job that forms a different CI key, so ``` - name: Cache dependencies uses: swatinem/rust-cache@v2 with: save-if: ${{ false }} ``` would not work. This makes Linux bundling jobs long. Release Notes: - N/A

Kirill Bulatov committed 2 years ago

Commit ffebe2e1 parent e85f1909 files · +295 −33Browse files

Showing the changes to script/bundle-linux (1 of 9 files). Show all

Unified · Split

script/bundle-linux+106−0
@@ -0,0 +1,106 @@
1#!/usr/bin/env bash
2
3set -euxo pipefail
4
5build_flag="--release"
6target_dir="release"
7bundle_name=""
8zed_crate="zed"
9
10
11help_info() {
12 echo "
13Usage: ${0##*/} [options] [bundle_name]
14Build the application bundle for Linux.
15
16Options:
17 -d Compile in debug mode
18 -h Display this help and exit
19 "
20}
21
22while getopts 'dh' flag
23do
24 case "${flag}" in
25 d)
26 export CARGO_INCREMENTAL=true
27 export CARGO_BUNDLE_SKIP_BUILD=true
28 build_flag="";
29 target_dir="debug"
30 ;;
31 h)
32 help_info
33 exit 0
34 ;;
35 esac
36done
37
38shift $((OPTIND-1))
39
40if [[ $# -gt 0 ]]; then
41 if [ "$1" ]; then
42 bundle_name=$1
43 fi
44fi
45
46export ZED_BUNDLE=true
47
48cargo_bundle_version=$(cargo -q bundle --help 2>&1 | head -n 1 || echo "")
49if [ "$cargo_bundle_version" != "cargo-bundle v0.6.0-zed" ]; then
50 cargo install cargo-bundle --git https://github.com/zed-industries/cargo-bundle.git --branch zed-deploy
51fi
52
53echo "Compiling zed binaries"
54cargo build ${build_flag} --package ${zed_crate} --package cli
55
56echo "Creating application bundle"
57# TODO linux
58# Here, hacks to make `cargo bundle` run work, but macOS does not need these
59# Most probably, needs https://github.com/zed-industries/cargo-bundle/commit/9e185bd44d968d8039192220603494555afdbb4f from the upstream.
60cp "target/${target_dir}/Zed" "target/${target_dir}/zed"
61pushd crates/${zed_crate}
62 channel=$(<RELEASE_CHANNEL)
63 cp Cargo.toml Cargo.toml.backup
64 sed \
65 -i.backup -e \
66 "s/package.metadata.bundle-${channel}/package.metadata.bundle/" \
67 Cargo.toml
68
69 # TODO linux `zed_cli` does not get into this bundle despite being built
70 bundle_path=$(cargo bundle ${build_flag} --select-workspace-root | xargs)
71
72 mv Cargo.toml.backup Cargo.toml
73popd
74
75# For nightly, cut off the version out of the bundle name that `cargo bundle` always adds.
76if [ "$channel" == "nightly" ]; then
77 version="$(cargo metadata --no-deps --manifest-path crates/zed/Cargo.toml --offline --format-version=1 | jq -r '.packages | map(select(.name == "zed"))[0].version')"
78 version_less_bundle_path=$(echo "$bundle_path" | sed "s/_$version//")
79 mv "$bundle_path" "$version_less_bundle_path"
80 bundle_path="$version_less_bundle_path"
81fi
82
83# TODO linux
84# Other Linux systems will need a different set of manipulations + a way to know which ones to do.
85# If bundle_name is not set or empty, use the basename of $bundle_path
86if [ -z "${bundle_name}" ]; then
87 bundle_name=$(basename "${bundle_path}")
88fi
89# If bundle_name doesn't end in .deb, append it
90if [[ "$bundle_name" != *.deb ]]; then
91 bundle_name="$bundle_name.deb"
92fi
93
94pushd target/
95 rm -rf bundle/ 2>/dev/null || true
96 dpkg-deb -x "${bundle_path}" bundle/
97 dpkg-deb --control "${bundle_path}" bundle/DEBIAN
98 mkdir -p bundle/usr/local/bin/
99 mv bundle/usr/bin/zed "bundle/usr/local/bin/zed-$channel"
100 cp "${target_dir}/cli" "bundle/usr/local/bin/cli-$channel"
101 ln -s "/usr/local/bin/cli-$channel" "bundle/usr/local/bin/zed"
102 rm -rf bundle/usr/bin/
103 dpkg-deb -b bundle/ "${target_dir}/${bundle_name}"
104 bundle_path="${PWD}/${target_dir}/${bundle_name}"
105popd
106echo "Bundled ${bundle_path}"