mirror of
https://github.com/zed-industries/zed.git
synced 2024-12-29 05:11:44 +03:00
ffebe2e4a6
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
76 lines
2.4 KiB
Bash
Executable File
76 lines
2.4 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
|
|
# Based on the template in: https://docs.digitalocean.com/reference/api/spaces-api/
|
|
bash -euo pipefail
|
|
|
|
allowed_targets=("linux-deb" "macos")
|
|
is_allowed_target() {
|
|
for val in "${allowed_targets[@]}"; do
|
|
if [[ "$1" == "$val" ]]; then
|
|
return 0
|
|
fi
|
|
done
|
|
return 1
|
|
}
|
|
|
|
if [[ -n "${1:-}" ]]; then
|
|
if is_allowed_target "$1"; then
|
|
target="$1"
|
|
else
|
|
echo "Error: Target '$1' is not allowed"
|
|
echo "Usage: $0 [${allowed_targets[@]}]"
|
|
exit 1
|
|
fi
|
|
else
|
|
echo "Error: Target is not specified"
|
|
echo "Usage: $0 [${allowed_targets[@]}]"
|
|
exit 1
|
|
fi
|
|
echo "Uploading nightly for target: $target"
|
|
|
|
# Step 1: Define the parameters for the Space you want to upload to.
|
|
SPACE="zed-nightly-host" # Find your endpoint in the control panel, under Settings.
|
|
REGION="nyc3" # Must be "us-east-1" when creating new Spaces. Otherwise, use the region in your endpoint (e.g. nyc3).
|
|
|
|
# Step 2: Define a function that uploads your object via cURL.
|
|
function uploadToSpaces
|
|
{
|
|
file_to_upload="$1"
|
|
file_name="$2"
|
|
space_path="nightly"
|
|
date=$(date +"%a, %d %b %Y %T %z")
|
|
acl="x-amz-acl:private"
|
|
content_type="application/octet-stream"
|
|
storage_type="x-amz-storage-class:STANDARD"
|
|
string="PUT\n\n${content_type}\n${date}\n${acl}\n${storage_type}\n/${SPACE}/${space_path}/${file_name}"
|
|
signature=$(echo -en "${string}" | openssl sha1 -hmac "${DIGITALOCEAN_SPACES_SECRET_KEY}" -binary | base64)
|
|
|
|
curl --fail -vv -s -X PUT -T "$file_to_upload" \
|
|
-H "Host: ${SPACE}.${REGION}.digitaloceanspaces.com" \
|
|
-H "Date: $date" \
|
|
-H "Content-Type: $content_type" \
|
|
-H "$storage_type" \
|
|
-H "$acl" \
|
|
-H "Authorization: AWS ${DIGITALOCEAN_SPACES_ACCESS_KEY}:$signature" \
|
|
"https://${SPACE}.${REGION}.digitaloceanspaces.com/${space_path}/${file_name}"
|
|
}
|
|
|
|
sha=$(git rev-parse HEAD)
|
|
echo ${sha} > target/latest-sha
|
|
case "$target" in
|
|
macos)
|
|
uploadToSpaces "target/release/Zed.dmg" "Zed.dmg"
|
|
uploadToSpaces "target/latest-sha" "latest-sha"
|
|
;;
|
|
linux-deb)
|
|
find target/release -type f -name "*.deb" -print0 | while IFS= read -r -d '' bundle_file; do
|
|
uploadToSpaces "$bundle_file" "$(basename "$bundle_file")"
|
|
done
|
|
uploadToSpaces "target/latest-sha" "latest-sha-linux-deb"
|
|
;;
|
|
*)
|
|
echo "Error: Unknown target '$target'"
|
|
exit 1
|
|
;;
|
|
esac
|