mirror of
https://github.com/aljazceru/goose.git
synced 2026-01-02 22:14:26 +01:00
158 lines
5.8 KiB
YAML
158 lines
5.8 KiB
YAML
name: "Bundle Desktop (Windows)"
|
|
|
|
on:
|
|
# push:
|
|
# branches: [ "main" ]
|
|
# pull_request:
|
|
# branches: [ "main" ]
|
|
workflow_call:
|
|
inputs:
|
|
signing:
|
|
description: 'Whether to sign the Windows executable'
|
|
required: false
|
|
type: boolean
|
|
default: false
|
|
secrets:
|
|
WINDOWS_CERTIFICATE:
|
|
required: false
|
|
WINDOWS_CERTIFICATE_PASSWORD:
|
|
required: false
|
|
|
|
jobs:
|
|
build-desktop-windows:
|
|
name: Build Desktop (Windows)
|
|
runs-on: windows-latest
|
|
|
|
steps:
|
|
# 1) Check out source
|
|
- name: Checkout repository
|
|
uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744
|
|
|
|
# 2) Set up Rust
|
|
- name: Set up Rust
|
|
uses: dtolnay/rust-toolchain@38b70195107dddab2c7bbd522bcf763bac00963b
|
|
# If you need a specific version, you could do:
|
|
# or uses: actions/setup-rust@v1
|
|
# with:
|
|
# rust-version: 1.73.0
|
|
|
|
# 3) Set up Node.js
|
|
- name: Set up Node.js
|
|
uses: actions/setup-node@1a4442cacd436585916779262731d5b162bc6ec7 # pin@v3
|
|
with:
|
|
node-version: 16
|
|
|
|
# 4) Cache dependencies (optional, can add more paths if needed)
|
|
- name: Cache node_modules
|
|
uses: actions/cache@2f8e54208210a422b2efd51efaa6bd6d7ca8920f # pin@v3
|
|
with:
|
|
path: |
|
|
node_modules
|
|
ui/desktop/node_modules
|
|
key: ${{ runner.os }}-build-desktop-windows-${{ hashFiles('**/package-lock.json') }}
|
|
restore-keys: |
|
|
${{ runner.os }}-build-desktop-windows-
|
|
|
|
# 5) Install top-level dependencies if a package.json is in root
|
|
- name: Install top-level deps
|
|
run: |
|
|
if (Test-Path package.json) {
|
|
npm install
|
|
}
|
|
|
|
# 6) Build rust for x86_64-pc-windows-gnu
|
|
- name: Install MinGW dependencies
|
|
run: |
|
|
choco install mingw --version=8.1.0
|
|
# Debug - check installation paths
|
|
Write-Host "Checking MinGW installation..."
|
|
Get-ChildItem -Path "C:\ProgramData\chocolatey\lib\mingw" -Recurse -Filter "*.dll" | ForEach-Object {
|
|
Write-Host $_.FullName
|
|
}
|
|
Get-ChildItem -Path "C:\tools" -Recurse -Filter "*.dll" | ForEach-Object {
|
|
Write-Host $_.FullName
|
|
}
|
|
|
|
- name: Cargo build for Windows
|
|
run: |
|
|
cargo build --release --target x86_64-pc-windows-gnu
|
|
|
|
# 7) Check that the compiled goosed.exe exists and copy exe/dll to ui/desktop/src/bin
|
|
- name: Prepare Windows binary and DLLs
|
|
run: |
|
|
if (!(Test-Path .\target\x86_64-pc-windows-gnu\release\goosed.exe)) {
|
|
Write-Error "Windows binary not found."; exit 1;
|
|
}
|
|
Write-Host "Copying Windows binary and DLLs to ui/desktop/src/bin..."
|
|
if (!(Test-Path ui\desktop\src\bin)) {
|
|
New-Item -ItemType Directory -Path ui\desktop\src\bin | Out-Null
|
|
}
|
|
Copy-Item .\target\x86_64-pc-windows-gnu\release\goosed.exe ui\desktop\src\bin\
|
|
|
|
# Copy MinGW DLLs - try both possible locations
|
|
$mingwPaths = @(
|
|
"C:\ProgramData\chocolatey\lib\mingw\tools\install\mingw64\bin",
|
|
"C:\tools\mingw64\bin"
|
|
)
|
|
|
|
foreach ($path in $mingwPaths) {
|
|
if (Test-Path "$path\libstdc++-6.dll") {
|
|
Write-Host "Found MinGW DLLs in $path"
|
|
Copy-Item "$path\libstdc++-6.dll" ui\desktop\src\bin\
|
|
Copy-Item "$path\libgcc_s_seh-1.dll" ui\desktop\src\bin\
|
|
Copy-Item "$path\libwinpthread-1.dll" ui\desktop\src\bin\
|
|
break
|
|
}
|
|
}
|
|
|
|
# Copy any other DLLs from the release directory
|
|
ls .\target\x86_64-pc-windows-gnu\release\*.dll | ForEach-Object {
|
|
Copy-Item $_ ui\desktop\src\bin\
|
|
}
|
|
|
|
# 8) Install & build UI desktop
|
|
- name: Build desktop UI with npm
|
|
run: |
|
|
cd ui\desktop
|
|
npm install
|
|
npm run bundle:windows
|
|
|
|
# 9) Copy exe/dll to final out/Goose-win32-x64/resources/bin
|
|
- name: Copy exe/dll to out folder
|
|
run: |
|
|
cd ui\desktop
|
|
if (!(Test-Path .\out\Goose-win32-x64\resources\bin)) {
|
|
New-Item -ItemType Directory -Path .\out\Goose-win32-x64\resources\bin | Out-Null
|
|
}
|
|
Copy-Item .\src\bin\goosed.exe .\out\Goose-win32-x64\resources\bin\
|
|
ls .\src\bin\*.dll | ForEach-Object {
|
|
Copy-Item $_ .\out\Goose-win32-x64\resources\bin\
|
|
}
|
|
|
|
# 10) Code signing (if enabled)
|
|
- name: Sign Windows executable
|
|
# Skip this step by default - enable when we have a certificate
|
|
if: inputs.signing && inputs.signing == true
|
|
env:
|
|
WINDOWS_CERTIFICATE: ${{ secrets.WINDOWS_CERTIFICATE }}
|
|
WINDOWS_CERTIFICATE_PASSWORD: ${{ secrets.WINDOWS_CERTIFICATE_PASSWORD }}
|
|
run: |
|
|
# Create a temporary certificate file
|
|
$certBytes = [Convert]::FromBase64String($env:WINDOWS_CERTIFICATE)
|
|
$certPath = Join-Path -Path $env:RUNNER_TEMP -ChildPath "certificate.pfx"
|
|
[IO.File]::WriteAllBytes($certPath, $certBytes)
|
|
|
|
# Sign the main executable
|
|
$signtool = "C:\Program Files (x86)\Windows Kits\10\bin\10.0.17763.0\x64\signtool.exe"
|
|
& $signtool sign /f $certPath /p $env:WINDOWS_CERTIFICATE_PASSWORD /tr http://timestamp.digicert.com /td sha256 /fd sha256 "ui\desktop\out\Goose-win32-x64\Goose.exe"
|
|
|
|
# Clean up the certificate
|
|
Remove-Item -Path $certPath
|
|
|
|
# 11) Upload the final Windows build
|
|
- name: Upload Windows build artifacts
|
|
uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # pin@v4
|
|
with:
|
|
name: desktop-windows-dist
|
|
path: ui/desktop/out/Goose-win32-x64/
|