feat: set up Sentry

This commit is contained in:
Harsh Shandilya 2023-03-03 01:43:03 +05:30
parent 62dd421cf4
commit 905c27fe84
No known key found for this signature in database
10 changed files with 130 additions and 2 deletions

View file

@ -25,6 +25,13 @@
], ],
"groupName": "kotlin" "groupName": "kotlin"
}, },
{
"matchPackagePatterns": [
"^io.sentry",
"^sentry",
],
"groupName": "sentry"
},
{ {
"managers": [ "managers": [
"gradle" "gradle"
@ -81,6 +88,17 @@
], ],
"datasourceTemplate": "docker", "datasourceTemplate": "docker",
"depNameTemplate": "jetbrains/qodana-jvm-android", "depNameTemplate": "jetbrains/qodana-jvm-android",
},
{
"fileMatch": [
"gradle/libs.versions.toml"
],
"matchStrings": [
"sentry-sdk = \"(?<currentValue>.*)\""
],
"datasourceTemplate": "maven",
"depNameTemplate": "io.sentry:sentry-android",
"registryUrlTemplate": "https://repo1.maven.org/maven2/",
} }
] ]
} }

View file

@ -61,6 +61,8 @@ jobs:
# This allows us to build most of what we need without the emulator running # This allows us to build most of what we need without the emulator running
# and using resources # and using resources
- name: Build app and benchmark - name: Build app and benchmark
env:
SENTRY_DSN: ${{ secrets.SENTRY_DSN }}
run: ./gradlew :benchmark:assembleBenchmark :android:assembleBenchmark run: ./gradlew :benchmark:assembleBenchmark :android:assembleBenchmark
# Now use reactivecircus/android-emulator-runner to spin up an emulator. We're gonna use it again # Now use reactivecircus/android-emulator-runner to spin up an emulator. We're gonna use it again

View file

@ -70,6 +70,8 @@ jobs:
- name: Build release app - name: Build release app
uses: gradle/gradle-build-action@6095a76664413da4c8c134ee32e8a8ae900f0f1f # v2.4.0 uses: gradle/gradle-build-action@6095a76664413da4c8c134ee32e8a8ae900f0f1f # v2.4.0
env:
SENTRY_DSN: ${{ secrets.SENTRY_DSN }}
with: with:
arguments: --no-configuration-cache --stacktrace collectReleaseApks arguments: --no-configuration-cache --stacktrace collectReleaseApks
gradle-home-cache-cleanup: true gradle-home-cache-cleanup: true

View file

@ -57,8 +57,10 @@ jobs:
- name: Build release assets - name: Build release assets
shell: bash shell: bash
env:
SENTRY_DSN: ${{ secrets.SENTRY_DSN }}
run: | run: |
./gradlew --no-configuration-cache collectReleaseApks collectReleaseBundle ./gradlew --no-configuration-cache collectReleaseApks collectReleaseBundle -PsentryUploadMappings
- name: Clean secrets - name: Clean secrets
run: scripts/signing-cleanup.sh run: scripts/signing-cleanup.sh

View file

@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased] ## [Unreleased]
### Added
* Introduce [Sentry](https://sentry.io) for error reporting and performance monitoring
## [1.22.0] - 2023-03-02 ## [1.22.0] - 2023-03-02
### Changed ### Changed

View file

@ -11,6 +11,7 @@ plugins {
id("dev.msfjarvis.claw.rename-artifacts") id("dev.msfjarvis.claw.rename-artifacts")
id("dev.msfjarvis.claw.kotlin-android") id("dev.msfjarvis.claw.kotlin-android")
id("dev.msfjarvis.claw.kotlin-kapt") id("dev.msfjarvis.claw.kotlin-kapt")
id("dev.msfjarvis.claw.sentry")
id("dev.msfjarvis.claw.versioning-plugin") id("dev.msfjarvis.claw.versioning-plugin")
alias(libs.plugins.anvil) alias(libs.plugins.anvil)
alias(libs.plugins.whetstone) alias(libs.plugins.whetstone)

View file

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8" ?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<application>
<!-- Required: set your sentry.io project identifier (DSN) -->
<meta-data android:name="io.sentry.dsn" android:value="${sentryDsn}" />
<!-- enable automatic breadcrumbs for user interactions (clicks, swipes, scrolls) -->
<meta-data android:name="io.sentry.traces.user-interaction.enable" android:value="true" />
<meta-data android:name="io.sentry.breadcrumbs.user-interaction" android:value="true" />
<!-- enable screenshot for crashes -->
<meta-data android:name="io.sentry.attach-screenshot" android:value="true" />
<!-- enable view hierarchy for crashes -->
<meta-data android:name="io.sentry.attach-view-hierarchy" android:value="true" />
<!-- enable the performance API by setting a sample-rate, adjust in production env -->
<meta-data android:name="io.sentry.traces.sample-rate" android:value="0.8" />
<!-- enable profiling when starting transactions, adjust in production env -->
<meta-data android:name="io.sentry.traces.profiling.sample-rate" android:value="0.8" />
</application>
</manifest>

View file

@ -1,5 +1,5 @@
/* /*
* Copyright © 2022 Harsh Shandilya. * Copyright © 2022-2023 Harsh Shandilya.
* Use of this source code is governed by an MIT-style * Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at * license that can be found in the LICENSE file or at
* https://opensource.org/licenses/MIT. * https://opensource.org/licenses/MIT.
@ -59,6 +59,10 @@ gradlePlugin {
id = "dev.msfjarvis.claw.rename-artifacts" id = "dev.msfjarvis.claw.rename-artifacts"
implementationClass = "dev.msfjarvis.claw.gradle.RenameArtifactsPlugin" implementationClass = "dev.msfjarvis.claw.gradle.RenameArtifactsPlugin"
} }
register("sentry") {
id = "dev.msfjarvis.claw.sentry"
implementationClass = "dev.msfjarvis.claw.gradle.SentryPlugin"
}
register("spotless") { register("spotless") {
id = "dev.msfjarvis.claw.spotless" id = "dev.msfjarvis.claw.spotless"
implementationClass = "dev.msfjarvis.claw.gradle.SpotlessPlugin" implementationClass = "dev.msfjarvis.claw.gradle.SpotlessPlugin"
@ -80,6 +84,7 @@ dependencies {
implementation(libs.build.detekt) implementation(libs.build.detekt)
implementation(libs.build.kotlin.gradle) implementation(libs.build.kotlin.gradle)
implementation(libs.build.semver) implementation(libs.build.semver)
implementation(libs.build.sentry)
implementation(libs.build.spotless) implementation(libs.build.spotless)
implementation(libs.build.vcu) implementation(libs.build.vcu)
implementation(libs.build.versions) implementation(libs.build.versions)

View file

@ -0,0 +1,71 @@
/*
* Copyright © 2023 Harsh Shandilya.
* Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at
* https://opensource.org/licenses/MIT.
*/
package dev.msfjarvis.claw.gradle
import com.android.build.api.variant.ApplicationAndroidComponentsExtension
import io.sentry.android.gradle.extensions.InstrumentationFeature
import io.sentry.android.gradle.extensions.SentryPluginExtension
import java.util.EnumSet
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.api.artifacts.VersionCatalogsExtension
import org.gradle.kotlin.dsl.apply
import org.gradle.kotlin.dsl.configure
import org.gradle.kotlin.dsl.getByType
@Suppress("Unused")
class SentryPlugin : Plugin<Project> {
override fun apply(project: Project) {
project.pluginManager.withPlugin("com.android.application") {
val catalog = project.extensions.getByType<VersionCatalogsExtension>()
val libs = catalog.named("libs")
project.extensions.configure<ApplicationAndroidComponentsExtension> {
onVariants(selector()) { variant ->
val sentryDsn = project.providers.environmentVariable(SENTRY_DSN_PROPERTY)
if (sentryDsn.isPresent) {
variant.manifestPlaceholders.put("sentryDsn", sentryDsn.get())
}
}
}
project.plugins.apply(io.sentry.android.gradle.SentryPlugin::class)
project.extensions.configure<SentryPluginExtension> {
val enableMappings =
project.providers.gradleProperty(SENTRY_UPLOAD_MAPPINGS_PROPERTY).isPresent
includeProguardMapping.set(enableMappings)
autoUploadProguardMapping.set(enableMappings)
uploadNativeSymbols.set(false)
autoUploadNativeSymbols.set(false)
includeNativeSources.set(false)
ignoredVariants.set(emptySet())
ignoredBuildTypes.set(setOf("debug"))
ignoredFlavors.set(emptySet())
tracingInstrumentation {
enabled.set(true)
debug.set(false)
forceInstrumentDependencies.set(false)
features.set(EnumSet.allOf(InstrumentationFeature::class.java))
}
experimentalGuardsquareSupport.set(false)
autoInstallation {
enabled.set(true)
sentryVersion.set(libs.findVersion("sentry-sdk").get().requiredVersion)
}
includeDependenciesReport.set(true)
}
with(project.dependencies) {
addProvider("implementation", platform(libs.findLibrary("sentry-bom").get()))
}
}
}
private companion object {
private const val SENTRY_DSN_PROPERTY = "SENTRY_DSN"
private const val SENTRY_UPLOAD_MAPPINGS_PROPERTY = "sentryUploadMappings"
}
}

View file

@ -14,6 +14,7 @@ kotlin = "1.8.10"
okhttp = "3.14.9" okhttp = "3.14.9"
retrofit = "2.9.0" retrofit = "2.9.0"
richtext = "0.16.0" richtext = "0.16.0"
sentry-sdk = "6.15.0"
serialization = "1.5.0" serialization = "1.5.0"
sqldelight = "2.0.0-alpha05" sqldelight = "2.0.0-alpha05"
whetstone = "0.6.0-SNAPSHOT" whetstone = "0.6.0-SNAPSHOT"
@ -52,6 +53,7 @@ build-cachefix = "org.gradle.android.cache-fix:org.gradle.android.cache-fix.grad
build-detekt = "io.gitlab.arturbosch.detekt:detekt-gradle-plugin:1.22.0" build-detekt = "io.gitlab.arturbosch.detekt:detekt-gradle-plugin:1.22.0"
build-kotlin-gradle = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", version.ref = "kotlin" } build-kotlin-gradle = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", version.ref = "kotlin" }
build-semver = "com.vdurmont:semver4j:3.1.0" build-semver = "com.vdurmont:semver4j:3.1.0"
build-sentry = "io.sentry.android.gradle:io.sentry.android.gradle.gradle.plugin:3.4.2"
build-spotless = "com.diffplug.spotless:spotless-plugin-gradle:6.16.0" build-spotless = "com.diffplug.spotless:spotless-plugin-gradle:6.16.0"
build-vcu = "nl.littlerobots.version-catalog-update:nl.littlerobots.version-catalog-update.gradle.plugin:0.7.0" build-vcu = "nl.littlerobots.version-catalog-update:nl.littlerobots.version-catalog-update.gradle.plugin:0.7.0"
build-versions = "com.github.ben-manes:gradle-versions-plugin:0.46.0" build-versions = "com.github.ben-manes:gradle-versions-plugin:0.46.0"
@ -78,6 +80,7 @@ okhttp-core = { module = "com.squareup.okhttp3:okhttp", version.ref = "okhttp" }
okhttp-loggingInterceptor = { module = "com.squareup.okhttp3:logging-interceptor", version.ref = "okhttp" } okhttp-loggingInterceptor = { module = "com.squareup.okhttp3:logging-interceptor", version.ref = "okhttp" }
retrofit = { module = "com.squareup.retrofit2:retrofit", version.ref = "retrofit" } retrofit = { module = "com.squareup.retrofit2:retrofit", version.ref = "retrofit" }
retrofit-kotlinxSerializationConverter = "com.jakewharton.retrofit:retrofit2-kotlinx-serialization-converter:0.8.0" retrofit-kotlinxSerializationConverter = "com.jakewharton.retrofit:retrofit2-kotlinx-serialization-converter:0.8.0"
sentry-bom = { module = "io.sentry:sentry-bom", version.ref = "sentry-sdk" }
sqldelight-androidDriver = { module = "app.cash.sqldelight:android-driver", version.ref = "sqldelight" } sqldelight-androidDriver = { module = "app.cash.sqldelight:android-driver", version.ref = "sqldelight" }
sqldelight-extensions-coroutines = { module = "app.cash.sqldelight:coroutines-extensions-jvm", version.ref = "sqldelight" } sqldelight-extensions-coroutines = { module = "app.cash.sqldelight:coroutines-extensions-jvm", version.ref = "sqldelight" }
sqldelight-jvmDriver = { module = "app.cash.sqldelight:sqlite-driver", version.ref = "sqldelight" } sqldelight-jvmDriver = { module = "app.cash.sqldelight:sqlite-driver", version.ref = "sqldelight" }