One of the reasons we didn't spot that we were missing the telemetry env vars for the production builds was that nightly (which was working) had its own set of build steps. This re-uses those and pushes the env vars down from the workflow to the job. It also fixes nightly releases to upload all-in-one go so that all platforms update in sync. Closes #41655 Release Notes: - N/A
181 lines
5.9 KiB
Bash
Executable File
181 lines
5.9 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
|
|
set -euxo pipefail
|
|
source script/lib/blob-store.sh
|
|
|
|
# Function for displaying help info
|
|
help_info() {
|
|
echo "
|
|
Usage: ${0##*/} [options]
|
|
Build a release .tar.gz for Linux.
|
|
|
|
Options:
|
|
-h, --help Display this help and exit.
|
|
--flatpak Set ZED_BUNDLE_TYPE=flatpak so that this can be included in system info
|
|
"
|
|
}
|
|
|
|
# Parse all arguments manually
|
|
while [[ $# -gt 0 ]]; do
|
|
case $1 in
|
|
-h|--help)
|
|
help_info
|
|
exit 0
|
|
;;
|
|
--flatpak)
|
|
export ZED_BUNDLE_TYPE=flatpak
|
|
shift
|
|
;;
|
|
--)
|
|
shift
|
|
break
|
|
;;
|
|
-*)
|
|
echo "Unknown option: $1" >&2
|
|
help_info
|
|
exit 1
|
|
;;
|
|
*)
|
|
echo "Error: Unexpected argument: $1" >&2
|
|
help_info
|
|
exit 1
|
|
;;
|
|
esac
|
|
done
|
|
|
|
export ZED_BUNDLE=true
|
|
|
|
channel=$(<crates/zed/RELEASE_CHANNEL)
|
|
target_dir="${CARGO_TARGET_DIR:-target}"
|
|
|
|
version="$(script/get-crate-version zed)"
|
|
# Set RELEASE_VERSION so it's compiled into GPUI and it knows about the version.
|
|
export RELEASE_VERSION="${version}"
|
|
|
|
commit=$(git rev-parse HEAD | cut -c 1-7)
|
|
|
|
version_info=$(rustc --version --verbose)
|
|
host_line=$(echo "$version_info" | grep host)
|
|
target_triple=${host_line#*: }
|
|
musl_triple=${target_triple%-gnu}-musl
|
|
remote_server_triple=${REMOTE_SERVER_TARGET:-"${musl_triple}"}
|
|
rustup_installed=false
|
|
if command -v rustup >/dev/null 2>&1; then
|
|
rustup_installed=true
|
|
fi
|
|
|
|
# Generate the licenses first, so they can be baked into the binaries
|
|
script/generate-licenses
|
|
|
|
if "$rustup_installed"; then
|
|
rustup target add "$remote_server_triple"
|
|
fi
|
|
|
|
export CC=$(which clang)
|
|
|
|
# Build binary in release mode
|
|
export RUSTFLAGS="${RUSTFLAGS:-} -C link-args=-Wl,--disable-new-dtags,-rpath,\$ORIGIN/../lib"
|
|
cargo build --release --target "${target_triple}" --package zed --package cli
|
|
# Build remote_server in separate invocation to prevent feature unification from other crates
|
|
# from influencing dynamic libraries required by it.
|
|
if [[ "$remote_server_triple" == "$musl_triple" ]]; then
|
|
export RUSTFLAGS="${RUSTFLAGS:-} -C target-feature=+crt-static"
|
|
fi
|
|
cargo build --release --target "${remote_server_triple}" --package remote_server
|
|
|
|
# Upload debug info to sentry.io
|
|
if ! command -v sentry-cli >/dev/null 2>&1; then
|
|
echo "sentry-cli not found. skipping sentry upload."
|
|
echo "install with: 'curl -sL https://sentry.io/get-cli | bash'"
|
|
else
|
|
if [[ -n "${SENTRY_AUTH_TOKEN:-}" ]]; then
|
|
echo "Uploading zed debug symbols to sentry..."
|
|
# note: this uploads the unstripped binary which is needed because it contains
|
|
# .eh_frame data for stack unwinding. see https://github.com/getsentry/symbolic/issues/783
|
|
sentry-cli debug-files upload --include-sources --wait -p zed -o zed-dev \
|
|
"${target_dir}/${target_triple}"/release/zed \
|
|
"${target_dir}/${remote_server_triple}"/release/remote_server
|
|
else
|
|
echo "missing SENTRY_AUTH_TOKEN. skipping sentry upload."
|
|
fi
|
|
fi
|
|
|
|
# Strip debug symbols and save them for upload to DigitalOcean
|
|
objcopy --strip-debug "${target_dir}/${target_triple}/release/zed"
|
|
objcopy --strip-debug "${target_dir}/${target_triple}/release/cli"
|
|
objcopy --strip-debug "${target_dir}/${remote_server_triple}/release/remote_server"
|
|
|
|
# Ensure that remote_server does not depend on libssl nor libcrypto, as we got rid of these deps.
|
|
if ldd "${target_dir}/${remote_server_triple}/release/remote_server" | grep -q 'libcrypto\|libssl'; then
|
|
if [[ "$remote_server_triple" == *-musl ]]; then
|
|
echo "Error: remote_server still depends on libssl or libcrypto" && exit 1
|
|
else
|
|
echo "Info: Using non-musl remote-server build."
|
|
fi
|
|
fi
|
|
|
|
suffix=""
|
|
if [ "$channel" != "stable" ]; then
|
|
suffix="-$channel"
|
|
fi
|
|
|
|
# Move everything that should end up in the final package
|
|
# into a temp directory.
|
|
temp_dir=$(mktemp -d)
|
|
zed_dir="${temp_dir}/zed$suffix.app"
|
|
|
|
# Binary
|
|
mkdir -p "${zed_dir}/bin" "${zed_dir}/libexec"
|
|
cp "${target_dir}/${target_triple}/release/zed" "${zed_dir}/libexec/zed-editor"
|
|
cp "${target_dir}/${target_triple}/release/cli" "${zed_dir}/bin/zed"
|
|
|
|
# Libs
|
|
find_libs() {
|
|
ldd ${target_dir}/${target_triple}/release/zed |\
|
|
cut -d' ' -f3 |\
|
|
grep -v '\<\(libstdc++.so\|libc.so\|libgcc_s.so\|libm.so\|libpthread.so\|libdl.so\|libasound.so\)'
|
|
}
|
|
|
|
mkdir -p "${zed_dir}/lib"
|
|
rm -rf "${zed_dir}/lib/*"
|
|
cp $(find_libs) "${zed_dir}/lib"
|
|
|
|
# Icons
|
|
mkdir -p "${zed_dir}/share/icons/hicolor/512x512/apps"
|
|
cp "crates/zed/resources/app-icon$suffix.png" "${zed_dir}/share/icons/hicolor/512x512/apps/zed.png"
|
|
mkdir -p "${zed_dir}/share/icons/hicolor/1024x1024/apps"
|
|
cp "crates/zed/resources/app-icon$suffix@2x.png" "${zed_dir}/share/icons/hicolor/1024x1024/apps/zed.png"
|
|
|
|
# .desktop
|
|
export DO_STARTUP_NOTIFY="true"
|
|
export APP_CLI="zed"
|
|
export APP_ICON="zed"
|
|
export APP_ARGS="%U"
|
|
if [[ "$channel" == "preview" ]]; then
|
|
export APP_NAME="Zed Preview"
|
|
elif [[ "$channel" == "nightly" ]]; then
|
|
export APP_NAME="Zed Nightly"
|
|
elif [[ "$channel" == "dev" ]]; then
|
|
export APP_NAME="Zed Devel"
|
|
else
|
|
export APP_NAME="Zed"
|
|
fi
|
|
|
|
mkdir -p "${zed_dir}/share/applications"
|
|
envsubst < "crates/zed/resources/zed.desktop.in" > "${zed_dir}/share/applications/zed$suffix.desktop"
|
|
chmod +x "${zed_dir}/share/applications/zed$suffix.desktop"
|
|
|
|
# Copy generated licenses so they'll end up in archive too
|
|
cp "assets/licenses.md" "${zed_dir}/licenses.md"
|
|
|
|
# Create archive out of everything that's in the temp directory
|
|
arch=$(uname -m)
|
|
archive="zed-linux-${arch}.tar.gz"
|
|
|
|
rm -rf "${archive}"
|
|
remove_match="zed(-[a-zA-Z0-9]+)?-linux-$(uname -m)\.tar\.gz"
|
|
ls "${target_dir}/release" | grep -E ${remove_match} | xargs -d "\n" -I {} rm -f "${target_dir}/release/{}" || true
|
|
tar -czvf "${target_dir}/release/$archive" -C ${temp_dir} "zed$suffix.app"
|
|
|
|
gzip -f --stdout --best "${target_dir}/${remote_server_triple}/release/remote_server" > "${target_dir}/zed-remote-server-linux-${arch}.gz"
|