Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,13 @@
- Add upload functionality for size analysis ([#915](https://github.com/getsentry/sentry-android-gradle-plugin/pull/915))
- Add VCS info extension for build uploads with customizable version control metadata ([#969](https://github.com/getsentry/sentry-android-gradle-plugin/pull/969))
- Include version in logs if auto install refuses to install a dependency ([#979](https://github.com/getsentry/sentry-android-gradle-plugin/pull/979))
- Auto install Spring Boot 4 (`sentry-spring-boot-4`) and Spring 7 (`sentry-spring-7`) modules ([#980](https://github.com/getsentry/sentry-android-gradle-plugin/pull/980))

### Fixes

- Enable caching for BundleSourcesTask ([#894](https://github.com/getsentry/sentry-android-gradle-plugin/pull/894)
- Add support for Kotlin 2.2.0 for Sentry Kotlin Compiler Plugin ([#944](https://github.com/getsentry/sentry-android-gradle-plugin/pull/944))
- Sentry dependencies intended for Spring Boot 3 / Spring 6 will no longer be installed for Spring Boot 4 / Spring 7 ([#980](https://github.com/getsentry/sentry-android-gradle-plugin/pull/980))
- Allow lazily configured version details for ProGuard mappings ([#974](https://github.com/getsentry/sentry-android-gradle-plugin/pull/974))

### Breaking Changes
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,10 @@ import io.sentry.android.gradle.autoinstall.override.WarnOnOverrideStrategy
import io.sentry.android.gradle.autoinstall.quartz.QuartzInstallStrategy
import io.sentry.android.gradle.autoinstall.spring.Spring5InstallStrategy
import io.sentry.android.gradle.autoinstall.spring.Spring6InstallStrategy
import io.sentry.android.gradle.autoinstall.spring.Spring7InstallStrategy
import io.sentry.android.gradle.autoinstall.spring.SpringBoot2InstallStrategy
import io.sentry.android.gradle.autoinstall.spring.SpringBoot3InstallStrategy
import io.sentry.android.gradle.autoinstall.spring.SpringBoot4InstallStrategy
import io.sentry.android.gradle.autoinstall.sqlite.SQLiteInstallStrategy
import io.sentry.android.gradle.autoinstall.timber.TimberInstallStrategy
import io.sentry.android.gradle.extensions.SentryPluginExtension
Expand Down Expand Up @@ -48,8 +50,10 @@ private val delayedStrategies =
listOf(
Spring5InstallStrategy.Registrar,
Spring6InstallStrategy.Registrar,
Spring7InstallStrategy.Registrar,
SpringBoot2InstallStrategy.Registrar,
SpringBoot3InstallStrategy.Registrar,
SpringBoot4InstallStrategy.Registrar,
)

fun Project.installDependencies(extension: SentryPluginExtension, isAndroid: Boolean) {
Expand Down Expand Up @@ -115,6 +119,7 @@ private fun DependencySet.findSentryVersion(isAndroid: Boolean): String? =
(it.name == SentryModules.SENTRY.name ||
it.name == SentryModules.SENTRY_SPRING_BOOT2.name ||
it.name == SentryModules.SENTRY_SPRING_BOOT3.name ||
it.name == SentryModules.SENTRY_SPRING_BOOT4.name ||
it.name == SentryModules.SENTRY_BOM.name ||
it.name == SentryModules.SENTRY_OPENTELEMETRY_AGENTLESS.name ||
it.name == SentryModules.SENTRY_OPENTELEMETRY_AGENTLESS_SPRING.name) &&
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -76,8 +76,10 @@ abstract class WarnOnOverrideStrategy : ComponentMetadataRule {
SentryModules.SENTRY_QUARTZ,
SentryModules.SENTRY_SPRING5,
SentryModules.SENTRY_SPRING6,
SentryModules.SENTRY_SPRING7,
SentryModules.SENTRY_SPRING_BOOT2,
SentryModules.SENTRY_SPRING_BOOT3,
SentryModules.SENTRY_SPRING_BOOT4,
)

override fun register(component: ComponentMetadataHandler) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,9 @@ abstract class Spring6InstallStrategy : AbstractInstallStrategy {
override val minSupportedThirdPartyVersion: SemVer
get() = MIN_SUPPORTED_VERSION

override val maxSupportedThirdPartyVersion: SemVer
get() = MAX_SUPPORTED_VERSION

override val minSupportedSentryVersion: SemVer
get() = SemVer(6, 7, 0)

Expand All @@ -34,6 +37,7 @@ abstract class Spring6InstallStrategy : AbstractInstallStrategy {
internal const val SENTRY_SPRING_6_ID = "sentry-spring-jakarta"

private val MIN_SUPPORTED_VERSION = SemVer(6, 0, 0)
private val MAX_SUPPORTED_VERSION = SemVer(6, 9999, 9999)

override fun register(component: ComponentMetadataHandler) {
component.withModule("$SPRING_GROUP:$SPRING_6_ID", Spring6InstallStrategy::class.java) {}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package io.sentry.android.gradle.autoinstall.spring

import io.sentry.android.gradle.SentryPlugin
import io.sentry.android.gradle.autoinstall.AbstractInstallStrategy
import io.sentry.android.gradle.autoinstall.InstallStrategyRegistrar
import io.sentry.android.gradle.util.SemVer
import javax.inject.Inject
import org.gradle.api.artifacts.dsl.ComponentMetadataHandler
import org.slf4j.Logger

// @CacheableRule
abstract class Spring7InstallStrategy : AbstractInstallStrategy {

constructor(logger: Logger) : super() {
this.logger = logger
}

@Suppress("unused") // used by Gradle
@Inject // inject is needed to avoid Gradle error
constructor() : this(SentryPlugin.logger)

override val sentryModuleId: String
get() = SENTRY_SPRING_7_ID

override val minSupportedThirdPartyVersion: SemVer
get() = MIN_SUPPORTED_VERSION

override val maxSupportedThirdPartyVersion: SemVer
get() = MAX_SUPPORTED_VERSION

override val minSupportedSentryVersion: SemVer
get() = SemVer(8, 21, 0)

companion object Registrar : InstallStrategyRegistrar {
private const val SPRING_GROUP = "org.springframework"
private const val SPRING_7_ID = "spring-core"
internal const val SENTRY_SPRING_7_ID = "sentry-spring-7"

private val MIN_SUPPORTED_VERSION = SemVer(7, 0, 0, "M1")
private val MAX_SUPPORTED_VERSION = SemVer(7, 9999, 9999)

override fun register(component: ComponentMetadataHandler) {
component.withModule("$SPRING_GROUP:$SPRING_7_ID", Spring7InstallStrategy::class.java) {}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,9 @@ abstract class SpringBoot3InstallStrategy : AbstractInstallStrategy {
override val minSupportedThirdPartyVersion: SemVer
get() = MIN_SUPPORTED_VERSION

override val maxSupportedThirdPartyVersion: SemVer
get() = MAX_SUPPORTED_VERSION

override val minSupportedSentryVersion: SemVer
get() = SemVer(6, 28, 0)

Expand All @@ -34,6 +37,7 @@ abstract class SpringBoot3InstallStrategy : AbstractInstallStrategy {
internal const val SENTRY_SPRING_BOOT_3_ID = "sentry-spring-boot-jakarta"

private val MIN_SUPPORTED_VERSION = SemVer(3, 0, 0)
private val MAX_SUPPORTED_VERSION = SemVer(3, 9999, 9999)

override fun register(component: ComponentMetadataHandler) {
component.withModule(
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package io.sentry.android.gradle.autoinstall.spring

import io.sentry.android.gradle.SentryPlugin
import io.sentry.android.gradle.autoinstall.AbstractInstallStrategy
import io.sentry.android.gradle.autoinstall.InstallStrategyRegistrar
import io.sentry.android.gradle.util.SemVer
import javax.inject.Inject
import org.gradle.api.artifacts.dsl.ComponentMetadataHandler
import org.slf4j.Logger

// @CacheableRule
abstract class SpringBoot4InstallStrategy : AbstractInstallStrategy {

constructor(logger: Logger) : super() {
this.logger = logger
}

@Suppress("unused") // used by Gradle
@Inject // inject is needed to avoid Gradle error
constructor() : this(SentryPlugin.logger)

override val sentryModuleId: String
get() = SENTRY_SPRING_BOOT_4_ID

override val minSupportedThirdPartyVersion: SemVer
get() = MIN_SUPPORTED_VERSION

override val maxSupportedThirdPartyVersion: SemVer
get() = MAX_SUPPORTED_VERSION

override val minSupportedSentryVersion: SemVer
get() = SemVer(8, 21, 0)

companion object Registrar : InstallStrategyRegistrar {
private const val SPRING_GROUP = "org.springframework.boot"
private const val SPRING_BOOT_4_ID = "spring-boot"
internal const val SENTRY_SPRING_BOOT_4_ID = "sentry-spring-boot-4"

private val MIN_SUPPORTED_VERSION = SemVer(4, 0, 0, "M1")
private val MAX_SUPPORTED_VERSION = SemVer(4, 9999, 9999)

override fun register(component: ComponentMetadataHandler) {
component.withModule(
"$SPRING_GROUP:$SPRING_BOOT_4_ID",
SpringBoot4InstallStrategy::class.java,
) {}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -57,10 +57,13 @@ internal object SentryModules {
internal val SENTRY_QUARTZ = DefaultModuleIdentifier.newId("io.sentry", "sentry-quartz")
internal val SENTRY_SPRING5 = DefaultModuleIdentifier.newId("io.sentry", "sentry-spring")
internal val SENTRY_SPRING6 = DefaultModuleIdentifier.newId("io.sentry", "sentry-spring-jakarta")
internal val SENTRY_SPRING7 = DefaultModuleIdentifier.newId("io.sentry", "sentry-spring-7")
internal val SENTRY_SPRING_BOOT2 =
DefaultModuleIdentifier.newId("io.sentry", "sentry-spring-boot")
internal val SENTRY_SPRING_BOOT3 =
DefaultModuleIdentifier.newId("io.sentry", "sentry-spring-boot-jakarta")
internal val SENTRY_SPRING_BOOT4 =
DefaultModuleIdentifier.newId("io.sentry", "sentry-spring-boot-4")
internal val SENTRY_BOM = DefaultModuleIdentifier.newId("io.sentry", "sentry-bom")
internal val SENTRY_OPENTELEMETRY_AGENTLESS =
DefaultModuleIdentifier.newId("io.sentry", "sentry-opentelemetry-agentless")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,19 @@ class Spring6InstallStrategyTest {
verify(fixture.metadataDetails, never()).allVariants(any())
}

@Test
fun `when spring version is too high logs a message and does nothing`() {
val sut = fixture.getSut(springVersion = "7.0.0")
sut.execute(fixture.metadataContext)

assertTrue {
fixture.logger.capturedMessage ==
"[sentry] sentry-spring-jakarta won't be installed because the current " +
"version (7.0.0) is higher than the maximum supported version (6.9999.9999)"
}
verify(fixture.metadataDetails, never()).allVariants(any())
}

@Test
fun `installs sentry-spring-jakarta with info message`() {
val sut = fixture.getSut()
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
package io.sentry.android.gradle.autoinstall.spring

import com.nhaarman.mockitokotlin2.any
import com.nhaarman.mockitokotlin2.doAnswer
import com.nhaarman.mockitokotlin2.doReturn
import com.nhaarman.mockitokotlin2.mock
import com.nhaarman.mockitokotlin2.never
import com.nhaarman.mockitokotlin2.verify
import com.nhaarman.mockitokotlin2.whenever
import io.sentry.android.gradle.autoinstall.AutoInstallState
import io.sentry.android.gradle.instrumentation.fakes.CapturingTestLogger
import kotlin.test.assertEquals
import kotlin.test.assertTrue
import org.gradle.api.Action
import org.gradle.api.artifacts.ComponentMetadataContext
import org.gradle.api.artifacts.ComponentMetadataDetails
import org.gradle.api.artifacts.DirectDependenciesMetadata
import org.gradle.api.artifacts.ModuleVersionIdentifier
import org.gradle.api.artifacts.VariantMetadata
import org.junit.Test
import org.slf4j.Logger

class Spring7InstallStrategyTest {
class Fixture {
val logger = CapturingTestLogger()
val dependencies = mock<DirectDependenciesMetadata>()
val metadataDetails = mock<ComponentMetadataDetails>()
val metadataContext =
mock<ComponentMetadataContext> {
whenever(it.details).thenReturn(metadataDetails)
val metadata = mock<VariantMetadata>()
doAnswer { (it.arguments[0] as Action<DirectDependenciesMetadata>).execute(dependencies) }
.whenever(metadata)
.withDependencies(any<Action<DirectDependenciesMetadata>>())

doAnswer {
// trigger the callback registered in tests
(it.arguments[0] as Action<VariantMetadata>).execute(metadata)
}
.whenever(metadataDetails)
.allVariants(any<Action<VariantMetadata>>())
}

fun getSut(springVersion: String = "7.0.0"): Spring7InstallStrategy {
val id = mock<ModuleVersionIdentifier> { whenever(it.version).doReturn(springVersion) }
whenever(metadataDetails.id).thenReturn(id)

with(AutoInstallState.getInstance()) {
this.enabled = true
this.sentryVersion = "8.21.0"
}
return Spring7InstallStrategyImpl(logger)
}
}

private val fixture = Fixture()

@Test
fun `when spring version is too low logs a message and does nothing`() {
val sut = fixture.getSut(springVersion = "6.7.4")
sut.execute(fixture.metadataContext)

assertTrue {
fixture.logger.capturedMessage ==
"[sentry] sentry-spring-7 won't be installed because the current " +
"version (6.7.4) is lower than the minimum supported version (7.0.0-M1)"
}
verify(fixture.metadataDetails, never()).allVariants(any())
}

@Test
fun `when spring version is too high logs a message and does nothing`() {
val sut = fixture.getSut(springVersion = "8.0.0")
sut.execute(fixture.metadataContext)

assertTrue {
fixture.logger.capturedMessage ==
"[sentry] sentry-spring-7 won't be installed because the current " +
"version (8.0.0) is higher than the maximum supported version (7.9999.9999)"
}
verify(fixture.metadataDetails, never()).allVariants(any())
}

@Test
fun `installs sentry-spring-jakarta with info message`() {
val sut = fixture.getSut()
sut.execute(fixture.metadataContext)

assertTrue {
fixture.logger.capturedMessage ==
"[sentry] sentry-spring-7 was successfully installed with version: 8.21.0"
}
verify(fixture.dependencies)
.add(
com.nhaarman.mockitokotlin2.check<String> {
assertEquals("io.sentry:sentry-spring-7:8.21.0", it)
}
)
}

private class Spring7InstallStrategyImpl(logger: Logger) : Spring7InstallStrategy(logger)
}
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,19 @@ class SpringBoot3InstallStrategyTest {
verify(fixture.metadataDetails, never()).allVariants(any())
}

@Test
fun `when spring version is too high logs a message and does nothing`() {
val sut = fixture.getSut(springVersion = "4.0.0")
sut.execute(fixture.metadataContext)

assertTrue {
fixture.logger.capturedMessage ==
"[sentry] sentry-spring-boot-jakarta won't be installed because the current " +
"version (4.0.0) is higher than the maximum supported version (3.9999.9999)"
}
verify(fixture.metadataDetails, never()).allVariants(any())
}

@Test
fun `installs sentry-spring-boot-jakarta with info message`() {
val sut = fixture.getSut()
Expand Down
Loading
Loading