mirror of
https://github.com/Chuyu-Team/YY-Thunks.git
synced 2026-10-18 22:01:36 +08:00
237 lines
9.8 KiB
YAML
237 lines
9.8 KiB
YAML
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
|
||
|