name: Build&Test on: [push, pull_request] jobs: Build: runs-on: windows-latest steps: - uses: actions/checkout@v4 - name: 恢复编译产物 id: BinCache uses: actions/cache@v4 with: path: | objs/**/*.obj Lib/**/*.* Config/**/*.* YY.Depends.Analyzer.exe key: BinCache_${{github.sha}} - name: 初始化 working-directory: ${{env.GITHUB_WORKSPACE}} run: | mkdir -p Bin Invoke-WebRequest -Uri https://github.com/Chuyu-Team/LibMaker/releases/download/v1.0.4/LibMaker.exe -OutFile Bin\LibMaker.exe Invoke-WebRequest -Uri https://github.com/Chuyu-Team/YY-Thunks/releases/download/v1.0.2.8/MinimumRequiredVersionHelper.exe -OutFile Bin\MinimumRequiredVersionHelper.exe $ProgramFiles = ${env:ProgramFiles(x86)} if (-not $ProgramFiles) { $ProgramFiles = $env:ProgramFiles } $BuiltInVsWhereExe = "$ProgramFiles\Microsoft Visual Studio\Installer\vswhere.exe" if (-not (Test-Path $BuiltInVsWhereExe)) { throw "找不到vswhere.exe!" } Write-Output $BuiltInVsWhereExe $LatestVisualStudioRoot = & $BuiltInVsWhereExe -latest -prerelease -property installationPath if (-not (Test-Path $LatestVisualStudioRoot)) { throw "找不到 VisualStudioRoot!" } echo "LatestVisualStudioRoot=$LatestVisualStudioRoot" >> $env:GITHUB_ENV $MSBuildBinPath="$LatestVisualStudioRoot\MSBuild\Current\Bin" if (-not (Test-Path $MSBuildBinPath)) { $installationVersion = & $BuiltInVsWhereExe -latest -prerelease -property installationVersion $majorVersion = "$installationVersion".Split('.')[0] $MSBuildBinPath="$LatestVisualStudioRoot\MSBuild\$majorVersion.0\Bin" } if (-not (Test-Path $MSBuildBinPath)) { throw "找不到 MSBuildBinPath!" } echo "MSBuildBinPath=$MSBuildBinPath" >> $env:GITHUB_ENV if($env:GITHUB_REF.StartsWith("refs/tags/v", "CurrentCultureIgnoreCase")) { $BuildVersion = $env:GITHUB_REF.Remove(0, 11); echo "BuildVersion=$BuildVersion" >> $env:GITHUB_ENV $Prerelease = $BuildVersion.contains("-"); echo "Prerelease=$Prerelease" >> $env:GITHUB_ENV # github的内置版本有Bug,此行必须添加,否则无法获得内容 git fetch --depth=1 origin +refs/tags/*:refs/tags/* $releaseNotes = & git tag -l --format='%(contents)' $env:GITHUB_REF.Remove(0, 10) # .nuspec 是 XML,releaseNotes 里的 & < > 等字符必须转义,否则会生成损坏的 XML $releaseNotes = [System.Security.SecurityElement]::Escape($releaseNotes) # 顺带剔除 XML 1.0 不允许的控制字符(如 \x01 等) $releaseNotes = [regex]::Replace($releaseNotes, '[\x00-\x08\x0B\x0C\x0E-\x1F]', '') $content = [System.IO.File]::ReadAllText("NuGet\YY-Thunks.nuspec") # 使用此文本替换 .nuspec 中的 releaseNotes # [System.IO.File]::WriteAllText("YY-Thunks-New.nuspec", $content) # 微软这个大爷…… $releaseNotesToken = '$releaseNotes$' $releaseNotesIndex = $content.IndexOf($releaseNotesToken) if($releaseNotesIndex -ne -1) { echo $content.Substring(0, $releaseNotesIndex) | out-file "YY-Thunks-New.nuspec" -NoNewline echo $releaseNotes | out-file "YY-Thunks-New.nuspec" -Append echo $content.Remove(0, $releaseNotesIndex + $releaseNotesToken.Length) | out-file "YY-Thunks-New.nuspec" -NoNewline -Append } } - name: 执行编译 if: steps.BinCache.outputs.cache-hit != 'true' working-directory: ${{env.GITHUB_WORKSPACE}} shell: cmd run: | set Path=%GITHUB_WORKSPACE%\Bin;${{env.MSBuildBinPath}};%Path% set LatestVisualStudioRoot=${{env.LatestVisualStudioRoot}} setlocal call "%LatestVisualStudioRoot%\VC\Auxiliary\Build\vcvars32.bat" call "%GITHUB_WORKSPACE%\src\Build.cmd" if %ErrorLevel% NEQ 0 exit /b %ErrorLevel% endlocal setlocal call "%LatestVisualStudioRoot%\VC\Auxiliary\Build\vcvars64.bat" call "%GITHUB_WORKSPACE%\src\Build.cmd" if %ErrorLevel% NEQ 0 exit /b %ErrorLevel% endlocal msbuild src\YY.Depends.Analyzer\YY.Depends.Analyzer.vcxproj -r "-p:Configuration=Release;Platform=Win32;OutDir=%GITHUB_WORKSPACE%\;SolutionDir=%GITHUB_WORKSPACE%\src\\" if %ErrorLevel% NEQ 0 exit /b %ErrorLevel% - name: 执行单元测试 if: steps.BinCache.outputs.cache-hit != 'true' working-directory: ${{env.GITHUB_WORKSPACE}} shell: pwsh run: | # Procdump工具,用于单元测试崩溃诊断 Invoke-WebRequest -Uri https://download.sysinternals.com/files/Procdump.zip -OutFile Bin\Procdump.zip &7z e Bin\Procdump.zip "-o$Env:GITHUB_WORKSPACE\Bin" Invoke-WebRequest -Uri https://github.com/mingkuang-Chuyu/Visual_Studio_Platform_Toolset/releases/download/v1.0.2/Visual.Studio.2008.Platform.Toolset.v1.0.2.7z -OutFile Bin\Visual.Studio.2008.Platform.Toolset.v1.0.2.7z &7z x Bin\Visual.Studio.2008.Platform.Toolset.v1.0.2.7z "-o$Env:GITHUB_WORKSPACE\Bin" # MSBuild、PROCDUMP_PATH目录更新到 Path $Env:Path="$Env:GITHUB_WORKSPACE\Bin;${{env.MSBuildBinPath}};${{env.LatestVisualStudioRoot}}\Common7\IDE\CommonExtensions\Microsoft\TestWindow;" + $Env:Path $Env:WindowsSdkDir_60A_TestPath="$Env:GITHUB_WORKSPACE\Bin\Program Files\Microsoft SDKs\Windows\v6.0A" # 编译单元测试项目 &msbuild src\YY-Thunks.UnitTest\YY-Thunks.UnitTest.vcxproj "-p:Configuration=Release;Platform=Win32;SolutionDir=$Env:GITHUB_WORKSPACE\src\\" if($lastexitcode -ne 0) { throw "YY-Thunks.UnitTest.vcxproj编译失败!退出代码:$lastexitcode" } &msbuild src\YY-Thunks.UnitTest\YY-Thunks.UnitTest.vcxproj "-p:Configuration=Release;Platform=x64;SolutionDir=$Env:GITHUB_WORKSPACE\src\\" if($lastexitcode -ne 0) { throw "YY-Thunks.UnitTest.vcxproj编译失败!退出代码:$lastexitcode" } $RunFaild = 0 &vstest.console src\Release\YY-Thunks.UnitTest.dll "/logger:trx;LogFileName=UnitTestWin32.trx" "/Blame:CollectDump;CollectAlways=false;DumpType=full" "/Diag:TestResults\Win32.log" if($lastexitcode -ne 0) { $RunFaild = 1 } &vstest.console src\x64\Release\YY-Thunks.UnitTest.dll "/logger:trx;LogFileName=UnitTestWin64.trx" "/Blame:CollectDump;CollectAlways=false;DumpType=full" "/Diag:TestResults\Win64.log" if($lastexitcode -ne 0) { $RunFaild = 1 } if($RunFaild -ne 0) { throw "YY-Thunks.UnitTest单元测试失败!" } - uses: dorny/test-reporter@v1 if: contains(fromJSON('["push", "create"]'), github.event_name) && steps.BinCache.outputs.cache-hit != 'true' && (success() || failure()) with: name: 单元测试报告 path: TestResults/*.trx reporter: dotnet-trx - name: 文件打包 working-directory: ${{env.GITHUB_WORKSPACE}} shell: cmd run: | ::打包Release 7z a -tzip %GITHUB_WORKSPACE%\YY-Thunks-Objs.zip objs LICENSE ReadMe.md ThunksList.md YY.Depends.Analyzer.exe Config 7z a -tzip %GITHUB_WORKSPACE%\YY-Thunks-Lib.zip Lib LICENSE ReadMe.md ThunksList.md YY.Depends.Analyzer.exe Config ::打包Nuget if "${{env.BuildVersion}}" NEQ "" ( nuget pack YY-Thunks-New.nuspec -Properties version=${{env.BuildVersion}};commit=%GITHUB_SHA% ) - uses: actions/upload-artifact@v4 with: path: | *.nupkg *.zip # 失败时我们收集一些信息,用于诊断 - uses: actions/upload-artifact@v4 if: failure() with: name: ErrorLog path: | TestResults\**\*.* src\Release\YY-Thunks.UnitTest.dll src\Release\YY-Thunks.UnitTest.pdb src\Release\*.log src\x64\Release\YY-Thunks.UnitTest.dll src\x64\Release\YY-Thunks.UnitTest.pdb src\x64\Release\*.log src\YY-Thunks.UnitTest\TestProject\Example\Win32\Static src\YY-Thunks.UnitTest\TestProject\Example\x64\Static - uses: xresloader/upload-to-github-release@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: file: "YY-Thunks-*.zip" overwrite: true tags: true draft: false prerelease: ${{env.Prerelease}} - name: 内容发布 if: contains(github.ref, 'tags/') working-directory: ${{env.GITHUB_WORKSPACE}} shell: cmd run: | :: 把生成的nuget包发布到nuget中 nuget push YY-Thunks.${{env.BuildVersion}}.nupkg -ApiKey ${{ secrets.NUGET_TOKEN }} -Source https://api.nuget.org/v3/index.json