windows: Use setup-dev-driver.ps1 to create dev driver (#24196)

张小白 created

Closes #ISSUE

Release Notes:

- N/A

Change summary

.github/workflows/ci.yml    | 35 ++++++++++++-----------------------
script/setup-dev-driver.ps1 | 28 ++++++++++++++++++++++++++++
2 files changed, 40 insertions(+), 23 deletions(-)

Detailed changes

.github/workflows/ci.yml 🔗

@@ -236,58 +236,47 @@ jobs:
     runs-on: hosted-windows-1
     steps:
       # more info here:- https://github.com/rust-lang/cargo/issues/13020
-      - name: Create Dev Drive using ReFS
-        run: |
-          $Volume = New-VHD -Path C:/zed_dev_drive.vhdx -SizeBytes 30GB |
-                    Mount-VHD -Passthru |
-                    Initialize-Disk -Passthru |
-                    New-Partition -AssignDriveLetter -UseMaximumSize |
-                    Format-Volume -FileSystem ReFS -Confirm:$false -Force
-          Write-Output $Volume
-          Write-Output "DEV_DRIVE=$($Volume.DriveLetter):" >> $env:GITHUB_ENV
       - name: Enable longer pathnames for git
         run: git config --system core.longpaths true
+
       - name: Checkout repo
         uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
         with:
           clean: false
+
+      - name: Create Dev Drive using ReFS
+        run: ./script/setup-dev-driver.ps1
+
       # actions/checkout does not let us clone into anywhere outside ${{ github.workspace }}, so we have to copy the clone...
       - name: Copy Git Repo to Dev Drive
         run: |
-          Copy-Item -Path "${{ github.workspace }}" -Destination "${{ env.DEV_DRIVE }}/zed" -Recurse
+          Copy-Item -Path "${{ github.workspace }}" -Destination "${{ env.ZED_WORKSPACE }}" -Recurse
 
       - name: Cache dependencies
         uses: swatinem/rust-cache@f0deed1e0edfc6a9be95417288c0e1099b1eeec3 # v2
         with:
           save-if: ${{ github.ref == 'refs/heads/main' }}
-          workspaces: ${{ env.DEV_DRIVE }}/zed
+          workspaces: ${{ env.ZED_WORKSPACE }}
           cache-provider: "github"
-        env:
-          CARGO_HOME: ${{ env.DEV_DRIVE }}/.cargo
-          RUSTUP_HOME: ${{ env.DEV_DRIVE }}/.rustup
 
       - name: Configure CI
         run: |
-          mkdir -p ${{ env.DEV_DRIVE }}/.cargo -ErrorAction Ignore
-          cp ./.cargo/ci-config.toml ${{ env.DEV_DRIVE }}/.cargo/config.toml
+          mkdir -p ${{ env.CARGO_HOME }} -ErrorAction Ignore
+          cp ./.cargo/ci-config.toml ${{ env.CARGO_HOME }}/config.toml
 
       - name: cargo clippy
+        working-directory: ${{ env.ZED_WORKSPACE }}
         # Windows can't run shell scripts, so we need to use `cargo xtask`.
         run: cargo xtask clippy
-        env:
-          CARGO_HOME: ${{ env.DEV_DRIVE }}/.cargo
-          RUSTUP_HOME: ${{ env.DEV_DRIVE }}/.rustup
 
       - name: Build Zed
+        working-directory: ${{ env.ZED_WORKSPACE }}
         run: cargo build
-        env:
-          CARGO_HOME: ${{ env.DEV_DRIVE }}/.cargo
-          RUSTUP_HOME: ${{ env.DEV_DRIVE }}/.rustup
 
       # 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 "${{ env.DEV_DRIVE }}/.cargo/config.toml"  -Force
+        run: Remove-Item -Path "${{ env.CARGO_HOME }}/config.toml"  -Force
 
   bundle-mac:
     timeout-minutes: 120

script/setup-dev-driver.ps1 🔗

@@ -0,0 +1,28 @@
+# Configures a drive for testing in CI.
+# todo(windows)
+# The current version of the Windows runner is 10.0.20348 which does not support DevDrive option.
+# Ref: https://learn.microsoft.com/en-us/windows/dev-drive/
+
+$Volume = New-VHD -Path C:/zed_dev_drive.vhdx -SizeBytes 30GB |
+                    Mount-VHD -Passthru |
+                    Initialize-Disk -Passthru |
+                    New-Partition -AssignDriveLetter -UseMaximumSize |
+                    Format-Volume -FileSystem ReFS -Confirm:$false -Force
+
+$Drive = "$($Volume.DriveLetter):"
+
+# Show some debug information
+Write-Output $Volume
+Write-Output "Using Dev Drive at $Drive"
+    
+# Move Cargo to the dev drive
+New-Item -Path "$($Drive)/.cargo/bin" -ItemType Directory -Force
+Copy-Item -Path "C:/Users/runneradmin/.cargo/*" -Destination "$($Drive)/.cargo/" -Recurse -Force
+
+Write-Output `
+	"DEV_DRIVE=$($Drive)" `
+	"RUSTUP_HOME=$($Drive)/.rustup" `
+	"CARGO_HOME=$($Drive)/.cargo" `
+	"ZED_WORKSPACE=$($Drive)/zed" `
+	"PATH=$($Drive)/.cargo/bin;$env:PATH" `
+	>> $env:GITHUB_ENV