Build and Sign Virtual Drivers - Sequential #30
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Build and Sign Virtual Drivers - Full Production | |
| on: | |
| push: | |
| branches: [ main, master ] | |
| paths-ignore: | |
| - '**.md' | |
| - 'docs/**' | |
| - '.github/workflows/ci-validation.yml' | |
| - '.github/workflows/build-installer.yml' | |
| workflow_dispatch: | |
| inputs: | |
| skip_signing: | |
| description: 'Skip SignPath signing (for testing)' | |
| required: false | |
| default: false | |
| type: boolean | |
| build_installer: | |
| description: 'Build installer after signing' | |
| required: false | |
| default: true | |
| type: boolean | |
| release: | |
| types: [created] | |
| schedule: | |
| - cron: '0 2 * * 0' # Weekly builds | |
| env: | |
| BUILD_CONFIGURATION: Release | |
| jobs: | |
| # Job 1: Build Control Apps for both architectures - runs independently and concurrently | |
| build-control-apps: | |
| runs-on: windows-latest | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v4 | |
| - name: Setup Node.js | |
| uses: actions/setup-node@v4 | |
| with: | |
| node-version: '18' | |
| # Checkout Virtual Driver Control Repository | |
| - name: Checkout Virtual Driver Control Repository | |
| if: github.repository != 'VirtualDrivers/Virtual-Driver-Control' | |
| uses: actions/checkout@v4 | |
| with: | |
| repository: 'VirtualDrivers/Virtual-Driver-Control' | |
| path: 'control-app-repo' | |
| token: ${{ secrets.GITHUB_TOKEN }} | |
| continue-on-error: true | |
| # Build Control App for ARM64 | |
| - name: Build Virtual Driver Control App (ARM64) | |
| run: | | |
| $controlAppPath = "" | |
| if (Test-Path "control-app-repo/VirtualDriverControl/package.json") { | |
| $controlAppPath = "control-app-repo/VirtualDriverControl" | |
| Write-Output "Found control app in separate repository" | |
| } | |
| if ($controlAppPath -ne "") { | |
| Write-Output "Building Virtual Driver Control App for ARM64..." | |
| # Create separate directory for ARM64 build | |
| $arm64BuildPath = "control-app-arm64" | |
| Copy-Item $controlAppPath -Destination $arm64BuildPath -Recurse -Force | |
| Push-Location $arm64BuildPath | |
| # Install dependencies | |
| npm ci | |
| # Modify package.json for ARM64 | |
| $packageJson = Get-Content "package.json" | ConvertFrom-Json | |
| $packageJson.build.win.target[0].arch = @("arm64") | |
| $packageJson | ConvertTo-Json -Depth 10 | Set-Content "package.json" | |
| # Build portable app for ARM64 | |
| npm run build-portable | |
| Pop-Location | |
| # Copy to publish directory | |
| $publishDir = "./control-app-publish-arm64" | |
| New-Item -ItemType Directory -Path $publishDir -Force | |
| Copy-Item "$arm64BuildPath/dist/*" -Destination $publishDir -Recurse -Force | |
| Write-Output "✅ ARM64 Control App build completed" | |
| } | |
| # Build Control App for x64 (in parallel with ARM64) | |
| - name: Build Virtual Driver Control App (x64) | |
| run: | | |
| $controlAppPath = "" | |
| if (Test-Path "control-app-repo/VirtualDriverControl/package.json") { | |
| $controlAppPath = "control-app-repo/VirtualDriverControl" | |
| Write-Output "Found control app in separate repository" | |
| } | |
| if ($controlAppPath -ne "") { | |
| Write-Output "Building Virtual Driver Control App for x64..." | |
| # Create separate directory for x64 build | |
| $x64BuildPath = "control-app-x64" | |
| Copy-Item $controlAppPath -Destination $x64BuildPath -Recurse -Force | |
| Push-Location $x64BuildPath | |
| # Install dependencies | |
| npm ci | |
| # Build portable app for x64 (default config) | |
| npm run build-portable | |
| Pop-Location | |
| # Copy to publish directory | |
| $publishDir = "./control-app-publish-x64" | |
| New-Item -ItemType Directory -Path $publishDir -Force | |
| Copy-Item "$x64BuildPath/dist/*" -Destination $publishDir -Recurse -Force | |
| Write-Output "✅ x64 Control App build completed" | |
| } | |
| # Upload Control Apps as artifacts | |
| - name: Upload Control Apps | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: Control-Apps-${{ env.BUILD_CONFIGURATION }} | |
| path: | | |
| control-app-publish-arm64/ | |
| control-app-publish-x64/ | |
| retention-days: 1 | |
| # Job 2: Build ARM64 VDD only (skip VAD due to WDK ARM64 issues) - runs concurrently with x64 and control apps | |
| build-arm64: | |
| runs-on: windows-latest | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v4 | |
| # Setup build environment | |
| - name: Setup MSBuild | |
| uses: microsoft/setup-msbuild@v1 | |
| - name: Install Visual Studio 2022 dependencies | |
| run: | | |
| choco install visualstudio2022-workload-manageddesktop -y | |
| if ($LASTEXITCODE -ne 0) { exit 1 } | |
| choco install visualstudio2022-workload-nativedesktop -y | |
| if ($LASTEXITCODE -ne 0) { exit 1 } | |
| choco install visualstudio2022-workload-vctools -y | |
| if ($LASTEXITCODE -ne 0) { exit 1 } | |
| choco install windowsdriverkit11 -y | |
| if ($LASTEXITCODE -ne 0) { exit 1 } | |
| - name: Setup .NET | |
| uses: actions/setup-dotnet@v4 | |
| with: | |
| dotnet-version: '6.0.x' | |
| - name: Setup Node.js | |
| uses: actions/setup-node@v4 | |
| with: | |
| node-version: '18' | |
| # Build Virtual Display Driver for ARM64 | |
| - name: Build Virtual Display Driver (ARM64) | |
| run: | | |
| Write-Output "Building Virtual Display Driver (HDR) for ARM64..." | |
| $vddSln = "Virtual Display Driver (HDR)/MTTVDD.sln" | |
| if (Test-Path $vddSln) { | |
| Write-Output "Found VDD solution: $vddSln" | |
| Write-Output "Running MSBuild for ARM64..." | |
| msbuild $vddSln /p:Configuration=$env:BUILD_CONFIGURATION /p:Platform=ARM64 /verbosity:minimal | |
| if ($LASTEXITCODE -eq 0) { | |
| Write-Output "✅ VDD build completed successfully for ARM64" | |
| } else { | |
| Write-Output "❌ VDD build failed with exit code: $LASTEXITCODE" | |
| exit 1 | |
| } | |
| # List build directory | |
| $buildDir = "Virtual Display Driver (HDR)\ARM64\$env:BUILD_CONFIGURATION\MttVDD" | |
| if (Test-Path $buildDir) { | |
| Write-Output "VDD Build outputs in ${buildDir}:" | |
| Get-ChildItem $buildDir | ForEach-Object { Write-Output " - $($_.Name)" } | |
| } else { | |
| Write-Output "❌ Build directory not found: ${buildDir}" | |
| exit 1 | |
| } | |
| } else { | |
| Write-Output "❌ VDD solution file not found at: $vddSln" | |
| exit 1 | |
| } | |
| # Note: Skipping ARM64 VAD build due to WDK toolchain limitations | |
| - name: ARM64 VAD Build Notice | |
| run: | | |
| Write-Output "ℹ️ Skipping ARM64 VAD build due to Windows Driver Kit ARM64 cross-compilation issues" | |
| Write-Output "ℹ️ VAD will be built for x64 only in the next job" | |
| # Download Control Apps | |
| - name: Download Control Apps | |
| uses: actions/download-artifact@v4 | |
| with: | |
| name: Control-Apps-${{ env.BUILD_CONFIGURATION }} | |
| path: control-apps | |
| # Package ARM64 components (VDD + Control App only) | |
| - name: Package ARM64 components | |
| run: | | |
| Write-Output "Creating ARM64 package..." | |
| $packageDir = "arm64-components" | |
| New-Item -ItemType Directory -Path $packageDir -Force | |
| # Create component directories | |
| $vddDir = "$packageDir\VDD" | |
| $controlDir = "$packageDir\ControlApp" | |
| New-Item -ItemType Directory -Path $vddDir -Force | |
| New-Item -ItemType Directory -Path $controlDir -Force | |
| # Copy VDD ARM64 files | |
| $vddBuildDir = "Virtual Display Driver (HDR)\ARM64\$env:BUILD_CONFIGURATION\MttVDD" | |
| if (Test-Path $vddBuildDir) { | |
| Copy-Item "$vddBuildDir\*" -Destination $vddDir -Force | |
| Write-Output "✅ Copied VDD ARM64 files" | |
| } | |
| # Copy Control App ARM64 files from downloaded artifacts | |
| if (Test-Path "control-apps\control-app-publish-arm64") { | |
| Copy-Item "control-apps\control-app-publish-arm64\*" -Destination $controlDir -Recurse -Force | |
| Write-Output "✅ Copied Control App ARM64 files" | |
| } | |
| Write-Output "ARM64_PACKAGE_DIR=$packageDir" >> $env:GITHUB_ENV | |
| # Upload ARM64 artifacts | |
| - name: Upload ARM64 components | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: ARM64-Components-${{ env.BUILD_CONFIGURATION }} | |
| path: ${{ env.ARM64_PACKAGE_DIR }} | |
| retention-days: 1 | |
| # Job 2: Build x64 components (VDD + VAD + Control App) - runs concurrently with ARM64 | |
| build-x64: | |
| runs-on: windows-latest | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v4 | |
| # Setup build environment | |
| - name: Setup MSBuild | |
| uses: microsoft/setup-msbuild@v1 | |
| - name: Install Visual Studio 2022 dependencies | |
| run: | | |
| choco install visualstudio2022-workload-manageddesktop -y | |
| if ($LASTEXITCODE -ne 0) { exit 1 } | |
| choco install visualstudio2022-workload-nativedesktop -y | |
| if ($LASTEXITCODE -ne 0) { exit 1 } | |
| choco install visualstudio2022-workload-vctools -y | |
| if ($LASTEXITCODE -ne 0) { exit 1 } | |
| choco install windowsdriverkit11 -y | |
| if ($LASTEXITCODE -ne 0) { exit 1 } | |
| - name: Setup Node.js | |
| uses: actions/setup-node@v4 | |
| with: | |
| node-version: '18' | |
| # Build Virtual Display Driver for x64 | |
| - name: Build Virtual Display Driver (x64) | |
| run: | | |
| Write-Output "Building Virtual Display Driver (HDR) for x64..." | |
| $vddSln = "Virtual Display Driver (HDR)/MTTVDD.sln" | |
| if (Test-Path $vddSln) { | |
| Write-Output "Found VDD solution: $vddSln" | |
| Write-Output "Running MSBuild for x64..." | |
| msbuild $vddSln /p:Configuration=$env:BUILD_CONFIGURATION /p:Platform=x64 /verbosity:minimal | |
| if ($LASTEXITCODE -eq 0) { | |
| Write-Output "✅ VDD build completed successfully for x64" | |
| } else { | |
| Write-Output "❌ VDD build failed with exit code: $LASTEXITCODE" | |
| exit 1 | |
| } | |
| # List build directory | |
| $buildDir = "Virtual Display Driver (HDR)\x64\$env:BUILD_CONFIGURATION\MttVDD" | |
| if (Test-Path $buildDir) { | |
| Write-Output "VDD Build outputs in ${buildDir}:" | |
| Get-ChildItem $buildDir | ForEach-Object { Write-Output " - $($_.Name)" } | |
| } else { | |
| Write-Output "❌ Build directory not found: ${buildDir}" | |
| exit 1 | |
| } | |
| } else { | |
| Write-Output "❌ VDD solution file not found at: $vddSln" | |
| exit 1 | |
| } | |
| # Build Virtual Audio Driver for x64 (stable platform) | |
| - name: Build Virtual Audio Driver (x64) | |
| run: | | |
| Write-Output "Building Virtual Audio Driver for x64..." | |
| $vadSln = "Virtual-Audio-Driver (Latest Stable)/VirtualAudioDriver.sln" | |
| if (Test-Path $vadSln) { | |
| Write-Output "Found VAD solution: $vadSln" | |
| Write-Output "Running MSBuild for x64..." | |
| msbuild $vadSln /p:Configuration=$env:BUILD_CONFIGURATION /p:Platform=x64 /verbosity:minimal | |
| if ($LASTEXITCODE -eq 0) { | |
| Write-Output "✅ VAD build completed successfully for x64" | |
| } else { | |
| Write-Output "❌ VAD build failed with exit code: $LASTEXITCODE" | |
| exit 1 | |
| } | |
| # List build outputs | |
| Write-Output "Searching for VAD build outputs..." | |
| Get-ChildItem -Path "Virtual-Audio-Driver (Latest Stable)" -Recurse -Include "*.sys", "*.inf", "*.cat", "*.dll" -ErrorAction SilentlyContinue | ForEach-Object { | |
| Write-Output " - $($_.FullName)" | |
| } | |
| } else { | |
| Write-Output "❌ VAD solution file not found at: $vadSln" | |
| exit 1 | |
| } | |
| # Download Control Apps | |
| - name: Download Control Apps | |
| uses: actions/download-artifact@v4 | |
| with: | |
| name: Control-Apps-${{ env.BUILD_CONFIGURATION }} | |
| path: control-apps | |
| # Package x64 components (VDD + VAD + Control App) | |
| - name: Package x64 components | |
| run: | | |
| Write-Output "Creating x64 package..." | |
| $packageDir = "x64-components" | |
| New-Item -ItemType Directory -Path $packageDir -Force | |
| # Create component directories | |
| $vddDir = "$packageDir\VDD" | |
| $vadDir = "$packageDir\VAD" | |
| $controlDir = "$packageDir\ControlApp" | |
| New-Item -ItemType Directory -Path $vddDir -Force | |
| New-Item -ItemType Directory -Path $vadDir -Force | |
| New-Item -ItemType Directory -Path $controlDir -Force | |
| # Copy VDD x64 files | |
| $vddBuildDir = "Virtual Display Driver (HDR)\x64\$env:BUILD_CONFIGURATION\MttVDD" | |
| if (Test-Path $vddBuildDir) { | |
| Copy-Item "$vddBuildDir\*" -Destination $vddDir -Force | |
| Write-Output "✅ Copied VDD x64 files" | |
| } | |
| # Copy VAD x64 files | |
| $vadFiles = Get-ChildItem -Path "Virtual-Audio-Driver (Latest Stable)" -Recurse -Include "*.sys", "*.inf", "*.cat", "*.dll" -ErrorAction SilentlyContinue | |
| foreach ($file in $vadFiles) { | |
| Copy-Item $file.FullName -Destination $vadDir -Force | |
| } | |
| Write-Output "✅ Copied VAD x64 files" | |
| # Copy Control App x64 files from downloaded artifacts | |
| if (Test-Path "control-apps\control-app-publish-x64") { | |
| Copy-Item "control-apps\control-app-publish-x64\*" -Destination $controlDir -Recurse -Force | |
| Write-Output "✅ Copied Control App x64 files to x64 package" | |
| } | |
| Write-Output "X64_PACKAGE_DIR=$packageDir" >> $env:GITHUB_ENV | |
| # Upload x64 artifacts | |
| - name: Upload x64 components | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: X64-Components-${{ env.BUILD_CONFIGURATION }} | |
| path: ${{ env.X64_PACKAGE_DIR }} | |
| retention-days: 1 | |
| # Job 4: Unified packaging and signing - waits for all concurrent builds | |
| package-and-sign: | |
| needs: [build-control-apps, build-arm64, build-x64] | |
| runs-on: windows-latest | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v4 | |
| # Download ARM64 artifacts | |
| - name: Download ARM64 components | |
| uses: actions/download-artifact@v4 | |
| with: | |
| name: ARM64-Components-${{ env.BUILD_CONFIGURATION }} | |
| path: arm64-components | |
| # Download x64 artifacts | |
| - name: Download x64 components | |
| uses: actions/download-artifact@v4 | |
| with: | |
| name: X64-Components-${{ env.BUILD_CONFIGURATION }} | |
| path: x64-components | |
| # Create unified package for signing | |
| - name: Create unified package for SignPath | |
| run: | | |
| Write-Output "Creating unified package for signing..." | |
| $unifiedDir = "unified-driver-package" | |
| New-Item -ItemType Directory -Path $unifiedDir -Force | |
| # Create platform-specific directories | |
| $arm64Dir = "$unifiedDir\ARM64" | |
| $x64Dir = "$unifiedDir\x64" | |
| New-Item -ItemType Directory -Path $arm64Dir -Force | |
| New-Item -ItemType Directory -Path $x64Dir -Force | |
| # Create component subdirectories | |
| # ARM64: VDD + Control App only | |
| New-Item -ItemType Directory -Path "$arm64Dir\VDD" -Force | |
| New-Item -ItemType Directory -Path "$arm64Dir\ControlApp" -Force | |
| # x64: VDD + VAD + Control App | |
| New-Item -ItemType Directory -Path "$x64Dir\VDD" -Force | |
| New-Item -ItemType Directory -Path "$x64Dir\VAD" -Force | |
| New-Item -ItemType Directory -Path "$x64Dir\ControlApp" -Force | |
| # Copy ARM64 components (VDD + Control App) | |
| if (Test-Path "arm64-components\VDD") { | |
| Copy-Item "arm64-components\VDD\*" -Destination "$arm64Dir\VDD" -Force | |
| Write-Output "✅ Copied ARM64 VDD files" | |
| } | |
| if (Test-Path "arm64-components\ControlApp") { | |
| Copy-Item "arm64-components\ControlApp\*" -Destination "$arm64Dir\ControlApp" -Recurse -Force | |
| Write-Output "✅ Copied Control App files to ARM64 package" | |
| } | |
| # Copy x64 components (VDD + VAD) | |
| if (Test-Path "x64-components\VDD") { | |
| Copy-Item "x64-components\VDD\*" -Destination "$x64Dir\VDD" -Force | |
| Write-Output "✅ Copied x64 VDD files" | |
| } | |
| if (Test-Path "x64-components\VAD") { | |
| Copy-Item "x64-components\VAD\*" -Destination "$x64Dir\VAD" -Force | |
| Write-Output "✅ Copied x64 VAD files" | |
| } | |
| # Copy Control App to x64 as well (shared component) | |
| if (Test-Path "x64-components\ControlApp") { | |
| Copy-Item "x64-components\ControlApp\*" -Destination "$x64Dir\ControlApp" -Recurse -Force | |
| Write-Output "✅ Copied Control App files to x64 package" | |
| } | |
| # Display final package structure | |
| Write-Output "" | |
| Write-Output "=== Final Unified Package Structure ===" | |
| Get-ChildItem $unifiedDir -Recurse | ForEach-Object { | |
| $relativePath = $_.FullName.Substring($unifiedDir.Length + 1) | |
| if ($_.PSIsContainer) { | |
| Write-Output "📁 $relativePath/" | |
| } else { | |
| Write-Output "📄 $relativePath" | |
| } | |
| } | |
| # Create ZIP file | |
| $zipFile = "unified-driver-package-mixed-platform.zip" | |
| Write-Output "" | |
| Write-Output "Creating unified ZIP file: $zipFile" | |
| Compress-Archive -Path $unifiedDir -DestinationPath $zipFile -Force | |
| if (Test-Path $zipFile) { | |
| $zipSize = (Get-Item $zipFile).Length | |
| Write-Output "✅ Unified package created successfully: $zipFile (${zipSize} bytes)" | |
| Write-Output "UNIFIED_PACKAGE_PATH=$zipFile" >> $env:GITHUB_ENV | |
| } else { | |
| Write-Output "❌ Failed to create unified package" | |
| exit 1 | |
| } | |
| # Upload unified package | |
| - name: Upload unified package | |
| id: upload_unified_package | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: Unified-Driver-Package-Mixed-Platform-${{ env.BUILD_CONFIGURATION }} | |
| path: ${{ env.UNIFIED_PACKAGE_PATH }} | |
| # Generate release tag | |
| - name: Generate release tag | |
| id: generate_tag | |
| run: | | |
| $releaseTag = (Get-Date).ToString('yy.MM.dd') | |
| Write-Output "Generated release tag: $releaseTag" | |
| echo "RELEASE_TAG=$releaseTag" >> $env:GITHUB_ENV | |
| # Submit unified package to SignPath (only for main branch and tags, unless skipping) | |
| - name: Submit unified package to SignPath for signing | |
| if: (github.ref == 'refs/heads/main' || github.ref == 'refs/heads/master' || startsWith(github.ref, 'refs/tags/')) && steps.upload_unified_package.outputs.artifact-id != '' && github.event.inputs.skip_signing != 'true' | |
| id: signpath_unified_request | |
| uses: signpath/github-action-submit-signing-request@v1 | |
| with: | |
| api-token: '${{ secrets.SIGNPATH_API_TOKEN }}' | |
| organization-id: '${{ vars.SIGNPATH_ORG_ID }}' | |
| project-slug: '${{ vars.SIGNPATH_PROJECT_SLUG }}' | |
| signing-policy-slug: '${{ vars.SIGNPATH_POLICY_SLUG }}' | |
| github-artifact-id: '${{ steps.upload_unified_package.outputs.artifact-id }}' | |
| wait-for-completion: true | |
| output-artifact-directory: '${{ vars.SIGNPATH_OUTPUT_DIR }}' | |
| parameters: | | |
| Version: ${{ toJSON(env.BUILD_CONFIGURATION) }} | |
| Release_Tag: "${{ env.RELEASE_TAG }}" | |
| Platforms: "ARM64-VDD-only,x64-VDD-VAD" | |
| continue-on-error: true | |
| # Upload signed unified package | |
| - name: Upload signed unified package | |
| if: steps.signpath_unified_request.outcome == 'success' | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: Signed-Unified-Package-Mixed-Platform-${{ env.BUILD_CONFIGURATION }} | |
| path: '${{ vars.SIGNPATH_OUTPUT_DIR }}\*' | |
| continue-on-error: true | |
| # Checkout Virtual Driver Installer Repository | |
| - name: Checkout Virtual Driver Installer Repository | |
| uses: actions/checkout@v4 | |
| with: | |
| repository: 'VirtualDrivers/Virtual-Driver-Installer' | |
| path: 'installer-repo' | |
| token: ${{ secrets.GITHUB_TOKEN }} | |
| continue-on-error: true | |
| # Build installer using signed components | |
| - name: Build Virtual Driver Installer | |
| if: steps.signpath_unified_request.outcome == 'success' && github.event.inputs.build_installer != 'false' | |
| run: | | |
| Write-Output "Building Virtual Driver Installer..." | |
| $installerPath = "installer-repo" | |
| if (-not (Test-Path $installerPath)) { | |
| Write-Output "❌ Installer repository not found" | |
| exit 1 | |
| } | |
| Push-Location $installerPath | |
| # Copy signed artifacts to installer input directory | |
| $signedArtifactsPath = "${{ vars.SIGNPATH_OUTPUT_DIR }}" | |
| if (Test-Path $signedArtifactsPath) { | |
| Write-Output "Copying signed artifacts to installer input..." | |
| # Create SignedArtifacts directory structure expected by build script | |
| New-Item -ItemType Directory -Path "SignedArtifacts" -Force | |
| Copy-Item "$signedArtifactsPath\*" -Destination "SignedArtifacts\" -Recurse -Force | |
| Write-Output "Contents of SignedArtifacts directory:" | |
| Get-ChildItem "SignedArtifacts" -Recurse | ForEach-Object { Write-Output " - $($_.FullName)" } | |
| # Run the installer build script | |
| Write-Output "Running installer build script..." | |
| if (Test-Path "build-installer.ps1") { | |
| .\build-installer.ps1 | |
| # Install Inno Setup if not available | |
| if (-not (Get-Command "iscc" -ErrorAction SilentlyContinue)) { | |
| Write-Output "Installing Inno Setup..." | |
| choco install innosetup -y | |
| if ($LASTEXITCODE -ne 0) { | |
| Write-Output "Failed to install Inno Setup" | |
| exit 1 | |
| } | |
| } | |
| # Compile the installer using Inno Setup | |
| Write-Output "Compiling installer with Inno Setup..." | |
| $issFile = "Setup.iss" | |
| if (Test-Path $issFile) { | |
| iscc $issFile | |
| if ($LASTEXITCODE -eq 0) { | |
| Write-Output "✅ Inno Setup compilation completed" | |
| } else { | |
| Write-Output "❌ Inno Setup compilation failed with exit code: $LASTEXITCODE" | |
| exit 1 | |
| } | |
| } else { | |
| Write-Output "❌ Setup.iss not found" | |
| exit 1 | |
| } | |
| # Check if installer was built successfully | |
| if (Test-Path "output\*.exe") { | |
| Write-Output "✅ Installer built successfully" | |
| Get-ChildItem "output\*.exe" | ForEach-Object { | |
| Write-Output "Built installer: $($_.Name) ($(($_.Length / 1MB).ToString('F2')) MB)" | |
| } | |
| # Get the actual installer file path for upload | |
| $installerFile = Get-ChildItem "output\*.exe" | Select-Object -First 1 | |
| Write-Output "INSTALLER_NAME=$($installerFile.Name)" >> $env:GITHUB_ENV | |
| } else { | |
| Write-Output "❌ No installer executable found in output directory" | |
| Get-ChildItem "output" -ErrorAction SilentlyContinue | ForEach-Object { | |
| Write-Output "Found in output: $($_.Name)" | |
| } | |
| exit 1 | |
| } | |
| } else { | |
| Write-Output "❌ build-installer.ps1 not found" | |
| exit 1 | |
| } | |
| } else { | |
| Write-Output "❌ Signed artifacts not found at: $signedArtifactsPath" | |
| exit 1 | |
| } | |
| Pop-Location | |
| continue-on-error: true | |
| # Upload built installer | |
| - name: Upload Virtual Driver Installer | |
| if: env.INSTALLER_NAME != '' | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: Virtual-Driver-Installer-${{ env.BUILD_CONFIGURATION }}-${{ env.RELEASE_TAG }} | |
| path: installer-repo/output/${{ env.INSTALLER_NAME }} | |
| continue-on-error: true | |
| # Build Summary | |
| - name: Build and SignPath Summary | |
| if: always() | |
| run: | | |
| Write-Output "=== Virtual Drivers Concurrent Build & Sign Summary ===" | |
| Write-Output "Configuration: $env:BUILD_CONFIGURATION" | |
| Write-Output "Release Tag: ${{ env.RELEASE_TAG }}" | |
| Write-Output "Commit: ${{ github.sha }}" | |
| Write-Output "Branch/Tag: ${{ github.ref }}" | |
| Write-Output "" | |
| Write-Output "Build Strategy: Concurrent with Mixed Platform Support" | |
| Write-Output "" | |
| Write-Output "Platform-Specific Components Built:" | |
| Write-Output "ARM64: VDD + Control App (VAD skipped due to WDK limitations)" | |
| Write-Output "x64: VDD + VAD + Control App" | |
| Write-Output "" | |
| Write-Output "This workflow successfully:" | |
| Write-Output "✅ Built ARM64 VDD and Electron Control App concurrently" | |
| Write-Output "✅ Built x64 drivers concurrently with ARM64 (VDD + VAD + Control App)" | |
| Write-Output "✅ Created unified package containing all working components" | |
| Write-Output "✅ Submitted single unified package to SignPath for code signing" | |
| Write-Output "✅ Built installer using signed components" | |
| Write-Output "✅ Generated automatic release tags for version tracking" | |
| Write-Output "" | |
| Write-Output "Benefits of This Approach:" | |
| Write-Output "• Time efficiency - concurrent builds reduce total build time" | |
| Write-Output "• Resource optimization - parallel execution on separate runners" | |
| Write-Output "• Single SignPath submission for all platforms" | |
| Write-Output "• Works around WDK ARM64 cross-compilation limitations" | |
| Write-Output "• VAD still available for primary x64 platform" | |
| Write-Output "• Electron-based Control App for modern UI experience" | |
| Write-Output "• Automated installer generation from signed components" | |
| Write-Output "" | |
| Write-Output "SignPath Integration Status:" | |
| if ('${{ steps.signpath_unified_request.outcome }}' -eq 'success') { | |
| Write-Output "✅ Unified package (mixed platforms) submitted and signed successfully" | |
| } else { | |
| Write-Output "❌ Unified package signing failed or skipped" | |
| } | |
| Write-Output "" | |
| Write-Output "Installer Build Status:" | |
| if ('${{ env.INSTALLER_NAME }}' -ne '') { | |
| Write-Output "✅ Virtual Driver Installer built successfully: ${{ env.INSTALLER_NAME }}" | |
| } else { | |
| Write-Output "❌ Installer build failed or skipped" | |
| } | |
| Write-Output "" | |
| Write-Output "⚠️ Note: ARM64 VAD skipped due to Windows Driver Kit cross-compilation issues" | |
| Write-Output " This is a known limitation with WDK 11 ARM64 toolchain on GitHub Actions" |