Skip to content

Commit 57e53d5

Browse files
authored
fix(instrumentation): Make SentryGenerateIntegrationListTask configuration-cache compatible (#866)
* Make SentryGenerateIntegrationListTask configuration-cache compatible * Revert * Changelog * Use ubuntu-latest for agp matrix
1 parent b3dd905 commit 57e53d5

6 files changed

Lines changed: 103 additions & 20 deletions

File tree

.github/workflows/test-matrix-agp-gradle.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ concurrency:
1212

1313
jobs:
1414
publish-dry-run:
15-
runs-on: ubuntu-20.04
15+
runs-on: ubuntu-latest
1616
strategy:
1717
fail-fast: false
1818
matrix:

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
### Fixes
66

77
- Kotlin Compiler Plugin: Fix API incompatibility with Kotlin 2.1.20 ([#857](https://github.com/getsentry/sentry-android-gradle-plugin/pull/857))
8+
- Make `SentryGenerateIntegrationListTask` configuration-cache compatible ([#866](https://github.com/getsentry/sentry-android-gradle-plugin/pull/866))
89

910
### Internal
1011

plugin-build/src/main/kotlin/io/sentry/android/gradle/AndroidComponentsConfig.kt

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ import io.sentry.android.gradle.tasks.SentryUploadProguardMappingsTask
2929
import io.sentry.android.gradle.tasks.configureNativeSymbolsTask
3030
import io.sentry.android.gradle.tasks.dependencies.SentryExternalDependenciesReportTaskFactory
3131
import io.sentry.android.gradle.telemetry.SentryTelemetryService
32-
import io.sentry.android.gradle.telemetry.withSentryTelemetry
3332
import io.sentry.android.gradle.transforms.MetaInfStripTransform
3433
import io.sentry.android.gradle.util.AgpVersions
3534
import io.sentry.android.gradle.util.AgpVersions.isAGP74
@@ -204,18 +203,13 @@ fun AndroidComponentsExtension<*, *, *>.configure(
204203
}
205204

206205
val manifestUpdater =
207-
project.tasks.register(
208-
"${variant.name}SentryGenerateIntegrationListTask",
209-
SentryGenerateIntegrationListTask::class.java,
210-
) {
211-
it.integrations.set(
212-
sentryModulesService.map { service ->
213-
service.retrieveEnabledInstrumentationFeatures()
214-
}
215-
)
216-
it.usesService(sentryModulesService)
217-
it.withSentryTelemetry(extension, sentryTelemetryProvider)
218-
}
206+
SentryGenerateIntegrationListTask.register(
207+
project,
208+
extension,
209+
sentryTelemetryProvider,
210+
sentryModulesService,
211+
variant.name,
212+
)
219213

220214
variant.artifacts
221215
.use(manifestUpdater)

plugin-build/src/main/kotlin/io/sentry/android/gradle/services/SentryModulesService.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ abstract class SentryModulesService :
2828
@set:Synchronized
2929
var externalModules: Map<ModuleIdentifier, SemVer> = emptyMap()
3030

31-
fun retrieveEnabledInstrumentationFeatures(): Set<String> {
31+
fun retrieveEnabledInstrumentationFeatures(project: Project): Provider<Set<String>> {
3232
val features =
3333
parameters.features
3434
.get()
@@ -52,7 +52,7 @@ abstract class SentryModulesService :
5252
features.add("DexGuard")
5353
}
5454

55-
return features
55+
return project.provider { features }
5656
}
5757

5858
private fun isInstrumentationEnabled(feature: InstrumentationFeature): Boolean {

plugin-build/src/main/kotlin/io/sentry/android/gradle/tasks/SentryGenerateIntegrationListTask.kt

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,17 @@
11
package io.sentry.android.gradle.tasks
22

33
import io.sentry.android.gradle.ManifestWriter
4+
import io.sentry.android.gradle.extensions.SentryPluginExtension
5+
import io.sentry.android.gradle.services.SentryModulesService
6+
import io.sentry.android.gradle.telemetry.SentryTelemetryService
7+
import io.sentry.android.gradle.telemetry.withSentryTelemetry
48
import io.sentry.android.gradle.util.info
59
import java.nio.file.Files
610
import java.nio.file.StandardCopyOption
711
import org.gradle.api.DefaultTask
12+
import org.gradle.api.Project
813
import org.gradle.api.file.RegularFileProperty
14+
import org.gradle.api.provider.Provider
915
import org.gradle.api.provider.SetProperty
1016
import org.gradle.api.tasks.CacheableTask
1117
import org.gradle.api.tasks.Input
@@ -14,14 +20,11 @@ import org.gradle.api.tasks.OutputFile
1420
import org.gradle.api.tasks.PathSensitive
1521
import org.gradle.api.tasks.PathSensitivity.NONE
1622
import org.gradle.api.tasks.TaskAction
23+
import org.gradle.api.tasks.TaskProvider
1724

1825
@CacheableTask
1926
abstract class SentryGenerateIntegrationListTask : DefaultTask() {
2027

21-
companion object {
22-
const val ATTR_INTEGRATIONS = "io.sentry.gradle-plugin-integrations"
23-
}
24-
2528
init {
2629
description = "Writes enabled integrations to AndroidManifest.xml"
2730
}
@@ -58,4 +61,29 @@ abstract class SentryGenerateIntegrationListTask : DefaultTask() {
5861
)
5962
}
6063
}
64+
65+
companion object {
66+
const val ATTR_INTEGRATIONS = "io.sentry.gradle-plugin-integrations"
67+
68+
fun register(
69+
project: Project,
70+
extension: SentryPluginExtension,
71+
sentryTelemetryProvider: Provider<SentryTelemetryService>?,
72+
sentryModulesService: Provider<SentryModulesService>,
73+
variantName: String,
74+
): TaskProvider<SentryGenerateIntegrationListTask> {
75+
return project.tasks.register(
76+
"${variantName}SentryGenerateIntegrationListTask",
77+
SentryGenerateIntegrationListTask::class.java,
78+
) {
79+
it.integrations.set(
80+
sentryModulesService.flatMap { service ->
81+
service.retrieveEnabledInstrumentationFeatures(project)
82+
}
83+
)
84+
it.usesService(sentryModulesService)
85+
it.withSentryTelemetry(extension, sentryTelemetryProvider)
86+
}
87+
}
88+
}
6189
}

plugin-build/src/test/kotlin/io/sentry/android/gradle/integration/SentryPluginConfigurationCacheTest.kt

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,15 @@ import io.sentry.android.gradle.util.AgpVersions
66
import io.sentry.android.gradle.util.GradleVersions
77
import io.sentry.android.gradle.util.SemVer
88
import io.sentry.android.gradle.verifyDependenciesReportAndroid
9+
import io.sentry.android.gradle.verifyIntegrationList
910
import java.io.File
1011
import kotlin.test.assertEquals
1112
import kotlin.test.assertFalse
1213
import kotlin.test.assertTrue
14+
import org.gradle.testkit.runner.TaskOutcome
1315
import org.gradle.util.GradleVersion
1416
import org.hamcrest.CoreMatchers.`is`
17+
import org.jetbrains.kotlin.gradle.report.TaskExecutionState.UP_TO_DATE
1518
import org.junit.Assume.assumeThat
1619
import org.junit.Test
1720

@@ -306,4 +309,61 @@ class SentryPluginConfigurationCacheTest :
306309
val outputWithConfigCache = runner.build().output
307310
assertTrue { "Configuration cache entry reused." in outputWithConfigCache }
308311
}
312+
313+
@Test
314+
fun `generate integration list task respects configuration cache`() {
315+
assumeThat(
316+
"SentryGenerateIntegrationListTask only supports " +
317+
"configuration cache from Gradle 7.5 onwards",
318+
GradleVersions.CURRENT >= GradleVersions.VERSION_7_5,
319+
`is`(true),
320+
)
321+
appBuildFile.writeText(
322+
// language=Groovy
323+
"""
324+
plugins {
325+
id "com.android.application"
326+
id "io.sentry.android.gradle"
327+
}
328+
329+
android {
330+
namespace 'com.example'
331+
}
332+
333+
sentry {
334+
includeNativeSources = false
335+
uploadNativeSymbols = false
336+
includeProguardMapping = false
337+
autoUploadProguardMapping = false
338+
tracingInstrumentation.features = []
339+
telemetry = false
340+
}
341+
"""
342+
.trimIndent()
343+
)
344+
runner.appendArguments(":app:assembleDebug").appendArguments("--configuration-cache")
345+
346+
val firstBuild = runner.build().output
347+
assertTrue { "Configuration cache entry stored." in firstBuild }
348+
349+
val integrationsFirst = verifyIntegrationList(testProjectDir.root, "debug", signed = false)
350+
assertEquals(
351+
listOf("AppStartInstrumentation", "LogcatInstrumentation"),
352+
integrationsFirst.sorted(),
353+
)
354+
355+
// second build should reuse config cache and tasks should be up-to-date as nothing changed
356+
val secondBuild = runner.build()
357+
assertEquals(
358+
TaskOutcome.UP_TO_DATE,
359+
secondBuild.task(":app:debugSentryGenerateIntegrationListTask")?.outcome,
360+
)
361+
assertTrue { "Configuration cache entry reused." in secondBuild.output }
362+
363+
val integrationsSecond = verifyIntegrationList(testProjectDir.root, "debug", signed = false)
364+
assertEquals(
365+
listOf("AppStartInstrumentation", "LogcatInstrumentation"),
366+
integrationsSecond.sorted(),
367+
)
368+
}
309369
}

0 commit comments

Comments
 (0)