Skip to content

Merge pull request #23 from RuntimeRascal/copilot/add-rectangle-drawi… #22

Merge pull request #23 from RuntimeRascal/copilot/add-rectangle-drawi…

Merge pull request #23 from RuntimeRascal/copilot/add-rectangle-drawi… #22

Workflow file for this run

name: CI Build
on:
push:
branches: [main]
# pull_request:
# branches: [main]
permissions:
contents: write # Required for creating draft releases
env:
VERSION: '' # Will be set from package.json
jobs:
build:
runs-on: windows-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Get version from package.json
id: get_version
shell: pwsh
run: |
$packageJson = Get-Content -Path "package.json" -Raw | ConvertFrom-Json
$version = $packageJson.version
Write-Host "Version from package.json: $version"
echo "VERSION=$version" >> $env:GITHUB_ENV
echo "version=$version" >> $env:GITHUB_OUTPUT
- name: Setup .NET 8
uses: actions/setup-dotnet@v4
with:
dotnet-version: '8.0.x'
- name: Install WiX Toolset
shell: pwsh
run: |
dotnet tool install --global wix --version 4.0.5
wix --version
- name: Restore dependencies
run: |
dotnet restore Src/GhostDraw/GhostDraw.csproj
dotnet restore Tests/GhostDraw.Tests/GhostDraw.Tests.csproj
- name: Build application and tests
run: |
dotnet build Src/GhostDraw/GhostDraw.csproj -c Release --no-restore
dotnet build Tests/GhostDraw.Tests/GhostDraw.Tests.csproj -c Release --no-restore
- name: Run tests
run: dotnet test Tests/GhostDraw.Tests/GhostDraw.Tests.csproj -c Release --no-build --verbosity normal
- name: Publish application
shell: pwsh
run: |
dotnet publish Src/GhostDraw/GhostDraw.csproj `
-c Release `
-r win-x64 `
--self-contained true `
-p:PublishSingleFile=false `
-p:Version=${{ env.VERSION }}
- name: Generate WiX component list
shell: pwsh
working-directory: Installer
run: |
.\Generate-FileList.ps1 `
-PublishPath "..\Src\GhostDraw\bin\Release\net8.0-windows\win-x64\publish" `
-OutputFile "HarvestedFiles.wxs"
- name: Build installer MSI
shell: pwsh
working-directory: Installer
run: |
dotnet build GhostDraw.Installer.wixproj `
-c Release `
-p:Version=${{ env.VERSION }} `
-p:PublishDir="..\Src\GhostDraw\bin\Release\net8.0-windows\win-x64\publish\"
- name: Verify build outputs
shell: pwsh
run: |
$exePath = "Src\GhostDraw\bin\Release\net8.0-windows\win-x64\publish\GhostDraw.exe"
$msiPath = "Installer\bin\x64\Release\GhostDrawSetup-${{ env.VERSION }}.msi"
if (Test-Path $exePath) {
Write-Host "✓ Application EXE built successfully" -ForegroundColor Green
} else {
Write-Error "Application EXE not found"
exit 1
}
if (Test-Path $msiPath) {
$size = (Get-Item $msiPath).Length / 1MB
Write-Host "✓ Installer MSI built successfully (${{ env.VERSION }})" -ForegroundColor Green
Write-Host " Size: $([math]::Round($size, 2)) MB" -ForegroundColor Gray
} else {
Write-Error "Installer MSI not found at $msiPath"
exit 1
}
- name: Create portable zip
shell: pwsh
run: |
$publishDir = "Src\GhostDraw\bin\Release\net8.0-windows\win-x64\publish"
$zipPath = "GhostDraw-${{ env.VERSION }}-portable.zip"
Compress-Archive -Path "$publishDir\*" -DestinationPath $zipPath -Force
$size = (Get-Item $zipPath).Length / 1MB
Write-Host "✓ Portable ZIP created: $zipPath" -ForegroundColor Green
Write-Host " Size: $([math]::Round($size, 2)) MB" -ForegroundColor Gray
- name: Delete old artifacts
uses: geekyeggo/delete-artifact@v5
with:
name: |
GhostDrawSetup-*
GhostDraw-*-portable
failOnError: false
- name: Upload installer artifact
uses: actions/upload-artifact@v4
with:
name: GhostDrawSetup-${{ env.VERSION }}
path: Installer/bin/x64/Release/GhostDrawSetup-${{ env.VERSION }}.msi
retention-days: 30
- name: Upload portable artifact
uses: actions/upload-artifact@v4
with:
name: GhostDraw-${{ env.VERSION }}-portable
path: GhostDraw-${{ env.VERSION }}-portable.zip
retention-days: 30
# Check if a PUBLISHED (non-draft) release exists for this version
# If only a draft exists, we should update it with new assets
- name: Check if published release exists
id: check_release
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
shell: pwsh
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
$tagName = "v${{ env.VERSION }}"
# Try to get release info, capture result
try {
$release = gh release view $tagName --json isDraft,name 2>$null
if ($LASTEXITCODE -eq 0 -and $release) {
$releaseInfo = $release | ConvertFrom-Json
if ($releaseInfo.isDraft -eq $true) {
Write-Host "Draft release exists for $tagName - will update with new assets"
"skip_release=false" | Out-File -FilePath $env:GITHUB_OUTPUT -Append
} else {
Write-Host "Published release exists for $tagName - skipping"
"skip_release=true" | Out-File -FilePath $env:GITHUB_OUTPUT -Append
}
} else {
Write-Host "No release exists for $tagName - will create draft release"
"skip_release=false" | Out-File -FilePath $env:GITHUB_OUTPUT -Append
}
} catch {
Write-Host "No release exists for $tagName - will create draft release"
"skip_release=false" | Out-File -FilePath $env:GITHUB_OUTPUT -Append
}
# Always exit successfully
exit 0
- name: Create or update draft release
if: github.event_name == 'push' && github.ref == 'refs/heads/main' && steps.check_release.outputs.skip_release == 'false'
uses: softprops/action-gh-release@v2
with:
tag_name: v${{ env.VERSION }}
name: GhostDraw v${{ env.VERSION }}
draft: true
prerelease: false
generate_release_notes: true
files: |
Installer/bin/x64/Release/GhostDrawSetup-${{ env.VERSION }}.msi
GhostDraw-${{ env.VERSION }}-portable.zip
body: |
## GhostDraw v${{ env.VERSION }}
### Downloads
- **GhostDrawSetup-${{ env.VERSION }}.msi** - Windows installer
- **GhostDraw-${{ env.VERSION }}-portable.zip** - Portable version (no installation required)
### Installation
1. Download the MSI installer or portable ZIP
2. Run the installer or extract the ZIP to a folder of your choice
3. Launch GhostDraw from the Start Menu or the extracted folder
---
*Edit this draft to add release notes, then publish when ready.*
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}