Skip to content

Commit

Permalink
Add GitHub actions metadata to build time and tests (#453)
Browse files Browse the repository at this point in the history
* Add GitHub Aactions metadata

* Modify url and add stuff to test events
  • Loading branch information
jraska authored Mar 27, 2021
1 parent 3e8c6c5 commit 230e08a
Show file tree
Hide file tree
Showing 8 changed files with 63 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import com.jraska.analytics.AnalyticsReporter
import com.jraska.github.client.firebase.report.FirebaseResultExtractor
import com.jraska.github.client.firebase.report.FirebaseUrlParser
import com.jraska.github.client.firebase.report.TestResultsReporter
import com.jraska.gradle.CiInfo
import com.jraska.gradle.git.GitInfoProvider
import org.apache.tools.ant.util.TeeOutputStream
import org.gradle.api.Plugin
Expand Down Expand Up @@ -57,13 +58,13 @@ class FirebaseTestLabPlugin : Plugin<Project> {
project.exec("gsutil cp $firstResultsFileToPull $firstOutputFile")

val firebaseUrl = FirebaseUrlParser.parse(decorativeStream.toString())
val firstResult = FirebaseResultExtractor(firebaseUrl, GitInfoProvider.gitInfo(project), firstDevice).extract(File(firstOutputFile).readText())
val firstResult = FirebaseResultExtractor(firebaseUrl, GitInfoProvider.gitInfo(project), CiInfo.collectGitHubActions(), firstDevice).extract(File(firstOutputFile).readText())

val secondOutputFile = "${project.buildDir}/test-results/${secondDevice.cloudStoragePath()}/firebase-tests-results.xml"
val secondResultsFileToPull = "gs://test-lab-twsawhz0hy5am-h35y3vymzadax/$resultDir/${secondDevice.cloudStoragePath()}/test_result_1.xml"
project.exec("gsutil cp $secondResultsFileToPull $secondOutputFile")

val secondResult = FirebaseResultExtractor(firebaseUrl, GitInfoProvider.gitInfo(project), secondDevice).extract(File(secondOutputFile).readText())
val secondResult = FirebaseResultExtractor(firebaseUrl, GitInfoProvider.gitInfo(project), CiInfo.collectGitHubActions(), secondDevice).extract(File(secondOutputFile).readText())

val reporter = TestResultsReporter(AnalyticsReporter.create("Test Reporter"))

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.jraska.github.client.firebase

import com.jraska.gradle.CiInfo
import com.jraska.gradle.git.GitInfo

data class TestSuiteResult(
Expand All @@ -14,6 +15,7 @@ data class TestSuiteResult(
val flakyCount: Int,
val firebaseUrl: String,
val gitInfo: GitInfo,
val ciInfo: CiInfo?,
val device: String
)

Expand All @@ -24,6 +26,7 @@ data class TestResult(
val time: Double,
val fullName: String,
val gitInfo: GitInfo,
val ciInfo: CiInfo?,
val firebaseUrl: String,
val failure: String?,
val device: String
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import com.jraska.github.client.firebase.Device
import com.jraska.github.client.firebase.TestOutcome
import com.jraska.github.client.firebase.TestResult
import com.jraska.github.client.firebase.TestSuiteResult
import com.jraska.gradle.CiInfo
import com.jraska.gradle.git.GitInfo
import groovy.util.Node
import groovy.util.NodeList
Expand All @@ -12,6 +13,7 @@ import groovy.util.XmlParser
class FirebaseResultExtractor(
private val firebaseUrl: String,
private val gitInfo: GitInfo,
private val ciInfo: CiInfo?,
private val device: Device
) {
fun extract(xml: String): TestSuiteResult {
Expand All @@ -38,6 +40,7 @@ class FirebaseResultExtractor(
testsCount = testsCount,
device = device.firebaseCommandString(),
gitInfo = gitInfo,
ciInfo = ciInfo,
firebaseUrl = firebaseUrl,
errorsCount = errorsCount,
passedCount = passedCount,
Expand Down Expand Up @@ -68,6 +71,7 @@ class FirebaseResultExtractor(
outcome = outcome,
firebaseUrl = firebaseUrl,
gitInfo = gitInfo,
ciInfo = ciInfo,
device = device.firebaseCommandString(),
fullName = "$className#$methodName"
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,12 @@ class TestResultsReporter(
"failure" to testResult.failure,
"outcome" to testResult.outcome,
"testTime" to testResult.time
).apply { putAll(testResult.gitInfo.asAnalyticsProperties()) }
).apply {
putAll(testResult.gitInfo.asAnalyticsProperties())
if(testResult.ciInfo != null) {
putAll(testResult.ciInfo.asAnalyticsProperties())
}
}
}

private fun convertTestSuite(results: TestSuiteResult): Map<String, Any?> {
Expand All @@ -49,7 +54,12 @@ class TestResultsReporter(
"flakyCount" to results.flakyCount,
"failedCount" to results.failedCount,
"errorsCount" to results.errorsCount
).apply { putAll(results.gitInfo.asAnalyticsProperties()) }
).apply {
putAll(results.gitInfo.asAnalyticsProperties())
if(results.ciInfo != null) {
putAll(results.ciInfo.asAnalyticsProperties())
}
}
}

companion object {
Expand Down
32 changes: 32 additions & 0 deletions plugins/src/main/java/com/jraska/gradle/CiInfo.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package com.jraska.gradle

import okhttp3.HttpUrl
import okhttp3.HttpUrl.Companion.toHttpUrl

class CiInfo(
val runId: Long,
val workflowName: String,
val runNumber: Int,
val runLink: HttpUrl
) {
fun asAnalyticsProperties(): Map<String, Any?> {
return mapOf(
"runId" to runId,
"workflowName" to workflowName,
"runNumber" to runNumber,
"runLink" to runLink.toString(),
)
}

companion object {
fun collectGitHubActions(): CiInfo? {
val workflowName = System.getenv("GITHUB_WORKFLOW") ?: return null

val runId = System.getenv("GITHUB_RUN_ID").toLong()
val runNumber = System.getenv("GITHUB_RUN_NUMBER").toInt()
val runLink = "https://github.com/jraska/github-client/actions/runs/$runId".toHttpUrl()

return CiInfo(runId, workflowName, runNumber, runLink)
}
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.jraska.gradle.buildtime

import com.jraska.gradle.CiInfo
import com.jraska.gradle.git.GitInfo

data class BuildData(
Expand All @@ -16,6 +17,7 @@ data class BuildData(
val environment: Environment,
val parameters: Map<String, Any>,
val gitInfo: GitInfo,
val ciInfo: CiInfo?,
val taskStatistics: TaskStatistics,
val buildDataCollectionOverhead: Long // This is only collection overhead. We cannot see the reporting overhead as measuring and reporting it will add meta- overhead :D
)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.jraska.gradle.buildtime

import com.jraska.gradle.CiInfo
import com.jraska.gradle.git.GitInfoProvider
import org.codehaus.groovy.runtime.ProcessGroovyMethods
import org.gradle.BuildResult
Expand Down Expand Up @@ -27,6 +28,8 @@ object BuildDataFactory {
val daemonInfo = services[DaemonScanInfo::class.java]
val startParameter = gradle.startParameter

val ciInfo = CiInfo.collectGitHubActions()

return BuildData(
action = result.action,
buildTime = totalTime,
Expand All @@ -47,6 +50,7 @@ object BuildDataFactory {
"maxWorkers" to startParameter.maxWorkerCount
).apply { putAll(startParameter.systemPropertiesArgs) },
gitInfo = GitInfoProvider.gitInfo(gradle.rootProject),
ciInfo = ciInfo,
taskStatistics = TaskStatistics(
statistics.totalTaskCount,
statistics.upToDateTaskCount,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,9 @@ class BuildReporter(
).apply {
putAll(buildData.parameters)
putAll(buildData.gitInfo.asAnalyticsProperties())
if (buildData.ciInfo != null) {
putAll(buildData.ciInfo.asAnalyticsProperties())
}
}
}

Expand Down

0 comments on commit 230e08a

Please sign in to comment.