ci: Fix release action and don't double-zip. #26
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 Package | |
| on: [push] | |
| permissions: | |
| contents: write | |
| jobs: | |
| build-windows: | |
| runs-on: windows-latest | |
| permissions: | |
| packages: write | |
| contents: read | |
| strategy: | |
| matrix: | |
| platform: [x86, x64] | |
| configuration: [Release] | |
| env: | |
| NUGET_PACKAGES: ${{ github.workspace }}/.nuget/packages | |
| steps: | |
| - name: Checkout | |
| uses: actions/checkout@v4 | |
| - name: Add dotnet | |
| uses: actions/setup-dotnet@v4 | |
| with: | |
| dotnet-version: 8.0.x | |
| - name: Setup MSBuild | |
| uses: microsoft/setup-msbuild@v2 | |
| - name: Setup NuGet | |
| uses: NuGet/[email protected] | |
| - uses: actions/cache@v4 | |
| with: | |
| path: ${{ github.workspace }}\.nuget\packages | |
| key: ${{ runner.os }}-nuget-${{ hashFiles('**/*.csproj') }} | |
| restore-keys: | | |
| ${{ runner.os }}-nuget- | |
| - name: Download and Setup VPinMAME | |
| shell: pwsh | |
| run: | | |
| Invoke-WebRequest -Uri "https://github.com/freezy/dmd-extensions/files/4073824/VPinMAME31_Minimal.zip" -OutFile vpm.zip | |
| Expand-Archive vpm.zip -DestinationPath vpm | |
| cd vpm | |
| regsvr32 /s VPinMAME.dll | |
| cd .. | |
| - name: Restore NuGet packages | |
| run: nuget restore DmdExtensions.sln | |
| - name: Restore DLLExport dependency | |
| run: .\DllExport -action Restore -sln-file DmdExtensions.sln | |
| - name: Update version info | |
| shell: pwsh | |
| run: | | |
| function replaceNumericVersion($name, $fileContent) { | |
| $RegularExpression = [regex] "^[^/]*\[assembly:\s*$name\(\""(\d+)\.(\d+)\.(\d+)(\.(\d+))?\""\)" | |
| foreach($content in $fileContent) | |
| { | |
| $match = [System.Text.RegularExpressions.Regex]::Match($content, $RegularExpression) | |
| if ($match.Success) { | |
| $major=$match.groups[1].value -as [int] | |
| $minor=$match.groups[2].value -as [int] | |
| $patch=$match.groups[3].value -as [int] | |
| $revision=$match.groups[4].value -as [int] | |
| return $fileContent -replace "^[^/]*\[assembly:\s*$name\(\""[^""]*\""\)", "[assembly: $name(""$major.$minor.$patch.$env:GITHUB_RUN_NUMBER"")" | |
| } | |
| } | |
| } | |
| function replaceFullVersion($name, $fileContent) { | |
| $RegularExpression = [regex] "[^/]*\[assembly:\s*$name\(\""(\d)\.(\d)\.(\d)(-([\w\W]+))?\""\)" | |
| foreach($content in $fileContent) | |
| { | |
| $match = [System.Text.RegularExpressions.Regex]::Match($content, $RegularExpression) | |
| if ($match.Success) { | |
| $major=$match.groups[1].value -as [int] | |
| $minor=$match.groups[2].value -as [int] | |
| $patch=$match.groups[3].value -as [int] | |
| $tag=$match.groups[5].value | |
| $branch = if ($env:GITHUB_HEAD_REF) { $env:GITHUB_HEAD_REF } else { $env:GITHUB_REF_NAME } | |
| if ($branch -eq "master" -or $branch -eq "main") { | |
| if ($tag) { $version = "$major.$minor.$patch-$tag-r$env:GITHUB_RUN_NUMBER" } | |
| else { $version = "$major.$minor.$patch-r$env:GITHUB_RUN_NUMBER" } | |
| } else { | |
| $version = "$major.$minor.$patch-$($branch.ToUpper())-r$env:GITHUB_RUN_NUMBER" | |
| } | |
| Write-Host "Changing version to $version" | |
| "version=$version" >> $env:GITHUB_OUTPUT | |
| return $fileContent -replace "^[^/]*\[assembly:\s*$name\(\""[^""]*\""\)", "[assembly: $name(""$version"")" | |
| } | |
| } | |
| } | |
| function replaceAny($name, $replaceWith, $fileContent) { | |
| $RegularExpression = [regex] "^[^/]*\[assembly:\s*$name\(\""[^""]*\""\)" | |
| foreach($content in $fileContent) | |
| { | |
| $match = [System.Text.RegularExpressions.Regex]::Match($content, $RegularExpression) | |
| if ($match.Success) { | |
| return $fileContent -replace "^[^/]*\[assembly:\s*$name\(\""[^""]*\""\)", "[assembly: $name(""$replaceWith"")" | |
| } | |
| } | |
| } | |
| $assemblyFile = "VersionAssemblyInfo.cs" | |
| $fileContent = Get-Content $assemblyFile | |
| $fileContent = replaceNumericVersion 'AssemblyVersion' $fileContent | |
| $fileContent = replaceNumericVersion 'AssemblyFileVersion' $fileContent | |
| $fileContent = replaceFullVersion 'AssemblyInformationalVersion' $fileContent | |
| if (-not $env:GITHUB_REF.StartsWith("refs/tags/")) { | |
| $fileContent = replaceAny 'AssemblyConfiguration' $env:GITHUB_SHA.Substring(0, 7) $fileContent | |
| } | |
| $fileContent | Set-Content "$assemblyFile" | |
| Write-Host "Patching $assemblyFile" | |
| - name: Build | |
| run: msbuild -t:rebuild /p:Platform=${{ matrix.platform }} /p:Configuration=${{ matrix.configuration }} DmdExtensions.sln | |
| - name: Build installer | |
| run: msbuild /p:Platform=${{ matrix.platform }} /p:Configuration=${{ matrix.configuration }} /p:SolutionDir="$env:GITHUB_WORKSPACE\" .\Installer\Installer.wixproj | |
| - name: Generate zip bundle | |
| shell: pwsh | |
| run: | | |
| $version = if ($env:GITHUB_REF.StartsWith("refs/tags/")) { $env:GITHUB_REF_NAME } else { $env:GITHUB_SHA.Substring(0, 7) } | |
| $outDir = "$env:GITHUB_WORKSPACE\Installer\Builds" | |
| New-Item -ItemType Directory -Force -Path $outDir | Out-Null | |
| $zipArchive = Join-Path $outDir "dmdext-$version-${{ matrix.platform }}.zip" | |
| Compress-Archive -Path "$env:GITHUB_WORKSPACE\Console\bin\${{ matrix.platform }}\${{ matrix.configuration }}\dmdext.exe" -DestinationPath $zipArchive -Force | |
| Compress-Archive -Path "$env:GITHUB_WORKSPACE\Console\bin\${{ matrix.platform }}\${{ matrix.configuration }}\dmdext.log.config" -Update -DestinationPath $zipArchive | |
| Compress-Archive -Path "$env:GITHUB_WORKSPACE\Console\ProPinballSlave.bat" -Update -DestinationPath $zipArchive | |
| $dllSuffix = if ('${{ matrix.platform }}' -eq 'x64') { '64' } else { '' } | |
| Compress-Archive -Path "$env:GITHUB_WORKSPACE\PinMameDevice\bin\${{ matrix.platform }}\${{ matrix.configuration }}\DmdDevice$dllSuffix.dll" -Update -DestinationPath $zipArchive | |
| Compress-Archive -Path "$env:GITHUB_WORKSPACE\PinMameDevice\bin\${{ matrix.platform }}\${{ matrix.configuration }}\DmdDevice.log.config" -Update -DestinationPath $zipArchive | |
| # Include default ini template as a folder inside the zip | |
| Copy-Item -Path "$env:GITHUB_WORKSPACE\PinMameDevice\DmdDevice.ini" -Destination (New-Item -Type Directory -Force "$env:GITHUB_WORKSPACE\ini-template") | Out-Null | |
| Compress-Archive -Path "$env:GITHUB_WORKSPACE\ini-template\*" -Update -DestinationPath $zipArchive | |
| Remove-Item "$env:GITHUB_WORKSPACE\ini-template" -Recurse -Force | |
| # Include 'data' folder contents as 'dmdext' directory inside the zip | |
| Rename-Item "$env:GITHUB_WORKSPACE\PinMameDevice\data" "$env:GITHUB_WORKSPACE\PinMameDevice\dmdext" | |
| Compress-Archive -Path "$env:GITHUB_WORKSPACE\PinMameDevice\dmdext\*" -Update -DestinationPath $zipArchive | |
| Rename-Item "$env:GITHUB_WORKSPACE\PinMameDevice\dmdext" "$env:GITHUB_WORKSPACE\PinMameDevice\data" | |
| # Upload the already-zipped bundle | |
| - name: Upload ZIP artifacts | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: dmdext-${{ matrix.platform }}-zip | |
| path: ${{ github.workspace }}\Installer\Builds\*.zip | |
| compression-level: 0 | |
| retention-days: 90 | |
| if-no-files-found: error | |
| # Upload the MSI as-is (not placed inside the zip) | |
| - name: Upload installer artifacts | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: dmdext-${{ matrix.platform }}-msi | |
| path: ${{ github.workspace }}\Installer\Builds\*.msi | |
| compression-level: 0 | |
| retention-days: 90 | |
| if-no-files-found: error | |
| create-release: | |
| needs: [build-windows] | |
| runs-on: ubuntu-latest | |
| if: github.event_name == 'push' && (github.ref == 'refs/heads/main' || github.ref == 'refs/heads/master' || startsWith(github.ref, 'refs/tags/')) | |
| steps: | |
| # Download both matrix artifacts by pattern and merge into the workspace | |
| - name: Download ZIP artifacts | |
| uses: actions/download-artifact@v4 | |
| with: | |
| pattern: dmdext-*-zip | |
| merge-multiple: true | |
| - name: Download MSI artifacts | |
| uses: actions/download-artifact@v4 | |
| with: | |
| pattern: dmdext-*-msi | |
| merge-multiple: true | |
| - name: List files | |
| run: ls -alR | |
| - name: Create Release | |
| uses: ncipollo/release-action@v1 | |
| with: | |
| token: "${{ secrets.GITHUB_TOKEN }}" | |
| generateReleaseNotes: true | |
| prerelease: ${{ !startsWith(github.ref, 'refs/tags/') }} | |
| allowUpdates: true | |
| artifacts: "dmdext*" | |
| tag: ${{ startsWith(github.ref, 'refs/tags/') && github.ref_name || format('v{0}', github.sha) }} | |
| name: ${{ startsWith(github.ref, 'refs/tags/') && github.ref_name || 'Latest' }} |