如何使用 Jacoco 和多个模块在 Jenkins 中实现代码覆盖?
How to have code coverage in Jenkins with Jacoco and multiple modules?
我的代码结构如下:
events
messages
other-code
functional-tests
在 jacoco 的构建脚本中,首先它必须复制所有 classes 并将该 class 目录用于 运行 工具。你能在这里描述目标目录的步骤吗?我的意思是如何提及 运行 代码覆盖率所在的目录。
构建后,每个文件夹都有自己的目标文件夹,其中包含 classes。
步骤如下:
- 在 Jenkins 中构建项目作为一项工作
- 部署到用户阶段
- 运行 Jenkins 的 jacoco 报告工作
Jacoco 报告工作说明:
构建步骤 - maven 3.3.3
目标 - 清洁测试
和测试套件、用户阶段详细信息和其他信息被传递。
Post步-执行shell
这里无法格式化和粘贴,所以上传到这里:https://zerobin.net/?8a988cd05bf3d752#fbzMlW1b7uzD+HZnmwnd9WjQYBI3j95Q7DCIx6q+l0U=
调用顶级 Maven 目标 - Maven 3.3.3
-f jacoco_pom.xml jacoco:dump antrun:run@report
shell 粘贴中使用的 clasDir
变量应该有 classes。到目前为止,我已经在 shell 脚本的开头完成了此操作。
mkdir -p target/classes
cp -R messages/target/classes target/classes
并设置clsDir = target/classes
,
这样我就得到了那个模块的报告。我的测试套件只包含一个 class。我还想包括其他模块,例如 events
、other-code
以及 link 来源。
我需要有关如何设置它的帮助。主要目的是生成功能测试的代码覆盖率报告。
编辑:
答案:下面的答案有帮助,但这一切都是通过 shell 命令完成的,而不是任何 UI。因此,克隆 repo,执行 mvn clean package -DskipTests
并从所有模块文件夹复制所有第一级子文件夹有帮助,但随后显示覆盖错误 class 文件的执行数据不匹配。这意味着 class 检测和我们用于覆盖的 class 是由不同的 JVM 分别构建的(一个在 Jenkins 中,另一个在阶段部署)。
所以解决方案不是克隆和重新编译它们,而是从部署存储库下载清单并解压缩所有 jar。这样我就拥有了相同版本的所有 classes。
要通过更改 Jenkins JaCoCo 插件配置来包含多个 class 目录,您需要修改 'Path to class directories' 字段。
例如,如果您想在目录 'events' 和 'other-code' 下包含任何 classes,您可以将以下内容添加到 'Path to class directories' 部分:
**/events,**/other-code
请记住,如果您想添加多个目录,您必须用逗号分隔每个目录,并且不能有空格(由于插件的错误).注意:此逗号错误适用于此插件配置中的所有文本字段。
这是我的 JaCoCo 插件配置:
编辑: 如评论中所述,解决此问题的一种方法是利用您正在处理的任何构建工具(Ant、Maven、Gradle)删除target
(即:jar、war 等)放入一个公共目录,然后将 jacoco 插件指向那里。
我的代码结构如下:
events
messages
other-code
functional-tests
在 jacoco 的构建脚本中,首先它必须复制所有 classes 并将该 class 目录用于 运行 工具。你能在这里描述目标目录的步骤吗?我的意思是如何提及 运行 代码覆盖率所在的目录。
构建后,每个文件夹都有自己的目标文件夹,其中包含 classes。
步骤如下:
- 在 Jenkins 中构建项目作为一项工作
- 部署到用户阶段
- 运行 Jenkins 的 jacoco 报告工作
Jacoco 报告工作说明:
构建步骤 - maven 3.3.3 目标 - 清洁测试 和测试套件、用户阶段详细信息和其他信息被传递。
Post步-执行shell
这里无法格式化和粘贴,所以上传到这里:https://zerobin.net/?8a988cd05bf3d752#fbzMlW1b7uzD+HZnmwnd9WjQYBI3j95Q7DCIx6q+l0U=
调用顶级 Maven 目标 - Maven 3.3.3 -f jacoco_pom.xml jacoco:dump antrun:run@report
shell 粘贴中使用的 clasDir
变量应该有 classes。到目前为止,我已经在 shell 脚本的开头完成了此操作。
mkdir -p target/classes
cp -R messages/target/classes target/classes
并设置clsDir = target/classes
,
这样我就得到了那个模块的报告。我的测试套件只包含一个 class。我还想包括其他模块,例如 events
、other-code
以及 link 来源。
我需要有关如何设置它的帮助。主要目的是生成功能测试的代码覆盖率报告。
编辑:
答案:下面的答案有帮助,但这一切都是通过 shell 命令完成的,而不是任何 UI。因此,克隆 repo,执行 mvn clean package -DskipTests
并从所有模块文件夹复制所有第一级子文件夹有帮助,但随后显示覆盖错误 class 文件的执行数据不匹配。这意味着 class 检测和我们用于覆盖的 class 是由不同的 JVM 分别构建的(一个在 Jenkins 中,另一个在阶段部署)。
所以解决方案不是克隆和重新编译它们,而是从部署存储库下载清单并解压缩所有 jar。这样我就拥有了相同版本的所有 classes。
要通过更改 Jenkins JaCoCo 插件配置来包含多个 class 目录,您需要修改 'Path to class directories' 字段。
例如,如果您想在目录 'events' 和 'other-code' 下包含任何 classes,您可以将以下内容添加到 'Path to class directories' 部分:
**/events,**/other-code
请记住,如果您想添加多个目录,您必须用逗号分隔每个目录,并且不能有空格(由于插件的错误).注意:此逗号错误适用于此插件配置中的所有文本字段。
这是我的 JaCoCo 插件配置:
编辑: 如评论中所述,解决此问题的一种方法是利用您正在处理的任何构建工具(Ant、Maven、Gradle)删除target
(即:jar、war 等)放入一个公共目录,然后将 jacoco 插件指向那里。