ci: Count revision separately for each branch. #34
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] | |
| concurrency: | |
| group: ${{ github.workflow }}-${{ github.ref }} | |
| cancel-in-progress: false | |
| 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: Compute per-branch build number | |
| id: branch_build | |
| env: | |
| GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| shell: pwsh | |
| run: | | |
| $ownerRepo = "${{ github.repository }}" | |
| $branch = if ($env:GITHUB_HEAD_REF) { $env:GITHUB_HEAD_REF } else { $env:GITHUB_REF_NAME } | |
| # Parse the workflow file name from workflow_ref: owner/repo/.github/workflows/<file>@<ref> | |
| $wfRef = "${{ github.workflow_ref }}" | |
| if ($wfRef -match "\.github/workflows/(?<file>[^@]+)@") { $wfFile = $matches.file } else { throw "Couldn't parse workflow file from workflow_ref" } | |
| $uri = "https://api.github.com/repos/$ownerRepo/actions/workflows/$wfFile/runs?branch=$branch&per_page=1" | |
| $headers = @{ | |
| Authorization = "Bearer $env:GH_TOKEN" | |
| "X-GitHub-Api-Version" = "2022-11-28" | |
| "User-Agent" = "branch-counter" | |
| } | |
| $resp = Invoke-RestMethod -Uri $uri -Headers $headers -Method GET | |
| # total_count includes this current run, which is what we want (first run => 1) | |
| $count = [int]$resp.total_count | |
| "number=$count" >> $env:GITHUB_OUTPUT | |
| - name: Update version info | |
| id: set_version | |
| shell: pwsh | |
| env: | |
| BRANCH_BUILD: ${{ steps.branch_build.outputs.number }} | |
| 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] | |
| return $fileContent -replace "^[^/]*\[assembly:\s*$name\(\""[^""]*\""\)", "[assembly: $name(""$major.$minor.$patch.$env:BRANCH_BUILD"")]".TrimEnd("]") | |
| } | |
| } | |
| } | |
| 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:BRANCH_BUILD" } | |
| else { $version = "$major.$minor.$patch-r$env:BRANCH_BUILD" } | |
| } else { | |
| $version = "$major.$minor.$patch-$($branch.ToUpper())-r$env:BRANCH_BUILD" | |
| } | |
| "version=$version" >> $env:GITHUB_OUTPUT | |
| return $fileContent -replace "^[^/]*\[assembly:\s*$name\(\""[^""]*\""\)", "[assembly: $name(""$version"")]".TrimEnd("]") | |
| } | |
| } | |
| } | |
| 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"")]".TrimEnd("]") | |
| } | |
| } | |
| } | |
| $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" | |
| - 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: Package portable bundle (folder) | |
| shell: pwsh | |
| run: | | |
| $version = "${{ steps.set_version.outputs.version }}" | |
| $outDir = "$env:GITHUB_WORKSPACE\Installer\Builds" | |
| $bundleDir = Join-Path $outDir "dmdext-v$version-${{ matrix.platform }}" | |
| New-Item -ItemType Directory -Force -Path $bundleDir | Out-Null | |
| # Core binaries/config | |
| Copy-Item "$env:GITHUB_WORKSPACE\Console\bin\${{ matrix.platform }}\${{ matrix.configuration }}\dmdext.exe" -Destination $bundleDir -Force | |
| Copy-Item "$env:GITHUB_WORKSPACE\Console\bin\${{ matrix.platform }}\${{ matrix.configuration }}\dmdext.log.config" -Destination $bundleDir -Force | |
| Copy-Item "$env:GITHUB_WORKSPACE\Console\ProPinballSlave.bat" -Destination $bundleDir -Force | |
| # PinMAME device bits | |
| $dllSuffix = if ('${{ matrix.platform }}' -eq 'x64') { '64' } else { '' } | |
| Copy-Item "$env:GITHUB_WORKSPACE\PinMameDevice\bin\${{ matrix.platform }}\${{ matrix.configuration }}\DmdDevice$dllSuffix.dll" -Destination $bundleDir -Force | |
| Copy-Item "$env:GITHUB_WORKSPACE\PinMameDevice\bin\${{ matrix.platform }}\${{ matrix.configuration }}\DmdDevice.log.config" -Destination $bundleDir -Force | |
| # ini template as a folder | |
| New-Item -ItemType Directory -Force -Path (Join-Path $bundleDir 'ini-template') | Out-Null | |
| Copy-Item "$env:GITHUB_WORKSPACE\PinMameDevice\DmdDevice.ini" -Destination (Join-Path $bundleDir 'ini-template\DmdDevice.ini') -Force | |
| # data folder contents under a 'dmdext' subfolder | |
| New-Item -ItemType Directory -Force -Path (Join-Path $bundleDir 'dmdext') | Out-Null | |
| Copy-Item "$env:GITHUB_WORKSPACE\PinMameDevice\data\*" -Destination (Join-Path $bundleDir 'dmdext') -Recurse -Force | |
| - name: Rename MSI to versioned filename | |
| shell: pwsh | |
| run: | | |
| $ErrorActionPreference = 'Stop' | |
| $version = "${{ steps.set_version.outputs.version }}" | |
| $root = $env:GITHUB_WORKSPACE | |
| $outDir = Join-Path $root 'Installer\Builds' | |
| New-Item -ItemType Directory -Force -Path $outDir | Out-Null | |
| $searchRoots = @( | |
| (Join-Path $root 'Installer\Builds'), | |
| (Join-Path $root 'Installer\bin'), | |
| (Join-Path $root 'Installer') | |
| ) | Get-Unique | |
| $candidates = foreach ($dir in $searchRoots) { | |
| if (Test-Path $dir) { Get-ChildItem -Path $dir -Filter *.msi -File -Recurse -ErrorAction SilentlyContinue } | |
| } | |
| if (-not $candidates) { throw "No MSI found under:`n - $($searchRoots -join "`n - ")" } | |
| $msi = $candidates | Sort-Object LastWriteTimeUtc -Descending | Select-Object -First 1 | |
| $target = Join-Path $outDir "dmdext-v$version-${{ matrix.platform }}.msi" | |
| if ($msi.FullName -ieq $target) { exit 0 } | |
| Copy-Item $msi.FullName $target -Force | |
| if ($msi.FullName -ne $target) { Remove-Item $msi.FullName -Force } | |
| - name: Upload portable bundle (single zip by GitHub) | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: dmdext-v${{ steps.set_version.outputs.version }}-${{ matrix.platform }} | |
| path: ${{ github.workspace }}\Installer\Builds\dmdext-v${{ steps.set_version.outputs.version }}-${{ matrix.platform }} | |
| retention-days: 90 | |
| if-no-files-found: error | |
| - name: Upload MSI (wrapped by GitHub) | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: dmdext-v${{ steps.set_version.outputs.version }}-${{ matrix.platform }}-msi | |
| path: ${{ github.workspace }}\Installer\Builds\dmdext-v${{ steps.set_version.outputs.version }}-${{ matrix.platform }}.msi | |
| retention-days: 90 | |
| if-no-files-found: error |