dotnet.exe锁定SonarScanner.MSBuild.Common.dll

时间:2018-05-31 20:25:39

标签: sonarqube sonarqube-scan

晚上好,

我在Jenkins的2.1项目中使用。{3}}的.Net Core 2.0版本:

withSonarQubeEnv('SonarQubeMain') {
    bat "dotnet ${globals.SONAR_QUBE_MSBUILD_PATH}\\SonarScanner.MSBuild.dll begin /k:\"${globals.SONAR_QUBE_PROJECT}\" /d:sonar.host.url=${globals.SONAR_HOST_URL} /d:sonar.cs.xunit.reportsPaths=\"XUnit.xml\" /d:sonar.cs.opencover.reportsPaths=\"coverage.xml\"
}

bat "dotnet build --version-suffix ${env.BUILD_NUMBER}"

dir('test/mytestprojecthere') {
    bat 'D:\\OpenCover\\OpenCover.Console.exe -target:"c:\\Program Files\\dotnet\\dotnet.exe" -targetargs:"xunit --no-build -xml XUnit.xml" -output:coverage.xml -oldStyle -filter:"-[*Tests*]*" -register:user'
}
withSonarQubeEnv('SonarQubeMain') {
    bat "dotnet ${globals.SONAR_QUBE_MSBUILD_PATH}\\SonarScanner.MSBuild.dll end"
}

它适用于第一个构建,但在下一个构建中,它失败了:

Failed to create an empty directory 'D:\Jenkins\workspace\xxxxxxxx\.sonarqube'. 
Please check that there are no open or read-only files in the directory and that you have the necessary read/write permissions.

Detailed error message: Access to the path 'SonarScanner.MSBuild.Common.dll' is denied.

并检查我的Windows服务器我可以看到多个.Net核心主机后台进程。如果我杀了这些我可以重建......

我为MSBuild推荐了msbuild /nodereuse:false,但似乎不适用于dotnet核心版本?

5 个答案:

答案 0 :(得分:5)

FYI @Nauzet在MSBuild存储库扫描程序#535中为此打开了一个问题。

总结:

  • 开始和结束步骤似乎运行良好,并且 dotnet.exe 关闭了预期的那些进程
  • 在构建复杂的解决方案时,将启动 dotnet.exe 的多个实例,并且不会在构建完成后立即关闭它们。在更简单的解决方案上似乎不会出现此问题。
  • 如果您使用 dotnet build dotnet msbuild
  • 触发构建阶段,则会出现问题
  • 解决方法:直接使用 msbuild 构建,或使用 dotnet build / nodereuse:false
  • 构建
仅供参考,MSBuild扫描仪有几个自定义任务,在构建阶段会调用这些任务。这些使用被锁定的组件。自定义任务没有什么不寻常的。他们只是从磁盘上的文件读取数据。在这一点上,我不认为这是MSBuild扫描仪的问题。

答案 1 :(得分:1)

我们只是遇到了这个问题,发现它与dotnet和msbuild对由以前的多线程版本保留的正在运行的节点的重用有关。

为避免此问题,请在命令行上按以下方式使用/nodereuse:false/nr:false

msbuild /m /nr:false myproject.proj

msbuild /m /nodereuse:false myproject.proj

dotnet restore myproject.sln /nodereuse:false

答案 2 :(得分:0)

请编辑您的管道脚本,如下所示,它应该可以正常工作:

using (var reader = OpenXmlReader.Create(worksheetPart))
{
    while (reader.Read())
    {
        if (typeof(Row).IsAssignableFrom(reader.ElementType))
        {
            var row = (Row)reader.LoadCurrentElement();
            foreach (var cell in row.Elements<Cell>())
            {
                var (_, value) = ParseCell(cell);
            }
        }
    }
}

<强> 更新

这是我使用的dotnet核心应用程序管道构建脚本,它运行良好,没有任何问题:

    withSonarQubeEnv('SonarQubeMain') {
    bat "dotnet ${globals.SONAR_QUBE_MSBUILD_PATH}\\SonarScanner.MSBuild.dll begin /k:\"${globals.SONAR_QUBE_PROJECT}\" /d:sonar.host.url=${globals.SONAR_HOST_URL} /d:sonar.cs.xunit.reportsPaths=\"XUnit.xml\" /d:sonar.cs.opencover.reportsPaths=\"coverage.xml\"

bat "dotnet build --version-suffix ${env.BUILD_NUMBER}"

dir('test/mytestprojecthere') {
    bat 'D:\\OpenCover\\OpenCover.Console.exe -target:"c:\\Program Files\\dotnet\\dotnet.exe" -targetargs:"xunit --no-build -xml XUnit.xml" -output:coverage.xml -oldStyle -filter:"-[*Tests*]*" -register:user'
}

bat "dotnet ${globals.SONAR_QUBE_MSBUILD_PATH}\\SonarScanner.MSBuild.dll end"
    }

答案 3 :(得分:0)

我自己碰到了它,并通过运行dotnet build-server shutdown作为构建计划中的第一项任务来“解决”它。由于多种原因,这不是理想的选择,其中一个很大的原因是,如果我尝试在同一台计算机上一次运行多个.NET Core版本,可能会引起问题。这似乎是扫描仪中的错误-希望它会尽快修复。

答案 4 :(得分:0)

我遇到了同样的问题,运行以下命令解决了该问题。

dotnet build-server shutdown

这是由于msbuild节点重用而发生的。我们将msbuild节点保持活动状态,以便在进行连续构建时节省启动时间。

也可以通过设置以下环境变量来关闭它。

MSBUILDDISABLENODEREUSE=1