diff --git a/.cargo/ci-config.toml b/.cargo/ci-config.toml new file mode 100644 index 0000000000..09e1af5c18 --- /dev/null +++ b/.cargo/ci-config.toml @@ -0,0 +1,12 @@ +# This config is different from config.toml in this directory, as the latter is recognized by Cargo. +# This file is placed in ./../.cargo/config.toml on CI runs. Cargo then merges Zeds .cargo/config.toml with ./../.cargo/config.toml +# with preference for settings from Zeds config.toml. +# TL;DR: If a value is set in both ci-config.toml and config.toml, config.toml value takes precedence. +# Arrays are merged together though. See: https://doc.rust-lang.org/cargo/reference/config.html#hierarchical-structure +# The intent for this file is to configure CI build process with a divergance from Zed developers experience; for example, in this config file +# we use `-D warnings` for rustflags (which makes compilation fail in presence of warnings during build process). Placing that in developers `config.toml` +# would be incovenient. +# The reason for not using the RUSTFLAGS environment variable is that doing so would override all the settings in the config.toml file, even if the contents of the latter are completely nonsensical. See: https://github.com/rust-lang/cargo/issues/5376 +# Here, we opted to use `[target.'cfg(all())']` instead of `[build]` because `[target.'**']` is guaranteed to be cumulative. +[target.'cfg(all())'] +rustflags = ["-D", "warnings"] diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2d7563cdb3..8b675f08df 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -20,7 +20,6 @@ env: CARGO_TERM_COLOR: always CARGO_INCREMENTAL: 0 RUST_BACKTRACE: 1 - RUSTFLAGS: "-D warnings" jobs: migration_checks: @@ -101,6 +100,11 @@ jobs: with: clean: false + - name: Configure CI + run: | + mkdir -p ./../.cargo + cp ./.cargo/ci-config.toml ./../.cargo/config.toml + - name: cargo clippy run: ./script/clippy @@ -132,6 +136,11 @@ jobs: cargo build -p remote_server script/check-rust-livekit-macos + # Since the macOS runners are stateful, so we need to remove the config file to prevent potential bug. + - name: Clean CI config file + if: always() + run: rm -rf ./../.cargo + linux_tests: timeout-minutes: 60 name: (Linux) Run Clippy and tests @@ -156,6 +165,11 @@ jobs: - name: Install Linux dependencies run: ./script/linux + - name: Configure CI + run: | + mkdir -p ./../.cargo + cp ./.cargo/ci-config.toml ./../.cargo/config.toml + - name: cargo clippy run: ./script/clippy @@ -167,6 +181,14 @@ jobs: cargo build -p zed cargo check -p workspace + # Even the Linux runner is not stateful, in theory there is no need to do this cleanup. + # But, to avoid potential issues in the future if we choose to use a stateful Linux runner and forget to add code + # to clean up the config file, I’ve included the cleanup code here as a precaution. + # While it’s not strictly necessary at this moment, I believe it’s better to err on the side of caution. + - name: Clean CI config file + if: always() + run: rm -rf ./../.cargo + build_remote_server: timeout-minutes: 60 name: (Linux) Build Remote Server @@ -191,9 +213,18 @@ jobs: - name: Install Clang & Mold run: ./script/remote-server && ./script/install-mold 2.34.0 + - name: Configure CI + run: | + mkdir -p ./../.cargo + cp ./.cargo/ci-config.toml ./../.cargo/config.toml + - name: Build Remote Server run: cargo build -p remote_server + - name: Clean CI config file + if: always() + run: rm -rf ./../.cargo + # todo(windows): Actually run the tests windows_tests: timeout-minutes: 60 @@ -215,6 +246,11 @@ jobs: save-if: ${{ github.ref == 'refs/heads/main' }} cache-provider: "github" + - name: Configure CI + run: | + mkdir -p ./../.cargo + cp ./.cargo/ci-config.toml ./../.cargo/config.toml + - name: cargo clippy # Windows can't run shell scripts, so we need to use `cargo xtask`. run: cargo xtask clippy @@ -222,6 +258,11 @@ jobs: - name: Build Zed run: cargo build + # Since the Windows runners are stateful, so we need to remove the config file to prevent potential bug. + - name: Clean CI config file + if: always() + run: Remove-Item -Path "./../.cargo" -Recurse -Force + bundle-mac: timeout-minutes: 120 name: Create a macOS bundle