forked from biasedbit/gradle-plugins
-
Notifications
You must be signed in to change notification settings - Fork 0
/
jacoco-multiproject-aggregator.gradle
134 lines (117 loc) · 3.78 KB
/
jacoco-multiproject-aggregator.gradle
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
/**
* JaCoCo code coverage tracking for Gradle multi-projects.
*
* This plugin is specific for multi-project builds:
* - It only tracks code on subprojects
* - It only generates a single aggregated coverage report that includes all subprojects
*/
apply plugin: 'java'
def jacocoVersion = '0.6.0.201210061924'
def isSubproject = project.parent != null
def trackCoverage = isSubproject
configurations { jacoco }
dependencies {
jacoco "org.jacoco:org.jacoco.agent:${jacocoVersion}"
jacoco "org.jacoco:org.jacoco.ant:${jacocoVersion}"
}
def jacocoConvention = new JacocoPluginConvention(project)
project.convention.plugins.jacoco = jacocoConvention
class JacocoPluginConvention {
def reportPath
def tmpDir
def coverageFile
def includes
def excludes
def exclclassloader
def append
def dumponexit
def output
def jacoco(Closure close) {
close.delegate = this
close.run()
}
JacocoPluginConvention(Project project) {
reportPath = "${project.reporting.baseDir.absolutePath}/coverage"
tmpDir = "${project.buildDir}/tmp"
coverageFile = "${tmpDir}/jacoco.exec"
includes = []
excludes = []
exclclassloader = []
append = false
dumponexit = true
output = 'file'
}
def getParams() {
def params = [:]
params['property'] = 'agentvmparam'
params['destfile'] = coverageFile
if (includes != null && includes.size > 0) params['includes'] = includes.join(':')
if (excludes != null && excludes.size > 0) params['excludes'] = excludes.join(':')
if (exclclassloader != null && exclclassloader.size > 0) params['exclclassloader'] = exclclassloader
params['append'] = append
params['dumponexit'] = dumponexit
params['output'] = output
params
}
}
// Only apply code coverage to subprojects
if (trackCoverage) {
logger.info "Tracking code coverage for '${project.name}'"
test {
doFirst {
ant.taskdef(
name: 'jacocoagent',
classname: 'org.jacoco.ant.AgentTask',
classpath: configurations.jacoco.asPath
)
ant.jacocoagent jacocoConvention.params
jvmArgs "${ant.properties.agentvmparam}"
}
}
} else {
logger.info "Skipping coverage for '${project.name}'"
}
// This aggregate report task is only available to the parent project
if (!isSubproject) {
task coverageReport << {
ant.taskdef(
name: 'jacocoreport',
classname: 'org.jacoco.ant.ReportTask',
classpath: configurations.jacoco.asPath
)
ant.mkdir dir: jacocoConvention.reportPath
ant.jacocoreport {
executiondata {
subprojects.each { subproject ->
def subprojectCoverageFile = subproject.convention.plugins.jacoco.coverageFile
if (file(subprojectCoverageFile).exists()) {
logger.info "* Adding jacoco.exec for '${subproject.name}' (${subprojectCoverageFile})."
ant.file file: "${subprojectCoverageFile}"
} else {
logger.info "! Skipping '${subproject.name}', no jacoco.exec found."
}
}
}
structure(name: project.description) {
subprojects.each { subproject ->
group(name: subproject.displayName) {
classfiles {
fileset dir: "${subproject.sourceSets.main.output.classesDir}"
}
sourcefiles {
subproject.sourceSets.main.java.srcDirs.each {
fileset dir: it.absolutePath
}
}
}
}
}
html destdir: jacocoConvention.reportPath
}
logger.info "* Aggregated coverage report generated to '${jacocoConvention.reportPath}/index.html'"
}
// Make sure that all subproject have been evaluated and their tasks defined before defining this dependency
gradle.projectsEvaluated {
coverageReport.dependsOn subprojects.check
}
}