SonarCloud 代码覆盖率在 GitHub Actions 构建中保持为 0.0
Posted
技术标签:
【中文标题】SonarCloud 代码覆盖率在 GitHub Actions 构建中保持为 0.0【英文标题】:SonarCloud code coverage remains 0.0 in GitHub Actions build 【发布时间】:2020-03-11 07:22:58 【问题描述】:我已使用 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
`
【问题讨论】:
没有看到您的工作流程就很难提供帮助。如果可以,请将其添加到您的问题中。文件系统在步骤之间保留,但不是作业,因此请确保两个操作在同一个作业中运行。 【参考方案1】:在让 Typescript 项目的覆盖范围发挥作用时,我遇到了类似的问题。如果没有您的声纳日志,我只能猜测,但问题是 lcov.info 中的路径,其中来自 github 的绝对路径类似于 SF:/home/runner/work/YoutRepoName..
和 Sonar 正在启动 Docker 容器并将工作目录设置为 /github/workdir
,因此无法找到来自 lcov.info 的文件。
如果你发现类似的东西,请检查你的日志
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
之后正确报告了覆盖率。 也许这有帮助
问候马蒂亚斯
【讨论】:
【参考方案2】:我在 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 中运行的,我觉得它更干净。
【讨论】:
【参考方案3】:要克服此错误,您需要使用 --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
【讨论】:
以上是关于SonarCloud 代码覆盖率在 GitHub Actions 构建中保持为 0.0的主要内容,如果未能解决你的问题,请参考以下文章