问题描述
在使用Azure DevOps时,有一个需求是希望能够在不同的git仓库之间创建代码覆盖率报告。他们的构建CI/CD流水线同时使用了TeamCity和Azure DevOps。用户已经尝试了一些选项,但没有找到直接的解决方案。他们考虑了以下几种方法:
– 使用像coveralls.io这样的服务,该服务支持添加私有仓库,但需要订阅。
– 使用TeamCity SonarQube插件,但功能有限,用户还没有尝试过。
– 使用自定义脚本来查询和汇总TeamCity/Azure DevOps中最后一次成功构建的代码覆盖率指标,并按仓库进行分组。Azure DevOps和TeamCity都提供了REST API来获取数据。
用户还需要一个适用于Azure DevOps构建的解决方案,但他们承认自己还没有对此进行充分的研究。
解决方案
请注意以下操作注意版本差异及修改前做好备份。
方案1
如果你使用Python和GitLab,你可以在CI/CD流水线中包含一个测试覆盖率报告。你可以使用pip install coverage
安装coverage,并在流水线中运行coverage
命令。以下是一个AWS Lambda流水线的示例,但你应该能够在你的环境中找到类似的内容:
script:
- pip install -r ./awslambda/requirements.txt
- coverage run -m unittest discover -v -s "./awslambda" -p "*_test.py"
- coverage report
上述示例会生成一个漂亮的代码覆盖率报告,而且对于Python、AWS和GitLab都是免费的。
方案2
你可以使用SonarQube。它不会生成自己的测试覆盖率报告,而是重用现有流水线的覆盖率文件。
方案3
对于Azure DevOps构建,你可以使用自定义脚本来查询和汇总代码覆盖率指标。Azure DevOps提供了REST API,可以用来获取构建数据。以下是一个示例脚本,可以用来获取最后一次成功构建的代码覆盖率指标:
# 使用Azure DevOps REST API获取构建数据
# 替换以下变量为你的实际值
organization="your_organization"
project="your_project"
buildDefinitionId="your_build_definition_id"
# 获取最后一次成功构建的ID
buildId=$(curl -s -u username:password "https://dev.azure.com/$organization/$project/_apis/build/builds?definitions=$buildDefinitionId&resultFilter=succeeded&\$top=1&api-version=6.0" | jq -r '.value[0].id')
# 获取构建的代码覆盖率指标
coverage=$(curl -s -u username:password "https://dev.azure.com/$organization/$project/_apis/build/builds/$buildId/attachments?api-version=6.0-preview.1" | jq -r '.value[] | select(.name | contains("coverage.xml")) | .url')
# 下载代码覆盖率文件
curl -s -u username:password -o coverage.xml $coverage
# 解析代码覆盖率文件并汇总指标
# TODO: 根据你的需求编写解析和汇总代码
请注意,上述脚本中的username
和password
需要替换为你的Azure DevOps凭据。
以上是几种可能的解决方案,你可以根据你的具体需求选择适合你的方法。希望对你有所帮助!