From 1196d15b3f5715672263dc58b4815aac6067a7df Mon Sep 17 00:00:00 2001 From: 0marperez Date: Thu, 25 Apr 2024 14:23:35 -0400 Subject: [PATCH 1/4] feat: save artifact size metrics task --- .../ArtifactSizeMetricsPlugin.kt | 1 + .../SaveArtifactSizeMetrics.kt | 56 +++++++++++++++++++ 2 files changed, 57 insertions(+) create mode 100644 build-plugins/build-support/src/main/kotlin/aws/sdk/kotlin/gradle/plugins/artifactsizemetrics/SaveArtifactSizeMetrics.kt diff --git a/build-plugins/build-support/src/main/kotlin/aws/sdk/kotlin/gradle/plugins/artifactsizemetrics/ArtifactSizeMetricsPlugin.kt b/build-plugins/build-support/src/main/kotlin/aws/sdk/kotlin/gradle/plugins/artifactsizemetrics/ArtifactSizeMetricsPlugin.kt index fbfec34..7970d3d 100644 --- a/build-plugins/build-support/src/main/kotlin/aws/sdk/kotlin/gradle/plugins/artifactsizemetrics/ArtifactSizeMetricsPlugin.kt +++ b/build-plugins/build-support/src/main/kotlin/aws/sdk/kotlin/gradle/plugins/artifactsizemetrics/ArtifactSizeMetricsPlugin.kt @@ -36,6 +36,7 @@ class ArtifactSizeMetricsPlugin : Plugin { target.tasks.register("collectDelegatedArtifactSizeMetrics") { group = TASK_GROUP } target.tasks.register("analyzeArtifactSizeMetrics") { group = TASK_GROUP } target.tasks.register("putArtifactSizeMetricsInCloudWatch") { group = TASK_GROUP } + target.tasks.register("saveArtifactSizeMetrics") { group = TASK_GROUP } } } diff --git a/build-plugins/build-support/src/main/kotlin/aws/sdk/kotlin/gradle/plugins/artifactsizemetrics/SaveArtifactSizeMetrics.kt b/build-plugins/build-support/src/main/kotlin/aws/sdk/kotlin/gradle/plugins/artifactsizemetrics/SaveArtifactSizeMetrics.kt new file mode 100644 index 0000000..ea0e7c4 --- /dev/null +++ b/build-plugins/build-support/src/main/kotlin/aws/sdk/kotlin/gradle/plugins/artifactsizemetrics/SaveArtifactSizeMetrics.kt @@ -0,0 +1,56 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ +package aws.sdk.kotlin.gradle.plugins.artifactsizemetrics + +import aws.sdk.kotlin.gradle.util.AwsSdkGradleException +import aws.sdk.kotlin.services.s3.S3Client +import aws.sdk.kotlin.services.s3.putObject +import aws.smithy.kotlin.runtime.content.ByteStream +import kotlinx.coroutines.runBlocking +import org.gradle.api.DefaultTask +import org.gradle.api.file.RegularFileProperty +import org.gradle.api.tasks.InputFile +import org.gradle.api.tasks.TaskAction + +/** + * Puts artifact size metrics in S3 to save them. + * We put them in CloudWatch also (as metrics) but CloudWatch only keeps metrics temporarily. + */ +internal abstract class SaveArtifactSizeMetrics : DefaultTask() { + /** + * File containing the project's artifact size metrics. + */ + @get:InputFile + abstract val metricsFile: RegularFileProperty + + init { + metricsFile.convention(project.layout.buildDirectory.file(OUTPUT_PATH + "artifact-size-metrics.csv")) + } + + private val pluginConfig = project.rootProject.extensions.getByType(ArtifactSizeMetricsPluginConfig::class.java) + + @TaskAction + fun save() { + val releaseTag = project.findProperty("release")?.toString()?.also { + check(it.isNotEmpty()) { "The release property is set to empty \"-Prelease=\" (no value set). Please specify a value." } + } ?: throw AwsSdkGradleException("The release property is not set. Please set a value: \"-Prelease=YOUR_RELEASE_VALUE\"") + + runBlocking { + S3Client.fromEnvironment().use { s3 -> + s3.putObject { + bucket = S3_ARTIFACT_SIZE_METRICS_BUCKET + key = "${pluginConfig.projectRepositoryName}-latest-release.csv" + body = ByteStream.fromString(metricsFile.get().asFile.readText()) + } + + s3.putObject { + bucket = S3_ARTIFACT_SIZE_METRICS_BUCKET + key = "${pluginConfig.projectRepositoryName}-$releaseTag-release.csv" + body = ByteStream.fromString(metricsFile.get().asFile.readText()) + } + } + } + } +} From 89acbd063c0624a64b906d8410a30d7aff6257b0 Mon Sep 17 00:00:00 2001 From: 0marperez Date: Thu, 25 Apr 2024 14:27:02 -0400 Subject: [PATCH 2/4] reduce duplicated code --- .../plugins/artifactsizemetrics/SaveArtifactSizeMetrics.kt | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/build-plugins/build-support/src/main/kotlin/aws/sdk/kotlin/gradle/plugins/artifactsizemetrics/SaveArtifactSizeMetrics.kt b/build-plugins/build-support/src/main/kotlin/aws/sdk/kotlin/gradle/plugins/artifactsizemetrics/SaveArtifactSizeMetrics.kt index ea0e7c4..b1b7a74 100644 --- a/build-plugins/build-support/src/main/kotlin/aws/sdk/kotlin/gradle/plugins/artifactsizemetrics/SaveArtifactSizeMetrics.kt +++ b/build-plugins/build-support/src/main/kotlin/aws/sdk/kotlin/gradle/plugins/artifactsizemetrics/SaveArtifactSizeMetrics.kt @@ -37,18 +37,20 @@ internal abstract class SaveArtifactSizeMetrics : DefaultTask() { check(it.isNotEmpty()) { "The release property is set to empty \"-Prelease=\" (no value set). Please specify a value." } } ?: throw AwsSdkGradleException("The release property is not set. Please set a value: \"-Prelease=YOUR_RELEASE_VALUE\"") + val artifactSizeMetrics = ByteStream.fromString(metricsFile.get().asFile.readText()) + runBlocking { S3Client.fromEnvironment().use { s3 -> s3.putObject { bucket = S3_ARTIFACT_SIZE_METRICS_BUCKET key = "${pluginConfig.projectRepositoryName}-latest-release.csv" - body = ByteStream.fromString(metricsFile.get().asFile.readText()) + body = artifactSizeMetrics } s3.putObject { bucket = S3_ARTIFACT_SIZE_METRICS_BUCKET key = "${pluginConfig.projectRepositoryName}-$releaseTag-release.csv" - body = ByteStream.fromString(metricsFile.get().asFile.readText()) + body = artifactSizeMetrics } } } From a9cb522dfa37a54ae99118581f3fae84fd559fd0 Mon Sep 17 00:00:00 2001 From: 0marperez Date: Thu, 25 Apr 2024 14:48:28 -0400 Subject: [PATCH 3/4] Minor improvements --- .../artifactsizemetrics/ArtifactSizeMetricsPlugin.kt | 6 ++---- .../PutArtifactSizeMetricsInCloudWatch.kt | 6 ++---- .../artifactsizemetrics/SaveArtifactSizeMetrics.kt | 7 ++----- .../kotlin/aws/sdk/kotlin/gradle/util/ProjectExt.kt | 10 ++++++++++ 4 files changed, 16 insertions(+), 13 deletions(-) diff --git a/build-plugins/build-support/src/main/kotlin/aws/sdk/kotlin/gradle/plugins/artifactsizemetrics/ArtifactSizeMetricsPlugin.kt b/build-plugins/build-support/src/main/kotlin/aws/sdk/kotlin/gradle/plugins/artifactsizemetrics/ArtifactSizeMetricsPlugin.kt index 7970d3d..ef57212 100644 --- a/build-plugins/build-support/src/main/kotlin/aws/sdk/kotlin/gradle/plugins/artifactsizemetrics/ArtifactSizeMetricsPlugin.kt +++ b/build-plugins/build-support/src/main/kotlin/aws/sdk/kotlin/gradle/plugins/artifactsizemetrics/ArtifactSizeMetricsPlugin.kt @@ -4,7 +4,7 @@ */ package aws.sdk.kotlin.gradle.plugins.artifactsizemetrics -import org.gradle.api.GradleException +import aws.sdk.kotlin.gradle.util.verifyRootProject import org.gradle.api.Plugin import org.gradle.api.Project import org.gradle.api.tasks.TaskProvider @@ -22,9 +22,7 @@ internal const val S3_ARTIFACT_SIZE_METRICS_BUCKET = "artifact-size-metrics" // */ class ArtifactSizeMetricsPlugin : Plugin { override fun apply(target: Project) { - if (target != target.rootProject) { - throw GradleException("${this::class.java} can only be applied to the root project") - } + target.verifyRootProject { "${this::class.java} can only be applied to the root project" } target.extensions.create("artifactSizeMetrics", ArtifactSizeMetricsPluginConfig::class.java) diff --git a/build-plugins/build-support/src/main/kotlin/aws/sdk/kotlin/gradle/plugins/artifactsizemetrics/PutArtifactSizeMetricsInCloudWatch.kt b/build-plugins/build-support/src/main/kotlin/aws/sdk/kotlin/gradle/plugins/artifactsizemetrics/PutArtifactSizeMetricsInCloudWatch.kt index 6a84750..2f64681 100644 --- a/build-plugins/build-support/src/main/kotlin/aws/sdk/kotlin/gradle/plugins/artifactsizemetrics/PutArtifactSizeMetricsInCloudWatch.kt +++ b/build-plugins/build-support/src/main/kotlin/aws/sdk/kotlin/gradle/plugins/artifactsizemetrics/PutArtifactSizeMetricsInCloudWatch.kt @@ -4,7 +4,7 @@ */ package aws.sdk.kotlin.gradle.plugins.artifactsizemetrics -import aws.sdk.kotlin.gradle.util.AwsSdkGradleException +import aws.sdk.kotlin.gradle.util.stringPropertyNotNull import aws.sdk.kotlin.services.cloudwatch.CloudWatchClient import aws.sdk.kotlin.services.cloudwatch.model.Dimension import aws.sdk.kotlin.services.cloudwatch.model.MetricDatum @@ -36,9 +36,7 @@ internal abstract class PutArtifactSizeMetricsInCloudWatch : DefaultTask() { fun put() { val currentTime = Instant.now() val pluginConfig = project.rootProject.extensions.getByType(ArtifactSizeMetricsPluginConfig::class.java) - val releaseTag = project.findProperty("release")?.toString()?.also { - check(it.isNotEmpty()) { "The release property is set to empty \"-Prelease=\" (no value set). Please specify a value." } - } ?: throw AwsSdkGradleException("The release property is not set. Please set a value: \"-Prelease=YOUR_RELEASE_VALUE\"") + val releaseTag = project.stringPropertyNotNull("release") val metrics = metricsFile .get() diff --git a/build-plugins/build-support/src/main/kotlin/aws/sdk/kotlin/gradle/plugins/artifactsizemetrics/SaveArtifactSizeMetrics.kt b/build-plugins/build-support/src/main/kotlin/aws/sdk/kotlin/gradle/plugins/artifactsizemetrics/SaveArtifactSizeMetrics.kt index b1b7a74..299fb8c 100644 --- a/build-plugins/build-support/src/main/kotlin/aws/sdk/kotlin/gradle/plugins/artifactsizemetrics/SaveArtifactSizeMetrics.kt +++ b/build-plugins/build-support/src/main/kotlin/aws/sdk/kotlin/gradle/plugins/artifactsizemetrics/SaveArtifactSizeMetrics.kt @@ -4,7 +4,7 @@ */ package aws.sdk.kotlin.gradle.plugins.artifactsizemetrics -import aws.sdk.kotlin.gradle.util.AwsSdkGradleException +import aws.sdk.kotlin.gradle.util.stringPropertyNotNull import aws.sdk.kotlin.services.s3.S3Client import aws.sdk.kotlin.services.s3.putObject import aws.smithy.kotlin.runtime.content.ByteStream @@ -33,10 +33,7 @@ internal abstract class SaveArtifactSizeMetrics : DefaultTask() { @TaskAction fun save() { - val releaseTag = project.findProperty("release")?.toString()?.also { - check(it.isNotEmpty()) { "The release property is set to empty \"-Prelease=\" (no value set). Please specify a value." } - } ?: throw AwsSdkGradleException("The release property is not set. Please set a value: \"-Prelease=YOUR_RELEASE_VALUE\"") - + val releaseTag = project.stringPropertyNotNull("release") val artifactSizeMetrics = ByteStream.fromString(metricsFile.get().asFile.readText()) runBlocking { diff --git a/build-plugins/build-support/src/main/kotlin/aws/sdk/kotlin/gradle/util/ProjectExt.kt b/build-plugins/build-support/src/main/kotlin/aws/sdk/kotlin/gradle/util/ProjectExt.kt index e0fd4a5..9907c73 100644 --- a/build-plugins/build-support/src/main/kotlin/aws/sdk/kotlin/gradle/util/ProjectExt.kt +++ b/build-plugins/build-support/src/main/kotlin/aws/sdk/kotlin/gradle/util/ProjectExt.kt @@ -65,4 +65,14 @@ public inline fun Project.verifyRootProject(lazyMessage: () -> Any) { } } +/** + * Will access a project property as a String, only if it is not null or not empty. + * @throws AwsSdkGradleException If the property is empty or null + * @return The property as a String + */ +fun Project.stringPropertyNotNull(property: String): String = + findProperty(property)?.toString()?.also { + check(it.isNotEmpty()) { "The $property property is set to empty \"-P$property=\" (no value set). Please specify a value." } + } ?: throw AwsSdkGradleException("The $property property is not set. Please set a value: \"-P$property=YOUR_VALUE\"") + class AwsSdkGradleException(message: String) : GradleException(message) From cf4deb4222e9fafc96a4abf4e2b092a7697b849f Mon Sep 17 00:00:00 2001 From: 0marperez Date: Fri, 26 Apr 2024 13:19:22 -0400 Subject: [PATCH 4/4] Change plugin ID --- build-plugins/build-support/build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build-plugins/build-support/build.gradle.kts b/build-plugins/build-support/build.gradle.kts index 96e1493..e76fcbf 100644 --- a/build-plugins/build-support/build.gradle.kts +++ b/build-plugins/build-support/build.gradle.kts @@ -30,7 +30,7 @@ dependencies { gradlePlugin { plugins { create("artifact-size-metrics") { - id = "artifact-size-metrics" + id = "aws.sdk.kotlin.gradle.artifactsizemetrics" implementationClass = "aws.sdk.kotlin.gradle.plugins.artifactsizemetrics.ArtifactSizeMetricsPlugin" } }