diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c154505811..30db3dc0b0 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -736,6 +736,64 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + freebsd: + timeout-minutes: 60 + runs-on: github-8vcpu-ubuntu-2404 + if: | + startsWith(github.ref, 'refs/tags/v') + || contains(github.event.pull_request.labels.*.name, 'run-bundling') + needs: [linux_tests] + name: Build Zed on FreeBSD + # env: + # MYTOKEN : ${{ secrets.MYTOKEN }} + # MYTOKEN2: "value2" + steps: + - uses: actions/checkout@v4 + - name: Build FreeBSD remote-server + id: freebsd-build + uses: vmactions/freebsd-vm@c3ae29a132c8ef1924775414107a97cac042aad5 # v1.2.0 + with: + # envs: "MYTOKEN MYTOKEN2" + usesh: true + release: 13.5 + copyback: true + prepare: | + pkg install -y \ + bash curl jq git \ + rustup-init cmake-core llvm-devel-lite pkgconf protobuf # ibx11 alsa-lib rust-bindgen-cli + run: | + freebsd-version + sysctl hw.model + sysctl hw.ncpu + sysctl hw.physmem + sysctl hw.usermem + git config --global --add safe.directory /home/runner/work/zed/zed + rustup-init --profile minimal --default-toolchain none -y + . "$HOME/.cargo/env" + ./script/bundle-freebsd + mkdir -p out/ + mv "target/zed-remote-server-freebsd-x86_64.gz" out/ + rm -rf target/ + cargo clean + + - name: Upload Artifact to Workflow - zed-remote-server (run-bundling) + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 + if: contains(github.event.pull_request.labels.*.name, 'run-bundling') + with: + name: zed-remote-server-${{ github.event.pull_request.head.sha || github.sha }}-x86_64-unknown-freebsd.gz + path: out/zed-remote-server-freebsd-x86_64.gz + + - name: Upload Artifacts to release + uses: softprops/action-gh-release@de2c0eb89ae2a093876385947365aca7b0e5f844 # v1 + if: ${{ !(contains(github.event.pull_request.labels.*.name, 'run-bundling')) }} + with: + draft: true + prerelease: ${{ env.RELEASE_CHANNEL == 'preview' }} + files: | + out/zed-remote-server-freebsd-x86_64.gz + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + nix-build: name: Build with Nix uses: ./.github/workflows/nix.yml diff --git a/.github/workflows/release_nightly.yml b/.github/workflows/release_nightly.yml index f6512bc678..18934da74b 100644 --- a/.github/workflows/release_nightly.yml +++ b/.github/workflows/release_nightly.yml @@ -167,6 +167,62 @@ jobs: - name: Upload Zed Nightly run: script/upload-nightly linux-targz + freebsd: + timeout-minutes: 60 + if: github.repository_owner == 'zed-industries' + runs-on: github-8vcpu-ubuntu-2404 + needs: tests + name: Build Zed on FreeBSD + # env: + # MYTOKEN : ${{ secrets.MYTOKEN }} + # MYTOKEN2: "value2" + steps: + - uses: actions/checkout@v4 + - name: Build FreeBSD remote-server + id: freebsd-build + uses: vmactions/freebsd-vm@c3ae29a132c8ef1924775414107a97cac042aad5 # v1.2.0 + with: + # envs: "MYTOKEN MYTOKEN2" + usesh: true + release: 13.5 + copyback: true + prepare: | + pkg install -y \ + bash curl jq git \ + rustup-init cmake-core llvm-devel-lite pkgconf protobuf # ibx11 alsa-lib rust-bindgen-cli + run: | + freebsd-version + sysctl hw.model + sysctl hw.ncpu + sysctl hw.physmem + sysctl hw.usermem + git config --global --add safe.directory /home/runner/work/zed/zed + rustup-init --profile minimal --default-toolchain none -y + . "$HOME/.cargo/env" + ./script/bundle-freebsd + mkdir -p out/ + mv "target/zed-remote-server-freebsd-x86_64.gz" out/ + rm -rf target/ + cargo clean + + - name: Upload Artifact to Workflow - zed-remote-server (run-bundling) + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 + if: contains(github.event.pull_request.labels.*.name, 'run-bundling') + with: + name: zed-remote-server-${{ github.event.pull_request.head.sha || github.sha }}-x86_64-unknown-freebsd.gz + path: out/zed-remote-server-freebsd-x86_64.gz + + - name: Upload Artifacts to release + uses: softprops/action-gh-release@de2c0eb89ae2a093876385947365aca7b0e5f844 # v1 + if: ${{ !(contains(github.event.pull_request.labels.*.name, 'run-bundling')) }} + with: + draft: true + prerelease: ${{ env.RELEASE_CHANNEL == 'preview' }} + files: | + out/zed-remote-server-freebsd-x86_64.gz + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + bundle-nix: name: Build and cache Nix package needs: tests diff --git a/rust-toolchain.toml b/rust-toolchain.toml index d543eb64a3..a7a9ac8295 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -5,6 +5,7 @@ components = [ "rustfmt", "clippy" ] targets = [ "x86_64-apple-darwin", "aarch64-apple-darwin", + "x86_64-unknown-freebsd", "x86_64-unknown-linux-gnu", "x86_64-pc-windows-msvc", "wasm32-wasip2", # extensions diff --git a/script/bundle-freebsd b/script/bundle-freebsd new file mode 100755 index 0000000000..7222a06256 --- /dev/null +++ b/script/bundle-freebsd @@ -0,0 +1,160 @@ +#!/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 FreeBSD. + +Options: + -h Display this help and exit. + " +} + +while getopts 'h' flag; do + case "${flag}" in + h) + help_info + exit 0 + ;; + esac +done + +export ZED_BUNDLE=true + +channel=$(/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 + +# Strip debug symbols and save them for upload to DigitalOcean +# objcopy --only-keep-debug "${target_dir}/${target_triple}/release/zed" "${target_dir}/${target_triple}/release/zed.dbg" +# objcopy --only-keep-debug "${target_dir}/${remote_server_triple}/release/remote_server" "${target_dir}/${remote_server_triple}/release/remote_server.dbg" +# 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" + +# gzip -f "${target_dir}/${target_triple}/release/zed.dbg" +# gzip -f "${target_dir}/${remote_server_triple}/release/remote_server.dbg" + +# if [[ -n "${DIGITALOCEAN_SPACES_SECRET_KEY:-}" && -n "${DIGITALOCEAN_SPACES_ACCESS_KEY:-}" ]]; then +# upload_to_blob_store_public \ +# "zed-debug-symbols" \ +# "${target_dir}/${target_triple}/release/zed.dbg.gz" \ +# "$channel/zed-$version-${target_triple}.dbg.gz" +# upload_to_blob_store_public \ +# "zed-debug-symbols" \ +# "${target_dir}/${remote_server_triple}/release/remote_server.dbg.gz" \ +# "$channel/remote_server-$version-${remote_server_triple}.dbg.gz" +# fi + +# 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 + echo "Error: remote_server still depends on libssl or libcrypto" && exit 1 +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" + +# 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) +# target="freebsd-${arch}" +# if [[ "$channel" == "dev" ]]; then +# archive="zed-${commit}-${target}.tar.gz" +# else +# archive="zed-${target}.tar.gz" +# fi + +# 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-freebsd-x86_64.gz"