Skip to content

Commit

Permalink
Checks for releases notes before releasing to the play store (#38)
Browse files Browse the repository at this point in the history
  • Loading branch information
VincentMasselis committed May 21, 2024
1 parent 0aa63db commit be830e2
Show file tree
Hide file tree
Showing 4 changed files with 35 additions and 24 deletions.
2 changes: 2 additions & 0 deletions app/phone/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
@file:Suppress("LocalVariableName", "UnstableApiUsage")

import com.masselis.tpmsadvanced.emulator.EmulatorPlugin
import com.masselis.tpmsadvanced.gitflow.GitflowExtension
import com.masselis.tpmsadvanced.playstore.PlayStoreExtension
import com.masselis.tpmsadvanced.playstore.PlayStorePlugin
import com.masselis.tpmsadvanced.playstore.task.UpdatePlayStoreScreenshots
Expand All @@ -20,6 +21,7 @@ if (isDecrypted) {

apply<PlayStorePlugin>()
configure<PlayStoreExtension> {
version = rootProject.the<GitflowExtension>().version
serviceAccountCredentials = file("../../secrets/publisher-service-account.json")
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
package com.masselis.tpmsadvanced.playstore

import StricSemanticVersion
import org.gradle.api.file.RegularFileProperty
import org.gradle.api.provider.Property

public interface PlayStoreExtension {
public val version: Property<StricSemanticVersion>
public val serviceAccountCredentials: RegularFileProperty
}
Original file line number Diff line number Diff line change
@@ -1,31 +1,35 @@
package com.masselis.tpmsadvanced.playstore

import StricSemanticVersion
import com.android.build.api.artifact.SingleArtifact
import com.android.build.api.variant.ApplicationAndroidComponentsExtension
import com.android.build.api.variant.VariantOutputConfiguration.OutputType.SINGLE
import com.android.build.api.variant.impl.VariantOutputImpl
import com.android.build.gradle.internal.scope.getOutputPath
import com.masselis.tpmsadvanced.playstore.task.PublishToPlayStore
import com.masselis.tpmsadvanced.playstore.task.UpdatePlayStoreScreenshots
import com.masselis.tpmsadvanced.playstore.valuesource.ReleaseNote
import org.gradle.api.GradleException
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.configurationcache.extensions.capitalized
import org.gradle.kotlin.dsl.assign
import org.gradle.kotlin.dsl.create
import org.gradle.kotlin.dsl.from
import org.gradle.kotlin.dsl.registerIfAbsent
import org.gradle.kotlin.dsl.the

@Suppress("UnstableApiUsage")
public class PlayStorePlugin : Plugin<Project> {
override fun apply(project: Project) {
val ext = project.extensions.create<PlayStoreExtension>("playStore")
project.gradle.sharedServices.registerIfAbsent(
override fun apply(project: Project): Unit = with(project) {
val ext = extensions.create<PlayStoreExtension>("playStore")
gradle.sharedServices.registerIfAbsent(
"android-publisher-service", AndroidPublisherService::class
) {
parameters.serviceAccountCredentials = ext.serviceAccountCredentials
}

project.the<ApplicationAndroidComponentsExtension>().apply {
the<ApplicationAndroidComponentsExtension>().apply {
onVariants { variant ->
if (variant.isMinifyEnabled.not())
return@onVariants
Expand All @@ -39,33 +43,43 @@ public class PlayStorePlugin : Plugin<Project> {
val versionName = output.versionName
val releaseBundle = output.outputFileName.map { fileName ->
SingleArtifact.BUNDLE.getOutputPath(
project.layout.buildDirectory,
layout.buildDirectory,
variant.name,
forceFilename = fileName.substringBeforeLast('.') + ".aab"
)
}
val releaseNotesDir = project
.layout
.projectDirectory
.dir("src/${variant.flavorName}/play/release-notes/en-US/")

project.tasks.create<PublishToPlayStore>("publishToPlayStoreBeta${variant.name.capitalized()}") {
val releaseNotes = providers.from(ReleaseNote::class) {
releaseNotesDir = project
.layout
.projectDirectory
.dir("src/${variant.flavorName}/play/release-notes/en-US/")
// Preconditions
releaseNotesDir.get()
.asFileTree
.firstOrNull { runCatching { StricSemanticVersion(it.nameWithoutExtension) }.isFailure }
?.also { throw GradleException("This release note file name is invalid: $it") }
releaseNotesDir.get()
.asFileTree
.firstOrNull { it.nameWithoutExtension == ext.version.get().toString() }
?: throw GradleException("The release note file associated to the version ${ext.version.get()} is missing, add it to continue: ${releaseNotesDir.get()}/${ext.version.get()}.txt")
}
tasks.create<PublishToPlayStore>("publishToPlayStoreBeta${variant.name.capitalized()}") {
dependsOn("bundle${variant.name.capitalized()}")
track = "beta"
this.packageName = packageName
this.versionName = versionName
this.releaseBundle = releaseBundle
this.releaseNotesDir = releaseNotesDir
this.releaseNotes = releaseNotes
}
project.tasks.create<PublishToPlayStore>("publishToPlayStoreProduction${variant.name.capitalized()}") {
tasks.create<PublishToPlayStore>("publishToPlayStoreProduction${variant.name.capitalized()}") {
dependsOn("bundle${variant.name.capitalized()}")
track = "production"
this.packageName = packageName
this.versionName = versionName
this.releaseBundle = releaseBundle
this.releaseNotesDir = releaseNotesDir
this.releaseNotes = releaseNotes
}
project.tasks.create<UpdatePlayStoreScreenshots>("updatePlayStoreScreenshots${variant.name.capitalized()}") {
tasks.create<UpdatePlayStoreScreenshots>("updatePlayStoreScreenshots${variant.name.capitalized()}") {
this.packageName = packageName
screenshotDirectory = project
.layout
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,19 +4,15 @@ import com.google.api.client.http.FileContent
import com.masselis.tpmsadvanced.playstore.ServiceHolder
import com.masselis.tpmsadvanced.playstore.androidPublisher
import com.masselis.tpmsadvanced.playstore.updateTrack
import com.masselis.tpmsadvanced.playstore.valuesource.ReleaseNote
import com.masselis.tpmsadvanced.playstore.withEdit
import org.gradle.api.DefaultTask
import org.gradle.api.file.DirectoryProperty
import org.gradle.api.file.RegularFileProperty
import org.gradle.api.provider.Property
import org.gradle.api.provider.ProviderFactory
import org.gradle.api.tasks.Input
import org.gradle.api.tasks.InputDirectory
import org.gradle.api.tasks.InputFile
import org.gradle.api.tasks.TaskAction
import org.gradle.kotlin.dsl.assign
import org.gradle.kotlin.dsl.from
import org.gradle.kotlin.dsl.getValue
import org.gradle.kotlin.dsl.provideDelegate
import javax.inject.Inject
Expand All @@ -39,12 +35,8 @@ internal abstract class PublishToPlayStore : DefaultTask(), ServiceHolder {
abstract val releaseBundle: RegularFileProperty

@get:InputDirectory
abstract val releaseNotesDir: DirectoryProperty
abstract val releaseNotes: Property<String>

private val releaseNotes
get() = providerFactory.from(ReleaseNote::class) {
this.releaseNotesDir = this@PublishToPlayStore.releaseNotesDir
}

init {
group = "publishing"
Expand Down

0 comments on commit be830e2

Please sign in to comment.