返回
Linux 机器上运行 Cake 任务时遇到的“Code-coverage”构建问题该如何解决?
Linux
2024-03-05 05:33:00
Linux 机器上运行 Cake 任务的“Code-coverage”构建问题
简介
在将 Cake 脚本从 Windows 迁移到 Linux 机器时,可能会遇到运行“Code-coverage”任务时的问题。此错误通常是因为 DotCover 找不到输出目录。
问题
在 Linux 机器上运行 Cake 任务“Code-coverage”时,遇到了以下错误:
Error: DotCover Cover : Failed to run dotCover tests (code coverage). Arguments: dotnet test /Users/shared/Artifactory/Project/CI-Artifactory/.BuildCache/035845af2bb3/jobs/job/workspace/artifacts/ProjectCode/bin/Debug/netcoreapp3.1/Project.UnitTests.dll --logger trx;LogFileName=xUnit.results.trx --configuration Release --no-build --filter System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverageAttribute --code-coverage -o '/Users/shared/Artifactory/Project/CI-Artifactory/.BuildCache/035845af2bb3/jobs/job/workspace/artifacts/ProjectCode/bin/Debug/netcoreapp3.1/coverage.xml'
Working directory: /Users/shared/Artifactory/Project/CI-Artifactory/.BuildCache/035845af2bb3/jobs/job/workspace/artifacts/ProjectCode/bin/Debug/netcoreapp3.1
解决方法
解决此问题的方法是修改 DotCoverCover 设置中的输出目录。具体步骤如下:
- 在 DotCoverCoverSettings 中添加
WithOutputDirectory(codecoverageReportDir)
代码。 - 重新运行任务。
完整代码
以下是修改后的 Cake 任务代码:
Task("Code-Coverage")
.ContinueOnError()
.Does(() =>
{
try
{
if (!DirectoryExists(cireports))
{
CreateDirectory(cireports);
CreateDirectory(xunitReportDir);
} else {
if(!DirectoryExists(xunitReportDir))
{
CreateDirectory(xunitReportDir);
}
else {
DeleteDirectory(xunitReportDir, recursive:true);
CreateDirectory(xunitReportDir);
}
}
if (!DirectoryExists(codecoverageReportDir))
{
CreateDirectory(codecoverageReportDir);
} else {
DeleteDirectory(codecoverageReportDir, recursive:true);
CreateDirectory(codecoverageReportDir);
}
var projects = GetFiles(unitTestProjectDirPathPattern);
var settings = new DotCoverCoverSettings()
.WithFilter(codeCoverageFilter)
.WithAttributeFilter("System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverageAttribute")
.WithOutputDirectory(codecoverageReportDir);
foreach(var project in projects)
{
DotCoverCover(
x => x.DotNetCoreTest(
project.FullPath,
new DotNetCoreTestSettings() {
Configuration = configuration,
Logger = $"trx;LogFileName={unitTestingReport}",
NoBuild = true,
}
),
dotCodeCoverageReport,
settings
);
}
}
catch(Exception ex) {
throw new Exception(String.Format("Please fix the project compilation failures"));
}
});
常见问题解答
1. 为什么需要指定输出目录?
DotCover 需要一个输出目录来存储代码覆盖率报告。如果未指定,DotCover 会找不到输出目录并引发错误。
2. 如何确定正确的输出目录?
输出目录应位于一个持久的目录中,因为代码覆盖率报告将在构建过程中生成。可以创建一个新的目录或使用现有的目录。
3. 为什么“Code-coverage”任务需要此修复?
此修复是在将 Cake 脚本从 Windows 迁移到 Linux 机器时引入的。在 Windows 中,输出目录默认设置为一个临时目录,而在 Linux 中则需要手动指定。
4. 除了指定输出目录之外,还需要其他修改吗?
不需要其他修改。只需修改 DotCoverCover 设置中的输出目录即可解决此问题。
5. 此修复是否适用于所有 Linux 发行版?
此修复适用于所有 Linux 发行版。