1

我已经使用 GitHub Actions 为 .NET Core 解决方案设置了 CI。当代码被推送到主分支时,解决方案被构建,单元测试被运行并且代码分析被使用 SonarCloud 运行。代码分析步骤实际上是由sonarcloud-github-action执行的。

SonarCloud 中的质量门没有通过,因为覆盖率是 0.0%(对于现有代码都是新的)。我正在使用Coverlet生成代码覆盖率报告。在每个单元测试项目的测试执行后成功生成coverage.opencover.xml 文件。在 sonar-project.properties 文件中,我引用这些文件如下:

sonar.cs.opencover.reportsPaths=**\coverage.opencover.xml

但显然,SonarCloud 扫描仪可以识别代码覆盖率报告,但不会对其进行处理。在我的 GitHub Actions 工作流日志中,我确实看到了以下警告:

INFO: Parsing the OpenCover report <path>/coverage.opencover.xml INFO: Adding this code coverage report to the cache for later reuse: <path>/coverage.opencover.xml ... WARN: Missing blame information for the following files: WARN: * <path>/coverage.opencover.xml WARN: This may lead to missing/broken features in SonarQube

在尝试解决“缺少责任信息”警告时,我将覆盖文件添加到我的 SonarCloud 项目中的排除项中:**/coverage.opencover.xml但这并没有解决问题。警告仍然出现,代码覆盖率仍然是 0.0%。

有什么提示可以让这一切顺利进行吗?

[编辑]:

我在 GitHub Actions 中的工作流程如下所示:

name: .NET Core
on: [push]

jobs:
  build:

runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v1
- name: Setup .NET Core
  uses: actions/setup-dotnet@v1
  with:
    dotnet-version: 2.2.108
- name: Build with dotnet
  run: dotnet build src/<solution>.sln --configuration Release
- name: Unit Tests
  run: dotnet test src/<solution>.sln /p:CollectCoverage=true /p:CoverletOutputFormat=opencover
- name: SonarCloud Scan
  uses: sonarsource/sonarcloud-github-action@master
  env:
    GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
    SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}

`

4

3 回答 3

5

我在让 Typescript 项目的覆盖范围工作时遇到了类似的问题。如果没有您的声纳日志,我只能猜测,但问题是 lcov.info 中的路径,其中来自 github 的绝对路径类似于SF:/home/runner/work/YoutRepoName..Sonar 正在启动 Docker 容器并将工作目录设置为/github/workdir,因此无法从 lcov 中找到文件。信息。

如果您发现类似的东西,请检查您的日志

2019-11-28T15:36:34.9243068Z WARN: Could not resolve 2 file paths in [/github/workspace/test/unit/coverage/lcov.info], first unresolved path: /home/runner/work/jobreporter/jobreporter/dispatcher/index.ts
2019-11-28T15:36:34.9243445Z INFO: Sensor SonarJS Coverage [javascript] (done) | time=8ms

所以暂时我不得不将 locv.info 中的所有文件夹名称替换为/github/workdir.

在我的情况下,我使用

    - name: 'Run npm lint and test'
      shell: bash
      run: |
        pushd .
        npm ci
        npm run lint:ci
        npm run test --if-present
        sed -i 's+/home/runner/work/jobreporter/jobreporter+/github/workspace+g' test/unit/coverage/lcov.info
        sed -i 's+/home/runner/work/jobreporter/jobreporter+/github/workspace+g' eslint-report.json

之后,正确报告了覆盖率。也许这有帮助

问候马蒂亚斯

于 2019-11-29T08:33:36.463 回答
0

要克服此错误,您需要使用--blame参数运行测试。

这是我用于构建和推送到 SonarCloud 的 GitHub 操作。

name: Build and run tests
on:
  push:
    branches: [ master ]
  pull_request:
    branches: [ master ]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v2
      with:
        # Disabling shallow clone is recommended for improving relevancy of reporting for sonarcloud
        fetch-depth: 0
    - name: Setup .Net SDK (v5.0)
      uses: actions/setup-dotnet@v1
      with:
        dotnet-version: '5.0.100'
    - name: Install dependencies
      run: dotnet restore
    - name: Build
      run: dotnet build --configuration Release --no-restore
    - name: Test
      run: dotnet test --blame --no-restore --verbosity normal /p:CollectCoverage=true /p:CoverletOutputFormat=opencover /p:CoverletOutput=opencover.xml
    - name: SonarCloud Scan
      uses: sonarsource/sonarcloud-github-action@master
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
于 2020-11-29T15:33:33.940 回答
0

我在 Node 构建中遇到了同样的问题,其中 lcov.info 中的路径与 Github Action docker 容器中的路径不同。

为了解决这个问题,我不是直接在 worker 中设置 Node,而是使用 Docker Action 来构建,这样我的路径在所有 Action 中都保持不变。如果你在日志中挖掘,你可以准确地看到 docker 操作是如何运行的,以及可用的环境。

作为参考,我的动作看起来像这样

  - name: 'yarn install'
  uses: docker://node:10.16.3-buster
  with:
    args: yarn install
  env:
    NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
    CI: true

缺点是我的构建速度有点慢,但我所有的操作都是在 Docker 中运行的,我觉得它更干净。

于 2020-04-22T20:14:04.857 回答