1
+ import groovy.json.JsonBuilder
2
+ import org.gradle.util.VersionNumber
3
+
1
4
plugins {
2
5
id ' com.gradle.plugin-publish' version ' 0.14.0'
6
+ id " org.gradle.test-retry" version " 1.2.0"
3
7
}
4
8
5
9
apply plugin : " java-gradle-plugin"
6
10
apply plugin : " maven-publish"
11
+ apply plugin : " groovy"
7
12
apply plugin : " kotlin"
8
13
9
14
gradlePlugin {
10
15
plugins {
11
- simplePlugin {
16
+ rustAndroidGradlePlugin {
12
17
id = ' org.mozilla.rust-android-gradle'
13
18
implementationClass = ' com.nishtahir.RustAndroidPlugin'
14
19
displayName = ' Plugin for building Rust with Cargo in Android projects'
@@ -20,26 +25,40 @@ gradlePlugin {
20
25
group ' org.mozilla.rust-android-gradle'
21
26
version " $plugin_version "
22
27
28
+ def isCI = (System . getenv(' CI' ) ?: ' false' ). toBoolean()
29
+
30
+ // Maps supported Android plugin versions to the versions of Gradle that support it
31
+ def supportedVersions = [
32
+ " 7.0.0" : [" 7.1.1" ],
33
+ " 4.2.2" : [" 6.8.3" , " 7.1.1" ],
34
+ " 4.1.3" : [" 6.5.1" , " 6.8.3" ],
35
+ " 4.0.2" : [" 6.1.1" , " 6.8.3" ],
36
+ " 3.6.4" : [" 5.6.4" , " 6.8.3" ],
37
+ " 3.5.4" : [" 5.4.1" , " 5.6.4" , " 6.8.3" ],
38
+ " 3.1.2" : [" 4.10.2" ]
39
+ ]
40
+
41
+ // A local repo we publish our library to for testing in order to workaround limitations
42
+ // in the TestKit plugin classpath.
43
+ def localRepo = file(" $buildDir /local-repo" )
23
44
publishing {
24
45
repositories {
25
46
maven {
26
- url " ../samples/maven-repo"
27
- }
28
- }
29
- publications {
30
- maven(MavenPublication ) {
31
- groupId ' org.mozilla.rust-android-gradle'
32
- artifactId ' rust-android'
33
-
34
- from components. java
47
+ url = localRepo. toURI()
35
48
}
36
49
}
37
50
}
38
51
39
52
dependencies {
40
- compileOnly gradleApi()
41
- implementation " com.android.tools.build:gradle:$agp_version "
42
- // implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
53
+ implementation gradleApi()
54
+ compileOnly " com.android.tools.build:gradle:${ agp_version} "
55
+
56
+ testImplementation gradleTestKit()
57
+ testImplementation " com.android.tools.build:gradle:${ agp_version} "
58
+ testImplementation platform(" org.spockframework:spock-bom:2.0-M5-groovy-3.0" )
59
+ testImplementation(" org.spockframework:spock-core" ) { exclude group : ' org.codehaus.groovy' }
60
+ testImplementation(" org.spockframework:spock-junit4" ) { exclude group : ' org.codehaus.groovy' }
61
+ testImplementation " org.junit.jupiter:junit-jupiter-api"
43
62
}
44
63
45
64
compileKotlin {
@@ -54,12 +73,90 @@ pluginBundle {
54
73
vcsUrl = ' https://github.com/mozilla/rust-android-gradle.git'
55
74
tags = [' rust' , ' cargo' , ' android' ]
56
75
57
- plugins {
58
- rustAndroidPlugin {
59
- id = ' org.mozilla.rust-android-gradle.rust-android'
60
- displayName = ' Plugin for building Rust with Cargo in Android projects'
61
- description = ' A plugin that helps build Rust JNI libraries with Cargo for use in Android projects.'
62
- tags = [' rust' , ' cargo' , ' android' ]
76
+ mavenCoordinates {
77
+ groupId = " gradle.plugin.org.mozilla.rust-android-gradle"
78
+ }
79
+ }
80
+
81
+
82
+ // Generate a json file that contains the matrix of Gradle and AGP versions to test against.
83
+ def generatedResources = " $buildDir /generated-resources/main"
84
+ tasks. register(' generateVersions' ) {
85
+ def outputFile = file(" $generatedResources /versions.json" )
86
+ inputs. property " version" , version
87
+ inputs. property " supportedVersions" , supportedVersions
88
+ outputs. dir generatedResources
89
+ doLast {
90
+ outputFile. text = new JsonBuilder ([
91
+ version : version,
92
+ supportedVersions : supportedVersions
93
+ ]). toPrettyString()
94
+ }
95
+ }
96
+
97
+ sourceSets {
98
+ main {
99
+ output. dir(generatedResources, builtBy : tasks. named(' generateVersions' ))
100
+ }
101
+ }
102
+
103
+ // This is used by github actions to split out jobs by Android version test task
104
+ def generatedBuildResources = " $buildDir /build-resources"
105
+ tasks. register(' generateTestTasksJson' ) {
106
+ def outputFile = file(" ${ generatedBuildResources} /androidTestTasks.json" )
107
+ inputs. property " supportedVersions" , supportedVersions
108
+ outputs. dir generatedBuildResources
109
+ doLast {
110
+ outputFile. text = new JsonBuilder (
111
+ // Fails in CI with issues invoking Java 11. The single test that
112
+ // requires Java 11 succeeds. To be investigated in the future.
113
+ // ['test'] +
114
+ (supportedVersions. keySet(). collect {androidVersion -> androidTestTaskName(androidVersion) })
115
+ ). toString()
116
+ }
117
+ }
118
+
119
+ // Configuration common to all test tasks
120
+ tasks. withType(Test ). configureEach {
121
+ dependsOn publish
122
+ systemProperty " local.repo" , localRepo. toURI()
123
+ useJUnitPlatform()
124
+ retry {
125
+ maxRetries = isCI ? 1 : 0
126
+ maxFailures = 20
127
+ }
128
+ }
129
+
130
+ // Generate a test task for each Android version and run the tests annotated with the MultiVersionTest category
131
+ supportedVersions. keySet(). each { androidVersion ->
132
+ def testTaskName = androidTestTaskName(androidVersion)
133
+ def jdkVersion = jdkVersionFor(androidVersion)
134
+ def versionSpecificTest = tasks. register(testTaskName, Test ) {
135
+ description = " Runs the multi-version tests for AGP ${ androidVersion} "
136
+ group = " verification"
137
+
138
+ javaLauncher = javaToolchains. launcherFor {
139
+ languageVersion = jdkVersion
63
140
}
141
+
142
+ systemProperty ' org.gradle.android.testVersion' , androidVersion
143
+ }
144
+
145
+ tasks. named(' check' ). configure {
146
+ dependsOn versionSpecificTest
64
147
}
65
148
}
149
+
150
+ static def androidTestTaskName (String androidVersion ) {
151
+ return " testAndroid${ normalizeVersion(androidVersion)} "
152
+ }
153
+
154
+ static def normalizeVersion (String version ) {
155
+ return version. replaceAll(' [.\\ -]' , ' _' )
156
+ }
157
+
158
+ static def jdkVersionFor (String version ) {
159
+ def jdkVersion = VersionNumber . parse(version) > VersionNumber . parse(" 7.0.0-alpha01" ) ? 11 : 8
160
+
161
+ return JavaLanguageVersion . of(jdkVersion)
162
+ }
0 commit comments