Skip to content

Commit e914e0b

Browse files
authored
ci_jobs plugin clean up (#9858)
* Make CIJobsExtensions lazy * More CIJobsExtensions lazy API * Fix spacing * Make ci-jobs plugin lazy * Remove some provider usage * Rename some CIJobsExtensions variables * Improve comment
1 parent 9b91826 commit e914e0b

File tree

2 files changed

+168
-169
lines changed

2 files changed

+168
-169
lines changed

buildSrc/src/main/kotlin/CIJobsExtensions.kt

Lines changed: 76 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -5,104 +5,105 @@ import org.gradle.api.Task
55
import org.gradle.kotlin.dsl.extra
66

77
/**
8-
* Checks if a task is affected by git changes
8+
* Returns the task's path, given affected projects, if this task or its dependencies are affected by git changes.
99
*/
10-
internal fun isAffectedBy(baseTask: Task, affectedProjects: Map<Project, Set<String>>): String? {
11-
val visited = mutableSetOf<Task>()
12-
val queue = mutableListOf(baseTask)
10+
internal fun findAffectedTaskPath(baseTask: Task, affectedProjects: Map<Project, Set<String>>): String? {
11+
val visited = mutableSetOf<Task>()
12+
val queue = mutableListOf(baseTask)
13+
14+
while (queue.isNotEmpty()) {
15+
val t = queue.removeAt(0)
16+
if (visited.contains(t)) {
17+
continue
18+
}
19+
visited.add(t)
1320

14-
while (queue.isNotEmpty()) {
15-
val t = queue.removeAt(0)
16-
if (visited.contains(t)) {
17-
continue
18-
}
19-
visited.add(t)
20-
21-
val affectedTasks = affectedProjects[t.project]
22-
if (affectedTasks != null) {
23-
if (affectedTasks.contains("all")) {
24-
return "${t.project.path}:${t.name}"
25-
}
26-
if (affectedTasks.contains(t.name)) {
27-
return "${t.project.path}:${t.name}"
28-
}
29-
}
30-
31-
t.taskDependencies.getDependencies(t).forEach { queue.add(it) }
21+
val affectedTasks = affectedProjects[t.project]
22+
if (affectedTasks != null) {
23+
if (affectedTasks.contains("all")) {
24+
return "${t.project.path}:${t.name}"
25+
}
26+
if (affectedTasks.contains(t.name)) {
27+
return "${t.project.path}:${t.name}"
28+
}
3229
}
33-
return null
30+
31+
t.taskDependencies.getDependencies(t).forEach { queue.add(it) }
32+
}
33+
return null
3434
}
3535

3636
/**
3737
* Creates a single aggregate root task that depends on matching subproject tasks
3838
*/
3939
private fun Project.createRootTask(
40-
rootTaskName: String,
41-
subProjTaskName: String,
42-
includePrefixes: List<String>,
43-
excludePrefixes: List<String>,
44-
forceCoverage: Boolean
40+
rootTaskName: String,
41+
subProjTaskName: String,
42+
includePrefixes: List<String>,
43+
excludePrefixes: List<String>,
44+
forceCoverage: Boolean
4545
) {
46-
val coverage = forceCoverage || rootProject.hasProperty("checkCoverage")
47-
tasks.register(rootTaskName) {
48-
subprojects.forEach { subproject ->
49-
val activePartition = subproject.extra.get("activePartition") as Boolean
50-
if (activePartition &&
51-
includePrefixes.any { subproject.path.startsWith(it) } &&
52-
!excludePrefixes.any { subproject.path.startsWith(it) }) {
53-
54-
val testTask = subproject.tasks.findByName(subProjTaskName)
55-
var isAffected = true
56-
57-
if (testTask != null) {
58-
val useGitChanges = rootProject.extra.get("useGitChanges") as Boolean
59-
if (useGitChanges) {
60-
@Suppress("UNCHECKED_CAST")
61-
val affectedProjects = rootProject.extra.get("affectedProjects") as Map<Project, Set<String>>
62-
val fileTrigger = isAffectedBy(testTask, affectedProjects)
63-
if (fileTrigger != null) {
64-
logger.warn("Selecting ${subproject.path}:$subProjTaskName (triggered by $fileTrigger)")
65-
} else {
66-
logger.warn("Skipping ${subproject.path}:$subProjTaskName (not affected by changed files)")
67-
isAffected = false
68-
}
69-
}
70-
if (isAffected) {
71-
dependsOn(testTask)
72-
}
73-
}
74-
75-
if (isAffected && coverage) {
76-
val coverageTask = subproject.tasks.findByName("jacocoTestReport")
77-
if (coverageTask != null) {
78-
dependsOn(coverageTask)
79-
}
80-
val verificationTask = subproject.tasks.findByName("jacocoTestCoverageVerification")
81-
if (verificationTask != null) {
82-
dependsOn(verificationTask)
83-
}
84-
}
46+
val coverage = forceCoverage || rootProject.providers.gradleProperty("checkCoverage").isPresent
47+
tasks.register(rootTaskName) {
48+
subprojects.forEach { subproject ->
49+
val activePartition = subproject.extra.get("activePartition") as Boolean
50+
if (
51+
activePartition &&
52+
includePrefixes.any { subproject.path.startsWith(it) } &&
53+
!excludePrefixes.any { subproject.path.startsWith(it) }
54+
) {
55+
val testTask = subproject.tasks.findByName(subProjTaskName)
56+
var isAffected = true
57+
58+
if (testTask != null) {
59+
val useGitChanges = rootProject.extra.get("useGitChanges") as Boolean
60+
if (useGitChanges) {
61+
@Suppress("UNCHECKED_CAST")
62+
val affectedProjects = rootProject.extra.get("affectedProjects") as Map<Project, Set<String>>
63+
val affectedTaskPath = findAffectedTaskPath(testTask, affectedProjects)
64+
if (affectedTaskPath != null) {
65+
logger.warn("Selecting ${subproject.path}:$subProjTaskName (affected by $affectedTaskPath)")
66+
} else {
67+
logger.warn("Skipping ${subproject.path}:$subProjTaskName (not affected by changed files)")
68+
isAffected = false
8569
}
70+
}
71+
if (isAffected) {
72+
dependsOn(testTask)
73+
}
74+
}
75+
76+
if (isAffected && coverage) {
77+
val coverageTask = subproject.tasks.findByName("jacocoTestReport")
78+
if (coverageTask != null) {
79+
dependsOn(coverageTask)
80+
}
81+
val verificationTask = subproject.tasks.findByName("jacocoTestCoverageVerification")
82+
if (verificationTask != null) {
83+
dependsOn(verificationTask)
84+
}
8685
}
86+
}
8787
}
88+
}
8889
}
8990

9091
/**
9192
* Creates aggregate test tasks for CI using createRootTask() above
92-
*
93+
*
9394
* Creates three subtasks for the given base task name:
9495
* - ${baseTaskName}Test - runs allTests
9596
* - ${baseTaskName}LatestDepTest - runs allLatestDepTests
9697
* - ${baseTaskName}Check - runs check
9798
*/
9899
fun Project.testAggregate(
99-
baseTaskName: String,
100-
includePrefixes: List<String>,
101-
excludePrefixes: List<String> = emptyList(),
102-
forceCoverage: Boolean = false
100+
baseTaskName: String,
101+
includePrefixes: List<String>,
102+
excludePrefixes: List<String> = emptyList(),
103+
forceCoverage: Boolean = false
103104
) {
104-
createRootTask("${baseTaskName}Test", "allTests", includePrefixes, excludePrefixes, forceCoverage)
105-
createRootTask("${baseTaskName}LatestDepTest", "allLatestDepTests", includePrefixes, excludePrefixes, forceCoverage)
106-
createRootTask("${baseTaskName}Check", "check", includePrefixes, excludePrefixes, forceCoverage)
105+
createRootTask("${baseTaskName}Test", "allTests", includePrefixes, excludePrefixes, forceCoverage)
106+
createRootTask("${baseTaskName}LatestDepTest", "allLatestDepTests", includePrefixes, excludePrefixes, forceCoverage)
107+
createRootTask("${baseTaskName}Check", "check", includePrefixes, excludePrefixes, forceCoverage)
107108
}
108109

0 commit comments

Comments
 (0)