Skip to content

Commit 2b2c8e6

Browse files
authored
Add GMaven Version test (#5257)
NO_RELEASE_CHANGE
1 parent 792fb64 commit 2b2c8e6

File tree

8 files changed

+140
-15
lines changed

8 files changed

+140
-15
lines changed

.github/workflows/version-check.yml

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
name: Version Check
2+
3+
on:
4+
workflow_dispatch:
5+
pull_request:
6+
branches:
7+
- 'releases/**'
8+
9+
jobs:
10+
version-check:
11+
runs-on: ubuntu-latest
12+
steps:
13+
- uses: actions/[email protected]
14+
15+
- name: Build
16+
run: |
17+
./gradlew gmavenVersionCheck

buildSrc/src/main/java/com/google/firebase/gradle/plugins/FirebaseJavaLibraryPlugin.kt

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,11 +56,17 @@ class FirebaseJavaLibraryPlugin : BaseFirebaseLibraryPlugin() {
5656
setupStaticAnalysis(project, firebaseLibrary)
5757
setupApiInformationAnalysis(project)
5858
getIsPomValidTask(project, firebaseLibrary)
59-
getSemverTaskJar(project, firebaseLibrary)
59+
setupVersionCheckTasks(project, firebaseLibrary)
6060
configurePublishing(project, firebaseLibrary)
6161
}
6262

63-
private fun getSemverTaskJar(project: Project, firebaseLibrary: FirebaseLibraryExtension) {
63+
private fun setupVersionCheckTasks(project: Project, firebaseLibrary: FirebaseLibraryExtension) {
64+
project.tasks.register<GmavenVersionChecker>("gmavenVersionCheck") {
65+
groupId.value(firebaseLibrary.groupId.get())
66+
artifactId.value(firebaseLibrary.artifactId.get())
67+
version.value(firebaseLibrary.version)
68+
latestReleasedVersion.value(firebaseLibrary.latestReleasedVersion.orElseGet { "" })
69+
}
6470
project.mkdir("semver")
6571
project.tasks.register<GmavenCopier>("copyPreviousArtifacts") {
6672
dependsOn("jar")

buildSrc/src/main/java/com/google/firebase/gradle/plugins/FirebaseLibraryPlugin.kt

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,11 +84,17 @@ class FirebaseLibraryPlugin : BaseFirebaseLibraryPlugin() {
8484
android.testServer(FirebaseTestServer(project, firebaseLibrary.testLab, android))
8585
setupStaticAnalysis(project, firebaseLibrary)
8686
getIsPomValidTask(project, firebaseLibrary)
87-
getSemverTaskAar(project, firebaseLibrary)
87+
setupVersionCheckTasks(project, firebaseLibrary)
8888
configurePublishing(project, firebaseLibrary, android)
8989
}
9090

91-
private fun getSemverTaskAar(project: Project, firebaseLibrary: FirebaseLibraryExtension) {
91+
private fun setupVersionCheckTasks(project: Project, firebaseLibrary: FirebaseLibraryExtension) {
92+
project.tasks.register<GmavenVersionChecker>("gmavenVersionCheck") {
93+
groupId.value(firebaseLibrary.groupId.get())
94+
artifactId.value(firebaseLibrary.artifactId.get())
95+
version.value(firebaseLibrary.version)
96+
latestReleasedVersion.value(firebaseLibrary.latestReleasedVersion.orElseGet { "" })
97+
}
9298
project.mkdir("semver")
9399
project.mkdir("semver/previous-version")
94100
project.tasks.register<GmavenCopier>("copyPreviousArtifacts") {

buildSrc/src/main/java/com/google/firebase/gradle/plugins/GmavenHelper.kt

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -48,17 +48,35 @@ class GmavenHelper(val groupId: String, val artifactId: String) {
4848
return "${GMAVEN_ROOT}/${groupIdAsPath}/${artifactId}/${version}/${fileName}"
4949
}
5050

51+
fun hasReleasedVersion(version: String): Boolean {
52+
val doc: Document? = getMavenMetadata()
53+
if (doc != null) {
54+
val versions = doc.getElementsByTagName("version")
55+
for (i in 0..versions.length - 1) {
56+
if (versions.item(i).textContent == version) {
57+
return true
58+
}
59+
}
60+
}
61+
return false
62+
}
63+
5164
fun getLatestReleasedVersion(): String {
65+
val doc: Document? = getMavenMetadata()
66+
return doc?.getElementsByTagName("latest")?.item(0)?.getTextContent() ?: ""
67+
}
68+
69+
fun getMavenMetadata(): Document? {
70+
val groupIdAsPath = groupId.replace(".", "/")
71+
val mavenMetadataUrl = "${GMAVEN_ROOT}/${groupIdAsPath}/${artifactId}/maven-metadata.xml"
72+
val factory: DocumentBuilderFactory = DocumentBuilderFactory.newInstance()
73+
val builder: DocumentBuilder = factory.newDocumentBuilder()
5274
try {
53-
val groupIdAsPath = groupId.replace(".", "/")
54-
val mavenMetadataUrl = "${GMAVEN_ROOT}/${groupIdAsPath}/${artifactId}/maven-metadata.xml"
55-
val factory: DocumentBuilderFactory = DocumentBuilderFactory.newInstance()
56-
val builder: DocumentBuilder = factory.newDocumentBuilder()
5775
val doc: Document = builder.parse(URL(mavenMetadataUrl).openStream())
5876
doc.documentElement.normalize()
59-
return doc.getElementsByTagName("latest").item(0).getTextContent()
77+
return doc
6078
} catch (e: FileNotFoundException) {
61-
return ""
79+
return null
6280
}
6381
}
6482
}
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
// Copyright 2023 Google LLC
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License");
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
6+
//
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
//
9+
// Unless required by applicable law or agreed to in writing, software
10+
// distributed under the License is distributed on an "AS IS" BASIS,
11+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
// See the License for the specific language governing permissions and
13+
// limitations under the License.
14+
15+
package com.google.firebase.gradle.plugins
16+
17+
import org.gradle.api.DefaultTask
18+
import org.gradle.api.GradleException
19+
import org.gradle.api.provider.Property
20+
import org.gradle.api.tasks.Input
21+
import org.gradle.api.tasks.TaskAction
22+
23+
abstract class GmavenVersionChecker : DefaultTask() {
24+
25+
@get:Input abstract val groupId: Property<String>
26+
27+
@get:Input abstract val artifactId: Property<String>
28+
29+
@get:Input abstract val latestReleasedVersion: Property<String>
30+
31+
@get:Input abstract val version: Property<String>
32+
33+
@TaskAction
34+
fun run() {
35+
val mavenHelper = GmavenHelper(groupId.get(), artifactId.get())
36+
val latestMavenVersion = mavenHelper.getLatestReleasedVersion()
37+
val info =
38+
"\n latestReleasedVersion in gradle.properties should match the latest release on GMaven (${latestMavenVersion})" +
39+
"\n version in gradle.properties should be a version bump above this, following SemVer, and should not be released on GMaven"
40+
// Either the Maven metadata does not exist, or the library hasn't been released
41+
if (latestMavenVersion.isEmpty()) {
42+
return
43+
}
44+
// TODO(b/285892320): Remove condition when bug fixed
45+
if (artifactId.get() == "protolite-well-known-types") {
46+
return
47+
}
48+
if (version.get() == latestReleasedVersion.get()) {
49+
throw GradleException(
50+
"version and latestReleasedVersion from gradle.properties are the same (${version.get()})" +
51+
info
52+
)
53+
}
54+
if (latestMavenVersion == version.get()) {
55+
throw GradleException(
56+
"version from gradle.properties (${version.get()}) is already the latest release on GMaven" +
57+
info
58+
)
59+
} else if (mavenHelper.hasReleasedVersion(version.get())) {
60+
throw GradleException(
61+
"version from gradle.properties (${version.get()}) has already been released on GMaven" +
62+
info
63+
)
64+
}
65+
if (latestMavenVersion != latestReleasedVersion.get()) {
66+
if (mavenHelper.hasReleasedVersion(latestReleasedVersion.get())) {
67+
throw GradleException(
68+
"latestReleasedVersion from gradle.properties (${latestReleasedVersion.get()}) has been released but is not the latest release on GMaven (${latestMavenVersion})"
69+
)
70+
} else {
71+
throw GradleException(
72+
"latestReleasedVersion from gradle.properties (${latestReleasedVersion.get()}) has not been released on GMaven" +
73+
info
74+
)
75+
}
76+
}
77+
}
78+
}

firebase-messaging/gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
version=23.2.2
2-
latestReleasedVersion=23.2.2
2+
latestReleasedVersion=23.2.1
33
android.enableUnitTestBinaryResources=true

transport/transport-backend-cct/gradle.properties

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,5 +12,5 @@
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
1414

15-
version=3.1.9
16-
latestReleasedVersion=3.1.8
15+
version=3.1.10
16+
latestReleasedVersion=3.1.9

transport/transport-runtime/gradle.properties

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,6 @@
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
1414

15-
version=3.1.9
16-
latestReleasedVersion=3.1.8
15+
version=3.1.10
16+
latestReleasedVersion=3.1.9
1717
android.enableUnitTestBinaryResources=true

0 commit comments

Comments
 (0)