Skip to content
Closed
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
9 changes: 9 additions & 0 deletions .changeset/gradle-plugin-event-release-mode-default.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
---
'posthog-android-gradle-plugin': minor
---

Default `posthog.releaseMode` to `event`. The proguard mapping now uploads release-independent. Each event resolves its own release from the `$app_namespace` / `$app_version` / `$app_build` the SDK already sends. Two releases that ship the same mapping no longer both report whichever release uploaded it first.

Set `posthog.releaseMode=symbol-set`, or `POSTHOG_RELEASE_MODE=symbol-set`, to keep stamping the release onto the uploaded mapping.

Event mode needs posthog-cli 0.13.0 or newer. That version added `--release-mode` to `proguard upload`. The release coordinates the build sends must match the app's applicationId, versionName and versionCode.
Original file line number Diff line number Diff line change
Expand Up @@ -105,8 +105,9 @@ public abstract class PostHogUploadProguardMappingsTask : PostHogCliExecTask() {
args.add("--build")
args.add(it.toString())
}
// Passed only outside the default mode, so a symbol-set build keeps working against a
// posthog-cli predating the flag.
// Passed only outside symbol-set mode, so a symbol-set build keeps working against a
// posthog-cli predating the flag. The environment variable set above pins the mode for
// binaries that do know it.
releaseMode.orNull?.takeIf { it != PostHogReleaseMode.SYMBOL_SET.cliValue }?.let {
args.add("--release-mode")
args.add(it)
Expand All @@ -122,7 +123,7 @@ public abstract class PostHogUploadProguardMappingsTask : PostHogCliExecTask() {
releaseName: Provider<String>? = null,
releaseVersion: Provider<String>? = null,
build: Provider<Int>? = null,
releaseMode: PostHogReleaseMode = PostHogReleaseMode.SYMBOL_SET,
releaseMode: PostHogReleaseMode = PostHogReleaseMode.EVENT,
): TaskProvider<PostHogUploadProguardMappingsTask> {
val uploadPostHogProguardMappingsTask =
project.tasks.register(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -145,7 +145,7 @@ internal enum class PostHogReleaseMode(val cliValue: String) {
/**
* Release mode for this build: the `posthog.releaseMode` gradle property, then the
* `POSTHOG_RELEASE_MODE` environment variable posthog-cli and the bundler plugins already read,
* then [PostHogReleaseMode.SYMBOL_SET].
* then [PostHogReleaseMode.EVENT].
*
* An unrecognized value fails the build rather than falling back, so a typo can't silently leave
* a build binding its mapping to a release it meant to keep independent.
Expand All @@ -157,7 +157,7 @@ internal fun resolvePostHogReleaseMode(
val value =
project.findProperty(POSTHOG_RELEASE_MODE_PROPERTY)?.toString()?.trim()?.takeIf { it.isNotEmpty() }
?: environment[POSTHOG_RELEASE_MODE_ENV]?.trim()?.takeIf { it.isNotEmpty() }
?: return PostHogReleaseMode.SYMBOL_SET
?: return PostHogReleaseMode.EVENT
Comment thread
ablaszkiewicz marked this conversation as resolved.

return PostHogReleaseMode.from(value)
?: error(
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
package com.posthog.android

import org.gradle.api.Project
import org.gradle.testfixtures.ProjectBuilder
import org.junit.Test
import kotlin.test.assertEquals
import kotlin.test.assertFailsWith

internal class PostHogReleaseModeTest {
// Not `apply`: Project has its own apply(), so the scope function would resolve to Gradle's.
private fun project(releaseMode: String? = null): Project {
val project = ProjectBuilder.builder().build()
releaseMode?.let { project.extensions.extraProperties.set(POSTHOG_RELEASE_MODE_PROPERTY, it) }
return project
}

@Test
fun `a build that configures nothing uploads its mapping release-independent`() {
assertEquals(PostHogReleaseMode.EVENT, resolvePostHogReleaseMode(project(), emptyMap()))
}

@Test
fun `the gradle property selects the mode`() {
assertEquals(
PostHogReleaseMode.SYMBOL_SET,
resolvePostHogReleaseMode(project(releaseMode = "symbol-set"), emptyMap()),
)
}

@Test
fun `the environment variable selects the mode`() {
assertEquals(
PostHogReleaseMode.SYMBOL_SET,
resolvePostHogReleaseMode(project(), mapOf(POSTHOG_RELEASE_MODE_ENV to "symbol-set")),
)
}

@Test
fun `the gradle property wins over the environment variable`() {
assertEquals(
PostHogReleaseMode.SYMBOL_SET,
resolvePostHogReleaseMode(
project(releaseMode = "symbol-set"),
mapOf(POSTHOG_RELEASE_MODE_ENV to "event"),
),
)
}

@Test
fun `an unrecognized value fails the build instead of picking a mode`() {
assertFailsWith<IllegalStateException> {
resolvePostHogReleaseMode(project(releaseMode = "symbolset"), emptyMap())
}
}
}