-
Notifications
You must be signed in to change notification settings - Fork 52
269 lines (212 loc) · 8.89 KB
/
Build&Test.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
name: Build&Test
on: [push, pull_request]
jobs:
Build:
runs-on: windows-latest
steps:
- uses: actions/checkout@v4
- name: 恢复编译产物
id: ltlBinCache
uses: actions/cache@v4
with:
path: |
TargetPlatform/**/*.lib
TargetPlatform/**/*.pdb
key: ltl_${{github.sha}}
- name: 恢复缓存
if: steps.ltlBinCache.outputs.cache-hit != 'true'
id: ltlCache
uses: actions/cache@v4
with:
path: Tools/**/libucrt_shared.lib
key: ltl_${{ hashFiles('**/Build_libucrt_shared.cmd') }}
- name: 初始化
working-directory: ${{github.workspace}}
run: |
if (-not (Test-Path Tools))
{
mkdir -p Tools
}
# Procdump工具,用于单元测试崩溃诊断
Invoke-WebRequest -Uri https://download.sysinternals.com/files/Procdump.zip -OutFile Tools\Procdump.zip
&7z e Tools\Procdump.zip "-o$Env:GITHUB_WORKSPACE\Tools"
$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
# github的内置版本有Bug,此行必须添加,否则无法获得内容
git fetch --depth=1 origin +refs/tags/*:refs/tags/*
$releaseNotes = & git tag -l --format='%(contents)' $env:GITHUB_REF.Remove(0, 10)
$content = [System.IO.File]::ReadAllText("Nuget\VC-LTL.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 "Nuget\VC-LTL-New.nuspec" -NoNewline
echo $releaseNotes | out-file "Nuget\VC-LTL-New.nuspec" -Append
echo $content.Remove(0, $releaseNotesIndex + $releaseNotesToken.Length) | out-file "Nuget\VC-LTL-New.nuspec" -NoNewline -Append
}
# 替换 Cargo.toml 的版本号以为 crate 包生成做准备
$Cargo = [System.IO.File]::ReadAllText("Rust\Cargo.toml.template")
$Cargo = $Cargo.Replace('$version$', $BuildVersion)
[System.IO.File]::WriteAllText("Rust\Cargo.toml", $Cargo)
}
- name: 执行编译
if: steps.ltlBinCache.outputs.cache-hit != 'true'
working-directory: ${{github.workspace}}
shell: pwsh
run: |
# MSBuild 目录更新到 Path
$Env:Path="${{env.MSBuildBinPath}};${{env.LatestVisualStudioRoot}}\Common7\IDE\CommonExtensions\Microsoft\TestWindow;" + $Env:Path
# 编译项目
&msbuild Build.proj "-m" "-p:TagVersion=${{env.BuildVersion}}"
if($lastexitcode -ne 0)
{
throw "VC-LTL.vcxproj编译失败!退出代码:$lastexitcode"
}
- name: 执行单元测试
if: steps.ltlBinCache.outputs.cache-hit != 'true'
working-directory: ${{github.workspace}}
shell: pwsh
run: |
# MSBuild 目录更新到 Path
$Env:Path="${{env.MSBuildBinPath}};${{env.LatestVisualStudioRoot}}\Common7\IDE\CommonExtensions\Microsoft\TestWindow;" + $Env:Path
# 设置 PROCDUMP_PATH 目录
$Env:PROCDUMP_PATH="$Env:GITHUB_WORKSPACE\Tools"
# 编译单元测试项目
&msbuild UnitTest\UnitTest.vcxproj "-p:Configuration=Static;Platform=Win32;SolutionDir=$Env:GITHUB_WORKSPACE\\"
if($lastexitcode -ne 0)
{
throw "单元测试编译失败!退出代码:$lastexitcode"
}
$RunFaild = 0
&vstest.console Static\UnitTest.dll "/logger:trx;LogFileName=UnitTest.trx" --Parallel "/Blame:CollectDump;CollectAlways=false;DumpType=full"
if($lastexitcode -ne 0)
{
$RunFaild = 1
}
if($RunFaild -ne 0)
{
throw "UnitTest单元测试失败!"
}
- uses: dorny/test-reporter@v1
if: steps.ltlBinCache.outputs.cache-hit != 'true' && (success() || failure())
with:
name: 单元测试报告
path: TestResults/*.trx
reporter: dotnet-trx
- name: 文件打包
working-directory: ${{github.workspace}}
shell: cmd
run: |
set "Path=${{env.MSBuildBinPath}};%Path%"
::生成二进制包
msbuild Build.proj -p:TagVersion=${{env.BuildVersion}} -t:Pack
if %ERRORLEVEL% NEQ 0 exit /B %ERRORLEVEL%
:: 打包Redist
if "${{env.BuildVersion}}" NEQ "" (
msbuild Build.proj -p:TagVersion=${{env.BuildVersion}} -t:PackRedist
)
if %ERRORLEVEL% NEQ 0 exit /B %ERRORLEVEL%
::打包Nuget
if "${{env.BuildVersion}}" NEQ "" (
nuget pack Nuget\VC-LTL-New.nuspec -Properties version=${{env.BuildVersion}};commit=%GITHUB_SHA%
)
if %ERRORLEVEL% NEQ 0 exit /B %ERRORLEVEL%
- name: 匹配Redist缓存
if: contains(github.ref, 'tags/')
id: ltlRedistCache
uses: actions/cache@v4
with:
path: VC-LTL*-Redist.7z
key: ltl_Redist_${{ hashFiles('Redist/**/*.dll') }}
- name: 文件清理
if: steps.ltlRedistCache.outputs.cache-hit == 'true'
working-directory: ${{github.workspace}}
shell: cmd
run: |
del VC-LTL-${{env.BuildVersion}}-Redist.7z /Q /F
- uses: actions/upload-artifact@v4
with:
path: |
*.nupkg
*.7z
# 失败时我们收集一些信息,用于诊断
- uses: actions/upload-artifact@v4
if: failure()
with:
name: ErrorLog
path: |
TestResults/**/*.dmp
TestResults/**/Sequence_*.xml
Static\UnitTest.dll
Static\UnitTest.pdb
Static\*.log
UnitTest/SymbolBuildTest/.test/**/Build.log
*.7z
- uses: xresloader/upload-to-github-release@v1
if: contains(github.ref, 'tags/')
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
file: "VC-LTL-*.7z"
overwrite: true
tags: true
draft: false
- uses: actions-rs/toolchain@v1
with:
toolchain: stable
- name: 内容发布
if: contains(github.ref, 'tags/')
working-directory: ${{github.workspace}}
shell: cmd
run: |
set "Path=${{env.MSBuildBinPath}};%Path%"
:: 准备 Rust 打包所需要的内容
msbuild Build.proj -t:PrepareToCompileRustLanguageSupport
if %ERRORLEVEL% NEQ 0 exit /B %ERRORLEVEL%
:: 切换到 Rust 目录
pushd Rust
:: 登录 Cargo
cargo login ${{ secrets.CARGO_TOKEN }}
if %ERRORLEVEL% NEQ 0 exit /B %ERRORLEVEL%
:: 生成并发布
cargo publish --allow-dirty
if %ERRORLEVEL% NEQ 0 exit /B %ERRORLEVEL%
:: 切换回项目目录
popd
:: 把生成的nuget包发布到nuget中
nuget push VC-LTL.${{env.BuildVersion}}.nupkg -ApiKey ${{ secrets.NUGET_TOKEN }} -Source https://api.nuget.org/v3/index.json
if %ERRORLEVEL% NEQ 0 exit /B %ERRORLEVEL%