问题描述
我正在尝试生成测试覆盖率报告,并在我的项目构建完成后查看关于Teamcity的信息。到目前为止,我已经能够使其在我的本地计算机(Windows)上运行而没有任何问题。该报告正在生成,我能够查看覆盖率报告(生成的html文件),但是在teamcity(使用linux agent构建项目)上失败,并显示以下错误:
Error: System.AggregateException: One or more errors occurred. (Exec format error)
---> System.ComponentModel.Win32Exception (8): Exec format error
at System.Diagnostics.Process.ForkAndExecProcess(String filename,String[] argv,String[] envp,String cwd,Boolean redirectStdin,Boolean redirectStdout,Boolean redirectStderr,Boolean setCredentials,UInt32 userId,UInt32 groupId,UInt32[] groups,Int32& stdinFd,Int32& stdoutFd,Int32& stderrFd,Boolean usesTerminal,Boolean throwOnNoExec)
at System.Diagnostics.Process.StartCore(processstartinfo startInfo)
at System.Diagnostics.Process.Start()
at System.Diagnostics.Process.Start(processstartinfo startInfo)
at Cake.Core.IO.ProcessRunner.Start(FilePath filePath,ProcessSettings settings) in C:\projects\cake\src\Cake.Core\IO\ProcessRunner.cs:line 67
at Cake.Core.Tooling.Tool`1.RunProcess(TSettings settings,ProcessArgumentBuilder arguments,ProcessSettings processSettings) in C:\projects\cake\src\Cake.Core\Tooling\Tool.cs:line 215
at Cake.Core.Tooling.Tool`1.Run(TSettings settings,ProcessSettings processSettings,Action`1 postAction) in C:\projects\cake\src\Cake.Core\Tooling\Tool.cs:line 101
at Cake.Core.Tooling.Tool`1.Run(TSettings settings,ProcessArgumentBuilder arguments) in C:\projects\cake\src\Cake.Core\Tooling\Tool.cs:line 81
at Cake.Common.Tools.ReportGenerator.ReportGeneratorRunner.Run(IEnumerable`1 reports,DirectoryPath targetDir,ReportGeneratorSettings settings) in C:\projects\cake\src\Cake.Common\Tools\ReportGenerator\ReportGeneratorRunner.cs:line 66
at Cake.Common.Tools.ReportGenerator.ReportGeneratorAliases.ReportGenerator(ICakeContext context,IEnumerable`1 reports,ReportGeneratorSettings settings) in C:\projects\cake\src\Cake.Common\Tools\ReportGenerator\ReportGeneratorAliases.cs:line 151
at Cake.Common.Tools.ReportGenerator.ReportGeneratorAliases.ReportGenerator(ICakeContext context,String pattern,ReportGeneratorSettings settings) in C:\projects\cake\src\Cake.Common\Tools\ReportGenerator\ReportGeneratorAliases.cs:line 71
at Submission#0.ReportGenerator(String pattern,ReportGeneratorSettings settings) in :line 356
at Submission#0.<<Initialize>>b__0_4() in /opt/buildagent/work/[some folder]/build.cake:line 150
at Cake.Core.CakeTaskBuilderExtensions.<>c__displayClass29_0.<Does>b__0(ICakeContext context) in C:\projects\cake\src\Cake.Core\CakeTaskBuilder.Execution.cs:line 26
at Cake.Core.CakeTaskBuilderExtensions.<>c__displayClass32_0.<Does>b__0(ICakeContext x) in C:\projects\cake\src\Cake.Core\CakeTaskBuilder.Execution.cs:line 83
at Cake.Core.CakeTask.Execute(ICakeContext context) in C:\projects\cake\src\Cake.Core\CakeTask.cs:line 125
at Cake.Core.DefaultExecutionStrategy.ExecuteAsync(CakeTask task,ICakeContext context) in C:\projects\cake\src\Cake.Core\DefaultExecutionStrategy.cs:line 87
at Cake.Core.CakeEngine.ExecuteTaskAsync(ICakeContext context,IExecutionStrategy strategy,Stopwatch stopWatch,CakeTask task,CakeReport report) in C:\projects\cake\src\Cake.Core\CakeEngine.cs:line 336
at Cake.Core.CakeEngine.ExecuteTaskAsync(ICakeContext context,CakeReport report) in C:\projects\cake\src\Cake.Core\CakeEngine.cs:line 361
at Cake.Core.CakeEngine.ExecuteTaskAsync(ICakeContext context,CakeReport report) in C:\projects\cake\src\Cake.Core\CakeEngine.cs:line 369
at Cake.Core.CakeEngine.RunTask(ICakeContext context,String target,CakeReport report) in C:\projects\cake\src\Cake.Core\CakeEngine.cs:line 284
at Cake.Core.CakeEngine.RunTargetAsync(ICakeContext context,ExecutionSettings settings) in C:\projects\cake\src\Cake.Core\CakeEngine.cs:line 247
at Cake.Scripting.BuildScriptHost.RunTargetAsync(String target) in C:\projects\cake\src\Cake\Scripting\BuildScriptHost.cs:line 47
at Cake.Core.Scripting.ScriptHost.RunTarget(String target) in C:\projects\cake\src\Cake.Core\Scripting\ScriptHost.cs:line 191
at Submission#0.<<Initialize>>d__0.MoveNext() in /opt/buildagent/work/[some folder]/build.cake:line 346
--- End of stack trace from prevIoUs location where exception was thrown ---
at Microsoft.CodeAnalysis.Scripting.ScriptExecutionState.RunSubmissionsAsync[TResult](ImmutableArray`1 precedingExecutors,Func`2 currentExecutor,StrongBox`1 exceptionHolderOpt,Func`2 catchExceptionopt,CancellationToken cancellationToken)
at Microsoft.CodeAnalysis.Scripting.Script`1.RunSubmissionsAsync(ScriptExecutionState executionState,ImmutableArray`1 precedingExecutors,CancellationToken cancellationToken)
--- End of inner exception stack trace ---
at System.Threading.Tasks.Task.Wait(Int32 millisecondsTimeout,CancellationToken cancellationToken)
at Cake.Scripting.Roslyn.RoslynScriptSession.Execute(Script script) in C:\projects\cake\src\Cake\Scripting\Roslyn\RoslynScriptSession.cs:line 136
at Cake.Core.Scripting.ScriptRunner.Run(IScriptHost host,FilePath scriptPath,IDictionary`2 arguments) in C:\projects\cake\src\Cake.Core\Scripting\ScriptRunner.cs:line 219
at Cake.Commands.BuildCommand.Execute(CakeOptions options) in C:\projects\cake\src\Cake\Commands\BuildCommand.cs:line 41
at Cake.CakeApplication.Run(CakeOptions options) in C:\projects\cake\src\Cake\CakeApplication.cs:line 45
at Cake.Program.Main() in C:\projects\cake\src\Cake\Program.cs:line 80
Process exited with code 1
我也尝试使用dotnet-reportgenerator-globaltool,遇到相同的错误。 我还为ReportGenerator和dotnet-reportgenerator-globaltool指定了要使用.dll而不是.exe来运行ReportGenerator的ToolPath,仍然没有运气。
请在下面找到我的蛋糕脚本的一部分:
#tool nuget:?package=ReportGenerator
#addin nuget:?package=Cake.Coverlet
// define variables
...
Task("Test")
.Does(() =>
{
var resultsFolder = Directory(@".\coverage\");
if (testProjectFiles != null)
{
var settings = new DotNetCoreTestSettings
{
Configuration = "Release"
};
foreach (var projectFile in testProjectFiles)
{
var coverletSettings = new CoverletSettings {
CollectCoverage = true,CoverletoutputFormat = CoverletoutputFormat.opencover,CoverletoutputDirectory = resultsFolder,CoverletoutputName = $"{projectFile.GetFilenameWithoutExtension()}.opencover.xml",};
information("Running tests in {0}",projectFile.GetFilenameWithoutExtension());
DotNetCoreTest(projectFile.ToString(),settings,coverletSettings);
}
}
else
{
Warning("No unit tests found in the solution!");
}
});
Task("GenerateCoverageReport")
.Does(() =>
{
// Generate test coverage report
var reportGeneratorSetting = new ReportGeneratorSettings{
Verbosity = ReportGeneratorVerbosity.Verbose
};
// ---> failing on teamcity
ReportGenerator("./coverage/*.xml","./coverage",reportGeneratorSetting);
});
在Teamcity上运行ReportGenerator时,我缺少什么吗?请告知。
解决方法
尝试改用dotnet工具包:
#module nuget:?package=Cake.DotNetTool.Module&version=0.4.0
#tool dotnet:?package=dotnet-reportgenerator-globaltool&version=4.6.7
然后两次调用Cake,首先引导模块:
dotnet cake --bootstrap --verbosity=verbose && dotnet cake --verbosity=verbose