diff --git a/gradle.properties b/gradle.properties index 5354330f..dae9f0b3 100644 --- a/gradle.properties +++ b/gradle.properties @@ -5,5 +5,5 @@ org.gradle.jvmargs=--add-exports jdk.compiler/com.sun.tools.javac.api=ALL-UNNAME --add-exports jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED org.gradle.configuration-cache=true org.gradle.caching=true -version=0.12.0 +version=0.12.1 group=com.ryandens diff --git a/jib-common/build.gradle.kts b/jib-common/build.gradle.kts new file mode 100644 index 00000000..4371586b --- /dev/null +++ b/jib-common/build.gradle.kts @@ -0,0 +1,9 @@ +plugins { + id("com.ryandens.plugin-conventions") +} + +dependencies { + implementation(project(":plugin")) + compileOnly("com.google.cloud.tools:jib-gradle-plugin-extension-api:0.4.0") + compileOnly("com.google.cloud.tools.jib:com.google.cloud.tools.jib.gradle.plugin:3.5.3") +} diff --git a/plugin/src/main/java/com/ryandens/javaagent/JibExtensionConfiguration.java b/jib-common/src/main/java/com/ryandens/javaagent/jib/JibExtensionConfiguration.java similarity index 88% rename from plugin/src/main/java/com/ryandens/javaagent/JibExtensionConfiguration.java rename to jib-common/src/main/java/com/ryandens/javaagent/jib/JibExtensionConfiguration.java index c101d447..c90e2732 100644 --- a/plugin/src/main/java/com/ryandens/javaagent/JibExtensionConfiguration.java +++ b/jib-common/src/main/java/com/ryandens/javaagent/jib/JibExtensionConfiguration.java @@ -1,4 +1,4 @@ -package com.ryandens.javaagent; +package com.ryandens.javaagent.jib; import java.io.File; import javax.inject.Inject; @@ -11,9 +11,8 @@ * Extra configuration for {@link JavaagentJibExtension}. Declares the javaagent files that should * be copied into the container image and referenced via {@code -javaagent} JVM flags. * - *

Instances are created by Jib's plugin extension mechanism via {@link - * org.gradle.api.model.ObjectFactory}, so this class must have a single-argument constructor - * accepting {@link ObjectFactory}. + *

Instances are created by Jib's plugin extension mechanism via {@link ObjectFactory}, so this + * class must have a single-argument constructor accepting {@link ObjectFactory}. */ public class JibExtensionConfiguration { diff --git a/plugin/src/main/kotlin/com/ryandens/javaagent/JavaagentJibExtension.kt b/jib-common/src/main/kotlin/com/ryandens/javaagent/jib/JavaagentJibExtension.kt similarity index 78% rename from plugin/src/main/kotlin/com/ryandens/javaagent/JavaagentJibExtension.kt rename to jib-common/src/main/kotlin/com/ryandens/javaagent/jib/JavaagentJibExtension.kt index b5d867a2..ea8adba2 100644 --- a/plugin/src/main/kotlin/com/ryandens/javaagent/JavaagentJibExtension.kt +++ b/jib-common/src/main/kotlin/com/ryandens/javaagent/jib/JavaagentJibExtension.kt @@ -1,4 +1,4 @@ -package com.ryandens.javaagent +package com.ryandens.javaagent.jib import com.google.cloud.tools.jib.api.buildplan.AbsoluteUnixPath import com.google.cloud.tools.jib.api.buildplan.ContainerBuildPlan @@ -6,17 +6,15 @@ import com.google.cloud.tools.jib.api.buildplan.FileEntriesLayer import com.google.cloud.tools.jib.api.buildplan.FileEntry import com.google.cloud.tools.jib.api.buildplan.FilePermissions import com.google.cloud.tools.jib.api.buildplan.LayerObject -import com.google.cloud.tools.jib.gradle.JibExtension import com.google.cloud.tools.jib.gradle.extension.GradleData import com.google.cloud.tools.jib.gradle.extension.JibGradlePluginExtension import com.google.cloud.tools.jib.plugins.extension.ExtensionLogger -import org.gradle.api.Action +import com.ryandens.javaagent.JavaagentPlugin import org.gradle.api.GradleException import org.gradle.api.NamedDomainObjectProvider import org.gradle.api.Project import org.gradle.api.artifacts.Configuration import org.gradle.api.tasks.Copy -import java.io.File import java.util.Optional /** @@ -28,6 +26,10 @@ import java.util.Optional class JavaagentJibExtension : JibGradlePluginExtension, JavaagentPlugin { + companion object { + const val COPY_AGENTS_TASK_NAME = "copyAgentsToJibDir" + } + override fun getExtraConfigType(): Optional> = Optional.of(JibExtensionConfiguration::class.java) override fun extendContainerBuildPlan( @@ -80,7 +82,7 @@ class JavaagentJibExtension : ) { val destinationDirectory = project.layout.buildDirectory.dir("jib-agents") val copyAgents = - project.tasks.register("copyAgentsToJibDir", Copy::class.java) { + project.tasks.register(COPY_AGENTS_TASK_NAME, Copy::class.java) { it.from(javaagentConfiguration) it.into(destinationDirectory) } @@ -100,26 +102,5 @@ class JavaagentJibExtension : } else { throw IllegalStateException("Should not be possible") } - - val jibExtension: JibExtension? = project.extensions.findByType(JibExtension::class.java) - - jibExtension?.pluginExtensions { extensionParametersSpec -> - extensionParametersSpec.pluginExtension { extension -> - extension.implementation = "com.ryandens.javaagent.JavaagentJibExtension" - extension.configuration( - Action { extensionConfiguration -> - extensionConfiguration.javaagentFiles.set( - project.provider { - javaagentConfiguration - .get() - .files - .map { File(destinationDirectory.get().asFile, it.name) } - .toList() - }, - ) - }, - ) - } - } } } diff --git a/jib-common/src/main/resources/META-INF/services/com.google.cloud.tools.jib.gradle.extension.JibGradlePluginExtension b/jib-common/src/main/resources/META-INF/services/com.google.cloud.tools.jib.gradle.extension.JibGradlePluginExtension new file mode 100644 index 00000000..da8f8a4b --- /dev/null +++ b/jib-common/src/main/resources/META-INF/services/com.google.cloud.tools.jib.gradle.extension.JibGradlePluginExtension @@ -0,0 +1 @@ +com.ryandens.javaagent.jib.JavaagentJibExtension \ No newline at end of file diff --git a/jib/build.gradle.kts b/jib/build.gradle.kts new file mode 100644 index 00000000..20e731e8 --- /dev/null +++ b/jib/build.gradle.kts @@ -0,0 +1,56 @@ +import org.gradle.kotlin.dsl.assign +import org.gradle.plugin.compatibility.compatibility + +plugins { + id("com.ryandens.plugin-conventions") +} + +val plugin: Configuration by configurations.creating + +configurations { + compileOnly { + extendsFrom(plugin) + } + testImplementation { + extendsFrom(plugin) + } +} + +tasks.named("pluginUnderTestMetadata") { + // adds dependencies with the plugin configuration to the plugin classpath + pluginClasspath.setFrom(pluginClasspath.plus(plugin.files)) + // avoid warnings + dependsOn(tasks.compileKotlin) + dependsOn(tasks.compileJava) + dependsOn(tasks.processResources) + dependsOn(":jib-common:jar") + dependsOn(":plugin:jar") +} + +dependencies { + plugin("com.google.cloud.tools:jib-gradle-plugin-extension-api:0.4.0") + plugin("com.google.cloud.tools.jib:com.google.cloud.tools.jib.gradle.plugin:3.5.3") + implementation(project(":plugin")) + implementation(project(":jib-common")) + + testImplementation("org.jetbrains.kotlin:kotlin-test") + testImplementation("org.jetbrains.kotlin:kotlin-test-junit") + testImplementation("org.apache.commons:commons-compress:1.28.0") +} + +gradlePlugin { + plugins { + create("javaagentJibPlugin") { + id = "com.ryandens.javaagent-jib" + displayName = "Javaagent Jib Plugin" + description = "Automatically includes javaagents in OCI images created by Jib" + implementationClass = "com.ryandens.javaagent.jib.JavaagentJibPlugin" + tags.set(listOf("javaagent", "instrumentation", "docker", "jib")) + compatibility { + features { + configurationCache = true + } + } + } + } +} diff --git a/plugin/src/functionalTest/kotlin/com/ryandens/javaagent/JavaagentJibExtensionFunctionalTest.kt b/jib/src/functionalTest/kotlin/JavaagentJibExtensionFunctionalTest.kt similarity index 97% rename from plugin/src/functionalTest/kotlin/com/ryandens/javaagent/JavaagentJibExtensionFunctionalTest.kt rename to jib/src/functionalTest/kotlin/JavaagentJibExtensionFunctionalTest.kt index 596d6d9e..dd5d4b59 100644 --- a/plugin/src/functionalTest/kotlin/com/ryandens/javaagent/JavaagentJibExtensionFunctionalTest.kt +++ b/jib/src/functionalTest/kotlin/JavaagentJibExtensionFunctionalTest.kt @@ -1,5 +1,3 @@ -package com.ryandens.javaagent - import org.apache.commons.compress.archivers.ArchiveInputStream import org.apache.commons.compress.archivers.ArchiveStreamFactory import org.apache.commons.compress.archivers.tar.TarArchiveEntry @@ -42,7 +40,7 @@ class JavaagentJibExtensionFunctionalTest { val result = createAndBuildJavaagentProject(dependencies, listOf("jibBuildTar")) // Verify the result - assertTrue(result.output.contains("Running extension: com.ryandens.javaagent.JavaagentJibExtension")) + assertTrue(result.output.contains("Running extension: com.ryandens.javaagent.jib.JavaagentJibExtension")) // verify the agent was added to entrypoint assertTrue(File(functionalTestDir, JIB_IMAGE).exists()) @@ -70,7 +68,7 @@ class JavaagentJibExtensionFunctionalTest { val result = createAndBuildJavaagentProject(dependencies, listOf("jibBuildTar")) // Verify the result - assertTrue(result.output.contains("Running extension: com.ryandens.javaagent.JavaagentJibExtension")) + assertTrue(result.output.contains("Running extension: com.ryandens.javaagent.jib.JavaagentJibExtension")) // verify the agent was added to entrypoint assertTrue(File(functionalTestDir, JIB_IMAGE).exists()) diff --git a/jib/src/functionalTest/resources/hello-world-project/src/main/java/com/ryandens/HelloWorld.java b/jib/src/functionalTest/resources/hello-world-project/src/main/java/com/ryandens/HelloWorld.java new file mode 100644 index 00000000..e1a04c65 --- /dev/null +++ b/jib/src/functionalTest/resources/hello-world-project/src/main/java/com/ryandens/HelloWorld.java @@ -0,0 +1,9 @@ +package com.ryandens; + + +public final class HelloWorld { + + public static void main(final String[] args) { + System.out.println("Hello World!"); + } +} \ No newline at end of file diff --git a/jib/src/functionalTest/resources/hello-world-project/src/test/java/com/ryandens/HelloWorldTest.java b/jib/src/functionalTest/resources/hello-world-project/src/test/java/com/ryandens/HelloWorldTest.java new file mode 100644 index 00000000..f02b7888 --- /dev/null +++ b/jib/src/functionalTest/resources/hello-world-project/src/test/java/com/ryandens/HelloWorldTest.java @@ -0,0 +1,11 @@ +package com.ryandens; + +import org.junit.jupiter.api.Test; + +final class HelloWorldTest { + + @Test + void test() { + System.out.println("Hello test!"); + } +} \ No newline at end of file diff --git a/jib/src/main/kotlin/com/ryandens/javaagent/jib/JavaagentJibPlugin.kt b/jib/src/main/kotlin/com/ryandens/javaagent/jib/JavaagentJibPlugin.kt new file mode 100644 index 00000000..e11944dd --- /dev/null +++ b/jib/src/main/kotlin/com/ryandens/javaagent/jib/JavaagentJibPlugin.kt @@ -0,0 +1,52 @@ +package com.ryandens.javaagent.jib + +import com.google.cloud.tools.jib.gradle.JibExtension +import com.ryandens.javaagent.JavaagentBasePlugin +import org.gradle.api.Action +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.api.tasks.Copy +import java.io.File + +/** + * Plugin for using the [JavaagentJibExtension] with Google's jib plugin + * + * We [Suppress] `unused` here, but the class is used by virtue of being published to Gradle Plugin portal + */ +@Suppress("unused") +class JavaagentJibPlugin : Plugin { + @OptIn(ExperimentalStdlibApi::class) + override fun apply(project: Project) { + project.pluginManager.apply(JavaagentJibExtension::class.java) + + val javaagentConfiguration = project.configurations.named(JavaagentBasePlugin.CONFIGURATION_NAME) + + val destinationDirectory = + project.tasks + .named( + JavaagentJibExtension.COPY_AGENTS_TASK_NAME, + Copy::class.java, + ).map { it.destinationDir } + + val jibExtension: JibExtension? = project.extensions.findByType(JibExtension::class.java) + + jibExtension?.pluginExtensions { extensionParametersSpec -> + extensionParametersSpec.pluginExtension { extension -> + extension.implementation = "com.ryandens.javaagent.jib.JavaagentJibExtension" + extension.configuration( + Action { extensionConfiguration -> + extensionConfiguration.javaagentFiles.set( + project.provider { + javaagentConfiguration + .get() + .files + .map { File(destinationDirectory.get(), it.name) } + .toList() + }, + ) + }, + ) + } + } + } +} diff --git a/plugin/src/test/kotlin/com/ryandens/javaagent/JavaagentJibPluginTest.kt b/jib/src/test/kotlin/com/ryandens/javaagent/jib/JavaagentJibPluginTest.kt similarity index 90% rename from plugin/src/test/kotlin/com/ryandens/javaagent/JavaagentJibPluginTest.kt rename to jib/src/test/kotlin/com/ryandens/javaagent/jib/JavaagentJibPluginTest.kt index fd203d24..3b103daf 100644 --- a/plugin/src/test/kotlin/com/ryandens/javaagent/JavaagentJibPluginTest.kt +++ b/jib/src/test/kotlin/com/ryandens/javaagent/jib/JavaagentJibPluginTest.kt @@ -1,7 +1,7 @@ /* * This Kotlin source file was generated by the Gradle 'init' task. */ -package com.ryandens.javaagent +package com.ryandens.javaagent.jib import com.google.cloud.tools.jib.gradle.JibExtension import org.gradle.testfixtures.ProjectBuilder @@ -24,6 +24,6 @@ class JavaagentJibPluginTest { assertNotNull(project.configurations.findByName("javaagent")) val ext = project.extensions.getByType(JibExtension::class.java) - assertTrue(ext.pluginExtensions.get().any { it.implementation == "com.ryandens.javaagent.JavaagentJibExtension" }) + assertTrue(ext.pluginExtensions.get().any { it.implementation == "com.ryandens.javaagent.jib.JavaagentJibExtension" }) } } diff --git a/plugin/build.gradle.kts b/plugin/build.gradle.kts index 43d959c1..f0c6e68f 100644 --- a/plugin/build.gradle.kts +++ b/plugin/build.gradle.kts @@ -4,30 +4,7 @@ plugins { id("com.ryandens.plugin-conventions") } -val plugin: Configuration by configurations.creating - -configurations { - compileOnly { - extendsFrom(plugin) - } - testImplementation { - extendsFrom(plugin) - } -} - -tasks.named("pluginUnderTestMetadata") { - // adds dependencies with the plugin configuration to the plugin classpath - pluginClasspath.setFrom(pluginClasspath.plus(plugin.files)) - // avoid warnings - dependsOn(tasks.compileKotlin) - dependsOn(tasks.compileJava) - dependsOn(tasks.processResources) -} - dependencies { - plugin("com.google.cloud.tools:jib-gradle-plugin-extension-api:0.4.0") - plugin("com.google.cloud.tools.jib:com.google.cloud.tools.jib.gradle.plugin:3.5.3") - testImplementation("org.jetbrains.kotlin:kotlin-test") testImplementation("org.jetbrains.kotlin:kotlin-test-junit") testImplementation("org.apache.commons:commons-compress:1.28.0") @@ -71,18 +48,6 @@ gradlePlugin { } } } - create("javaagentJibPlugin") { - id = "com.ryandens.javaagent-jib" - displayName = "Javaagent Jib Plugin" - description = "Automatically includes javaagents in OCI images created by Jib" - implementationClass = "com.ryandens.javaagent.JavaagentJibExtension" - tags.set(listOf("javaagent", "instrumentation", "docker", "jib")) - compatibility { - features { - configurationCache = true - } - } - } create("javaagentTestPlugin") { id = "com.ryandens.javaagent-test" displayName = "Javaagent Test Plugin" diff --git a/plugin/src/main/resources/META-INF/services/com.google.cloud.tools.jib.gradle.extension.JibGradlePluginExtension b/plugin/src/main/resources/META-INF/services/com.google.cloud.tools.jib.gradle.extension.JibGradlePluginExtension deleted file mode 100644 index 7a5291b9..00000000 --- a/plugin/src/main/resources/META-INF/services/com.google.cloud.tools.jib.gradle.extension.JibGradlePluginExtension +++ /dev/null @@ -1 +0,0 @@ -com.ryandens.javaagent.JavaagentJibExtension \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index 9beb6f0a..302fd62e 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -8,7 +8,7 @@ plugins { } rootProject.name = "javaagent-plugin" -include("plugin", "simple-agent", "otel") +include("jib-common", "jib", "plugin", "simple-agent", "otel") val isCI = providers.environmentVariable("CI").isPresent