aboutsummaryrefslogtreecommitdiffstats
path: root/.github/workflows
diff options
context:
space:
mode:
authordivens <divens@users.noreply.github.com>2026-03-16 12:38:38 +0100
committerGitHub <noreply@github.com>2026-03-16 12:38:38 +0100
commitc4a572a8841e652cbff678ac10bd353ec79c58c5 (patch)
tree125e36af671bf8d67343da1f6e7797a935e34b23 /.github/workflows
parentfix: sixel-image aspect ratio and opacity issues (#4858) (diff)
downloadsl0ppij-c4a572a8841e652cbff678ac10bd353ec79c58c5.tar.gz
sl0ppij-c4a572a8841e652cbff678ac10bd353ec79c58c5.tar.xz
sl0ppij-c4a572a8841e652cbff678ac10bd353ec79c58c5.zip
Add Windows MSI installer with WiX v6 (#4847)
* Add Windows MSI installer with WiX v6 Build a dual-scope MSI installer that lets users choose per-user (%LocalAppData%\Zellij) or per-machine (Program Files\Zellij) install, with automatic PATH configuration and clean uninstall support. - Custom UI based on stock WixToolset.UI.wixext dialogs to work around the long-standing WixUI_Advanced dual-scope bug (wixtoolset/issues#7137) - Custom folder resolution CAs (SetFolderPerUser/SetFolderPerMachine) - Embed application icon into zellij.exe via embed-resource - Icon shown in Add/Remove Programs via ARPPRODUCTICON - MSI build integrated into release.yml CI workflow * Add MSI installer to no-web build and fix artifact naming - Add MSI build steps to build-release-noweb job - Add SHA256 checksums for MSI artifacts - Pin WixToolset.UI.wixext to 6.0.2 to avoid v7 RC incompatibility - Use -installer suffix after target in artifact names --------- Co-authored-by: divens <divens.dev@gmail.com>
Diffstat (limited to '.github/workflows')
-rw-r--r--.github/workflows/release.yml102
1 files changed, 102 insertions, 0 deletions
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index bd4f3f50..9a2f1f45 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -162,6 +162,57 @@ jobs:
asset_name: zellij-${{matrix.target}}.sha256sum
asset_content_type: text/plain
+ # ===== Windows MSI installer =====
+ - name: Install WiX v6
+ if: runner.os == 'Windows'
+ run: dotnet tool install --global wix
+
+ - name: Add WiX UI extension
+ if: runner.os == 'Windows'
+ run: wix extension add WixToolset.UI.wixext/6.0.2
+
+ - name: Build MSI installer
+ if: runner.os == 'Windows'
+ run: |
+ $version = (Select-String -Path Cargo.toml -Pattern '^version\s*=\s*"(.+)"' | Select-Object -First 1).Matches.Groups[1].Value
+ New-Item -ItemType Directory -Force -Path target\wix
+ wix build wix\main.wxs wix\Zellij.wxl `
+ -d Version=$version `
+ -arch x64 `
+ -ext WixToolset.UI.wixext `
+ -o target\wix\zellij-x86_64-pc-windows-msvc-installer.msi
+
+ - name: Create MSI checksum
+ if: runner.os == 'Windows'
+ id: make-checksum-msi
+ run: |
+ $checksum_name = "zellij-${{ matrix.target }}-installer.sha256sum"
+ $hash = (Get-FileHash "target\wix\zellij-${{ matrix.target }}-installer.msi" -Algorithm SHA256).Hash.ToLower()
+ "$hash zellij-${{ matrix.target }}-installer.msi" | Out-File -Encoding ascii $checksum_name
+ echo "checksum_name=$checksum_name" >> $env:GITHUB_OUTPUT
+
+ - name: Upload MSI installer
+ if: runner.os == 'Windows'
+ uses: actions/upload-release-asset@v1.0.2
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ with:
+ upload_url: ${{ needs.create-release.outputs.upload_url }}
+ asset_path: target\wix\zellij-${{ matrix.target }}-installer.msi
+ asset_name: zellij-${{ matrix.target }}-installer.msi
+ asset_content_type: application/octet-stream
+
+ - name: Upload MSI checksum
+ if: runner.os == 'Windows'
+ uses: actions/upload-release-asset@v1.0.2
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ with:
+ upload_url: ${{ needs.create-release.outputs.upload_url }}
+ asset_path: ${{ steps.make-checksum-msi.outputs.checksum_name }}
+ asset_name: zellij-${{ matrix.target }}-installer.sha256sum
+ asset_content_type: text/plain
+
build-release-noweb:
needs: create-release
name: build-release-noweb
@@ -301,3 +352,54 @@ jobs:
asset_path: ${{ steps.make-checksum-unix.outputs.checksum_name || steps.make-checksum-windows.outputs.checksum_name }}
asset_name: zellij-no-web-${{matrix.target}}.sha256sum
asset_content_type: text/plain
+
+ # ===== Windows MSI installer (no-web) =====
+ - name: Install WiX v6
+ if: runner.os == 'Windows'
+ run: dotnet tool install --global wix
+
+ - name: Add WiX UI extension
+ if: runner.os == 'Windows'
+ run: wix extension add WixToolset.UI.wixext/6.0.2
+
+ - name: Build MSI installer (no-web)
+ if: runner.os == 'Windows'
+ run: |
+ $version = (Select-String -Path Cargo.toml -Pattern '^version\s*=\s*"(.+)"' | Select-Object -First 1).Matches.Groups[1].Value
+ New-Item -ItemType Directory -Force -Path target\wix
+ wix build wix\main.wxs wix\Zellij.wxl `
+ -d Version=$version `
+ -arch x64 `
+ -ext WixToolset.UI.wixext `
+ -o target\wix\zellij-no-web-${{ matrix.target }}-installer.msi
+
+ - name: Create MSI checksum (no-web)
+ if: runner.os == 'Windows'
+ id: make-checksum-msi
+ run: |
+ $checksum_name = "zellij-no-web-${{ matrix.target }}-installer.sha256sum"
+ $hash = (Get-FileHash "target\wix\zellij-no-web-${{ matrix.target }}-installer.msi" -Algorithm SHA256).Hash.ToLower()
+ "$hash zellij-no-web-${{ matrix.target }}-installer.msi" | Out-File -Encoding ascii $checksum_name
+ echo "checksum_name=$checksum_name" >> $env:GITHUB_OUTPUT
+
+ - name: Upload MSI installer (no-web)
+ if: runner.os == 'Windows'
+ uses: actions/upload-release-asset@v1.0.2
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ with:
+ upload_url: ${{ needs.create-release.outputs.upload_url }}
+ asset_path: target\wix\zellij-no-web-${{ matrix.target }}-installer.msi
+ asset_name: zellij-no-web-${{ matrix.target }}-installer.msi
+ asset_content_type: application/octet-stream
+
+ - name: Upload MSI checksum (no-web)
+ if: runner.os == 'Windows'
+ uses: actions/upload-release-asset@v1.0.2
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ with:
+ upload_url: ${{ needs.create-release.outputs.upload_url }}
+ asset_path: ${{ steps.make-checksum-msi.outputs.checksum_name }}
+ asset_name: zellij-no-web-${{ matrix.target }}-installer.sha256sum
+ asset_content_type: text/plain