1[CmdletBinding()]
2Param(
3 [Parameter()][Alias('i')][switch]$Install,
4 [Parameter()][Alias('h')][switch]$Help,
5 [Parameter()][string]$Name
6)
7
8. "$PSScriptRoot/lib/blob-store.ps1"
9. "$PSScriptRoot/lib/workspace.ps1"
10
11# https://stackoverflow.com/questions/57949031/powershell-script-stops-if-program-fails-like-bash-set-o-errexit
12$ErrorActionPreference = 'Stop'
13$PSNativeCommandUseErrorActionPreference = $true
14
15$buildSuccess = $false
16
17if ($Help) {
18 Write-Output "Usage: test.ps1 [-Install] [-Help]"
19 Write-Output "Build the installer for Windows.\n"
20 Write-Output "Options:"
21 Write-Output " -Install, -i Run the installer after building."
22 Write-Output " -Help, -h Show this help message."
23 exit 0
24}
25
26Push-Location -Path crates/zed
27$channel = Get-Content "RELEASE_CHANNEL"
28$env:ZED_RELEASE_CHANNEL = $channel
29Pop-Location
30
31function CheckEnvironmentVariables {
32 $requiredVars = @(
33 'ZED_WORKSPACE', 'RELEASE_VERSION', 'ZED_RELEASE_CHANNEL',
34 'AZURE_TENANT_ID', 'AZURE_CLIENT_ID', 'AZURE_CLIENT_SECRET',
35 'ACCOUNT_NAME', 'CERT_PROFILE_NAME', 'ENDPOINT',
36 'FILE_DIGEST', 'TIMESTAMP_DIGEST', 'TIMESTAMP_SERVER'
37 )
38
39 foreach ($var in $requiredVars) {
40 if (-not (Test-Path "env:$var")) {
41 Write-Error "$var is not set"
42 exit 1
43 }
44 }
45}
46
47function PrepareForBundle {
48 if (Test-Path "$innoDir") {
49 Remove-Item -Path "$innoDir" -Recurse -Force
50 }
51 New-Item -Path "$innoDir" -ItemType Directory -Force
52 Copy-Item -Path "$env:ZED_WORKSPACE\crates\zed\resources\windows\*" -Destination "$innoDir" -Recurse -Force
53 New-Item -Path "$innoDir\make_appx" -ItemType Directory -Force
54 New-Item -Path "$innoDir\appx" -ItemType Directory -Force
55 New-Item -Path "$innoDir\bin" -ItemType Directory -Force
56 New-Item -Path "$innoDir\tools" -ItemType Directory -Force
57}
58
59function GenerateLicenses {
60 $oldErrorActionPreference = $ErrorActionPreference
61 $ErrorActionPreference = 'Continue'
62 . $PSScriptRoot/generate-licenses.ps1
63 $ErrorActionPreference = $oldErrorActionPreference
64}
65
66function BuildZedAndItsFriends {
67 Write-Output "Building Zed and its friends, for channel: $channel"
68 # Build zed.exe, cli.exe and auto_update_helper.exe
69 cargo build --release --package zed --package cli --package auto_update_helper
70 Copy-Item -Path ".\target\release\zed.exe" -Destination "$innoDir\Zed.exe" -Force
71 Copy-Item -Path ".\target\release\cli.exe" -Destination "$innoDir\cli.exe" -Force
72 Copy-Item -Path ".\target\release\auto_update_helper.exe" -Destination "$innoDir\auto_update_helper.exe" -Force
73 # Build explorer_command_injector.dll
74 switch ($channel) {
75 "stable" {
76 cargo build --release --features stable --no-default-features --package explorer_command_injector
77 }
78 "preview" {
79 cargo build --release --features preview --no-default-features --package explorer_command_injector
80 }
81 default {
82 cargo build --release --package explorer_command_injector
83 }
84 }
85 Copy-Item -Path ".\target\release\explorer_command_injector.dll" -Destination "$innoDir\zed_explorer_command_injector.dll" -Force
86}
87
88function ZipZedAndItsFriendsDebug {
89 $items = @(
90 ".\target\release\zed.pdb",
91 ".\target\release\cli.pdb",
92 ".\target\release\auto_update_helper.pdb",
93 ".\target\release\explorer_command_injector.pdb"
94 )
95
96 Compress-Archive -Path $items -DestinationPath ".\target\release\zed-$env:RELEASE_VERSION-$env:ZED_RELEASE_CHANNEL.dbg.zip" -Force
97}
98
99function MakeAppx {
100 switch ($channel) {
101 "stable" {
102 $manifestFile = "$env:ZED_WORKSPACE\crates\explorer_command_injector\AppxManifest.xml"
103 }
104 "preview" {
105 $manifestFile = "$env:ZED_WORKSPACE\crates\explorer_command_injector\AppxManifest-Preview.xml"
106 }
107 default {
108 $manifestFile = "$env:ZED_WORKSPACE\crates\explorer_command_injector\AppxManifest-Nightly.xml"
109 }
110 }
111 Copy-Item -Path "$manifestFile" -Destination "$innoDir\make_appx\AppxManifest.xml"
112 # Add makeAppx.exe to Path
113 $sdk = "C:\Program Files (x86)\Windows Kits\10\bin\10.0.26100.0\x64"
114 $env:Path += ';' + $sdk
115 makeAppx.exe pack /d "$innoDir\make_appx" /p "$innoDir\zed_explorer_command_injector.appx" /nv
116}
117
118function SignZedAndItsFriends {
119 $files = "$innoDir\Zed.exe,$innoDir\cli.exe,$innoDir\auto_update_helper.exe,$innoDir\zed_explorer_command_injector.dll,$innoDir\zed_explorer_command_injector.appx"
120 & "$innoDir\sign.ps1" $files
121}
122
123function DownloadAMDGpuServices {
124 # If you update the AGS SDK version, please also update the version in `crates/gpui/src/platform/windows/directx_renderer.rs`
125 $url = "https://codeload.github.com/GPUOpen-LibrariesAndSDKs/AGS_SDK/zip/refs/tags/v6.3.0"
126 $zipPath = ".\AGS_SDK_v6.3.0.zip"
127 # Download the AGS SDK zip file
128 Invoke-WebRequest -Uri $url -OutFile $zipPath
129 # Extract the AGS SDK zip file
130 Expand-Archive -Path $zipPath -DestinationPath "." -Force
131}
132
133function CollectFiles {
134 Move-Item -Path "$innoDir\zed_explorer_command_injector.appx" -Destination "$innoDir\appx\zed_explorer_command_injector.appx" -Force
135 Move-Item -Path "$innoDir\zed_explorer_command_injector.dll" -Destination "$innoDir\appx\zed_explorer_command_injector.dll" -Force
136 Move-Item -Path "$innoDir\cli.exe" -Destination "$innoDir\bin\zed.exe" -Force
137 Move-Item -Path "$innoDir\auto_update_helper.exe" -Destination "$innoDir\tools\auto_update_helper.exe" -Force
138 Move-Item -Path ".\AGS_SDK-6.3.0\ags_lib\lib\amd_ags_x64.dll" -Destination "$innoDir\amd_ags_x64.dll" -Force
139}
140
141function BuildInstaller {
142 $issFilePath = "$innoDir\zed.iss"
143 switch ($channel) {
144 "stable" {
145 $appId = "{{2DB0DA96-CA55-49BB-AF4F-64AF36A86712}"
146 $appIconName = "app-icon"
147 $appName = "Zed"
148 $appDisplayName = "Zed"
149 $appSetupName = "ZedEditorUserSetup-x64-$env:RELEASE_VERSION"
150 # The mutex name here should match the mutex name in crates\zed\src\zed\windows_only_instance.rs
151 $appMutex = "Zed-Stable-Instance-Mutex"
152 $appExeName = "Zed"
153 $regValueName = "Zed"
154 $appUserId = "ZedIndustries.Zed"
155 $appShellNameShort = "Z&ed"
156 $appAppxFullName = "ZedIndustries.Zed_1.0.0.0_neutral__japxn1gcva8rg"
157 }
158 "preview" {
159 $appId = "{{F70E4811-D0E2-4D88-AC99-D63752799F95}"
160 $appIconName = "app-icon-preview"
161 $appName = "Zed Preview"
162 $appDisplayName = "Zed Preview"
163 $appSetupName = "ZedEditorUserSetup-x64-$env:RELEASE_VERSION-preview"
164 # The mutex name here should match the mutex name in crates\zed\src\zed\windows_only_instance.rs
165 $appMutex = "Zed-Preview-Instance-Mutex"
166 $appExeName = "Zed"
167 $regValueName = "ZedPreview"
168 $appUserId = "ZedIndustries.Zed.Preview"
169 $appShellNameShort = "Z&ed Preview"
170 $appAppxFullName = "ZedIndustries.Zed.Preview_1.0.0.0_neutral__japxn1gcva8rg"
171 }
172 "nightly" {
173 $appId = "{{1BDB21D3-14E7-433C-843C-9C97382B2FE0}"
174 $appIconName = "app-icon-nightly"
175 $appName = "Zed Nightly"
176 $appDisplayName = "Zed Nightly"
177 $appSetupName = "ZedEditorUserSetup-x64-$env:RELEASE_VERSION-nightly"
178 # The mutex name here should match the mutex name in crates\zed\src\zed\windows_only_instance.rs
179 $appMutex = "Zed-Nightly-Instance-Mutex"
180 $appExeName = "Zed"
181 $regValueName = "ZedNightly"
182 $appUserId = "ZedIndustries.Zed.Nightly"
183 $appShellNameShort = "Z&ed Editor Nightly"
184 $appAppxFullName = "ZedIndustries.Zed.Nightly_1.0.0.0_neutral__japxn1gcva8rg"
185 }
186 "dev" {
187 $appId = "{{8357632E-24A4-4F32-BA97-E575B4D1FE5D}"
188 $appIconName = "app-icon-dev"
189 $appName = "Zed Dev"
190 $appDisplayName = "Zed Dev"
191 $appSetupName = "ZedEditorUserSetup-x64-$env:RELEASE_VERSION-dev"
192 # The mutex name here should match the mutex name in crates\zed\src\zed\windows_only_instance.rs
193 $appMutex = "Zed-Dev-Instance-Mutex"
194 $appExeName = "Zed"
195 $regValueName = "ZedDev"
196 $appUserId = "ZedIndustries.Zed.Dev"
197 $appShellNameShort = "Z&ed Dev"
198 $appAppxFullName = "ZedIndustries.Zed.Dev_1.0.0.0_neutral__japxn1gcva8rg"
199 }
200 default {
201 Write-Error "can't bundle installer for $channel."
202 exit 1
203 }
204 }
205
206 # Windows runner 2022 default has iscc in PATH, https://github.com/actions/runner-images/blob/main/images/windows/Windows2022-Readme.md
207 # Currently, we are using Windows 2022 runner.
208 # Windows runner 2025 doesn't have iscc in PATH for now, https://github.com/actions/runner-images/issues/11228
209 $innoSetupPath = "C:\Program Files (x86)\Inno Setup 6\ISCC.exe"
210
211 $definitions = @{
212 "AppId" = $appId
213 "AppIconName" = $appIconName
214 "OutputDir" = "$env:ZED_WORKSPACE\target"
215 "AppSetupName" = $appSetupName
216 "AppName" = $appName
217 "AppDisplayName" = $appDisplayName
218 "RegValueName" = $regValueName
219 "AppMutex" = $appMutex
220 "AppExeName" = $appExeName
221 "ResourcesDir" = "$innoDir"
222 "ShellNameShort" = $appShellNameShort
223 "AppUserId" = $appUserId
224 "Version" = "$env:RELEASE_VERSION"
225 "SourceDir" = "$env:ZED_WORKSPACE"
226 "AppxFullName" = $appAppxFullName
227 }
228
229 $signTool = "powershell.exe -ExecutionPolicy Bypass -File $innoDir\sign.ps1 `$f"
230
231 $defs = @()
232 foreach ($key in $definitions.Keys) {
233 $defs += "/d$key=`"$($definitions[$key])`""
234 }
235
236 $innoArgs = @($issFilePath) + $defs + "/sDefaultsign=`"$signTool`""
237
238 # Execute Inno Setup
239 Write-Host "🚀 Running Inno Setup: $innoSetupPath $innoArgs"
240 $process = Start-Process -FilePath $innoSetupPath -ArgumentList $innoArgs -NoNewWindow -Wait -PassThru
241
242 if ($process.ExitCode -eq 0) {
243 Write-Host "✅ Inno Setup successfully compiled the installer"
244 Write-Output "SETUP_PATH=target/$appSetupName.exe" >> $env:GITHUB_ENV
245 $script:buildSuccess = $true
246 }
247 else {
248 Write-Host "❌ Inno Setup failed: $($process.ExitCode)"
249 $script:buildSuccess = $false
250 }
251}
252
253ParseZedWorkspace
254$innoDir = "$env:ZED_WORKSPACE\inno"
255
256CheckEnvironmentVariables
257PrepareForBundle
258GenerateLicenses
259BuildZedAndItsFriends
260MakeAppx
261SignZedAndItsFriends
262ZipZedAndItsFriendsDebug
263DownloadAMDGpuServices
264CollectFiles
265BuildInstaller
266
267$debugArchive = ".\target\release\zed-$env:RELEASE_VERSION-$env:ZED_RELEASE_CHANNEL.dbg.zip"
268$debugStoreKey = "$env:ZED_RELEASE_CHANNEL/zed-$env:RELEASE_VERSION-$env:ZED_RELEASE_CHANNEL.dbg.zip"
269UploadToBlobStorePublic -BucketName "zed-debug-symbols" -FileToUpload $debugArchive -BlobStoreKey $debugStoreKey
270
271if ($buildSuccess) {
272 Write-Output "Build successful"
273 if ($Install) {
274 Write-Output "Installing Zed..."
275 Start-Process -FilePath "$env:ZED_WORKSPACE/target/ZedEditorUserSetup-x64-$env:RELEASE_VERSION.exe"
276 }
277 exit 0
278}
279else {
280 Write-Output "Build failed"
281 exit 1
282}