diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index f4b666eb..91521b77 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -22,51 +22,52 @@ jobs: release: runs-on: ubuntu-latest steps: - - name: Checkout - uses: actions/checkout@v4 - with: - token: ${{ secrets.SYNCED_GITHUB_TOKEN_REPO }} - - uses: gradle/actions/wrapper-validation@v4 - - name: Set up JDK 21 - uses: actions/setup-java@v4.6.0 - with: - java-version: '21' - distribution: 'adopt' - - name: Create .gpg key - run: | - echo $GPG_KEY_ARMOR | base64 --decode > ./release.asc - gpg --quiet --output $GITHUB_WORKSPACE/release.gpg --dearmor ./release.asc + - name: Checkout + uses: actions/checkout@v4 + with: + token: ${{ secrets.SYNCED_GITHUB_TOKEN_REPO }} + - uses: gradle/actions/wrapper-validation@v4 + - name: Set up JDK 21 + uses: actions/setup-java@v4.6.0 + with: + java-version: '21' + distribution: 'adopt' + - name: Set up Gradle Publishing Environment Variables + run: | + echo $GPG_KEY_ARMOR | base64 --decode > ./release.asc + gpg --quiet --output $GITHUB_WORKSPACE/release.gpg --dearmor ./release.asc - echo "Build and publish" - sed -i -e "s,sonatypeToken=,sonatypeToken=$SONATYPE_TOKEN_USERNAME,g" gradle.properties - SONATYPE_TOKEN_PASSWORD_ESCAPED=$(printf '%s\n' "$SONATYPE_TOKEN_PASSWORD" | sed -e 's/[\/&]/\\&/g') - sed -i -e "s,sonatypeTokenPassword=,sonatypeTokenPassword=$SONATYPE_TOKEN_PASSWORD_ESCAPED,g" gradle.properties - sed -i -e "s,signing.keyId=,signing.keyId=$GPG_KEY_ID,g" gradle.properties - sed -i -e "s,signing.password=,signing.password=$GPG_PASSWORD,g" gradle.properties - sed -i -e "s,signing.secretKeyRingFile=,signing.secretKeyRingFile=$GITHUB_WORKSPACE/release.gpg,g" gradle.properties - env: - GPG_KEY_ARMOR: "${{ secrets.SYNCED_GPG_KEY_ARMOR }}" - GPG_KEY_ID: ${{ secrets.SYNCED_GPG_KEY_ID }} - GPG_PASSWORD: ${{ secrets.SYNCED_GPG_KEY_PASSWORD }} - SONATYPE_TOKEN_PASSWORD: ${{ secrets.SONATYPE_TOKEN_PASSWORD }} - SONATYPE_TOKEN_USERNAME: ${{ secrets.SONATYPE_TOKEN }} + echo "Build and publish" + sed -i -e "s,mavenCentralUsername=,mavenCentralUsername=$SONATYPE_TOKEN_USERNAME,g" gradle.properties + SONATYPE_TOKEN_PASSWORD_ESCAPED=$(printf '%s\n' "$SONATYPE_TOKEN_PASSWORD" | sed -e 's/[\/&]/\\&/g') + sed -i -e "s,mavenCentralPassword=,mavenCentralPassword=$SONATYPE_TOKEN_PASSWORD_ESCAPED,g" gradle.properties + sed -i -e "s,signing.keyId=,signing.keyId=$GPG_KEY_ID,g" gradle.properties + sed -i -e "s,signing.password=,signing.password=$GPG_PASSWORD,g" gradle.properties + sed -i -e "s,signing.secretKeyRingFile=,signing.secretKeyRingFile=$GITHUB_WORKSPACE/release.gpg,g" gradle.properties - - uses: actions/setup-node@v4 - with: - node-version: '14' - - - name: Install conventionalcommits - run: npm i -D conventional-changelog-conventionalcommits + env: + SONATYPE_TOKEN_USERNAME: ${{ secrets.SONATYPE_TOKEN }} + SONATYPE_TOKEN_PASSWORD: ${{ secrets.SONATYPE_TOKEN_PASSWORD }} + GPG_KEY_ARMOR: ${{ secrets.SYNCED_GPG_KEY_ARMOR }} + GPG_PASSWORD: ${{ secrets.SYNCED_GPG_KEY_PASSWORD }} + GPG_KEY_ID: ${{ secrets.SYNCED_GPG_KEY_ID }} - - name: Semantic Release - uses: cycjimmy/semantic-release-action@v4.2.1 - with: - extra_plugins: | - "@semantic-release/commit-analyzer@8.0.1" - "@semantic-release/release-notes-generator@9.0.3" - "@google/semantic-release-replace-plugin@1.2.0" - "@semantic-release/exec@5.0.0" - "@semantic-release/git@9.0.1" - "@semantic-release/github@7.2.3" - env: - GH_TOKEN: ${{ secrets.SYNCED_GITHUB_TOKEN_REPO }} + - uses: actions/setup-node@v4 + with: + node-version: '14' + + - name: Install conventionalcommits + run: npm i -D conventional-changelog-conventionalcommits + + - name: Semantic Release + uses: cycjimmy/semantic-release-action@v4.2.1 + with: + extra_plugins: | + "@semantic-release/commit-analyzer@8.0.1" + "@semantic-release/release-notes-generator@9.0.3" + "@google/semantic-release-replace-plugin@1.2.0" + "@semantic-release/exec@5.0.0" + "@semantic-release/git@9.0.1" + "@semantic-release/github@7.2.3" + env: + GH_TOKEN: ${{ secrets.SYNCED_GITHUB_TOKEN_REPO }} \ No newline at end of file diff --git a/.releaserc b/.releaserc index 81956d5b..5a3a1387 100644 --- a/.releaserc +++ b/.releaserc @@ -15,7 +15,7 @@ plugins: to: ":${nextRelease.version}" - - "@semantic-release/exec" - prepareCmd: "./gradlew build --warn --stacktrace" - publishCmd: "./gradlew publish --warn --stacktrace" + publishCmd: "./gradlew publishToMavenCentral --warn --stacktrace" - - "@semantic-release/git" - assets: - "build.gradle.kts" diff --git a/build-logic/convention/build.gradle.kts b/build-logic/convention/build.gradle.kts index fa0ccec5..f2399c9b 100644 --- a/build-logic/convention/build.gradle.kts +++ b/build-logic/convention/build.gradle.kts @@ -14,6 +14,8 @@ dependencies { implementation(libs.android.gradle.plugin) implementation(libs.dokka.plugin) implementation(libs.org.jacoco.core) + implementation(libs.gradle.maven.publish.plugin) + } gradlePlugin { diff --git a/build-logic/convention/src/main/kotlin/PublishingConventionPlugin.kt b/build-logic/convention/src/main/kotlin/PublishingConventionPlugin.kt index 7cd066c1..ab01e742 100644 --- a/build-logic/convention/src/main/kotlin/PublishingConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/PublishingConventionPlugin.kt @@ -1,14 +1,13 @@ // buildSrc/src/main/kotlin/PublishingConventionPlugin.kt +import com.vanniktech.maven.publish.AndroidSingleVariantLibrary +import com.vanniktech.maven.publish.JavadocJar +import com.vanniktech.maven.publish.MavenPublishBaseExtension import org.gradle.api.Plugin import org.gradle.api.Project -import org.gradle.api.publish.PublishingExtension -import org.gradle.api.publish.maven.MavenPublication import org.gradle.kotlin.dsl.* import org.gradle.testing.jacoco.plugins.JacocoPluginExtension import org.gradle.api.tasks.testing.Test import org.gradle.testing.jacoco.plugins.JacocoTaskExtension -import org.gradle.plugins.signing.SigningExtension -import org.gradle.api.publish.maven.* class PublishingConventionPlugin : Plugin { override fun apply(project: Project) { @@ -16,17 +15,15 @@ class PublishingConventionPlugin : Plugin { applyPlugins() configureJacoco() - configurePublishing() - configureSigning() + configureVanniktechPublishing() } } private fun Project.applyPlugins() { apply(plugin = "com.android.library") apply(plugin = "com.mxalbert.gradle.jacoco-android") - apply(plugin = "maven-publish") apply(plugin = "org.jetbrains.dokka") - apply(plugin = "signing") + apply(plugin = "com.vanniktech.maven.publish") } private fun Project.configureJacoco() { @@ -43,68 +40,42 @@ class PublishingConventionPlugin : Plugin { } } - private fun Project.configurePublishing() { - extensions.configure { - publishing { - singleVariant("release") { - withSourcesJar() - withJavadocJar() - } - } - } - extensions.configure { - publications { - create("aar") { - afterEvaluate { - from(components["release"]) - } - pom { - name.set(project.name) - description.set("Jetpack Compose components for the Maps SDK for Android") - url.set("https://github.com/googlemaps/android-maps-compose") - scm { - connection.set("scm:git@github.com:googlemaps/android-maps-compose.git") - developerConnection.set("scm:git@github.com:googlemaps/android-maps-compose.git") - url.set("https://github.com/googlemaps/android-maps-compose") - } - licenses { - license { - name.set("The Apache Software License, Version 2.0") - url.set("http://www.apache.org/licenses/LICENSE-2.0.txt") - distribution.set("repo") - } - } - organization { - name.set("Google Inc") - url.set("http://developers.google.com/maps") - } - developers { - developer { - name.set("Google Inc.") - } - } + private fun Project.configureVanniktechPublishing() { + extensions.configure { + configure( + AndroidSingleVariantLibrary( + variant = "release", + sourcesJar = true, + publishJavadocJar = true + ) + ) + + publishToMavenCentral() + signAllPublications() + + pom { + name.set(project.name) + description.set("Jetpack Compose components for the Maps SDK for Android") + url.set("https://github.com/googlemaps/android-maps-compose") + licenses { + license { + name.set("The Apache Software License, Version 2.0") + url.set("http://www.apache.org/licenses/LICENSE-2.0.txt") + distribution.set("repo") } } - } - repositories { - maven { - val releasesRepoUrl = - uri("https://ossrh-staging-api.central.sonatype.com/service/local/staging/deploy/maven2/") - val snapshotsRepoUrl = - uri("https://central.sonatype.com/repository/maven-snapshots/") - url = if (project.version.toString().endsWith("SNAPSHOT")) snapshotsRepoUrl else releasesRepoUrl - credentials { - username = project.findProperty("sonatypeToken") as String? - password = project.findProperty("sonatypeTokenPassword") as String? + scm { + connection.set("scm:git@github.com:googlemaps/android-maps-compose.git") + developerConnection.set("scm:git@github.com:googlemaps/android-maps-compose.git") + url.set("https://github.com/googlemaps/android-maps-compose") + } + developers { + developer { + id.set("google") + name.set("Google Inc.") } } } } } - - private fun Project.configureSigning() { - configure { - sign(extensions.getByType().publications["aar"]) - } - } -} +} \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 42dfc0bb..d3384b97 100644 --- a/gradle.properties +++ b/gradle.properties @@ -23,16 +23,18 @@ android.enableJetifier=true # Kotlin code style for this project: "official" or "obsolete": kotlin.code.style=official -# variables required to allow build.gradle to parse, -# override in ~/.gradle/gradle.properties +mavenCentralUsername= +mavenCentralPassword= + signing.keyId= signing.password= signing.secretKeyRingFile= -sonatypeToken= -sonatypeTokenPassword= - android.nonTransitiveRClass=false android.nonFinalResIds=false -android.experimental.enableScreenshotTest=true \ No newline at end of file +android.experimental.enableScreenshotTest=true + +# Add a property to enable automatic release to Maven Central (optional, but good for CI) +# If true, publishToMavenCentral will also close and release the staging repository +mavenCentralAutomaticRelease=false \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 049ba1ef..fa02bfbe 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -7,6 +7,7 @@ androidxtest = "1.6.2" compose-bom = "2025.04.00" dokka = "2.0.0" espresso = "3.6.1" +gradleMavenPublishPlugin = "0.34.0" jacoco-plugin = "0.2.1" junit = "4.13.2" junitktx = "1.2.1" @@ -35,6 +36,7 @@ androidx-test-junit-ktx = { module = "androidx.test.ext:junit-ktx", version.ref androidx-test-rules = { module = "androidx.test:rules", version.ref = "androidCore" } androidx-test-runner = { module = "androidx.test:runner", version.ref = "androidxtest" } dokka-plugin = { module = "org.jetbrains.dokka:dokka-gradle-plugin", version.ref = "dokka" } +gradle-maven-publish-plugin = { module = "com.vanniktech:gradle-maven-publish-plugin", version.ref = "gradleMavenPublishPlugin" } jacoco-android-plugin = { module = "com.mxalbert.gradle:jacoco-android", version.ref = "jacoco-plugin", version.require = "0.2.1" } kotlin = { module = "org.jetbrains.kotlin:kotlin-stdlib-jdk7", version.ref = "kotlin" } kotlin-gradle-plugin = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", version.ref = "kotlin" }