返回

Linux 机器上运行 Cake 任务时遇到的“Code-coverage”构建问题该如何解决?

Linux

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 设置中的输出目录。具体步骤如下:

  1. 在 DotCoverCoverSettings 中添加 WithOutputDirectory(codecoverageReportDir) 代码。
  2. 重新运行任务。

完整代码

以下是修改后的 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 发行版。