Use FlowParameter for buildFinish event
Support build scan report for Gradle 8.1 #KT-55740: Fixed #KT-58251: Fixed
This commit is contained in:
committed by
Space Team
parent
99e4ca65be
commit
06ac8a10cd
@@ -124,7 +124,7 @@ fun Project.createGradleCommonSourceSet(): SourceSet {
|
||||
|
||||
dependencies {
|
||||
compileOnlyConfigurationName(kotlinStdlib())
|
||||
"commonGradleApiCompileOnly"("dev.gradleplugins:gradle-api:8.0")
|
||||
"commonGradleApiCompileOnly"("dev.gradleplugins:gradle-api:8.1")
|
||||
if (this@createGradleCommonSourceSet.name !in testPlugins) {
|
||||
compileOnlyConfigurationName(project(":kotlin-gradle-plugin-api")) {
|
||||
capabilities {
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
<trust group="org.jetbrains.kotlin" name="kotlin-android-extensions" version="1.9.2?[0-9](-.+)?" regex="true"/>
|
||||
<trust group="org.jetbrains.kotlin" name="kotlin-annotation-processing-embeddable" version="1.9.2?[0-9](-.+)?" regex="true"/>
|
||||
<trust group="org.jetbrains.kotlin" name="kotlin-annotation-processing-gradle" version="1.9.2?[0-9](-.+)?" regex="true"/>
|
||||
<trust group="org.jetbrains.kotlin" name="kotlin-assignment" version="1.9.2?[0-9](-.+)?" regex="true"/>
|
||||
<trust group="org.jetbrains.kotlin" name="kotlin-build-common" version="1.9.2?[0-9](-.+)?" regex="true"/>
|
||||
<trust group="org.jetbrains.kotlin" name="kotlin-build-tools-api" version="1.9.2?[0-9](-.+)?" regex="true"/>
|
||||
<trust group="org.jetbrains.kotlin" name="kotlin-build-tools-enum-compat" version="1.9.2?[0-9](-.+)?" regex="true"/>
|
||||
@@ -44,6 +45,8 @@
|
||||
<trust group="org.jetbrains.kotlin" name="kotlin-scripting-compiler-impl-embeddable" version="1.9.2?[0-9](-.+)?" regex="true"/>
|
||||
<trust group="org.jetbrains.kotlin" name="kotlin-scripting-jvm" version="1.9.2?[0-9](-.+)?" regex="true"/>
|
||||
<trust group="org.jetbrains.kotlin" name="kotlin-serialization" version="1.9.2?[0-9](-.+)?" regex="true"/>
|
||||
<trust group="org.jetbrains.kotlin" name="kotlin-serialization-compiler-plugin" version="1.9.2?[0-9](-.+)?" regex="true"/>
|
||||
<trust group="org.jetbrains.kotlin" name="kotlin-serialization-compiler-plugin-embeddable" version="1.9.2?[0-9](-.+)?" regex="true"/>
|
||||
<trust group="org.jetbrains.kotlin" name="kotlin-serialization-unshaded" version="1.9.2?[0-9](-.+)?" regex="true"/>
|
||||
<trust group="org.jetbrains.kotlin" name="kotlin-stdlib" version="1.9.2?[0-9](-.+)?" regex="true"/>
|
||||
<trust group="org.jetbrains.kotlin" name="kotlin-stdlib-common" version="1.9.2?[0-9](-.+)?" regex="true"/>
|
||||
@@ -62,8 +65,6 @@
|
||||
<trust group="org.jetbrains.kotlin" name="kotlin-tooling-metadata" version="1.9.2?[0-9](-.+)?" regex="true"/>
|
||||
<trust group="org.jetbrains.kotlin" name="kotlin-util-io" version="1.9.2?[0-9](-.+)?" regex="true"/>
|
||||
<trust group="org.jetbrains.kotlin" name="kotlin-util-klib" version="1.9.2?[0-9](-.+)?" regex="true"/>
|
||||
<trust group="org.jetbrains.kotlin" name="kotlin-serialization-compiler-plugin" version="1.9.2?[0-9](-.+)?" regex="true"/>
|
||||
<trust group="org.jetbrains.kotlin" name="kotlin-serialization-compiler-plugin-embeddable" version="1.9.2?[0-9](-.+)?" regex="true"/>
|
||||
<trust group="org.jetbrains.kotlin" name="kotlinx-serialization-compiler-plugin" version="1.9.2?[0-9](-.+)?" regex="true"/>
|
||||
<trust group="org.jetbrains.kotlin" name="kotlinx-serialization-compiler-plugin-embeddable" version="1.9.2?[0-9](-.+)?" regex="true"/>
|
||||
</trusted-artifacts>
|
||||
@@ -5684,6 +5685,12 @@
|
||||
<sha256 value="6b98dcf1309448d48b5a9762e94073fbee17cc45ff2b91b3d74a34b4945517c7" origin="Generated by Gradle"/>
|
||||
</artifact>
|
||||
</component>
|
||||
<component group="org.codehaus.groovy" name="groovy-ant" version="3.0.15">
|
||||
<artifact name="groovy-ant-3.0.15.jar">
|
||||
<md5 value="e6df49ede9a3f469f7debfd55db68770" origin="Generated by Gradle"/>
|
||||
<sha256 value="c29af7dc552b1cd802a911bfc40988dd53ea6f1b78cd727d57f637a1cb406e49" origin="Generated by Gradle"/>
|
||||
</artifact>
|
||||
</component>
|
||||
<component group="org.codehaus.groovy" name="groovy-ant" version="3.0.8">
|
||||
<artifact name="groovy-ant-3.0.8.jar">
|
||||
<md5 value="06d07e7277dfa15590e3590d79423a00" origin="Generated by Gradle"/>
|
||||
@@ -5702,6 +5709,12 @@
|
||||
<sha256 value="4b9291f2db479f9ea146f8ed6c977e7db9629fe0b78bc430c12b11a0e390ed50" origin="Generated by Gradle"/>
|
||||
</artifact>
|
||||
</component>
|
||||
<component group="org.codehaus.groovy" name="groovy-astbuilder" version="3.0.15">
|
||||
<artifact name="groovy-astbuilder-3.0.15.jar">
|
||||
<md5 value="d82be5cfef3fb7762acce638500de241" origin="Generated by Gradle"/>
|
||||
<sha256 value="ace82cc0149df0c2fe6015da18388da42e383a54a30293b7645061bcb6db9233" origin="Generated by Gradle"/>
|
||||
</artifact>
|
||||
</component>
|
||||
<component group="org.codehaus.groovy" name="groovy-astbuilder" version="3.0.8">
|
||||
<artifact name="groovy-astbuilder-3.0.8.jar">
|
||||
<md5 value="9c8dbfcbfed98548185cc75d35d09260" origin="Generated by Gradle"/>
|
||||
@@ -5720,6 +5733,12 @@
|
||||
<sha256 value="d4fa7a8ac7a64f6d11ec6bdd02b242447d5c48c8d68228bb05c0f05e5c1a1ca1" origin="Generated by Gradle"/>
|
||||
</artifact>
|
||||
</component>
|
||||
<component group="org.codehaus.groovy" name="groovy-cli-picocli" version="3.0.15">
|
||||
<artifact name="groovy-cli-picocli-3.0.15.jar">
|
||||
<md5 value="9aeaaa55b829609fa96ae35a1fd17878" origin="Generated by Gradle"/>
|
||||
<sha256 value="ff133cb810c3ba464a54038d2f9740e721b5d76c7ec2dbe12500f5013987b1d0" origin="Generated by Gradle"/>
|
||||
</artifact>
|
||||
</component>
|
||||
<component group="org.codehaus.groovy" name="groovy-cli-picocli" version="3.0.8">
|
||||
<artifact name="groovy-cli-picocli-3.0.8.jar">
|
||||
<md5 value="48e080fd873e3ea27413154f5530bc55" origin="Generated by Gradle"/>
|
||||
@@ -5738,6 +5757,12 @@
|
||||
<sha256 value="0a8f0977d17d18e220cfc91f23a5557d320a5abb7f8665db83db1f52a56075eb" origin="Generated by Gradle"/>
|
||||
</artifact>
|
||||
</component>
|
||||
<component group="org.codehaus.groovy" name="groovy-console" version="3.0.15">
|
||||
<artifact name="groovy-console-3.0.15.jar">
|
||||
<md5 value="915a3d4805266b809e241b69d8455006" origin="Generated by Gradle"/>
|
||||
<sha256 value="91ae09b41cff74e01fc3a1f7c94940dbdc46f3952a4faba30ccb5fc3e12c728f" origin="Generated by Gradle"/>
|
||||
</artifact>
|
||||
</component>
|
||||
<component group="org.codehaus.groovy" name="groovy-console" version="3.0.8">
|
||||
<artifact name="groovy-console-3.0.8.jar">
|
||||
<md5 value="c47387f9f97d6541712cbbebb3ea4cd6" origin="Generated by Gradle"/>
|
||||
@@ -5756,6 +5781,12 @@
|
||||
<sha256 value="e0af819c7fe96cbecbdb888fee8387b8131fa9adcc09afd0a94378134c106053" origin="Generated by Gradle"/>
|
||||
</artifact>
|
||||
</component>
|
||||
<component group="org.codehaus.groovy" name="groovy-datetime" version="3.0.15">
|
||||
<artifact name="groovy-datetime-3.0.15.jar">
|
||||
<md5 value="813e1617651170c01d6a88e172f6a84e" origin="Generated by Gradle"/>
|
||||
<sha256 value="369c1dbed7e8707912858b8440673f1feaa3b6a042f3bf39df864372afa7ae06" origin="Generated by Gradle"/>
|
||||
</artifact>
|
||||
</component>
|
||||
<component group="org.codehaus.groovy" name="groovy-datetime" version="3.0.8">
|
||||
<artifact name="groovy-datetime-3.0.8.jar">
|
||||
<md5 value="3c4d6e546425d95e9a0d82163371998b" origin="Generated by Gradle"/>
|
||||
@@ -5774,6 +5805,12 @@
|
||||
<sha256 value="6779bfe520d68d92e30e5c74aec2e25491f145a5d2e2afe3991713b7aa79571d" origin="Generated by Gradle"/>
|
||||
</artifact>
|
||||
</component>
|
||||
<component group="org.codehaus.groovy" name="groovy-docgenerator" version="3.0.15">
|
||||
<artifact name="groovy-docgenerator-3.0.15.jar">
|
||||
<md5 value="253719812fff37f0c0ba5962a08d8519" origin="Generated by Gradle"/>
|
||||
<sha256 value="8ffc7a2f0833a1adf73b05baad03848a77ad84691b655616a3afae109d8de778" origin="Generated by Gradle"/>
|
||||
</artifact>
|
||||
</component>
|
||||
<component group="org.codehaus.groovy" name="groovy-docgenerator" version="3.0.8">
|
||||
<artifact name="groovy-docgenerator-3.0.8.jar">
|
||||
<md5 value="34340ce2619785ef830014af584d59ac" origin="Generated by Gradle"/>
|
||||
@@ -5792,6 +5829,12 @@
|
||||
<sha256 value="8a2e933ec156762d14b7354581981ae00d025d4f2fb72bd7599e030d5cb5e08c" origin="Generated by Gradle"/>
|
||||
</artifact>
|
||||
</component>
|
||||
<component group="org.codehaus.groovy" name="groovy-groovydoc" version="3.0.15">
|
||||
<artifact name="groovy-groovydoc-3.0.15.jar">
|
||||
<md5 value="399c5a5a8b3880f81eccd65e6d7dfaad" origin="Generated by Gradle"/>
|
||||
<sha256 value="23690d9b4ec453676f5c229629edcf8a63db31b50e007cbc96b4ee253ca49eb9" origin="Generated by Gradle"/>
|
||||
</artifact>
|
||||
</component>
|
||||
<component group="org.codehaus.groovy" name="groovy-groovydoc" version="3.0.8">
|
||||
<artifact name="groovy-groovydoc-3.0.8.jar">
|
||||
<md5 value="8c2af9e4ba0f511d1026a2c9d1b1aa33" origin="Generated by Gradle"/>
|
||||
@@ -5810,6 +5853,12 @@
|
||||
<sha256 value="6a6ae9b33d39a88ea3d2ccf482e661a044dd1dbb0f4705e8a764846068085d9c" origin="Generated by Gradle"/>
|
||||
</artifact>
|
||||
</component>
|
||||
<component group="org.codehaus.groovy" name="groovy-groovysh" version="3.0.15">
|
||||
<artifact name="groovy-groovysh-3.0.15.jar">
|
||||
<md5 value="46d2605279aa8360e81af928bc24635e" origin="Generated by Gradle"/>
|
||||
<sha256 value="6dde004035ac2005e8cdf0bb3a2c55a81294aa01ef63aca167626cea91f736a0" origin="Generated by Gradle"/>
|
||||
</artifact>
|
||||
</component>
|
||||
<component group="org.codehaus.groovy" name="groovy-groovysh" version="3.0.8">
|
||||
<artifact name="groovy-groovysh-3.0.8.jar">
|
||||
<md5 value="ab72377e1a5c302760107cf2f2bab052" origin="Generated by Gradle"/>
|
||||
@@ -5828,6 +5877,12 @@
|
||||
<sha256 value="10ab5469f5cec7066379d9925fcae8ad9405e1fe04727532078ce3a597154fd2" origin="Generated by Gradle"/>
|
||||
</artifact>
|
||||
</component>
|
||||
<component group="org.codehaus.groovy" name="groovy-jmx" version="3.0.15">
|
||||
<artifact name="groovy-jmx-3.0.15.jar">
|
||||
<md5 value="9431e4b1efbe778094a2706f7a48a9b3" origin="Generated by Gradle"/>
|
||||
<sha256 value="dccc96e562a8f7bbf7a2070530c176fdc54f503265d57717b2c85ff47e33e921" origin="Generated by Gradle"/>
|
||||
</artifact>
|
||||
</component>
|
||||
<component group="org.codehaus.groovy" name="groovy-jmx" version="3.0.8">
|
||||
<artifact name="groovy-jmx-3.0.8.jar">
|
||||
<md5 value="d88d85f420ba9869bb89609c581cdc03" origin="Generated by Gradle"/>
|
||||
@@ -5846,6 +5901,12 @@
|
||||
<sha256 value="921972defd8a89a5ab442f5ae57b1760755d7fe339dce46fe140e79a6e63e066" origin="Generated by Gradle"/>
|
||||
</artifact>
|
||||
</component>
|
||||
<component group="org.codehaus.groovy" name="groovy-json" version="3.0.15">
|
||||
<artifact name="groovy-json-3.0.15.jar">
|
||||
<md5 value="d3b8ba671d4b66dc62e31ed84c0134ad" origin="Generated by Gradle"/>
|
||||
<sha256 value="5af931497211cc0f86f27c31fde685fb39d57d802f1432b35e8285bc5baa3fd0" origin="Generated by Gradle"/>
|
||||
</artifact>
|
||||
</component>
|
||||
<component group="org.codehaus.groovy" name="groovy-json" version="3.0.8">
|
||||
<artifact name="groovy-json-3.0.8.jar">
|
||||
<md5 value="ec723fd3359c5a4e6fb2af5528c8710b" origin="Generated by Gradle"/>
|
||||
@@ -5864,6 +5925,12 @@
|
||||
<sha256 value="d834f8d0e07fa73f5a59f700903180c1d834acde8ca03dd79641ef1460c82a4e" origin="Generated by Gradle"/>
|
||||
</artifact>
|
||||
</component>
|
||||
<component group="org.codehaus.groovy" name="groovy-jsr223" version="3.0.15">
|
||||
<artifact name="groovy-jsr223-3.0.15.jar">
|
||||
<md5 value="9a52ef8b0bf24de38ec0dccb7bac72ea" origin="Generated by Gradle"/>
|
||||
<sha256 value="2320f16a05e505246179a1d61cec8c3833efdd7a2142a69a93660eaa503e0317" origin="Generated by Gradle"/>
|
||||
</artifact>
|
||||
</component>
|
||||
<component group="org.codehaus.groovy" name="groovy-jsr223" version="3.0.8">
|
||||
<artifact name="groovy-jsr223-3.0.8.jar">
|
||||
<md5 value="89d828f65941ebfa726947d8869a7935" origin="Generated by Gradle"/>
|
||||
@@ -5882,6 +5949,12 @@
|
||||
<sha256 value="cc4f1040ffad34f6019341193943d8ad3201a2c2fde510666de325148e6efc7e" origin="Generated by Gradle"/>
|
||||
</artifact>
|
||||
</component>
|
||||
<component group="org.codehaus.groovy" name="groovy-macro" version="3.0.15">
|
||||
<artifact name="groovy-macro-3.0.15.jar">
|
||||
<md5 value="479911a530bf11cc06ce00fd0aac35da" origin="Generated by Gradle"/>
|
||||
<sha256 value="37bcf3b2da4134a530b8b0de53f2357d8bd14b0bdc17a4bf82d1b0f11ffc584c" origin="Generated by Gradle"/>
|
||||
</artifact>
|
||||
</component>
|
||||
<component group="org.codehaus.groovy" name="groovy-macro" version="3.0.8">
|
||||
<artifact name="groovy-macro-3.0.8.jar">
|
||||
<md5 value="c28b6b36e78d3f2cccd4176217c8d219" origin="Generated by Gradle"/>
|
||||
@@ -5900,6 +5973,12 @@
|
||||
<sha256 value="87a8f0ad8022b5295e3292f2ffc65e6eb2f108da9f3648bc5eae873a0d54c9ad" origin="Generated by Gradle"/>
|
||||
</artifact>
|
||||
</component>
|
||||
<component group="org.codehaus.groovy" name="groovy-nio" version="3.0.15">
|
||||
<artifact name="groovy-nio-3.0.15.jar">
|
||||
<md5 value="ae6080ba73300122313937a6328829e1" origin="Generated by Gradle"/>
|
||||
<sha256 value="d41ea667f3cc24483e5d1c1c8846691869c914015079d7fadad9b29746244009" origin="Generated by Gradle"/>
|
||||
</artifact>
|
||||
</component>
|
||||
<component group="org.codehaus.groovy" name="groovy-nio" version="3.0.8">
|
||||
<artifact name="groovy-nio-3.0.8.jar">
|
||||
<md5 value="748a2321e921889013382920b704c91c" origin="Generated by Gradle"/>
|
||||
@@ -5918,6 +5997,12 @@
|
||||
<sha256 value="b987ab4a4026cc2ecedf955dab9c03cd45bfb6ffeb1edb009164c9ef0f38a156" origin="Generated by Gradle"/>
|
||||
</artifact>
|
||||
</component>
|
||||
<component group="org.codehaus.groovy" name="groovy-servlet" version="3.0.15">
|
||||
<artifact name="groovy-servlet-3.0.15.jar">
|
||||
<md5 value="67717cfdcacd97c9817c554c5fcec541" origin="Generated by Gradle"/>
|
||||
<sha256 value="983996c7573e4181c3cfcdd54a0f92f8aea2a55fbc4ad86f2c2df95a68ea2eec" origin="Generated by Gradle"/>
|
||||
</artifact>
|
||||
</component>
|
||||
<component group="org.codehaus.groovy" name="groovy-servlet" version="3.0.8">
|
||||
<artifact name="groovy-servlet-3.0.8.jar">
|
||||
<md5 value="0a97588424aea9afd95a01ec28cdbaeb" origin="Generated by Gradle"/>
|
||||
@@ -5936,6 +6021,12 @@
|
||||
<sha256 value="8fa0019578f22732bb49d4f923a46ad489d3dc1d03a28f5db57a8c92139ec8f2" origin="Generated by Gradle"/>
|
||||
</artifact>
|
||||
</component>
|
||||
<component group="org.codehaus.groovy" name="groovy-sql" version="3.0.15">
|
||||
<artifact name="groovy-sql-3.0.15.jar">
|
||||
<md5 value="7343821875a8d5216784e7c996c8464e" origin="Generated by Gradle"/>
|
||||
<sha256 value="cff3a90fe09e47f965e832a9355566ddcec08cafd02c37867939eaf91292f62a" origin="Generated by Gradle"/>
|
||||
</artifact>
|
||||
</component>
|
||||
<component group="org.codehaus.groovy" name="groovy-sql" version="3.0.8">
|
||||
<artifact name="groovy-sql-3.0.8.jar">
|
||||
<md5 value="9167c2310e30ece293a0aa6fe0879c95" origin="Generated by Gradle"/>
|
||||
@@ -5954,6 +6045,12 @@
|
||||
<sha256 value="ee10f03e6c8e5f6b3c674f206d3d8933712964b7fb1e14c5a6aec85ff25d57e4" origin="Generated by Gradle"/>
|
||||
</artifact>
|
||||
</component>
|
||||
<component group="org.codehaus.groovy" name="groovy-swing" version="3.0.15">
|
||||
<artifact name="groovy-swing-3.0.15.jar">
|
||||
<md5 value="acaf345ec47c072dbb789aa915d0c5de" origin="Generated by Gradle"/>
|
||||
<sha256 value="64f2e2140780292786bdc54438995e6aa337741403c9f49805336fe00aa6630e" origin="Generated by Gradle"/>
|
||||
</artifact>
|
||||
</component>
|
||||
<component group="org.codehaus.groovy" name="groovy-swing" version="3.0.8">
|
||||
<artifact name="groovy-swing-3.0.8.jar">
|
||||
<md5 value="8d2843892e796095ff4d12b400eb4f9c" origin="Generated by Gradle"/>
|
||||
@@ -5972,6 +6069,12 @@
|
||||
<sha256 value="abfb7190631a35fc96e023bfcd4658f3f7d4ae76c488ef1b972a54b29809ddc2" origin="Generated by Gradle"/>
|
||||
</artifact>
|
||||
</component>
|
||||
<component group="org.codehaus.groovy" name="groovy-templates" version="3.0.15">
|
||||
<artifact name="groovy-templates-3.0.15.jar">
|
||||
<md5 value="0e8e4ecb6b709e43d1de2151000486a1" origin="Generated by Gradle"/>
|
||||
<sha256 value="bd6c9beff5333b070e3db93cf2acba42e08fe1a17c45b7acae02ca007c403a6a" origin="Generated by Gradle"/>
|
||||
</artifact>
|
||||
</component>
|
||||
<component group="org.codehaus.groovy" name="groovy-templates" version="3.0.8">
|
||||
<artifact name="groovy-templates-3.0.8.jar">
|
||||
<md5 value="7d1226bf74f783c980e0ed5652154193" origin="Generated by Gradle"/>
|
||||
@@ -5990,6 +6093,12 @@
|
||||
<sha256 value="bd6a2fd5d870e8a37949ae7109f1c838873ce4f3f72762b9200e448426b985d1" origin="Generated by Gradle"/>
|
||||
</artifact>
|
||||
</component>
|
||||
<component group="org.codehaus.groovy" name="groovy-test" version="3.0.15">
|
||||
<artifact name="groovy-test-3.0.15.jar">
|
||||
<md5 value="54ea580ed6a447c42018b05d715f0027" origin="Generated by Gradle"/>
|
||||
<sha256 value="68328b4ccbef24c73dca358334a6ec6520bc3e0501ee1879b49a269755db7f51" origin="Generated by Gradle"/>
|
||||
</artifact>
|
||||
</component>
|
||||
<component group="org.codehaus.groovy" name="groovy-test" version="3.0.8">
|
||||
<artifact name="groovy-test-3.0.8.jar">
|
||||
<md5 value="42693079c79da133d480e3552a0b2a01" origin="Generated by Gradle"/>
|
||||
@@ -6008,6 +6117,12 @@
|
||||
<sha256 value="be29cc480cec23d5082fabc2d29d2152d3f5be582b31c8ea848d3999dd5b1496" origin="Generated by Gradle"/>
|
||||
</artifact>
|
||||
</component>
|
||||
<component group="org.codehaus.groovy" name="groovy-test-junit5" version="3.0.15">
|
||||
<artifact name="groovy-test-junit5-3.0.15.jar">
|
||||
<md5 value="4a2a863d0cfc6448d14af28cd9ae6306" origin="Generated by Gradle"/>
|
||||
<sha256 value="c6266969f72493fd61e63dcc8f5e02e9e9d8871c0dd6adbe75739446d8d68f2c" origin="Generated by Gradle"/>
|
||||
</artifact>
|
||||
</component>
|
||||
<component group="org.codehaus.groovy" name="groovy-test-junit5" version="3.0.8">
|
||||
<artifact name="groovy-test-junit5-3.0.8.jar">
|
||||
<md5 value="c5c0dd43649b4fec61085f5154cabdf2" origin="Generated by Gradle"/>
|
||||
@@ -6026,6 +6141,12 @@
|
||||
<sha256 value="361edff0cb61a968346849bc51a20f238998b17c24dad21389143fbcf3bc3c7e" origin="Generated by Gradle"/>
|
||||
</artifact>
|
||||
</component>
|
||||
<component group="org.codehaus.groovy" name="groovy-testng" version="3.0.15">
|
||||
<artifact name="groovy-testng-3.0.15.jar">
|
||||
<md5 value="22de47df382ca9db8f02e3844efd7781" origin="Generated by Gradle"/>
|
||||
<sha256 value="9542bd12058d7d19366531e5efc524bb40b95d8a2f23654bcc850eae1d9b8957" origin="Generated by Gradle"/>
|
||||
</artifact>
|
||||
</component>
|
||||
<component group="org.codehaus.groovy" name="groovy-testng" version="3.0.8">
|
||||
<artifact name="groovy-testng-3.0.8.jar">
|
||||
<md5 value="b9501ad0665012c655aa1cfb15327bc0" origin="Generated by Gradle"/>
|
||||
@@ -6050,6 +6171,12 @@
|
||||
<sha256 value="8faea983f0d871bd2d2f28150747edf9047dd4d716700a0276eaa905a5cd0816" origin="Generated by Gradle"/>
|
||||
</artifact>
|
||||
</component>
|
||||
<component group="org.codehaus.groovy" name="groovy-xml" version="3.0.15">
|
||||
<artifact name="groovy-xml-3.0.15.jar">
|
||||
<md5 value="9b034305f3a4d0ace84e915bf7660695" origin="Generated by Gradle"/>
|
||||
<sha256 value="28670cefed54bf3704c0894a4dbf3f0e26178001ef889d28c9873deb87235a92" origin="Generated by Gradle"/>
|
||||
</artifact>
|
||||
</component>
|
||||
<component group="org.codehaus.groovy" name="groovy-xml" version="3.0.8">
|
||||
<artifact name="groovy-xml-3.0.8.jar">
|
||||
<md5 value="072f5b640272f58d7e038ccc4e01aeb8" origin="Generated by Gradle"/>
|
||||
@@ -6458,6 +6585,12 @@
|
||||
<sha256 value="24d7f385cdffff81648f11098688fd0a2f1986c5286364183c08958927e5307d" origin="Generated by Gradle"/>
|
||||
</artifact>
|
||||
</component>
|
||||
<component group="org.gradle.kotlin" name="gradle-kotlin-dsl-plugins" version="4.0.7">
|
||||
<artifact name="gradle-kotlin-dsl-plugins-4.0.7.jar">
|
||||
<md5 value="7f73b1970da5906bb57c2d4e95afb8ad" origin="Generated by Gradle"/>
|
||||
<sha256 value="7700af78c35bdd8c164e3f3a3026a568c66cf9dbd182a1756e087b2dfa3b02fb" origin="Generated by Gradle"/>
|
||||
</artifact>
|
||||
</component>
|
||||
<component group="org.gradle.toolchains" name="foojay-resolver" version="0.4.0">
|
||||
<artifact name="foojay-resolver-0.4.0.jar">
|
||||
<md5 value="eeb8fc7711dca44bb38d7e89846efa19" origin="Generated by Gradle"/>
|
||||
|
||||
+107
-7
@@ -15,8 +15,23 @@ import java.nio.file.Path
|
||||
@DisplayName("FUS statistic")
|
||||
//Tests for FUS statistics have to create new instance of KotlinBuildStatsService
|
||||
class FusStatisticsIT : KGPDaemonsBaseTest() {
|
||||
private val expectedMetrics = arrayOf(
|
||||
"OS_TYPE",
|
||||
"BUILD_FAILED=false",
|
||||
"EXECUTED_FROM_IDEA=false",
|
||||
"BUILD_FINISH_TIME",
|
||||
"GRADLE_VERSION",
|
||||
"KOTLIN_STDLIB_VERSION",
|
||||
"KOTLIN_COMPILER_VERSION",
|
||||
)
|
||||
|
||||
@DisplayName("for dokka")
|
||||
@GradleTest
|
||||
@GradleTestVersions(
|
||||
minVersion = TestVersions.Gradle.MIN_SUPPORTED,
|
||||
additionalVersions = [TestVersions.Gradle.G_7_6, TestVersions.Gradle.G_8_0],
|
||||
maxVersion = TestVersions.Gradle.G_8_1
|
||||
)
|
||||
fun testDokka(gradleVersion: GradleVersion) {
|
||||
project(
|
||||
"simpleProject",
|
||||
@@ -48,6 +63,11 @@ class FusStatisticsIT : KGPDaemonsBaseTest() {
|
||||
|
||||
@DisplayName("general fields")
|
||||
@GradleTest
|
||||
@GradleTestVersions(
|
||||
minVersion = TestVersions.Gradle.MIN_SUPPORTED,
|
||||
additionalVersions = [TestVersions.Gradle.G_7_6, TestVersions.Gradle.G_8_0],
|
||||
maxVersion = TestVersions.Gradle.G_8_1
|
||||
)
|
||||
fun testFusStatistics(gradleVersion: GradleVersion) {
|
||||
project(
|
||||
"simpleProject",
|
||||
@@ -57,13 +77,7 @@ class FusStatisticsIT : KGPDaemonsBaseTest() {
|
||||
val fusStatisticsPath = fusStatisticsPath
|
||||
assertFileContains(
|
||||
fusStatisticsPath,
|
||||
"OS_TYPE",
|
||||
"BUILD_FAILED=false",
|
||||
"EXECUTED_FROM_IDEA=false",
|
||||
"BUILD_FINISH_TIME",
|
||||
"GRADLE_VERSION",
|
||||
"KOTLIN_STDLIB_VERSION",
|
||||
"KOTLIN_COMPILER_VERSION",
|
||||
*expectedMetrics,
|
||||
)
|
||||
assertFileDoesNotContain(
|
||||
fusStatisticsPath,
|
||||
@@ -74,8 +88,65 @@ class FusStatisticsIT : KGPDaemonsBaseTest() {
|
||||
}
|
||||
}
|
||||
|
||||
@DisplayName("for project with buildSrc")
|
||||
@GradleTest
|
||||
@GradleTestVersions(
|
||||
minVersion = TestVersions.Gradle.MIN_SUPPORTED,
|
||||
additionalVersions = [TestVersions.Gradle.G_7_6, TestVersions.Gradle.G_8_0],
|
||||
maxVersion = TestVersions.Gradle.G_8_1
|
||||
)
|
||||
fun testProjectWithBuildSrc(gradleVersion: GradleVersion) {
|
||||
project(
|
||||
"instantExecutionWithBuildSrc",
|
||||
gradleVersion,
|
||||
) {
|
||||
build("compileKotlin", "-Pkotlin.session.logger.root.path=$projectPath") {
|
||||
val fusStatisticsPath = fusStatisticsPath
|
||||
assertFileContains(
|
||||
fusStatisticsPath,
|
||||
*expectedMetrics,
|
||||
"BUILD_SRC_EXISTS=true"
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@DisplayName("for project with included build")
|
||||
@GradleTest
|
||||
@GradleTestVersions(
|
||||
minVersion = TestVersions.Gradle.G_7_6,
|
||||
maxVersion = TestVersions.Gradle.G_8_0
|
||||
)
|
||||
fun testProjectWithIncludedBuild(gradleVersion: GradleVersion) {
|
||||
project(
|
||||
"instantExecutionWithIncludedBuildPlugin",
|
||||
gradleVersion,
|
||||
buildOptions = defaultBuildOptions.copy(configurationCache = true)
|
||||
) {
|
||||
build("compileKotlin", "-Pkotlin.session.logger.root.path=$projectPath") {
|
||||
val fusStatisticsPath = fusStatisticsPath
|
||||
assertFileContains(
|
||||
fusStatisticsPath,
|
||||
*expectedMetrics,
|
||||
)
|
||||
}
|
||||
build("compileKotlin", "-Pkotlin.session.logger.root.path=$projectPath") {
|
||||
val fusStatisticsPath = fusStatisticsPath
|
||||
assertFileContains(
|
||||
fusStatisticsPath,
|
||||
*expectedMetrics,
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@DisplayName("for failed build")
|
||||
@GradleTest
|
||||
@GradleTestVersions(
|
||||
minVersion = TestVersions.Gradle.MIN_SUPPORTED,
|
||||
additionalVersions = [TestVersions.Gradle.G_7_6, TestVersions.Gradle.G_8_0],
|
||||
maxVersion = TestVersions.Gradle.G_8_1
|
||||
)
|
||||
fun testFusStatisticsForFailedBuild(gradleVersion: GradleVersion) {
|
||||
project(
|
||||
"simpleProject",
|
||||
@@ -98,4 +169,33 @@ class FusStatisticsIT : KGPDaemonsBaseTest() {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@DisplayName("general fields with configuration cache")
|
||||
@GradleTest
|
||||
@GradleTestVersions(
|
||||
minVersion = TestVersions.Gradle.MIN_SUPPORTED,
|
||||
additionalVersions = [TestVersions.Gradle.G_7_6, TestVersions.Gradle.G_8_0],
|
||||
maxVersion = TestVersions.Gradle.G_8_1
|
||||
)
|
||||
fun testFusStatisticsWithConfigurationCache(gradleVersion: GradleVersion) {
|
||||
project(
|
||||
"simpleProject",
|
||||
gradleVersion,
|
||||
buildOptions = defaultBuildOptions.copy(configurationCache = true),
|
||||
) {
|
||||
build(
|
||||
"compileKotlin",
|
||||
"-Pkotlin.session.logger.root.path=$projectPath",
|
||||
) {
|
||||
assertConfigurationCacheStored()
|
||||
}
|
||||
|
||||
build(
|
||||
"compileKotlin",
|
||||
"-Pkotlin.session.logger.root.path=$projectPath",
|
||||
) {
|
||||
assertConfigurationCacheReused()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+1
-1
@@ -191,7 +191,7 @@ fun assertFileContains(
|
||||
|${textNotInTheFile.joinToString(separator = "\n")}
|
||||
|
|
||||
|actual file content:
|
||||
|$text"
|
||||
|"$text"
|
||||
|
|
||||
""".trimMargin()
|
||||
}
|
||||
|
||||
+7
-6
@@ -42,6 +42,7 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KotlinPm20ProjectExtension
|
||||
import org.jetbrains.kotlin.gradle.plugin.sources.DefaultKotlinSourceSetFactory
|
||||
import org.jetbrains.kotlin.gradle.plugin.statistics.KotlinBuildStatsService
|
||||
import org.jetbrains.kotlin.gradle.report.BuildMetricsService
|
||||
import org.jetbrains.kotlin.gradle.plugin.statistics.BuildFlowService
|
||||
import org.jetbrains.kotlin.gradle.targets.js.KotlinJsCompilerAttribute
|
||||
import org.jetbrains.kotlin.gradle.targets.js.KotlinJsPlugin
|
||||
import org.jetbrains.kotlin.gradle.targets.js.npm.addNpmDependencyExtension
|
||||
@@ -65,10 +66,11 @@ abstract class DefaultKotlinBasePlugin : KotlinBasePlugin {
|
||||
override val pluginVersion: String = getKotlinPluginVersion(logger)
|
||||
|
||||
override fun apply(project: Project) {
|
||||
val kotlinPluginVersion = project.getKotlinPluginVersion()
|
||||
|
||||
val statisticsReporter = KotlinBuildStatsService.getOrCreateInstance(project)
|
||||
statisticsReporter?.report(StringMetrics.KOTLIN_COMPILER_VERSION, kotlinPluginVersion)
|
||||
KotlinBuildStatsService.getOrCreateInstance(project)?.apply {
|
||||
report(StringMetrics.KOTLIN_COMPILER_VERSION, pluginVersion)
|
||||
}
|
||||
BuildFlowService.registerIfAbsent(project)
|
||||
|
||||
checkGradleCompatibility()
|
||||
|
||||
@@ -89,7 +91,7 @@ abstract class DefaultKotlinBasePlugin : KotlinBasePlugin {
|
||||
|
||||
val kotlinGradleBuildServices = KotlinGradleBuildServices.registerIfAbsent(project.gradle).get()
|
||||
if (!project.isProjectIsolationEnabled) {
|
||||
kotlinGradleBuildServices.detectKotlinPluginLoadedInMultipleProjects(project, kotlinPluginVersion)
|
||||
kotlinGradleBuildServices.detectKotlinPluginLoadedInMultipleProjects(project, pluginVersion)
|
||||
}
|
||||
|
||||
BuildMetricsService.registerIfAbsent(project)
|
||||
@@ -212,7 +214,6 @@ abstract class KotlinBasePluginWrapper : DefaultKotlinBasePlugin() {
|
||||
|
||||
override fun apply(project: Project) {
|
||||
super.apply(project)
|
||||
val kotlinPluginVersion = project.getKotlinPluginVersion()
|
||||
|
||||
project.logger.info("Using Kotlin Gradle Plugin $pluginVariant variant")
|
||||
|
||||
@@ -225,7 +226,7 @@ abstract class KotlinBasePluginWrapper : DefaultKotlinBasePlugin() {
|
||||
project.maybeCreateCommonizerClasspathConfiguration()
|
||||
|
||||
project.createKotlinExtension(projectExtensionClass).apply {
|
||||
coreLibrariesVersion = kotlinPluginVersion
|
||||
coreLibrariesVersion = pluginVersion
|
||||
|
||||
fun kotlinSourceSetContainer(factory: NamedDomainObjectFactory<KotlinSourceSet>) =
|
||||
project.container(KotlinSourceSet::class.java, factory)
|
||||
|
||||
+79
@@ -0,0 +1,79 @@
|
||||
/*
|
||||
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
package org.jetbrains.kotlin.gradle.plugin
|
||||
|
||||
import org.gradle.api.Project
|
||||
import org.gradle.api.flow.*
|
||||
import org.gradle.api.provider.Property
|
||||
import org.gradle.api.services.ServiceReference
|
||||
import org.gradle.api.tasks.Input
|
||||
import org.jetbrains.kotlin.gradle.plugin.statistics.BuildFlowService
|
||||
import org.jetbrains.kotlin.gradle.report.BuildMetricsService
|
||||
import org.jetbrains.kotlin.gradle.report.BuildScanExtensionHolder
|
||||
import javax.inject.Inject
|
||||
|
||||
internal abstract class StatisticsBuildFlowManager @Inject constructor(
|
||||
private val flowScope: FlowScope,
|
||||
private val flowProviders: FlowProviders,
|
||||
) {
|
||||
companion object {
|
||||
fun getInstance(project: Project) =
|
||||
project.objects.newInstance(StatisticsBuildFlowManager::class.java)
|
||||
}
|
||||
|
||||
fun subscribeForBuildResult() {
|
||||
flowScope.always(
|
||||
BuildFinishFlowAction::class.java
|
||||
) { spec ->
|
||||
spec.parameters.buildFailed.set(flowProviders.buildWorkResult.map { it.failure.isPresent })
|
||||
}
|
||||
}
|
||||
|
||||
fun subscribeForBuildScan(project: Project) {
|
||||
val buildScanExtension = project.rootProject.extensions.findByName("buildScan")
|
||||
val buildScanHolder = buildScanExtension?.let { BuildScanExtensionHolder(it) }
|
||||
|
||||
flowScope.always(
|
||||
BuildScanFlowAction::class.java
|
||||
) { spec ->
|
||||
spec.parameters.buildScanExtensionHolder.set(buildScanHolder)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
internal class BuildScanFlowAction : FlowAction<BuildScanFlowAction.Parameters> {
|
||||
interface Parameters : FlowParameters {
|
||||
@get:ServiceReference
|
||||
val buildMetricService: Property<BuildMetricsService?>
|
||||
|
||||
@get: Input
|
||||
val buildScanExtensionHolder: Property<BuildScanExtensionHolder?>
|
||||
}
|
||||
|
||||
override fun execute(parameters: Parameters) {
|
||||
parameters.buildMetricService.orNull?.addCollectedTagsToBuildScan(parameters.buildScanExtensionHolder.orNull)
|
||||
}
|
||||
}
|
||||
|
||||
internal class BuildFinishFlowAction : FlowAction<BuildFinishFlowAction.Parameters> {
|
||||
interface Parameters : FlowParameters {
|
||||
@get:ServiceReference
|
||||
val buildFlowServiceProperty: Property<BuildFlowService>
|
||||
|
||||
@get:Input
|
||||
val action: Property<String?>
|
||||
|
||||
@get:Input
|
||||
val buildFailed: Property<Boolean>
|
||||
|
||||
}
|
||||
|
||||
override fun execute(parameters: Parameters) {
|
||||
parameters.buildFlowServiceProperty.get().recordBuildFinished(
|
||||
parameters.action.orNull, parameters.buildFailed.get()
|
||||
)
|
||||
}
|
||||
}
|
||||
+126
@@ -0,0 +1,126 @@
|
||||
/*
|
||||
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
package org.jetbrains.kotlin.gradle.plugin.statistics
|
||||
|
||||
import org.gradle.api.Project
|
||||
import org.gradle.api.invocation.Gradle
|
||||
import org.gradle.api.provider.Property
|
||||
import org.gradle.api.provider.Provider
|
||||
import org.gradle.api.services.BuildService
|
||||
import org.gradle.api.services.BuildServiceParameters
|
||||
import org.gradle.tooling.events.FinishEvent
|
||||
import org.gradle.tooling.events.OperationCompletionListener
|
||||
import org.gradle.tooling.events.task.TaskFailureResult
|
||||
import org.gradle.tooling.events.task.TaskFinishEvent
|
||||
import org.gradle.util.GradleVersion
|
||||
import org.jetbrains.kotlin.gradle.plugin.BuildEventsListenerRegistryHolder
|
||||
import org.jetbrains.kotlin.gradle.plugin.StatisticsBuildFlowManager
|
||||
import org.jetbrains.kotlin.gradle.utils.isConfigurationCacheAvailable
|
||||
import org.jetbrains.kotlin.statistics.metrics.BooleanMetrics
|
||||
import org.jetbrains.kotlin.statistics.metrics.IStatisticsValuesConsumer
|
||||
import org.jetbrains.kotlin.statistics.metrics.NumericalMetrics
|
||||
import org.jetbrains.kotlin.statistics.metrics.StringMetrics
|
||||
import java.io.Serializable
|
||||
|
||||
internal abstract class BuildFlowService : BuildService<BuildFlowService.Parameters>, AutoCloseable, OperationCompletionListener {
|
||||
private var buildFailed: Boolean = false
|
||||
|
||||
interface Parameters : BuildServiceParameters {
|
||||
val configurationMetrics: Property<MetricContainer>
|
||||
val fusStatisticsAvailable: Property<Boolean>
|
||||
}
|
||||
|
||||
companion object {
|
||||
private val serviceName = "${BuildFlowService::class.simpleName}_${BuildFlowService::class.java.classLoader.hashCode()}"
|
||||
|
||||
private fun fusStatisticsAvailable(gradle: Gradle): Boolean {
|
||||
return when {
|
||||
//known issue for Gradle with configurationCache: https://github.com/gradle/gradle/issues/20001
|
||||
GradleVersion.current().baseVersion < GradleVersion.version("7.4") -> !isConfigurationCacheAvailable(gradle)
|
||||
GradleVersion.current().baseVersion < GradleVersion.version("8.1") -> true
|
||||
//known issue. Cant reuse cache if file is changed in gradle_user_home dir: KT-58768
|
||||
else -> !isConfigurationCacheAvailable(gradle)
|
||||
}
|
||||
}
|
||||
fun registerIfAbsent(
|
||||
project: Project,
|
||||
): Provider<BuildFlowService> {
|
||||
|
||||
project.gradle.sharedServices.registrations.findByName(serviceName)?.let {
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
return it.service as Provider<BuildFlowService>
|
||||
}
|
||||
|
||||
val fusStatisticsAvailable = fusStatisticsAvailable(project.gradle)
|
||||
return project.gradle.sharedServices.registerIfAbsent(serviceName, BuildFlowService::class.java) { spec ->
|
||||
if (fusStatisticsAvailable) {
|
||||
KotlinBuildStatsService.applyIfInitialised {
|
||||
it.recordProjectsEvaluated(project.gradle)
|
||||
}
|
||||
}
|
||||
|
||||
spec.parameters.configurationMetrics.set(project.provider {
|
||||
KotlinBuildStatsService.getInstance()?.collectStartMetrics(project)
|
||||
})
|
||||
spec.parameters.fusStatisticsAvailable.set(fusStatisticsAvailable)
|
||||
}.also { buildService ->
|
||||
if (fusStatisticsAvailable) {
|
||||
when {
|
||||
GradleVersion.current().baseVersion < GradleVersion.version("8.1") ->
|
||||
BuildEventsListenerRegistryHolder.getInstance(project).listenerRegistry.onTaskCompletion(buildService)
|
||||
else -> StatisticsBuildFlowManager.getInstance(project).subscribeForBuildResult()
|
||||
}
|
||||
}
|
||||
if (GradleVersion.current().baseVersion >= GradleVersion.version("8.1")) {
|
||||
StatisticsBuildFlowManager.getInstance(project).subscribeForBuildScan(project)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun onFinish(event: FinishEvent?) {
|
||||
if ((event is TaskFinishEvent) && (event.result is TaskFailureResult)) {
|
||||
buildFailed = true
|
||||
}
|
||||
}
|
||||
|
||||
override fun close() {
|
||||
if (parameters.fusStatisticsAvailable.get()) {
|
||||
recordBuildFinished(null, buildFailed)
|
||||
}
|
||||
KotlinBuildStatsService.applyIfInitialised {
|
||||
it.close()
|
||||
}
|
||||
}
|
||||
|
||||
internal fun recordBuildFinished(action: String?, buildFailed: Boolean) {
|
||||
KotlinBuildStatsService.applyIfInitialised {
|
||||
it.recordBuildFinish(action, buildFailed, parameters.configurationMetrics.orElse(MetricContainer()).get())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
internal class MetricContainer : Serializable {
|
||||
private val numericalMetrics = HashMap<NumericalMetrics, Long>()
|
||||
private val booleanMetrics = HashMap<BooleanMetrics, Boolean>()
|
||||
private val stringMetrics = HashMap<StringMetrics, String>()
|
||||
|
||||
fun report(sessionLogger: IStatisticsValuesConsumer) {
|
||||
for ((key, value) in numericalMetrics) {
|
||||
sessionLogger.report(key, value)
|
||||
}
|
||||
for ((key, value) in booleanMetrics) {
|
||||
sessionLogger.report(key, value)
|
||||
}
|
||||
for ((key, value) in stringMetrics) {
|
||||
sessionLogger.report(key, value)
|
||||
}
|
||||
}
|
||||
|
||||
fun put(metric: StringMetrics, value: String) = stringMetrics.put(metric, value)
|
||||
fun put(metric: BooleanMetrics, value: Boolean) = booleanMetrics.put(metric, value)
|
||||
fun put(metric: NumericalMetrics, value: Long) = numericalMetrics.put(metric, value)
|
||||
}
|
||||
+92
-83
@@ -7,12 +7,9 @@ package org.jetbrains.kotlin.gradle.plugin.statistics
|
||||
|
||||
import org.gradle.api.Project
|
||||
import org.gradle.api.artifacts.DependencySet
|
||||
import org.gradle.api.invocation.Gradle
|
||||
import org.gradle.api.logging.Logging
|
||||
import org.jetbrains.kotlin.gradle.utils.API
|
||||
import org.jetbrains.kotlin.gradle.utils.COMPILE
|
||||
import org.jetbrains.kotlin.gradle.utils.IMPLEMENTATION
|
||||
import org.jetbrains.kotlin.gradle.utils.RUNTIME
|
||||
import org.jetbrains.kotlin.gradle.plugin.internal.isProjectIsolationEnabled
|
||||
import org.jetbrains.kotlin.gradle.utils.*
|
||||
import org.jetbrains.kotlin.statistics.BuildSessionLogger
|
||||
import org.jetbrains.kotlin.statistics.metrics.BooleanMetrics
|
||||
import org.jetbrains.kotlin.statistics.metrics.NumericalMetrics
|
||||
@@ -61,92 +58,102 @@ class KotlinBuildStatHandler {
|
||||
}
|
||||
}
|
||||
|
||||
fun reportGlobalMetricsAndBuildFinished(
|
||||
gradle: Gradle?,
|
||||
beanName: ObjectName,
|
||||
fun reportGlobalMetrics(
|
||||
sessionLogger: BuildSessionLogger,
|
||||
action: String?,
|
||||
failure: Throwable?
|
||||
) {
|
||||
runSafe("${KotlinBuildStatHandler::class.java}.reportGlobalMetrics") {
|
||||
try {
|
||||
try {
|
||||
if (gradle != null) reportGlobalMetrics(gradle, sessionLogger)
|
||||
} finally {
|
||||
sessionLogger.finishBuildSession(action, failure)
|
||||
}
|
||||
} finally {
|
||||
buildFinished(beanName)
|
||||
}
|
||||
System.getProperty("os.name")?.also { sessionLogger.report(StringMetrics.OS_TYPE, System.getProperty("os.name")) }
|
||||
sessionLogger.report(NumericalMetrics.CPU_NUMBER_OF_CORES, Runtime.getRuntime().availableProcessors().toLong())
|
||||
sessionLogger.report(BooleanMetrics.EXECUTED_FROM_IDEA, System.getProperty("idea.active") != null)
|
||||
sessionLogger.report(NumericalMetrics.GRADLE_DAEMON_HEAP_SIZE, Runtime.getRuntime().maxMemory())
|
||||
}
|
||||
}
|
||||
|
||||
internal fun reportGlobalMetrics(gradle: Gradle, sessionLogger: BuildSessionLogger) {
|
||||
sessionLogger.report(StringMetrics.PROJECT_PATH, gradle.rootProject.projectDir.absolutePath)
|
||||
System.getProperty("os.name")?.also { sessionLogger.report(StringMetrics.OS_TYPE, System.getProperty("os.name")) }
|
||||
sessionLogger.report(NumericalMetrics.CPU_NUMBER_OF_CORES, Runtime.getRuntime().availableProcessors().toLong())
|
||||
sessionLogger.report(StringMetrics.GRADLE_VERSION, gradle.gradleVersion)
|
||||
sessionLogger.report(BooleanMetrics.EXECUTED_FROM_IDEA, System.getProperty("idea.active") != null)
|
||||
sessionLogger.report(NumericalMetrics.GRADLE_DAEMON_HEAP_SIZE, Runtime.getRuntime().maxMemory())
|
||||
sessionLogger.report(
|
||||
BooleanMetrics.KOTLIN_OFFICIAL_CODESTYLE,
|
||||
gradle.rootProject.providers.gradleProperty("kotlin.code.style").orNull == "official"
|
||||
) // constants are saved in IDEA plugin and could not be accessed directly
|
||||
internal fun reportBuildFinished(
|
||||
sessionLogger: BuildSessionLogger,
|
||||
action: String?,
|
||||
buildFailed: Boolean,
|
||||
configurationMetrics: MetricContainer,
|
||||
) {
|
||||
runSafe("${KotlinBuildStatHandler::class.java}.reportBuildFinish") {
|
||||
configurationMetrics.report(sessionLogger)
|
||||
sessionLogger.finishBuildSession(action, buildFailed)
|
||||
}
|
||||
}
|
||||
|
||||
gradle.taskGraph.whenReady() { taskExecutionGraph ->
|
||||
val executedTaskNames = taskExecutionGraph.allTasks.map { it.name }.distinct()
|
||||
report(sessionLogger, BooleanMetrics.MAVEN_PUBLISH_EXECUTED, executedTaskNames.contains("install"), null)
|
||||
internal fun collectConfigurationTimeMetrics(
|
||||
project: Project,
|
||||
sessionLogger: BuildSessionLogger,
|
||||
): MetricContainer {
|
||||
val gradle = project.gradle
|
||||
val configurationTimeMetrics = MetricContainer()
|
||||
configurationTimeMetrics.put(StringMetrics.PROJECT_PATH, gradle.rootProject.projectDir.absolutePath)
|
||||
configurationTimeMetrics.put(StringMetrics.GRADLE_VERSION, gradle.gradleVersion)
|
||||
|
||||
if (project.isProjectIsolationEnabled) { //support project isolation - KT-58768
|
||||
return configurationTimeMetrics
|
||||
}
|
||||
|
||||
gradle.taskGraph.whenReady { taskExecutionGraph ->
|
||||
val executedTaskNames = taskExecutionGraph.allTasks.map { it.name }.distinct()
|
||||
configurationTimeMetrics.put(BooleanMetrics.MAVEN_PUBLISH_EXECUTED, executedTaskNames.contains("install"))
|
||||
}// constants are saved in IDEA plugin and could not be accessed directly
|
||||
fun buildSrcExists(project: Project) = File(project.projectDir, "buildSrc").exists()
|
||||
sessionLogger.report(BooleanMetrics.BUILD_SRC_EXISTS, buildSrcExists(gradle.rootProject))
|
||||
configurationTimeMetrics.put(BooleanMetrics.BUILD_SRC_EXISTS, buildSrcExists(gradle.rootProject))
|
||||
|
||||
val statisticOverhead = measureTimeMillis {
|
||||
gradle.allprojects { project ->
|
||||
project.plugins.findPlugin(DOKKA_PLUGIN)?.also {
|
||||
sessionLogger.report(BooleanMetrics.ENABLED_DOKKA, true)
|
||||
configurationTimeMetrics.put(BooleanMetrics.ENABLED_DOKKA, true)
|
||||
}
|
||||
for (configuration in project.configurations) {
|
||||
val configurationName = configuration.name
|
||||
val dependencies = configuration.dependencies
|
||||
try {
|
||||
val configurationName = configuration.name
|
||||
val dependencies = configuration.dependencies
|
||||
|
||||
when (configurationName) {
|
||||
"KoverEngineConfig" -> {
|
||||
sessionLogger.report(BooleanMetrics.ENABLED_KOVER, true)
|
||||
}
|
||||
"kapt" -> {
|
||||
sessionLogger.report(BooleanMetrics.ENABLED_KAPT, true)
|
||||
for (dependency in dependencies) {
|
||||
when (dependency.group) {
|
||||
"com.google.dagger" -> sessionLogger.report(BooleanMetrics.ENABLED_DAGGER, true)
|
||||
"com.android.databinding" -> sessionLogger.report(BooleanMetrics.ENABLED_DATABINDING, true)
|
||||
when (configurationName) {
|
||||
"KoverEngineConfig" -> {
|
||||
configurationTimeMetrics.put(BooleanMetrics.ENABLED_KOVER, true)
|
||||
}
|
||||
"kapt" -> {
|
||||
configurationTimeMetrics.put(BooleanMetrics.ENABLED_KAPT, true)
|
||||
for (dependency in dependencies) {
|
||||
when (dependency.group) {
|
||||
"com.google.dagger" -> configurationTimeMetrics.put(BooleanMetrics.ENABLED_DAGGER, true)
|
||||
"com.android.databinding" -> configurationTimeMetrics.put(BooleanMetrics.ENABLED_DATABINDING, true)
|
||||
}
|
||||
}
|
||||
}
|
||||
API -> {
|
||||
configurationTimeMetrics.put(NumericalMetrics.CONFIGURATION_API_COUNT, 1)
|
||||
reportLibrariesVersions(configurationTimeMetrics, dependencies)
|
||||
}
|
||||
IMPLEMENTATION -> {
|
||||
configurationTimeMetrics.put(NumericalMetrics.CONFIGURATION_IMPLEMENTATION_COUNT, 1)
|
||||
reportLibrariesVersions(configurationTimeMetrics, dependencies)
|
||||
}
|
||||
COMPILE -> {
|
||||
configurationTimeMetrics.put(NumericalMetrics.CONFIGURATION_COMPILE_COUNT, 1)
|
||||
reportLibrariesVersions(configurationTimeMetrics, dependencies)
|
||||
}
|
||||
RUNTIME -> {
|
||||
configurationTimeMetrics.put(NumericalMetrics.CONFIGURATION_RUNTIME_COUNT, 1)
|
||||
reportLibrariesVersions(configurationTimeMetrics, dependencies)
|
||||
}
|
||||
}
|
||||
API -> {
|
||||
sessionLogger.report(NumericalMetrics.CONFIGURATION_API_COUNT, 1)
|
||||
reportLibrariesVersions(sessionLogger, dependencies)
|
||||
}
|
||||
IMPLEMENTATION -> {
|
||||
sessionLogger.report(NumericalMetrics.CONFIGURATION_IMPLEMENTATION_COUNT, 1)
|
||||
reportLibrariesVersions(sessionLogger, dependencies)
|
||||
}
|
||||
COMPILE -> {
|
||||
sessionLogger.report(NumericalMetrics.CONFIGURATION_COMPILE_COUNT, 1)
|
||||
reportLibrariesVersions(sessionLogger, dependencies)
|
||||
}
|
||||
RUNTIME -> {
|
||||
sessionLogger.report(NumericalMetrics.CONFIGURATION_RUNTIME_COUNT, 1)
|
||||
reportLibrariesVersions(sessionLogger, dependencies)
|
||||
}
|
||||
} catch (e: Throwable) {
|
||||
// log?
|
||||
}
|
||||
}
|
||||
val taskNames = project.tasks.names
|
||||
|
||||
sessionLogger.report(NumericalMetrics.NUMBER_OF_SUBPROJECTS, 1)
|
||||
sessionLogger.report(BooleanMetrics.KOTLIN_KTS_USED, project.buildscript.sourceFile?.name?.endsWith(".kts") ?: false)
|
||||
sessionLogger.report(NumericalMetrics.GRADLE_NUMBER_OF_TASKS, taskNames.size.toLong())
|
||||
sessionLogger.report(
|
||||
configurationTimeMetrics.put(NumericalMetrics.NUMBER_OF_SUBPROJECTS, 1)
|
||||
configurationTimeMetrics.put(
|
||||
BooleanMetrics.KOTLIN_KTS_USED,
|
||||
project.buildscript.sourceFile?.name?.endsWith(".kts") ?: false
|
||||
)
|
||||
configurationTimeMetrics.put(NumericalMetrics.GRADLE_NUMBER_OF_TASKS, taskNames.size.toLong())
|
||||
configurationTimeMetrics.put(
|
||||
NumericalMetrics.GRADLE_NUMBER_OF_UNCONFIGURED_TASKS,
|
||||
taskNames.count { name ->
|
||||
try {
|
||||
@@ -157,52 +164,54 @@ class KotlinBuildStatHandler {
|
||||
}.toLong()
|
||||
)
|
||||
|
||||
if (buildSrcExists(project)) {
|
||||
sessionLogger.report(NumericalMetrics.BUILD_SRC_COUNT, 1)
|
||||
sessionLogger.report(BooleanMetrics.BUILD_SRC_EXISTS, true)
|
||||
if (project.name == "buildSrc") {
|
||||
configurationTimeMetrics.put(NumericalMetrics.BUILD_SRC_COUNT, 1)
|
||||
configurationTimeMetrics.put(BooleanMetrics.BUILD_SRC_EXISTS, true)
|
||||
}
|
||||
}
|
||||
}
|
||||
sessionLogger.report(NumericalMetrics.STATISTICS_VISIT_ALL_PROJECTS_OVERHEAD, statisticOverhead)
|
||||
|
||||
return configurationTimeMetrics
|
||||
}
|
||||
|
||||
private fun reportLibrariesVersions(sessionLogger: BuildSessionLogger, dependencies: DependencySet?) {
|
||||
private fun reportLibrariesVersions(configurationTimeMetrics: MetricContainer, dependencies: DependencySet?) {
|
||||
dependencies?.forEach { dependency ->
|
||||
when {
|
||||
dependency.group?.startsWith("org.springframework") ?: false -> sessionLogger.report(
|
||||
dependency.group?.startsWith("org.springframework") ?: false -> configurationTimeMetrics.put(
|
||||
StringMetrics.LIBRARY_SPRING_VERSION,
|
||||
dependency.version ?: "0.0.0"
|
||||
)
|
||||
dependency.group?.startsWith("com.vaadin") ?: false -> sessionLogger.report(
|
||||
dependency.group?.startsWith("com.vaadin") ?: false -> configurationTimeMetrics.put(
|
||||
StringMetrics.LIBRARY_VAADIN_VERSION,
|
||||
dependency.version ?: "0.0.0"
|
||||
)
|
||||
dependency.group?.startsWith("com.google.gwt") ?: false -> sessionLogger.report(
|
||||
dependency.group?.startsWith("com.google.gwt") ?: false -> configurationTimeMetrics.put(
|
||||
StringMetrics.LIBRARY_GWT_VERSION,
|
||||
dependency.version ?: "0.0.0"
|
||||
)
|
||||
dependency.group?.startsWith("org.hibernate") ?: false -> sessionLogger.report(
|
||||
dependency.group?.startsWith("org.hibernate") ?: false -> configurationTimeMetrics.put(
|
||||
StringMetrics.LIBRARY_HIBERNATE_VERSION,
|
||||
dependency.version ?: "0.0.0"
|
||||
)
|
||||
dependency.group == "org.jetbrains.kotlin" && dependency.name.startsWith("kotlin-stdlib") -> sessionLogger.report(
|
||||
dependency.group == "org.jetbrains.kotlin" && dependency.name.startsWith("kotlin-stdlib") -> configurationTimeMetrics.put(
|
||||
StringMetrics.KOTLIN_STDLIB_VERSION,
|
||||
dependency.version ?: "0.0.0"
|
||||
)
|
||||
dependency.group == "org.jetbrains.kotlinx" && dependency.name == "kotlinx-coroutines" -> sessionLogger.report(
|
||||
dependency.group == "org.jetbrains.kotlinx" && dependency.name == "kotlinx-coroutines" -> configurationTimeMetrics.put(
|
||||
StringMetrics.KOTLIN_COROUTINES_VERSION,
|
||||
dependency.version ?: "0.0.0"
|
||||
)
|
||||
dependency.group == "org.jetbrains.kotlin" && dependency.name == "kotlin-reflect" -> sessionLogger.report(
|
||||
dependency.group == "org.jetbrains.kotlin" && dependency.name == "kotlin-reflect" -> configurationTimeMetrics.put(
|
||||
StringMetrics.KOTLIN_REFLECT_VERSION,
|
||||
dependency.version ?: "0.0.0"
|
||||
)
|
||||
dependency.group == "org.jetbrains.kotlinx" && dependency.name
|
||||
.startsWith("kotlinx-serialization-runtime") -> sessionLogger.report(
|
||||
.startsWith("kotlinx-serialization-runtime") -> configurationTimeMetrics.put(
|
||||
StringMetrics.KOTLIN_SERIALIZATION_VERSION,
|
||||
dependency.version ?: "0.0.0"
|
||||
)
|
||||
dependency.group == "com.android.tools.build" && dependency.name.startsWith("gradle") -> sessionLogger.report(
|
||||
dependency.group == "com.android.tools.build" && dependency.name.startsWith("gradle") -> configurationTimeMetrics.put(
|
||||
StringMetrics.ANDROID_GRADLE_PLUGIN_VERSION,
|
||||
dependency.version ?: "0.0.0"
|
||||
)
|
||||
@@ -215,7 +224,7 @@ class KotlinBuildStatHandler {
|
||||
metric: BooleanMetrics,
|
||||
value: Boolean,
|
||||
subprojectName: String?,
|
||||
weight: Long? = null
|
||||
weight: Long? = null,
|
||||
) = runSafe("report metric ${metric.name}") {
|
||||
sessionLogger.report(metric, value, subprojectName, weight)
|
||||
} ?: false
|
||||
@@ -225,7 +234,7 @@ class KotlinBuildStatHandler {
|
||||
metric: NumericalMetrics,
|
||||
value: Long,
|
||||
subprojectName: String?,
|
||||
weight: Long? = null
|
||||
weight: Long? = null,
|
||||
) = runSafe("report metric ${metric.name}") {
|
||||
sessionLogger.report(metric, value, subprojectName, weight)
|
||||
} ?: false
|
||||
@@ -235,7 +244,7 @@ class KotlinBuildStatHandler {
|
||||
metric: StringMetrics,
|
||||
value: String,
|
||||
subprojectName: String?,
|
||||
weight: Long? = null
|
||||
weight: Long? = null,
|
||||
) = runSafe("report metric ${metric.name}") {
|
||||
sessionLogger.report(metric, value, subprojectName, weight)
|
||||
} ?: false
|
||||
|
||||
+37
-25
@@ -5,8 +5,6 @@
|
||||
|
||||
package org.jetbrains.kotlin.gradle.plugin.statistics
|
||||
|
||||
import org.gradle.BuildAdapter
|
||||
import org.gradle.BuildResult
|
||||
import org.gradle.api.Project
|
||||
import org.gradle.api.invocation.Gradle
|
||||
import org.gradle.api.logging.Logger
|
||||
@@ -19,13 +17,13 @@ import org.jetbrains.kotlin.gradle.plugin.BuildEventsListenerRegistryHolder
|
||||
import org.jetbrains.kotlin.gradle.plugin.statistics.KotlinBuildStatHandler.Companion.runSafe
|
||||
import org.jetbrains.kotlin.gradle.plugin.statistics.old.Pre232IdeaKotlinBuildStatsMXBean
|
||||
import org.jetbrains.kotlin.gradle.plugin.statistics.old.Pre232IdeaKotlinBuildStatsService
|
||||
import org.jetbrains.kotlin.gradle.utils.isConfigurationCacheAvailable
|
||||
import org.jetbrains.kotlin.statistics.BuildSessionLogger
|
||||
import org.jetbrains.kotlin.statistics.BuildSessionLogger.Companion.STATISTICS_FOLDER_NAME
|
||||
import org.jetbrains.kotlin.statistics.metrics.BooleanMetrics
|
||||
import org.jetbrains.kotlin.statistics.metrics.IStatisticsValuesConsumer
|
||||
import org.jetbrains.kotlin.statistics.metrics.NumericalMetrics
|
||||
import org.jetbrains.kotlin.statistics.metrics.StringMetrics
|
||||
import java.io.Closeable
|
||||
import java.io.File
|
||||
import java.lang.management.ManagementFactory
|
||||
import javax.management.MBeanServer
|
||||
@@ -48,7 +46,7 @@ interface KotlinBuildStatsMXBean {
|
||||
}
|
||||
|
||||
|
||||
internal abstract class KotlinBuildStatsService internal constructor() : BuildAdapter(), IStatisticsValuesConsumer {
|
||||
internal abstract class KotlinBuildStatsService internal constructor() : IStatisticsValuesConsumer, Closeable {
|
||||
companion object {
|
||||
// Do not rename this bean otherwise compatibility with the older Kotlin Gradle Plugins would be lost
|
||||
private const val JMX_BEAN_NAME_BEFORE_232_IDEA = "org.jetbrains.kotlin.gradle.plugin.statistics:type=StatsService"
|
||||
@@ -77,7 +75,7 @@ internal abstract class KotlinBuildStatsService internal constructor() : BuildAd
|
||||
*/
|
||||
@JvmStatic
|
||||
@Synchronized
|
||||
fun getInstance(): IStatisticsValuesConsumer? {
|
||||
fun getInstance(): KotlinBuildStatsService? {
|
||||
if (statisticsIsEnabled != true) {
|
||||
return null
|
||||
}
|
||||
@@ -101,7 +99,7 @@ internal abstract class KotlinBuildStatsService internal constructor() : BuildAd
|
||||
*/
|
||||
@JvmStatic
|
||||
@Synchronized
|
||||
internal fun getOrCreateInstance(project: Project): IStatisticsValuesConsumer? {
|
||||
internal fun getOrCreateInstance(project: Project): KotlinBuildStatsService? {
|
||||
|
||||
return runSafe("${KotlinBuildStatsService::class.java}.getOrCreateInstance") {
|
||||
val gradle = project.gradle
|
||||
@@ -131,11 +129,7 @@ internal abstract class KotlinBuildStatsService internal constructor() : BuildAd
|
||||
registerPre232IdeaStatsBean(mbs, gradle, log)
|
||||
}
|
||||
|
||||
if (!isConfigurationCacheAvailable(gradle)) {
|
||||
gradle.addBuildListener(instance!!)
|
||||
}
|
||||
|
||||
BuildEventsListenerRegistryHolder.getInstance(project).listenerRegistry.onTaskCompletion(project.provider {
|
||||
BuildEventsListenerRegistryHolder.getInstance(project).listenerRegistry.onTaskCompletion(project.provider {
|
||||
OperationCompletionListener { event ->
|
||||
if (event is TaskFinishEvent) {
|
||||
reportTaskIfNeed(event.descriptor.name)
|
||||
@@ -181,7 +175,7 @@ internal abstract class KotlinBuildStatsService internal constructor() : BuildAd
|
||||
* Invokes provided collector if the reporting service is initialised.
|
||||
* The duration of collector's wall time is reported into overall overhead metric.
|
||||
*/
|
||||
fun applyIfInitialised(collector: (IStatisticsValuesConsumer) -> Unit) {
|
||||
fun applyIfInitialised(collector: (KotlinBuildStatsService) -> Unit) {
|
||||
getInstance()?.apply {
|
||||
try {
|
||||
val duration = measureTimeMillis {
|
||||
@@ -213,6 +207,22 @@ internal abstract class KotlinBuildStatsService internal constructor() : BuildAd
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun close() {
|
||||
instance = null
|
||||
}
|
||||
|
||||
/**
|
||||
* Collects metrics at the end of a build
|
||||
*/
|
||||
open fun recordBuildFinish(action: String?, buildFailed: Boolean, configurationTimeMetrics: MetricContainer) {}
|
||||
|
||||
/**
|
||||
* Collect project general and configuration metrics at the start of a build
|
||||
*/
|
||||
open fun collectStartMetrics(project: Project): MetricContainer = MetricContainer()
|
||||
|
||||
open fun recordProjectsEvaluated(gradle: Gradle) {}
|
||||
}
|
||||
|
||||
internal class JMXKotlinBuildStatsService(private val mbs: MBeanServer, private val beanName: ObjectName) :
|
||||
@@ -242,14 +252,11 @@ internal class JMXKotlinBuildStatsService(private val mbs: MBeanServer, private
|
||||
callJmx("reportString", "java.lang.String", metric.name, value, subprojectName, weight)
|
||||
} as? Boolean ?: false
|
||||
|
||||
override fun buildFinished(result: BuildResult) {
|
||||
instance = null
|
||||
}
|
||||
}
|
||||
|
||||
internal abstract class AbstractKotlinBuildStatsService(
|
||||
gradle: Gradle,
|
||||
protected val beanName: ObjectName,
|
||||
private val beanName: ObjectName,
|
||||
) : KotlinBuildStatsService() {
|
||||
companion object {
|
||||
//test only
|
||||
@@ -275,13 +282,16 @@ internal abstract class AbstractKotlinBuildStatsService(
|
||||
private val sessionLoggerRootPath =
|
||||
customSessionLoggerRootPath?.let { File(it) } ?: gradle.gradleUserHomeDir
|
||||
|
||||
protected val sessionLogger = BuildSessionLogger(sessionLoggerRootPath, forceValuesValidation = forcePropertiesValidation)
|
||||
protected val sessionLogger = BuildSessionLogger(
|
||||
sessionLoggerRootPath,
|
||||
forceValuesValidation = forcePropertiesValidation,
|
||||
)
|
||||
|
||||
private fun gradleBuildStartTime(gradle: Gradle): Long? {
|
||||
return (gradle as? DefaultGradle)?.services?.get(BuildRequestMetaData::class.java)?.startTime
|
||||
}
|
||||
|
||||
override fun projectsEvaluated(gradle: Gradle) {
|
||||
override fun recordProjectsEvaluated(gradle: Gradle) {
|
||||
runSafe("${DefaultKotlinBuildStatsService::class.java}.projectEvaluated") {
|
||||
if (!sessionLogger.isBuildSessionStarted()) {
|
||||
sessionLogger.startBuildSession(
|
||||
@@ -293,15 +303,15 @@ internal abstract class AbstractKotlinBuildStatsService(
|
||||
}
|
||||
|
||||
@Synchronized
|
||||
override fun buildFinished(result: BuildResult) {
|
||||
override fun close() {
|
||||
KotlinBuildStatHandler().buildFinished(beanName)
|
||||
instance = null
|
||||
super.close()
|
||||
}
|
||||
}
|
||||
|
||||
internal class DefaultKotlinBuildStatsService internal constructor(
|
||||
gradle: Gradle,
|
||||
beanName: ObjectName
|
||||
beanName: ObjectName,
|
||||
) : AbstractKotlinBuildStatsService(gradle, beanName), KotlinBuildStatsMXBean {
|
||||
|
||||
override fun report(metric: BooleanMetrics, value: Boolean, subprojectName: String?, weight: Long?): Boolean =
|
||||
@@ -323,9 +333,11 @@ internal class DefaultKotlinBuildStatsService internal constructor(
|
||||
report(StringMetrics.valueOf(name), value, subprojectName, weight)
|
||||
|
||||
//only one jmx bean service should report global metrics
|
||||
@Synchronized
|
||||
override fun buildFinished(result: BuildResult) {
|
||||
KotlinBuildStatHandler().reportGlobalMetricsAndBuildFinished(result.gradle, beanName, sessionLogger, result.action, result.failure)
|
||||
instance = null
|
||||
override fun recordBuildFinish(action: String?, buildFailed: Boolean, configurationTimeMetrics: MetricContainer) {
|
||||
KotlinBuildStatHandler().reportGlobalMetrics(sessionLogger)
|
||||
KotlinBuildStatHandler().reportBuildFinished(sessionLogger, action, buildFailed, configurationTimeMetrics)
|
||||
}
|
||||
|
||||
override fun collectStartMetrics(project: Project) = KotlinBuildStatHandler().collectConfigurationTimeMetrics(project, sessionLogger)
|
||||
|
||||
}
|
||||
|
||||
+14
-6
@@ -22,6 +22,7 @@ import org.gradle.tooling.events.task.TaskExecutionResult
|
||||
import org.gradle.tooling.events.task.TaskFailureResult
|
||||
import org.gradle.tooling.events.task.TaskFinishEvent
|
||||
import org.gradle.tooling.events.task.TaskSkippedResult
|
||||
import org.gradle.util.GradleVersion
|
||||
import org.jetbrains.kotlin.build.report.metrics.BuildMetrics
|
||||
import org.jetbrains.kotlin.build.report.metrics.BuildMetricsReporter
|
||||
import org.jetbrains.kotlin.build.report.metrics.BuildPerformanceMetric
|
||||
@@ -224,25 +225,27 @@ abstract class BuildMetricsService : BuildService<BuildMetricsService.Parameters
|
||||
// BuildScanExtension cant be parameter nor BuildService's field
|
||||
val buildScanExtension = project.rootProject.extensions.findByName("buildScan")
|
||||
val buildScan = buildScanExtension?.let { BuildScanExtensionHolder(it) }
|
||||
val buildReportService = buildMetricService.map { it.buildReportService }
|
||||
|
||||
val buildScanReportSettings = buildMetricService.get().parameters.reportingSettings.orNull?.buildScanReportSettings
|
||||
BuildEventsListenerRegistryHolder.getInstance(project).listenerRegistry.onTaskCompletion(project.provider {
|
||||
OperationCompletionListener { event ->
|
||||
if (event is TaskFinishEvent) {
|
||||
val buildOperation = buildMetricService.get().updateBuildOperationRecord(event)
|
||||
val buildParameters = buildMetricService.get().parameters.toBuildReportParameters()
|
||||
val buildReportService = buildMetricService.map { it.buildReportService }
|
||||
buildReportService.get().onFinish(event, buildOperation, buildParameters, buildScan)
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
val buildScanReportSettings = buildMetricService.get().parameters.reportingSettings.orNull?.buildScanReportSettings
|
||||
if (buildScanReportSettings != null) {
|
||||
buildScan?.also {
|
||||
buildReportService.get().initBuildScanTags(
|
||||
buildMetricService.map { it.buildReportService }.get().initBuildScanTags(
|
||||
it, buildMetricService.get().parameters.label.orNull
|
||||
)
|
||||
it.buildScan.buildFinished {
|
||||
buildReportService.get().addCollectedTags(buildScan)
|
||||
if (GradleVersion.current().baseVersion < GradleVersion.version("8.0")) {
|
||||
it.buildScan.buildFinished {
|
||||
buildMetricService.map { it.addCollectedTagsToBuildScan(buildScan) }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -273,6 +276,11 @@ abstract class BuildMetricsService : BuildService<BuildMetricsService.Parameters
|
||||
}
|
||||
}
|
||||
|
||||
internal fun addCollectedTagsToBuildScan(buildScan: BuildScanExtensionHolder?) {
|
||||
if (buildScan == null) return
|
||||
buildReportService.addCollectedTags(buildScan)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
internal class TaskRecord(
|
||||
|
||||
+11
-11
@@ -53,8 +53,8 @@ class BuildSessionLoggerTest {
|
||||
|
||||
assertEquals(true, logger1.isBuildSessionStarted())
|
||||
|
||||
logger1.finishBuildSession("", null)
|
||||
logger2.finishBuildSession("", null)
|
||||
logger1.finishBuildSession("", false)
|
||||
logger2.finishBuildSession("", false)
|
||||
|
||||
rootFolder.listFiles()?.first()?.listFiles()?.forEach { file ->
|
||||
assertTrue(
|
||||
@@ -69,21 +69,21 @@ class BuildSessionLoggerTest {
|
||||
val maxFileSize = 10_000
|
||||
val logger = BuildSessionLogger(rootFolder, 100, maxFileSize.toLong())
|
||||
logger.startBuildSession(0, null)
|
||||
logger.finishBuildSession("", null)
|
||||
logger.finishBuildSession("", false)
|
||||
|
||||
assertEquals(1, statFilesCount())
|
||||
|
||||
val file2edit = rootFolder.listFiles()?.first()?.listFiles()?.first() ?: fail("Could not find single stat file")
|
||||
|
||||
logger.startBuildSession(0, 0)
|
||||
logger.finishBuildSession("", null)
|
||||
logger.finishBuildSession("", false)
|
||||
//new file should not be created
|
||||
assertEquals(1, statFilesCount())
|
||||
|
||||
file2edit.appendBytes(ByteArray(maxFileSize))
|
||||
|
||||
logger.startBuildSession(0, 0)
|
||||
logger.finishBuildSession("", null)
|
||||
logger.finishBuildSession("", false)
|
||||
|
||||
// a new file should be created as maximal file size
|
||||
assertEquals(2, statFilesCount())
|
||||
@@ -94,7 +94,7 @@ class BuildSessionLoggerTest {
|
||||
val maxFiles = 100
|
||||
val logger = BuildSessionLogger(rootFolder, maxFiles)
|
||||
logger.startBuildSession(0, null)
|
||||
logger.finishBuildSession("", null)
|
||||
logger.finishBuildSession("", false)
|
||||
assertEquals(1, statFilesCount())
|
||||
|
||||
val statsFolder = rootFolder.listFiles()?.single() ?: fail("${rootFolder.absolutePath} was not created")
|
||||
@@ -107,7 +107,7 @@ class BuildSessionLoggerTest {
|
||||
}
|
||||
|
||||
logger.startBuildSession(0, 0)
|
||||
logger.finishBuildSession("", null)
|
||||
logger.finishBuildSession("", false)
|
||||
|
||||
assertTrue(
|
||||
statsFolder.listFiles()?.count { it.name == singleStatFile.name } == 1,
|
||||
@@ -139,7 +139,7 @@ class BuildSessionLoggerTest {
|
||||
|
||||
val startTime = System.currentTimeMillis() - 1001
|
||||
logger.startBuildSession(1, startTime)
|
||||
logger.finishBuildSession("Build", null)
|
||||
logger.finishBuildSession("Build", false)
|
||||
assertEquals(1, statFilesCount())
|
||||
|
||||
val statFile = rootFolder.listFiles()?.single()?.listFiles()?.single() ?: fail("Could not find stat file")
|
||||
@@ -158,7 +158,7 @@ class BuildSessionLoggerTest {
|
||||
}
|
||||
|
||||
|
||||
logger.finishBuildSession("", null)
|
||||
logger.finishBuildSession("", false)
|
||||
|
||||
val metrics = ArrayList<MetricsContainer>()
|
||||
MetricsContainer.readFromFile(statFile) {
|
||||
@@ -194,7 +194,7 @@ class BuildSessionLoggerTest {
|
||||
for (metric in NumericalMetrics.values()) {
|
||||
logger.report(metric, System.currentTimeMillis())
|
||||
}
|
||||
logger.finishBuildSession("Build", null)
|
||||
logger.finishBuildSession("Build", false)
|
||||
|
||||
MetricsContainer.readFromFile(rootFolder.listFiles()?.single()?.listFiles()?.single() ?: fail("Could not find stat file")) {
|
||||
for (metric in StringMetrics.values()) {
|
||||
@@ -217,7 +217,7 @@ class BuildSessionLoggerTest {
|
||||
logger.report(NumericalMetrics.ANALYSIS_LINES_PER_SECOND, 10, null, 9)
|
||||
logger.report(NumericalMetrics.ANALYSIS_LINES_PER_SECOND, 100, null, 1)
|
||||
|
||||
logger.finishBuildSession("Build", null)
|
||||
logger.finishBuildSession("Build", false)
|
||||
MetricsContainer.readFromFile(rootFolder.listFiles()?.single()?.listFiles()?.single() ?: fail("Could not find stat file")) {
|
||||
assertEquals(19L, it.getMetric(NumericalMetrics.ANALYSIS_LINES_PER_SECOND)?.getValue())
|
||||
}
|
||||
|
||||
+6
-3
@@ -20,7 +20,7 @@ class BuildSessionLogger(
|
||||
private val maxProfileFiles: Int = DEFAULT_MAX_PROFILE_FILES,
|
||||
private val maxFileSize: Long = DEFAULT_MAX_PROFILE_FILE_SIZE,
|
||||
private val maxFileAge: Long = DEFAULT_MAX_FILE_AGE,
|
||||
private val forceValuesValidation: Boolean = false
|
||||
private val forceValuesValidation: Boolean = false,
|
||||
) : IStatisticsValuesConsumer {
|
||||
|
||||
companion object {
|
||||
@@ -131,7 +131,10 @@ class BuildSessionLogger(
|
||||
}
|
||||
|
||||
@Synchronized
|
||||
fun finishBuildSession(@Suppress("UNUSED_PARAMETER") action: String?, failure: Throwable?) {
|
||||
fun finishBuildSession(
|
||||
@Suppress("UNUSED_PARAMETER") action: String?,
|
||||
buildFailed: Boolean,
|
||||
) {
|
||||
try {
|
||||
// nanotime could not be used as build start time in nanotime is unknown. As result, the measured duration
|
||||
// could be affected by system clock correction
|
||||
@@ -142,7 +145,7 @@ class BuildSessionLogger(
|
||||
}
|
||||
report(NumericalMetrics.GRADLE_EXECUTION_DURATION, finishTime - it.projectEvaluatedTime)
|
||||
report(NumericalMetrics.BUILD_FINISH_TIME, finishTime)
|
||||
report(BooleanMetrics.BUILD_FAILED, failure != null)
|
||||
report(BooleanMetrics.BUILD_FAILED, buildFailed)
|
||||
}
|
||||
buildSession = null
|
||||
} finally {
|
||||
|
||||
Reference in New Issue
Block a user