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

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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) {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -29,11 +30,30 @@ abstract class SentryUploadSnapshotsTask : SentryCliExecTask() {
@get:PathSensitive(PathSensitivity.RELATIVE)
abstract val snapshotsPath: DirectoryProperty

@get:Input @get:Optional abstract val vcsHeadSha: Property<String>
@get:Input @get:Optional abstract val vcsBaseSha: Property<String>
@get:Input @get:Optional abstract val vcsProvider: Property<String>
@get:Input @get:Optional abstract val vcsHeadRepoName: Property<String>
@get:Input @get:Optional abstract val vcsBaseRepoName: Property<String>
@get:Input @get:Optional abstract val vcsHeadRef: Property<String>
@get:Input @get:Optional abstract val vcsBaseRef: Property<String>
@get:Input @get:Optional abstract val vcsPrNumber: Property<Int>

override fun getArguments(args: MutableList<String>) {
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)
}

Expand Down Expand Up @@ -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()
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -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")
Expand Down
Loading