Skip to content

Commit 9d779a0

Browse files
authored
Build optimizations (#163)
### What's done: * Exclude detekt from `check` task * Exclude linking release executable from ordinary CI workflow * Enable gradle caches by default * Disable redundant KMP targets compilation during build_and_test.yml * Re-enable gradle-cache-action for build_and_test.yml
1 parent 655fd28 commit 9d779a0

File tree

6 files changed

+62
-4
lines changed

6 files changed

+62
-4
lines changed

.github/workflows/build_and_test.yml

+9-3
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,15 @@ jobs:
3535
# additional files to calculate key for dependency cache
3636
gradle-dependencies-cache-key: |
3737
buildSrc/**/Versions.kt
38-
# Until https://github.com/burrunan/gradle-cache-action/issues/42 is addressed, gradle should be run as a separate step
39-
- name: Run gradle command
40-
run: ./gradlew build --build-cache
38+
# Note: https://github.com/burrunan/gradle-cache-action/issues/42 can possible break this
39+
arguments: |
40+
build
41+
-PdisableRedundantTargets
42+
-x linkReleaseExecutableLinuxX64
43+
-x linkReleaseExecutableMingwX64
44+
-x linkReleaseExecutableMacosX64
45+
properties: |
46+
org.gradle.caching=true
4147
- name: Upload gradle reports
4248
if: ${{ always() }}
4349
uses: actions/upload-artifact@v2

build.gradle.kts

+3
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import org.cqfn.save.buildutils.configurePublishing
44
import org.cqfn.save.buildutils.configureVersioning
55
import org.cqfn.save.buildutils.createDetektTask
66
import org.cqfn.save.buildutils.createDiktatTask
7+
import org.cqfn.save.buildutils.disableRedundantKmpTargets
78
import org.cqfn.save.buildutils.installGitHooks
89

910
plugins {
@@ -26,6 +27,8 @@ allprojects {
2627
}
2728
configureDiktat()
2829
configureDetekt()
30+
31+
disableRedundantKmpTargets()
2932
}
3033
createDiktatTask()
3134
createDetektTask()

buildSrc/build.gradle.kts

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ repositories {
88

99
dependencies {
1010
implementation("org.cqfn.diktat:diktat-gradle-plugin:1.0.0-rc.1")
11-
implementation("io.gitlab.arturbosch.detekt:detekt-gradle-plugin:1.16.0")
11+
implementation("io.gitlab.arturbosch.detekt:detekt-gradle-plugin:1.17.1")
1212
runtimeOnly(kotlin("gradle-plugin", "1.5.0"))
1313
implementation("io.github.gradle-nexus:publish-plugin:1.1.0")
1414
implementation("org.ajoberstar.reckon:reckon-gradle:0.13.0")

buildSrc/src/main/kotlin/org/cqfn/save/buildutils/DetektConfiguration.kt

+16
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import io.gitlab.arturbosch.detekt.Detekt
88
import io.gitlab.arturbosch.detekt.DetektPlugin
99
import io.gitlab.arturbosch.detekt.extensions.DetektExtension
1010
import org.gradle.api.Project
11+
import org.gradle.api.tasks.TaskProvider
1112
import org.gradle.kotlin.dsl.apply
1213
import org.gradle.kotlin.dsl.configure
1314
import org.gradle.kotlin.dsl.withType
@@ -21,6 +22,21 @@ fun Project.configureDetekt() {
2122
config = rootProject.files("detekt.yml")
2223
buildUponDefaultConfig = true
2324
}
25+
// extremely awful hack to get to the point, when `DetektMultiplatform` has registered all the tasks
26+
afterEvaluate {
27+
// detekt registers tasks after Kotlin plugin has set up all targets
28+
afterEvaluate {
29+
// but they also use a nested `afterEvaluate` for interop with Android Gradle Plugin
30+
afterEvaluate {
31+
// so we need a third `afterEvaluate`, so that all detekt tasks are already registered
32+
tasks.matching { it.name == "check" }.configureEach {
33+
dependsOn.removeIf {
34+
it is TaskProvider<*> && it.name.startsWith("detekt")
35+
}
36+
}
37+
}
38+
}
39+
}
2440
}
2541

2642
/**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
/**
2+
* Utility functions to configure Kotlin in Gradle
3+
*/
4+
5+
package org.cqfn.save.buildutils
6+
7+
import org.gradle.api.GradleException
8+
import org.gradle.api.Project
9+
import org.gradle.nativeplatform.platform.internal.DefaultNativePlatform
10+
11+
/**
12+
* Some Kotlin Multiplatform targets are available on multiple OS.
13+
*
14+
* @throws GradleException if executed on some exotic OS
15+
*/
16+
fun Project.disableRedundantKmpTargets() {
17+
if (hasProperty("disableRedundantTargets") && (property("disableRedundantTargets") as String?) != "false") {
18+
afterEvaluate {
19+
val currentOs = DefaultNativePlatform.getCurrentOperatingSystem()
20+
val redundantTarget: String? = when {
21+
currentOs.isWindows -> "linuxX64"
22+
currentOs.isMacOsX -> "linuxX64"
23+
currentOs.isLinux -> null
24+
else -> throw GradleException("Unknown operating system ${currentOs.name}")
25+
}
26+
tasks.matching { redundantTarget != null && it.name.contains(redundantTarget, ignoreCase = true) }
27+
.configureEach {
28+
enabled = false
29+
}
30+
}
31+
}
32+
}

gradle.properties

+1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ group=org.cqfn.save
44
org.gradle.parallel=true
55
org.gradle.vfs.watch=true
66
org.gradle.jvmargs=-Xmx1g -XX:MaxMetaspaceSize=512m
7+
org.gradle.caching=true
78

89
# Kotlin
910
kotlin.code.style=official

0 commit comments

Comments
 (0)