Skip to content

Commit 1e66618

Browse files
committed
Added tasks to stage the release artifacts into the prebuilts
directory. This change also moves immutable-collection to firebase-database-collection to match the final name of that SDK. Change-Id: I8ad62e0f181b51469486cff7566f14d6e2b63057
1 parent e491210 commit 1e66618

29 files changed

+505
-16
lines changed
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package com.google.firebase.gradle
2+
3+
import org.gradle.api.DefaultTask
4+
import org.gradle.api.tasks.OutputDirectory
5+
import org.gradle.api.tasks.TaskAction
6+
import org.gradle.api.tasks.incremental.IncrementalTaskInputs
7+
8+
class GenerateGranularLibraryBuildTask extends DefaultTask {
9+
@OutputDirectory
10+
File outputDir
11+
12+
@TaskAction
13+
void execute(IncrementalTaskInputs inputs) {
14+
if (!outputDir.exists()) {
15+
outputDir.mkdirs()
16+
}
17+
18+
File buildFile = new File("${outputDir.absolutePath}/BUILD")
19+
buildFile.write("""# Build file for generating AARs
20+
licenses(["unencumbered"]) # Google owned.
21+
22+
package(
23+
default_visibility = [
24+
"//java/com/google/android/gmscore:gmscore_packages",
25+
],
26+
)
27+
28+
pkg_library(
29+
# Contents of AAR file
30+
name = "aar_files"
31+
srcs = glob([
32+
# Below files are optional for a drop.
33+
"proguard.txt", # buildozer: disable=constant-glob
34+
"res/**/*",
35+
"assets/**/*",
36+
"jni/**/*",
37+
# Third party licenses files are required
38+
# (see http://go/gmscore-third-party-licenses#gmscore-client-third-party-licenses),
39+
# except for clients we generate that do not include their own srcs/deps
40+
"third_party_licenses.json", # buildozer: disable=constant-glob
41+
"third_party_licenses.txt", # buildozer: disable=constant-glob
42+
]) + [
43+
# Below files are required for a drop.
44+
"AndroidManifest.xml",
45+
"R.txt",
46+
"classes.jar",
47+
],
48+
flatten = 0,
49+
tags = [
50+
"AndroidAAR",
51+
"Prebuilt",
52+
],
53+
)
54+
55+
genzip(
56+
# AAR artifact.
57+
name = "lib.aar",
58+
deps = [":aar_files"],
59+
)
60+
""")
61+
}
62+
63+
}
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
package com.google.firebase.gradle
2+
3+
import org.gradle.api.DefaultTask
4+
import org.gradle.api.Project
5+
import org.gradle.api.tasks.Input
6+
import org.gradle.api.tasks.OutputDirectory
7+
import org.gradle.api.tasks.TaskAction
8+
import org.gradle.api.tasks.incremental.IncrementalTaskInputs
9+
10+
import java.lang.reflect.Array;
11+
12+
13+
class GenerateGranularLibraryConfigTask extends DefaultTask {
14+
@Input
15+
List<String> projects
16+
17+
@OutputDirectory
18+
File outputDir
19+
20+
@TaskAction
21+
void execute(IncrementalTaskInputs inputs) {
22+
List<Project> projectsToRelease = projects.collect {
23+
project.project(it)
24+
}
25+
List<GranularLibraryConfig> configs = projectsToRelease.collect {
26+
def configs = it.configurations.findAll {
27+
it.name == 'implementation'
28+
}
29+
30+
def deps = configs.collect {
31+
new ArrayList(it.getAllDependencies())
32+
}.flatten()
33+
return new GranularLibraryConfig(
34+
name: it.ext.prebuiltLibName, version: it.version, externalName: it.name,
35+
deps: deps)
36+
}
37+
if (!outputDir.exists()) {
38+
outputDir.mkdirs()
39+
}
40+
File configFile = new File("${outputDir.absolutePath}/drop_config.pbascii")
41+
configFile.write """library_groups {
42+
${configs.collect { it.toPbAscii(2) }.join('\n')}
43+
name: "fireescape"
44+
}
45+
"""
46+
writeBuildFile()
47+
}
48+
49+
void writeBuildFile() {
50+
File buildFile = new File("${outputDir.absolutePath}/BUILD")
51+
buildFile.write '''
52+
# A package that defines the library groups for this drop
53+
licenses(["unencumbered"]) # Google owned.
54+
package(
55+
default_visibility = [
56+
"//java/com/google/android/gmscore:gmscore_packages",
57+
],
58+
)
59+
60+
pkg_library(
61+
name = "fireescape_library_group_info",
62+
srcs = [
63+
":static_config",
64+
],
65+
flatten = True,
66+
)
67+
68+
genrule(
69+
name = "static_config",
70+
srcs = [":drop_config.pbascii"],
71+
outs = ["//gmscore/sdk/stage/common:library_groups.pbascii"],
72+
cmd = "set -x; cp $(location //gmscore/sdk/stage/common:drop_config.pbascii) \"$@\"",
73+
output_to_bindir = True,
74+
tools = ["//third_party/zip"],
75+
)
76+
'''
77+
}
78+
79+
}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package com.google.firebase.gradle
2+
3+
import groovy.transform.Immutable
4+
import org.gradle.api.artifacts.Dependency
5+
6+
/**
7+
* Generates a library config pbascii needed for the granular build rules.
8+
*/
9+
@Immutable
10+
class GranularLibraryConfig implements Serializable {
11+
String name;
12+
String version;
13+
String externalName;
14+
List<Dependency> deps;
15+
16+
String toPbAscii(int indent) {
17+
String braceIndent = ' '.multiply(indent)
18+
String lineIndent = braceIndent + ' '.multiply(4)
19+
return """
20+
${braceIndent}members {
21+
${lineIndent}drop_aar_target: "//gmscore/sdk/stage/fireescape/${name}:lib.aar
22+
${lineIndent}in_third_party_sdk: true
23+
${lineIndent}sdk_group_id: "com.google.firebase"
24+
${lineIndent}name: "${name}"
25+
${lineIndent}publicly_releasable: true
26+
${lineIndent}version: "${version}"
27+
${lineIndent}external_name: "${externalName}"
28+
${lineIndent}external_deps: [${depsToPbAscii(indent + 4)}
29+
${lineIndent}]
30+
${braceIndent}}"""
31+
}
32+
33+
String depsToPbAscii(int indent) {
34+
String braceIndent = ' '.multiply(indent)
35+
// Add 5 spaces instead of 4 to account for the brace on the preceding line.
36+
String lineIndent = braceIndent + ' '.multiply(5)
37+
List<String> depStrings = new ArrayList<>()
38+
deps.each {
39+
depStrings.add("""\n$braceIndent{
40+
${lineIndent}group_id: "${it.group}"
41+
${lineIndent}artifact_id: "${it.name}"
42+
${lineIndent}version: "${it.version}"
43+
${lineIndent}type: "${typeFromDep(it)}"
44+
${braceIndent}}""")
45+
}
46+
return depStrings.join(',')
47+
}
48+
49+
static String typeFromDep(Dependency dep) {
50+
String type
51+
if (dep.group == 'com.google.firebase' || dep.group == 'com.google.android.gms') {
52+
type = 'aar'
53+
} else {
54+
type = 'jar'
55+
}
56+
return type
57+
}
58+
}

buildSrc/src/main/groovy/com/google/firebase/gradle/MultiProjectReleasePlugin.groovy

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,22 @@ class MultiProjectReleasePlugin implements Plugin<Project> {
152152
}
153153
}
154154

155+
def dropArtifactsInPrebuiltsStaging = project.task('dropInPrebuiltsStaging') {
156+
mustRunAfter(publishArtifacts)
157+
dependsOn projectsToRelease.collect {
158+
"$it.path:createPrebuiltsBuildFile"
159+
}
160+
161+
}
162+
163+
def g3DestDir = "${System.getProperty('g3dir')}/gmscore/sdk/stage/fireescape/"
164+
165+
def generatePrebuiltsConfig = project.task("generatePrebuiltsConfig", type: GenerateGranularLibraryConfigTask) {
166+
mustRunAfter(dropArtifactsInPrebuiltsStaging)
167+
projects = projectNames
168+
outputDir = new File(g3DestDir)
169+
}
170+
155171
// TODO(ashwinraghav) : Move proguard into versioned directory to avoid having to look
156172
// for it via the release tags
157173
def copyProguardMapping = project.task('copyProguardMapping') {
@@ -204,6 +220,7 @@ class MultiProjectReleasePlugin implements Plugin<Project> {
204220
dependsOn performPreReleaseCommits
205221
dependsOn assembleMavenRepoZip
206222
dependsOn performPostReleaseCommits
223+
dependsOn generatePrebuiltsConfig
207224
}
208225
}
209226
}

buildSrc/src/main/groovy/com/google/firebase/gradle/PublishingPlugin.groovy

Lines changed: 31 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@ class PublishingPlugin implements Plugin<Project> {
4747
PublishingPluginExtension coReleasedProjectsExtension =
4848
project.extensions.create('coreleases', PublishingPluginExtension)
4949

50+
def counter = 1
51+
5052
project.subprojects { subProject ->
5153
subProject.task('removeFromMavenLocal') {
5254
description "Delete all versions of the project from local maven"
@@ -98,7 +100,8 @@ class PublishingPlugin implements Plugin<Project> {
98100
// phase. They cannot be set directly by the task during configuration.
99101
// - The tasks' classpath params must be set before it starts executing and hence
100102
// cannot be set in its own doLast block .
101-
def configueClasspathTask = subProject.task('configueClasspath') {
103+
def configureClasspathTask = subProject.task('configureClasspath') {
104+
mustRunAfter assemble
102105
doLast {
103106
def classpath = []
104107
if (LicenseResolverPlugin.isAndroidProject(subProject)) {
@@ -114,7 +117,7 @@ class PublishingPlugin implements Plugin<Project> {
114117
}
115118
// Desugaring related classpath setting
116119
def arguments = desugar.args
117-
arguments.addAll(classpath.collectMany{['--classpath_entry', it]})
120+
arguments.addAll(classpath.collectMany { ['--classpath_entry', it] })
118121
desugar.args = arguments
119122

120123
//Proguarding related classpath setting
@@ -131,12 +134,12 @@ class PublishingPlugin implements Plugin<Project> {
131134
// directory structure is desugared into an equivalent dir that is copied back in
132135
// and overwrites before repackaging.
133136
def desugar = subProject.task('desugar', type: JavaExec) {
134-
dependsOn configueClasspathTask
137+
dependsOn configureClasspathTask
135138
mustRunAfter unpackTask
136139

137140
def inputPath
138141
def outputPath
139-
if(LicenseResolverPlugin.isAndroidProject(subProject)) {
142+
if (LicenseResolverPlugin.isAndroidProject(subProject)) {
140143
inputPath = "${subProject.buildDir}/unpacked/dist/classes.jar"
141144
outputPath = "${subProject.buildDir}/intermediates/desugar/classes.jar"
142145
} else {
@@ -170,7 +173,7 @@ class PublishingPlugin implements Plugin<Project> {
170173
mustRunAfter desugar
171174

172175
def inputPath
173-
if(LicenseResolverPlugin.isAndroidProject(subProject)) {
176+
if (LicenseResolverPlugin.isAndroidProject(subProject)) {
174177
inputPath = "${subProject.buildDir}/intermediates/desugar/classes.jar"
175178
} else {
176179
inputPath = "${subProject.buildDir}/intermediates/desugar"
@@ -195,17 +198,17 @@ class PublishingPlugin implements Plugin<Project> {
195198
}
196199

197200
proguardTask = subProject.task('proguard', type: ProGuardTask) {
198-
dependsOn configueClasspathTask
201+
dependsOn configureClasspathTask
199202
dependsOn licensedArtifactTask
200203
configuration subProject.file("preguard.txt")
201204

202-
if(LicenseResolverPlugin.isAndroidProject(subProject)) {
205+
if (LicenseResolverPlugin.isAndroidProject(subProject)) {
203206
libraryjars subProject.android.sourceSets.main.java.srcDirs
204207
} else {
205208
libraryjars subProject.sourceSets.main.java.srcDirs
206209
}
207210

208-
def proguardReleaseDir = new File(subProject.buildDir,"outputs/mapping/release")
211+
def proguardReleaseDir = new File(subProject.buildDir, "outputs/mapping/release")
209212
proguardReleaseDir.mkdirs()
210213

211214
def mappingFile = new File(proguardReleaseDir, "mapping.txt")
@@ -219,11 +222,30 @@ class PublishingPlugin implements Plugin<Project> {
219222
outjars "build/libs/assembleReleaseProguarded.${LicenseResolverPlugin.isAndroidProject(subProject) ? 'aar' : 'jar'}"
220223
}
221224

225+
subProject.ext.prebuiltLibName = "lib${counter}"
226+
counter++
227+
def g3DestDir = "${System.getProperty('g3dir')}/gmscore/sdk/stage/fireescape/$subProject.prebuiltLibName"
228+
def createPrebuiltsDrop = subProject.task('createPrebuiltsDrop', type: Copy) {
229+
dependsOn proguardTask
230+
def zipFile = "build/libs/assembleReleaseProguarded.${LicenseResolverPlugin.isAndroidProject(subProject) ? 'aar' : 'jar'}"
231+
from zipTree(zipFile)
232+
into g3DestDir
233+
}
234+
235+
def createPrebuiltsBuildFile = subProject.task('createPrebuiltsBuildFile', type: GenerateGranularLibraryBuildTask) {
236+
outputDir new File(g3DestDir)
237+
}
238+
239+
def createPrebuilts = subProject.task('createPrebuilts') {
240+
dependsOn createPrebuiltsBuildFile, createPrebuiltsDrop
241+
}
242+
222243
subProject.apply plugin: 'maven-publish'
223244

224245
tasks.withType(AbstractPublishToMaven.class) {
225246
it.dependsOn assemble
226247
it.dependsOn proguardTask
248+
it.dependsOn createPrebuilts
227249
}
228250

229251
publishing {
@@ -244,7 +266,7 @@ class PublishingPlugin implements Plugin<Project> {
244266
PublishVariants.values().each { variant ->
245267
"mavenJava$variant"(MavenPublication) {
246268
version getVersionToPublish(variant, subProject)
247-
artifact {proguardTask.outputs.files.singleFile}
269+
artifact { proguardTask.outputs.files.singleFile }
248270
pom.withXml {
249271
def rootNode = asNode()
250272
addNameNode(rootNode, subProject.name)

buildSrc/src/test/groovy/com/google/firebase/gradle/BaseSpecification.groovy

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,9 @@ class BaseSpecification extends Specification {
9292

9393
@Rule
9494
final TemporaryFolder testProjectDir = new TemporaryFolder()
95+
96+
@Rule
97+
final TemporaryFolder g3Dir = new TemporaryFolder()
9598
File rootBuildFile
9699
File rootSettingsFile
97100
File javaModuleFolder

0 commit comments

Comments
 (0)