From 2c1802c4c3e13c4793e8a9fb14a89b39a2b66489 Mon Sep 17 00:00:00 2001 From: Nelson Osacky Date: Thu, 12 Mar 2026 10:58:57 +0100 Subject: [PATCH 1/2] feat(snapshots): Wire VCS extension to snapshots upload task The VcsInfoExtension was only wired to the build upload task (size analysis). This wires the same VCS properties (head-sha, base-sha, vcs-provider, head/base-repo-name, head/base-ref, pr-number) to the snapshots upload task so sentry-cli can send git metadata with snapshot uploads. Co-Authored-By: Claude Opus 4.6 (1M context) --- .../gradle/extensions/VcsInfoExtension.kt | 8 +-- .../gradle/tasks/SentryUploadSnapshotsTask.kt | 28 ++++++++++ .../tasks/SentryUploadSnapshotsTaskTest.kt | 53 +++++++++++++++++++ 3 files changed, 85 insertions(+), 4 deletions(-) diff --git a/plugin-build/src/main/kotlin/io/sentry/android/gradle/extensions/VcsInfoExtension.kt b/plugin-build/src/main/kotlin/io/sentry/android/gradle/extensions/VcsInfoExtension.kt index 4fd8b6f0a..02a9ec0f4 100644 --- a/plugin-build/src/main/kotlin/io/sentry/android/gradle/extensions/VcsInfoExtension.kt +++ b/plugin-build/src/main/kotlin/io/sentry/android/gradle/extensions/VcsInfoExtension.kt @@ -5,11 +5,11 @@ import org.gradle.api.model.ObjectFactory import org.gradle.api.provider.Property /** - * Configuration for version control system information used in build uploads. + * Configuration for version control system information used in build uploads and snapshots. * - * This extension only applies to build upload functionality (e.g., APK/AAB uploads for size - * analysis) and has no effect on other plugin features such as ProGuard mapping uploads, source - * context uploads, or instrumentation. + * This extension applies to build upload functionality (e.g., APK/AAB uploads for size analysis) + * and snapshot uploads. It has no effect on other plugin features such as ProGuard mapping uploads, + * source context uploads, or instrumentation. */ open class VcsInfoExtension @Inject constructor(objects: ObjectFactory) { diff --git a/plugin-build/src/main/kotlin/io/sentry/android/gradle/tasks/SentryUploadSnapshotsTask.kt b/plugin-build/src/main/kotlin/io/sentry/android/gradle/tasks/SentryUploadSnapshotsTask.kt index 6a0620921..25e25e2d9 100644 --- a/plugin-build/src/main/kotlin/io/sentry/android/gradle/tasks/SentryUploadSnapshotsTask.kt +++ b/plugin-build/src/main/kotlin/io/sentry/android/gradle/tasks/SentryUploadSnapshotsTask.kt @@ -10,6 +10,7 @@ import org.gradle.api.provider.Property import org.gradle.api.provider.Provider import org.gradle.api.tasks.Input import org.gradle.api.tasks.InputDirectory +import org.gradle.api.tasks.Optional import org.gradle.api.tasks.PathSensitive import org.gradle.api.tasks.PathSensitivity import org.gradle.api.tasks.TaskProvider @@ -29,11 +30,30 @@ abstract class SentryUploadSnapshotsTask : SentryCliExecTask() { @get:PathSensitive(PathSensitivity.RELATIVE) abstract val snapshotsPath: DirectoryProperty + @get:Input @get:Optional abstract val vcsHeadSha: Property + @get:Input @get:Optional abstract val vcsBaseSha: Property + @get:Input @get:Optional abstract val vcsProvider: Property + @get:Input @get:Optional abstract val vcsHeadRepoName: Property + @get:Input @get:Optional abstract val vcsBaseRepoName: Property + @get:Input @get:Optional abstract val vcsHeadRef: Property + @get:Input @get:Optional abstract val vcsBaseRef: Property + @get:Input @get:Optional abstract val vcsPrNumber: Property + override fun getArguments(args: MutableList) { args.add("build") args.add("snapshots") args.add("--app-id") args.add(appId.get()) + + vcsHeadSha.orNull?.let { args.addAll(listOf("--head-sha", it)) } + vcsBaseSha.orNull?.let { args.addAll(listOf("--base-sha", it)) } + vcsProvider.orNull?.let { args.addAll(listOf("--vcs-provider", it)) } + vcsHeadRepoName.orNull?.let { args.addAll(listOf("--head-repo-name", it)) } + vcsBaseRepoName.orNull?.let { args.addAll(listOf("--base-repo-name", it)) } + vcsHeadRef.orNull?.let { args.addAll(listOf("--head-ref", it)) } + vcsBaseRef.orNull?.let { args.addAll(listOf("--base-ref", it)) } + vcsPrNumber.orNull?.let { args.addAll(listOf("--pr-number", it.toString())) } + args.add(snapshotsPath.get().asFile.absolutePath) } @@ -65,6 +85,14 @@ abstract class SentryUploadSnapshotsTask : SentryCliExecTask() { task.sentryUrl.set(extension.url) task.appId.set(extension.snapshots.appId) task.snapshotsPath.set(extension.snapshots.path) + task.vcsHeadSha.set(extension.vcsInfo.headSha) + task.vcsBaseSha.set(extension.vcsInfo.baseSha) + task.vcsProvider.set(extension.vcsInfo.vcsProvider) + task.vcsHeadRepoName.set(extension.vcsInfo.headRepoName) + task.vcsBaseRepoName.set(extension.vcsInfo.baseRepoName) + task.vcsHeadRef.set(extension.vcsInfo.headRef) + task.vcsBaseRef.set(extension.vcsInfo.baseRef) + task.vcsPrNumber.set(extension.vcsInfo.prNumber) task.asSentryCliExec() } } diff --git a/plugin-build/src/test/kotlin/io/sentry/android/gradle/tasks/SentryUploadSnapshotsTaskTest.kt b/plugin-build/src/test/kotlin/io/sentry/android/gradle/tasks/SentryUploadSnapshotsTaskTest.kt index 5955b08bf..de0b33812 100644 --- a/plugin-build/src/test/kotlin/io/sentry/android/gradle/tasks/SentryUploadSnapshotsTaskTest.kt +++ b/plugin-build/src/test/kotlin/io/sentry/android/gradle/tasks/SentryUploadSnapshotsTaskTest.kt @@ -1,5 +1,6 @@ package io.sentry.android.gradle.tasks +import com.google.common.truth.Truth.assertThat import java.io.File import kotlin.test.assertEquals import kotlin.test.assertFalse @@ -123,6 +124,58 @@ class SentryUploadSnapshotsTaskTest { assertEquals(1, args.indexOf("--url")) } + @Test + fun `all vcs parameters are passed to CLI correctly`() { + val task = createTestTask { + it.cliExecutable.set("sentry-cli") + it.appId.set("com.example") + it.snapshotsPath.set(File("/path/to/snapshots")) + it.vcsHeadSha.set("abc123def456") + it.vcsBaseSha.set("def456abc123") + it.vcsProvider.set("github") + it.vcsHeadRepoName.set("getsentry/sentry-android-gradle-plugin") + it.vcsBaseRepoName.set("getsentry/sentry-android-gradle-plugin") + it.vcsHeadRef.set("feature-branch") + it.vcsBaseRef.set("main") + it.vcsPrNumber.set(123) + } + + val args = task.computeCommandLineArgs() + + assertThat(args).containsAtLeast("--head-sha", "abc123def456").inOrder() + assertThat(args).containsAtLeast("--base-sha", "def456abc123").inOrder() + assertThat(args).containsAtLeast("--vcs-provider", "github").inOrder() + assertThat(args) + .containsAtLeast("--head-repo-name", "getsentry/sentry-android-gradle-plugin") + .inOrder() + assertThat(args) + .containsAtLeast("--base-repo-name", "getsentry/sentry-android-gradle-plugin") + .inOrder() + assertThat(args).containsAtLeast("--head-ref", "feature-branch").inOrder() + assertThat(args).containsAtLeast("--base-ref", "main").inOrder() + assertThat(args).containsAtLeast("--pr-number", "123").inOrder() + } + + @Test + fun `vcs parameters are omitted when not set`() { + val task = createTestTask { + it.cliExecutable.set("sentry-cli") + it.appId.set("com.example") + it.snapshotsPath.set(File("/path/to/snapshots")) + } + + val args = task.computeCommandLineArgs() + + assertThat(args).doesNotContain("--head-sha") + assertThat(args).doesNotContain("--base-sha") + assertThat(args).doesNotContain("--vcs-provider") + assertThat(args).doesNotContain("--head-repo-name") + assertThat(args).doesNotContain("--base-repo-name") + assertThat(args).doesNotContain("--head-ref") + assertThat(args).doesNotContain("--base-ref") + assertThat(args).doesNotContain("--pr-number") + } + private fun createProject(): Project { with(ProjectBuilder.builder().build()) { plugins.apply("io.sentry.android.gradle") From 4857aa9eda514414e74f0ebf28ddc4985f820a5f Mon Sep 17 00:00:00 2001 From: Nelson Osacky Date: Thu, 12 Mar 2026 11:04:41 +0100 Subject: [PATCH 2/2] docs: Add changelog entry for VCS info in snapshots Co-Authored-By: Claude Opus 4.6 (1M context) --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 81a3ebb24..80c32c491 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ ## Unreleased +### Features + +- (Experimental) Wire VCS info extension to snapshot uploads for git metadata support ([#1102](https://github.com/getsentry/sentry-android-gradle-plugin/pull/1102)) + ### Dependencies - Bump CLI from v3.3.2 to v3.3.3 ([#1101](https://github.com/getsentry/sentry-android-gradle-plugin/pull/1101))