From 8f1aafb5158c168275b65d53175d8c1a4cc45df1 Mon Sep 17 00:00:00 2001 From: Vladimir Sitnikov Date: Fri, 16 Sep 2022 14:51:45 +0300 Subject: [PATCH] bump minimum supported gradle version from 5.0 to 6.0 (via #100) --- README.md | 7 +- .../gradle/adapter/AllureAdapterBasePlugin.kt | 5 +- .../gradle/adapter/AllureAdapterExtension.kt | 22 ++-- .../gradle/adapter/AllureAdapterPlugin.kt | 8 +- .../autoconfigure/TrimMetaInfServices53.kt | 20 ---- .../gradle/adapter/config/AdapterConfig.kt | 16 +-- .../adapter/config/AllureJavaAdapter.kt | 4 +- .../gradle/adapter/tasks/CopyCategories.kt | 5 +- .../allure/gradle/adapter/AdaptersTest.kt | 7 +- .../allure/gradle/adapter/AssembleTest.kt | 2 +- .../allure/gradle/base/AllureBasePlugin.kt | 2 +- .../allure/gradle/base/AllureExtension.kt | 11 +- .../gradle/base/backport/GradleExtensions.kt | 44 +------- .../gradle/base/tasks/AllureExecTask.kt | 58 ++++++++-- .../src/it/full-dsl-groovy/build.gradle | 1 + .../src/it/full-dsl-kotlin/build.gradle.kts | 1 + .../gradle/allure/AggregatedReportTest.java | 2 +- .../allure/gradle/allure/CategoriesTest.java | 1 - .../gradle/allure/DependenciesTest.java | 20 ++-- .../gradle/allure/TestNgSpiOffTest.java | 2 +- .../io/qameta/allure/gradle/report/DslTest.kt | 4 +- .../download/AllureCommandlineExtension.kt | 7 +- .../gradle/download/AllureDownloadPlugin.kt | 11 +- .../gradle/report/AllureReportBasePlugin.kt | 5 +- .../gradle/report/AllureReportExtension.kt | 5 +- .../gradle/report/tasks/AllureReport.kt | 44 ++++---- .../allure/gradle/report/tasks/AllureServe.kt | 106 ++++++++++-------- .../allure/gradle/report/ReportOnlyTest.java | 1 - sandbox/dsl-groovy/build.gradle | 9 +- sandbox/dsl-kotlin/build.gradle.kts | 9 +- .../allure/gradle/rule/GradleRunnerRule.java | 10 +- 31 files changed, 212 insertions(+), 237 deletions(-) delete mode 100644 allure-adapter-plugin/src/main/kotlin/io/qameta/allure/gradle/adapter/autoconfigure/TrimMetaInfServices53.kt diff --git a/README.md b/README.md index c3796b4..ef6ea8e 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,9 @@ Gradle projects plugins for building [Allure](https://docs.qameta.io/allure/late Data colecting and reporting are split to different Gradle plugins, so you could apply the ones you need. -Note: 2.9+ requires Gradle 5.0+ +Note: +* allure-gradle 2.9+ requires Gradle 5.0+ +* allure-gradle 2.11+ requires Gradle 6.0+ The minimal configuration is as follows. It would configure test tasks to collect Allure results and add `allureReport` and `allureServe` @@ -105,6 +107,9 @@ allure { allureJavaVersion.set("2.19.0") aspectjVersion.set("1.9.5") + // Customize environment variables for launching Allure + environment.put("JAVA_HOME", "/path/to/java_home") + autoconfigure.set(true) autoconfigureListeners.set(true) aspectjWeaver.set(true) diff --git a/allure-adapter-plugin/src/main/kotlin/io/qameta/allure/gradle/adapter/AllureAdapterBasePlugin.kt b/allure-adapter-plugin/src/main/kotlin/io/qameta/allure/gradle/adapter/AllureAdapterBasePlugin.kt index 12f094e..4a8ac1d 100644 --- a/allure-adapter-plugin/src/main/kotlin/io/qameta/allure/gradle/adapter/AllureAdapterBasePlugin.kt +++ b/allure-adapter-plugin/src/main/kotlin/io/qameta/allure/gradle/adapter/AllureAdapterBasePlugin.kt @@ -28,10 +28,7 @@ open class AllureAdapterBasePlugin : Plugin { val allureExtension = the() allureExtension.extensions.create( AllureAdapterExtension.NAME, - project, - // Gradle 5 can't inject objects yet - // TODO: remove when Gradle 5 support can be dropped - objects + project ) val rawResultElements = configurations.create(ALLURE_RAW_RESULT_ELEMENTS_CONFIGURATION_NAME) { diff --git a/allure-adapter-plugin/src/main/kotlin/io/qameta/allure/gradle/adapter/AllureAdapterExtension.kt b/allure-adapter-plugin/src/main/kotlin/io/qameta/allure/gradle/adapter/AllureAdapterExtension.kt index 1694211..83d99d8 100644 --- a/allure-adapter-plugin/src/main/kotlin/io/qameta/allure/gradle/adapter/AllureAdapterExtension.kt +++ b/allure-adapter-plugin/src/main/kotlin/io/qameta/allure/gradle/adapter/AllureAdapterExtension.kt @@ -1,12 +1,10 @@ package io.qameta.allure.gradle.adapter import groovy.json.JsonOutput -import io.qameta.allure.gradle.base.tasks.ConditionalArgumentProvider -import io.qameta.allure.gradle.base.tasks.JavaAgentArgumentProvider import io.qameta.allure.gradle.adapter.config.* import io.qameta.allure.gradle.base.AllureExtension -import io.qameta.allure.gradle.util.conv -import io.qameta.allure.gradle.util.forUseAtConfigurationTimeBackport +import io.qameta.allure.gradle.base.tasks.ConditionalArgumentProvider +import io.qameta.allure.gradle.base.tasks.JavaAgentArgumentProvider import org.gradle.api.Action import org.gradle.api.Project import org.gradle.api.Task @@ -41,34 +39,32 @@ open class AllureAdapterExtension @Inject constructor( /** * `allure-java` version (adapters for test engines) */ - val allureJavaVersion: Property = objects.property().conv(project.the().version) - .forUseAtConfigurationTimeBackport() - val aspectjVersion: Property = objects.property().conv("1.9.9.1") + val allureJavaVersion: Property = + objects.property().convention(project.the().version) + val aspectjVersion: Property = objects.property().convention("1.9.9.1") /** * Automatically add the relevant test engine adapters */ - val autoconfigure: Property = objects.property().conv(true) - .forUseAtConfigurationTimeBackport() + val autoconfigure: Property = objects.property().convention(true) /** * Configure default listeners by default (e.g. JUnit5, TestNG). * This should be disabled if the project uses custom listeners */ - val autoconfigureListeners: Property = objects.property().conv(autoconfigure) + val autoconfigureListeners: Property = objects.property().convention(autoconfigure) /** * Automatically add AspectJ waver */ - val aspectjWeaver = objects.property().conv(autoconfigure) - .forUseAtConfigurationTimeBackport() + val aspectjWeaver = objects.property().convention(autoconfigure) /** * Path to `categories.json` file for Allure. * The default path is `test/resources/**/categories.json`. */ - val categoriesFile: Property = objects.fileProperty().conv(defaultCategoriesFile(project)) + val categoriesFile: Property = objects.fileProperty().convention(defaultCategoriesFile(project)) val frameworks = AdapterHandler(project.container { objects.newInstance(it, objects, this).also { adapter -> diff --git a/allure-adapter-plugin/src/main/kotlin/io/qameta/allure/gradle/adapter/AllureAdapterPlugin.kt b/allure-adapter-plugin/src/main/kotlin/io/qameta/allure/gradle/adapter/AllureAdapterPlugin.kt index 93ae856..8346cd5 100644 --- a/allure-adapter-plugin/src/main/kotlin/io/qameta/allure/gradle/adapter/AllureAdapterPlugin.kt +++ b/allure-adapter-plugin/src/main/kotlin/io/qameta/allure/gradle/adapter/AllureAdapterPlugin.kt @@ -4,7 +4,6 @@ import adapter import io.qameta.allure.gradle.base.AllureBasePlugin import io.qameta.allure.gradle.base.AllureExtension import io.qameta.allure.gradle.adapter.autoconfigure.BaseTrimMetaInfServices -import io.qameta.allure.gradle.adapter.autoconfigure.TrimMetaInfServices53 import io.qameta.allure.gradle.adapter.autoconfigure.TrimMetaInfServices54 import io.qameta.allure.gradle.adapter.config.AdapterHandler import io.qameta.allure.gradle.adapter.config.AllureJavaAdapter @@ -70,12 +69,7 @@ open class AllureAdapterPlugin : Plugin { // Older Gradle do not have "substitute with classifier" feature // so we use ArtifactTransformation to trim META-INF/services from the jar dependencies { - val transformClass = if (GradleVersion.current() >= GradleVersion.version("5.4")) { - TrimMetaInfServices54::class - } else { - TrimMetaInfServices53::class - } - registerTransform(transformClass) { + registerTransform(TrimMetaInfServices54::class) { from.attribute(artifactType, "jar") to.attribute(artifactType, BaseTrimMetaInfServices.NO_SPI_JAR) } diff --git a/allure-adapter-plugin/src/main/kotlin/io/qameta/allure/gradle/adapter/autoconfigure/TrimMetaInfServices53.kt b/allure-adapter-plugin/src/main/kotlin/io/qameta/allure/gradle/adapter/autoconfigure/TrimMetaInfServices53.kt deleted file mode 100644 index de79296..0000000 --- a/allure-adapter-plugin/src/main/kotlin/io/qameta/allure/gradle/adapter/autoconfigure/TrimMetaInfServices53.kt +++ /dev/null @@ -1,20 +0,0 @@ -package io.qameta.allure.gradle.adapter.autoconfigure - -import org.gradle.api.artifacts.transform.CacheableTransform -import org.gradle.api.artifacts.transform.InputArtifact -import org.gradle.api.artifacts.transform.TransformOutputs -import org.gradle.api.tasks.PathSensitive -import org.gradle.api.tasks.PathSensitivity -import java.io.File - -@CacheableTransform -abstract class TrimMetaInfServices53 : BaseTrimMetaInfServices() { - @get:PathSensitive(PathSensitivity.NONE) - @get:InputArtifact - // Gradle 5.3 supports File inputs only - abstract val inputArtifact: File - - override fun transform(outputs: TransformOutputs) { - doTransform(inputArtifact, outputs) - } -} diff --git a/allure-adapter-plugin/src/main/kotlin/io/qameta/allure/gradle/adapter/config/AdapterConfig.kt b/allure-adapter-plugin/src/main/kotlin/io/qameta/allure/gradle/adapter/config/AdapterConfig.kt index 3df62fd..a5d126e 100644 --- a/allure-adapter-plugin/src/main/kotlin/io/qameta/allure/gradle/adapter/config/AdapterConfig.kt +++ b/allure-adapter-plugin/src/main/kotlin/io/qameta/allure/gradle/adapter/config/AdapterConfig.kt @@ -5,12 +5,10 @@ import io.qameta.allure.gradle.adapter.AllureAdapterExtension import io.qameta.allure.gradle.adapter.autoconfigure.AutoconfigureRule import io.qameta.allure.gradle.adapter.autoconfigure.AutoconfigureRuleBuilder import io.qameta.allure.gradle.adapter.autoconfigure.DefaultAutoconfigureRuleBuilder -import io.qameta.allure.gradle.util.conv -import io.qameta.allure.gradle.util.domainObjectSetBackport -import io.qameta.allure.gradle.util.forUseAtConfigurationTimeBackport import org.gradle.api.Action import org.gradle.api.model.ObjectFactory import org.gradle.kotlin.dsl.property +import org.gradle.kotlin.dsl.domainObjectSet import javax.inject.Inject open class AdapterConfig @Inject constructor( @@ -23,7 +21,7 @@ open class AdapterConfig @Inject constructor( * The value defaults to [AllureExtension.allureJavaVersion] */ val adapterVersion = objects.property() - .conv(allureAdapterExtension.allureJavaVersion) + .convention(allureAdapterExtension.allureJavaVersion) @Deprecated( level = DeprecationLevel.WARNING, @@ -37,11 +35,10 @@ open class AdapterConfig @Inject constructor( /** * By default, the adapter is enabled. This property allows deactivating the adapter. */ - val enabled = objects.property().conv(true) + val enabled = objects.property().convention(true) val autoconfigureListeners = objects.property() - .forUseAtConfigurationTimeBackport() - .conv( + .convention( enabled.map { it && allureAdapterExtension.autoconfigureListeners.get() } ) @@ -57,8 +54,7 @@ open class AdapterConfig @Inject constructor( * Autoconfigure listeners is available only for the subset of adapters only (e.g [AdapterHandlerScope.testng], * [AdapterHandlerScope.junit5]) */ - val supportsAutoconfigureListeners = objects.property().conv(false) - .forUseAtConfigurationTimeBackport() + val supportsAutoconfigureListeners = objects.property().convention(false) /** * Returns `true` if `META-INF/services` should be removed from the dependency. @@ -66,7 +62,7 @@ open class AdapterConfig @Inject constructor( internal val trimServicesFromJar = supportsAutoconfigureListeners.map { it && !autoconfigureListeners.get() } - internal val activateOn = objects.domainObjectSetBackport() + internal val activateOn = objects.domainObjectSet(AutoconfigureRule::class) /** * Adds a basic autoconfigure rule: add [adapterDependency] to `compile` and `runtime` classpath diff --git a/allure-adapter-plugin/src/main/kotlin/io/qameta/allure/gradle/adapter/config/AllureJavaAdapter.kt b/allure-adapter-plugin/src/main/kotlin/io/qameta/allure/gradle/adapter/config/AllureJavaAdapter.kt index 2932030..4c40593 100644 --- a/allure-adapter-plugin/src/main/kotlin/io/qameta/allure/gradle/adapter/config/AllureJavaAdapter.kt +++ b/allure-adapter-plugin/src/main/kotlin/io/qameta/allure/gradle/adapter/config/AllureJavaAdapter.kt @@ -60,10 +60,10 @@ internal enum class AllureJavaAdapter( compileAndRuntime(dep) { val gradleVersion = GradleVersion.current() if (gradleVersion < GradleVersion.version("6.6") && trimServices.get()) { - if (gradleVersion < GradleVersion.version("5.3")) { + if (gradleVersion < GradleVersion.version("6.0")) { throw IllegalStateException( "Autoconfiguration for $name with autoconfigureListeners=false" + - " requires Gradle 5.3+. Please upgrade Gradle to 5.3+ or add ${dep.get()}:spi-off " + + " requires Gradle 6.0+. Please upgrade Gradle to 6.0+ or add ${dep.get()}:spi-off " + "to the relevant configurations (e.g. testImplementation) manually and " + "turn off autoconfiguration with $name { enabled.set(false) }" ) diff --git a/allure-adapter-plugin/src/main/kotlin/io/qameta/allure/gradle/adapter/tasks/CopyCategories.kt b/allure-adapter-plugin/src/main/kotlin/io/qameta/allure/gradle/adapter/tasks/CopyCategories.kt index 3a4fcab..9416964 100644 --- a/allure-adapter-plugin/src/main/kotlin/io/qameta/allure/gradle/adapter/tasks/CopyCategories.kt +++ b/allure-adapter-plugin/src/main/kotlin/io/qameta/allure/gradle/adapter/tasks/CopyCategories.kt @@ -2,7 +2,6 @@ package io.qameta.allure.gradle.adapter.tasks import adapter import io.qameta.allure.gradle.base.AllureExtension -import io.qameta.allure.gradle.util.conv import org.gradle.api.DefaultTask import org.gradle.api.model.ObjectFactory import org.gradle.api.tasks.* @@ -17,7 +16,7 @@ open class CopyCategories @Inject constructor(objects: ObjectFactory) : DefaultT @SkipWhenEmpty @PathSensitive(PathSensitivity.NONE) val categoriesFile = objects.fileProperty() - .conv(project.the().adapter.categoriesFile) + .convention(project.the().adapter.categoriesFile) @Internal val destinationDirs = objects.setProperty() @@ -29,7 +28,7 @@ open class CopyCategories @Inject constructor(objects: ObjectFactory) : DefaultT @OutputFile val markerFile = objects.directoryProperty() - .conv(project.layout.buildDirectory.dir("copy-categories/$name")) + .convention(project.layout.buildDirectory.dir("copy-categories/$name")) @TaskAction fun run() { diff --git a/allure-adapter-plugin/src/test/kotlin/io/qameta/allure/gradle/adapter/AdaptersTest.kt b/allure-adapter-plugin/src/test/kotlin/io/qameta/allure/gradle/adapter/AdaptersTest.kt index 8821d34..3fb4355 100644 --- a/allure-adapter-plugin/src/test/kotlin/io/qameta/allure/gradle/adapter/AdaptersTest.kt +++ b/allure-adapter-plugin/src/test/kotlin/io/qameta/allure/gradle/adapter/AdaptersTest.kt @@ -46,7 +46,7 @@ class AdaptersTest { "[AdapterConfig{junit5}, AdapterConfig{spock}]" ), arrayOf( - "5.0", + "6.0", "src/it/adapter-junit5-spock-kts", arrayOf("printAdapters"), "[AdapterConfig{junit5}, AdapterConfig{spock}]" @@ -56,14 +56,15 @@ class AdaptersTest { "src/it/adapter-all", arrayOf("printAdapters"), "[AdapterConfig{cucumber2Jvm}, AdapterConfig{cucumber3Jvm}, AdapterConfig{cucumber4Jvm}, AdapterConfig{cucumber5Jvm}, AdapterConfig{cucumber6Jvm}, AdapterConfig{cucumberJvm}, AdapterConfig{junit4}, AdapterConfig{junit5}, AdapterConfig{spock}, AdapterConfig{testng}]" - ), arrayOf( + ), + arrayOf( "7.0", "src/it/adapter-all", arrayOf("printAdapters"), "[AdapterConfig{cucumber2Jvm}, AdapterConfig{cucumber3Jvm}, AdapterConfig{cucumber4Jvm}, AdapterConfig{cucumber5Jvm}, AdapterConfig{cucumber6Jvm}, AdapterConfig{cucumberJvm}, AdapterConfig{junit4}, AdapterConfig{junit5}, AdapterConfig{spock}, AdapterConfig{testng}]" ), arrayOf( - "5.0", + "6.0", "src/it/adapter-all", arrayOf("printAdapters"), "[AdapterConfig{cucumber2Jvm}, AdapterConfig{cucumber3Jvm}, AdapterConfig{cucumber4Jvm}, AdapterConfig{cucumber5Jvm}, AdapterConfig{cucumber6Jvm}, AdapterConfig{cucumberJvm}, AdapterConfig{junit4}, AdapterConfig{junit5}, AdapterConfig{spock}, AdapterConfig{testng}]" diff --git a/allure-adapter-plugin/src/test/kotlin/io/qameta/allure/gradle/adapter/AssembleTest.kt b/allure-adapter-plugin/src/test/kotlin/io/qameta/allure/gradle/adapter/AssembleTest.kt index a2f1bb6..4acb972 100644 --- a/allure-adapter-plugin/src/test/kotlin/io/qameta/allure/gradle/adapter/AssembleTest.kt +++ b/allure-adapter-plugin/src/test/kotlin/io/qameta/allure/gradle/adapter/AssembleTest.kt @@ -36,7 +36,7 @@ class AssembleTest { arrayOf("assemble") ), arrayOf( - "5.0", + "6.0", "src/it/adapter-assemble", arrayOf("assemble") ) diff --git a/allure-base-plugin/src/main/kotlin/io/qameta/allure/gradle/base/AllureBasePlugin.kt b/allure-base-plugin/src/main/kotlin/io/qameta/allure/gradle/base/AllureBasePlugin.kt index 0ebb7f7..58096e1 100644 --- a/allure-base-plugin/src/main/kotlin/io/qameta/allure/gradle/base/AllureBasePlugin.kt +++ b/allure-base-plugin/src/main/kotlin/io/qameta/allure/gradle/base/AllureBasePlugin.kt @@ -17,7 +17,7 @@ open class AllureBasePlugin : Plugin { override fun apply(target: Project): Unit = target.run { // TODO: migrate to precompiled script plugin once Gradle 6.0 could be the minimal supported Gradle version // See https://docs.gradle.org/current/userguide/custom_plugins.html#sec:precompiled_plugins - extensions.create(AllureExtension.NAME, objects) + extensions.create(AllureExtension.NAME) configurations.create("allureWorkaroundGradleBug") { isCanBeConsumed = true diff --git a/allure-base-plugin/src/main/kotlin/io/qameta/allure/gradle/base/AllureExtension.kt b/allure-base-plugin/src/main/kotlin/io/qameta/allure/gradle/base/AllureExtension.kt index af429ab..caf01ef 100644 --- a/allure-base-plugin/src/main/kotlin/io/qameta/allure/gradle/base/AllureExtension.kt +++ b/allure-base-plugin/src/main/kotlin/io/qameta/allure/gradle/base/AllureExtension.kt @@ -1,9 +1,9 @@ package io.qameta.allure.gradle.base -import io.qameta.allure.gradle.util.conv import org.gradle.api.Action import org.gradle.api.model.ObjectFactory import org.gradle.api.plugins.ExtensionAware +import org.gradle.api.provider.MapProperty import org.gradle.api.provider.Property import org.gradle.kotlin.dsl.property import org.gradle.kotlin.dsl.provideDelegate @@ -11,7 +11,7 @@ import org.gradle.kotlin.dsl.provideDelegate /** * Provides API for configuring common properties for Allure. */ -open class AllureExtension( +abstract class AllureExtension( objects: ObjectFactory ) { companion object { @@ -21,7 +21,12 @@ open class AllureExtension( /** * `allure-commandline` version */ - val version: Property = objects.property().conv("2.19.0") + val version: Property = objects.property().convention("2.19.0") + + /** + * Default environment variables for launching `allure-commandline`. + */ + abstract val environment: MapProperty // TODO: remove when deprecated [aspectjweaver] is removed private val aspectjWeaver by lazy { diff --git a/allure-base-plugin/src/main/kotlin/io/qameta/allure/gradle/base/backport/GradleExtensions.kt b/allure-base-plugin/src/main/kotlin/io/qameta/allure/gradle/base/backport/GradleExtensions.kt index c7f3e92..1a943de 100644 --- a/allure-base-plugin/src/main/kotlin/io/qameta/allure/gradle/base/backport/GradleExtensions.kt +++ b/allure-base-plugin/src/main/kotlin/io/qameta/allure/gradle/base/backport/GradleExtensions.kt @@ -1,57 +1,19 @@ package io.qameta.allure.gradle.util -import org.gradle.api.DomainObjectSet import org.gradle.api.attributes.AttributeContainer import org.gradle.api.attributes.Category import org.gradle.api.attributes.LibraryElements import org.gradle.api.model.ObjectFactory -import org.gradle.api.provider.ListProperty -import org.gradle.api.provider.MapProperty -import org.gradle.api.provider.Property -import org.gradle.api.provider.Provider import org.gradle.kotlin.dsl.named -import org.gradle.util.GradleVersion -import org.gradle.util.WrapUtil - -val gradleGe51 = GradleVersion.current() >= GradleVersion.version("5.1") -val gradleGe53 = GradleVersion.current() >= GradleVersion.version("5.3") -val gradleGe55 = GradleVersion.current() >= GradleVersion.version("5.5") -val gradleGe56 = GradleVersion.current() >= GradleVersion.version("5.6") -val gradleGe65 = GradleVersion.current() >= GradleVersion.version("6.5") - -fun Property.conv(v: T) = if (gradleGe51) convention(v) else apply { set(v) } -fun Property.conv(v: Provider) = if (gradleGe51) convention(v) else apply { set(v) } - -fun ListProperty.conv(v: Iterable) = if (gradleGe51) convention(v) else apply { set(v) } -fun ListProperty.conv(v: Provider>) = if (gradleGe51) convention(v) else apply { set(v) } - -fun MapProperty.conv(v: Map) = if (gradleGe51) convention(v) else apply { set(v) } -fun MapProperty.conv(v: Provider>) = if (gradleGe51) convention(v) else apply { set(v) } - -fun Property.forUseAtConfigurationTimeBackport(): Property = apply { - if (gradleGe65) { - // forUseAtConfigurationTime is Gradle 6.5+ feature - forUseAtConfigurationTime() - } -} - -inline fun ObjectFactory.domainObjectSetBackport(): DomainObjectSet = - if (gradleGe55) domainObjectSet(T::class.java) else WrapUtil.toDomainObjectSet(T::class.java) fun AttributeContainer.categoryLibrary(objects: ObjectFactory) { - if (gradleGe53) { - attribute(Category.CATEGORY_ATTRIBUTE, objects.named(Category.LIBRARY)) - } + attribute(Category.CATEGORY_ATTRIBUTE, objects.named(Category.LIBRARY)) } fun AttributeContainer.categoryDocumentation(objects: ObjectFactory) { - if (gradleGe53) { - attribute(Category.CATEGORY_ATTRIBUTE, objects.named(Category.DOCUMENTATION)) - } + attribute(Category.CATEGORY_ATTRIBUTE, objects.named(Category.DOCUMENTATION)) } fun AttributeContainer.libraryElementsJar(objects: ObjectFactory) { - if (gradleGe56) { - attribute(LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE, objects.named(LibraryElements.JAR)) - } + attribute(LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE, objects.named(LibraryElements.JAR)) } diff --git a/allure-base-plugin/src/main/kotlin/io/qameta/allure/gradle/base/tasks/AllureExecTask.kt b/allure-base-plugin/src/main/kotlin/io/qameta/allure/gradle/base/tasks/AllureExecTask.kt index f5280fd..89d5a56 100644 --- a/allure-base-plugin/src/main/kotlin/io/qameta/allure/gradle/base/tasks/AllureExecTask.kt +++ b/allure-base-plugin/src/main/kotlin/io/qameta/allure/gradle/base/tasks/AllureExecTask.kt @@ -1,29 +1,48 @@ package io.qameta.allure.gradle.base.tasks -import io.qameta.allure.gradle.util.conv +import io.qameta.allure.gradle.base.AllureExtension import org.apache.tools.ant.taskdefs.condition.Os -import org.gradle.api.DefaultTask import org.gradle.api.artifacts.Configuration import org.gradle.api.file.FileCollection import org.gradle.api.model.ObjectFactory +import org.gradle.api.provider.MapProperty +import org.gradle.api.provider.Provider import org.gradle.api.tasks.* import org.gradle.api.tasks.options.Option import org.gradle.kotlin.dsl.property +import org.gradle.kotlin.dsl.the import org.gradle.util.GradleVersion import java.io.File -abstract class AllureExecTask constructor(objects: ObjectFactory) : DefaultTask() { +abstract class AllureExecTask constructor(objects: ObjectFactory) : Exec() { @InputDirectory @PathSensitive(PathSensitivity.NONE) val allureHome = objects.directoryProperty() @Internal @Option(option = "verbose", description = "Switch on the verbose mode") - val verbose = objects.property().conv(false) + val verbose = objects.property().convention(false) + + /** + * Gradle's [Exec.executable] does not support [Provider], and it uses [Object.toString], + * so we create an object that calls [Provider.get] in its [Object.toString]. + */ + protected fun Provider.lazyToString() = object { + override fun toString(): String = this@lazyToString.get().toString() + } + + /** + * We might need to recover values from [Provider] values stored in [Exec.getEnvironment] + * when launching process via [ProcessBuilder]. + */ + private fun unwrapProvider(value: Any): String = when (value) { + is Provider<*> -> unwrapProvider(value.get()) + else -> value.toString() + } @get:Internal - protected val allureExecutable: File - get() { + protected val allureExecutable = objects.property().convention( + project.provider { val homeDir = allureHome.get().asFile val binDir = homeDir.resolve("bin") @@ -35,9 +54,11 @@ abstract class AllureExecTask constructor(objects: ObjectFactory) : DefaultTask( if (!allureExecutable.exists()) { throw IllegalArgumentException("Cannot find allure commandline in $homeDir") } + allureExecutable.setExecutable(true) - return allureExecutable + allureExecutable } + ) // InputDirectories does not exist yet: https://github.com/gradle/gradle/issues/7485#issuecomment-585289792 @Internal @@ -53,19 +74,23 @@ abstract class AllureExecTask constructor(objects: ObjectFactory) : DefaultTask( * However, in certain cases only report re-execution is needed, then `skipDependsOn` would be useful. */ @Input - val dependsOnTests = objects.property().conv(false) + val dependsOnTests = objects.property().convention(false) @get:Internal - protected val rawResults: FileCollection - get() = - resultsDirs.get().filter { it.exists() && it.isDirectory } + protected val rawResults: Provider = + resultsDirs.map { it.filter { it.exists() && it.isDirectory } } @InputFiles @SkipWhenEmpty + @IgnoreEmptyDirectories @PathSensitive(PathSensitivity.RELATIVE) protected val inputFiles = project.files(resultsDirs.map { dirs -> dirs.map { project.fileTree(it) } }) + @get:Internal + protected abstract val defaultEnvironment: MapProperty + init { + defaultEnvironment.convention(project.the().environment) dependsOn(dependsOnTests.map { if (it) resultsDirs else emptyList() }) // In any case, if user launches "./gradlew test allureReport" the report generation // should wait for test execution @@ -77,4 +102,15 @@ abstract class AllureExecTask constructor(objects: ObjectFactory) : DefaultTask( mustRunAfter(resultsDirs.map { it.elements }) } } + + override fun exec() { + val environment = environment + for ((key, value) in defaultEnvironment.get()) { + if (key !in environment) { + logger.info("Adding $key to environment properties (value omitted for security reasons)") + environment[key] = unwrapProvider(value) + } + } + super.exec() + } } diff --git a/allure-plugin/src/it/full-dsl-groovy/build.gradle b/allure-plugin/src/it/full-dsl-groovy/build.gradle index a90b923..2c0bff2 100644 --- a/allure-plugin/src/it/full-dsl-groovy/build.gradle +++ b/allure-plugin/src/it/full-dsl-groovy/build.gradle @@ -7,6 +7,7 @@ plugins { allure { version = "42.0" + environment["TZ"] = "UTC" adapter { frameworks { junit5 { diff --git a/allure-plugin/src/it/full-dsl-kotlin/build.gradle.kts b/allure-plugin/src/it/full-dsl-kotlin/build.gradle.kts index dae4f20..92ebe64 100644 --- a/allure-plugin/src/it/full-dsl-kotlin/build.gradle.kts +++ b/allure-plugin/src/it/full-dsl-kotlin/build.gradle.kts @@ -7,6 +7,7 @@ plugins { allure { version.set("42.0") + environment.put("TZ", "UTC") adapter { frameworks { junit5 { diff --git a/allure-plugin/src/test/java/io/qameta/allure/gradle/allure/AggregatedReportTest.java b/allure-plugin/src/test/java/io/qameta/allure/gradle/allure/AggregatedReportTest.java index e46b8fc..9469636 100644 --- a/allure-plugin/src/test/java/io/qameta/allure/gradle/allure/AggregatedReportTest.java +++ b/allure-plugin/src/test/java/io/qameta/allure/gradle/allure/AggregatedReportTest.java @@ -35,8 +35,8 @@ public class AggregatedReportTest { @Parameterized.Parameters(name = "{1} [{0}]") public static Collection getFrameworks() { return Arrays.asList( + new Object[]{"7.5.1", "src/it/report-multi", new String[]{"allureAggregateReport"}}, new Object[]{"7.0", "src/it/report-multi", new String[]{"allureAggregateReport"}}, - new Object[]{"5.0", "src/it/report-multi", new String[]{"allureAggregateReport"}}, new Object[]{"6.0", "src/it/report-multi", new String[]{"allureAggregateReport"}} ); } diff --git a/allure-plugin/src/test/java/io/qameta/allure/gradle/allure/CategoriesTest.java b/allure-plugin/src/test/java/io/qameta/allure/gradle/allure/CategoriesTest.java index 9c87c8d..b1a0a5c 100644 --- a/allure-plugin/src/test/java/io/qameta/allure/gradle/allure/CategoriesTest.java +++ b/allure-plugin/src/test/java/io/qameta/allure/gradle/allure/CategoriesTest.java @@ -40,7 +40,6 @@ public static Collection getFrameworks() { return Arrays.asList( new Object[]{"7.5.1", "src/it/categories", new String[]{"allureReport"}}, new Object[]{"7.0", "src/it/categories", new String[]{"allureReport"}}, - new Object[]{"5.0", "src/it/categories", new String[]{"allureReport"}}, new Object[]{"6.0", "src/it/categories", new String[]{"allureReport"}} ); } diff --git a/allure-plugin/src/test/java/io/qameta/allure/gradle/allure/DependenciesTest.java b/allure-plugin/src/test/java/io/qameta/allure/gradle/allure/DependenciesTest.java index e60ccb5..f81513a 100644 --- a/allure-plugin/src/test/java/io/qameta/allure/gradle/allure/DependenciesTest.java +++ b/allure-plugin/src/test/java/io/qameta/allure/gradle/allure/DependenciesTest.java @@ -28,16 +28,16 @@ public class DependenciesTest { // The order of versions is newest, oldest, rest private static final String[][] IT_MATRIX = { - { "src/it/cucumber-jvm", "7.5.1", "7.0", "5.0", "6.0" }, - { "src/it/cucumber2-jvm", "7.5.1", "7.0", "5.0", "6.0" }, - { "src/it/junit4", "7.5.1", "7.0", "5.0", "6.0" }, - { "src/it/junit4-autoconfigure", "7.5.1", "7.0", "5.0", "6.0" }, - { "src/it/junit4-kotlin", "7.5.1", "7.0", "5.1", "5.0" }, - { "src/it/junit5", "7.5.1", "7.0", "5.0", "6.0" }, - { "src/it/junit5-5.8.1", "7.5.1", "7.2", "5.0", "6.0" }, - { "src/it/testng", "7.5.1", "7.0", "5.0", "6.0" }, - { "src/it/testng-autoconfigure", "7.5.1", "7.0", "5.0", "6.0" }, - { "src/it/spock", "7.5.1", "7.0", "5.0", "6.0" }, + { "src/it/cucumber-jvm", "7.5.1", "7.0", "6.0" }, + { "src/it/cucumber2-jvm", "7.5.1", "7.0", "6.0" }, + { "src/it/junit4", "7.5.1", "7.0", "6.0" }, + { "src/it/junit4-autoconfigure", "7.5.1", "7.0", "6.0" }, + { "src/it/junit4-kotlin", "7.5.1", "7.0", "6.0" }, + { "src/it/junit5", "7.5.1", "7.0", "6.0" }, + { "src/it/junit5-5.8.1", "7.5.1", "7.2", "6.0" }, + { "src/it/testng", "7.5.1", "7.0", "6.0" }, + { "src/it/testng-autoconfigure", "7.5.1", "7.0", "6.0" }, + { "src/it/spock", "7.5.1", "7.0", "6.0" }, }; @Parameterized.Parameter(0) diff --git a/allure-plugin/src/test/java/io/qameta/allure/gradle/allure/TestNgSpiOffTest.java b/allure-plugin/src/test/java/io/qameta/allure/gradle/allure/TestNgSpiOffTest.java index f77b684..96a2cdb 100644 --- a/allure-plugin/src/test/java/io/qameta/allure/gradle/allure/TestNgSpiOffTest.java +++ b/allure-plugin/src/test/java/io/qameta/allure/gradle/allure/TestNgSpiOffTest.java @@ -31,7 +31,7 @@ public class TestNgSpiOffTest { @Parameterized.Parameters(name = "{0}") public static Collection getFrameworks() { - return Arrays.asList("7.5.1", "7.0", "6.0", "5.4", "5.3"); + return Arrays.asList("7.5.1", "7.0", "6.0"); } @Test diff --git a/allure-plugin/src/test/kotlin/io/qameta/allure/gradle/report/DslTest.kt b/allure-plugin/src/test/kotlin/io/qameta/allure/gradle/report/DslTest.kt index 8f63294..b64b251 100644 --- a/allure-plugin/src/test/kotlin/io/qameta/allure/gradle/report/DslTest.kt +++ b/allure-plugin/src/test/kotlin/io/qameta/allure/gradle/report/DslTest.kt @@ -31,11 +31,9 @@ class DslTest { arrayOf("7.5.1", "src/it/full-dsl-kotlin"), arrayOf("7.0", "src/it/full-dsl-kotlin"), arrayOf("6.0", "src/it/full-dsl-kotlin"), - arrayOf("5.0", "src/it/full-dsl-kotlin"), arrayOf("7.5.1", "src/it/full-dsl-groovy"), arrayOf("7.0", "src/it/full-dsl-groovy"), - arrayOf("6.0", "src/it/full-dsl-groovy"), - arrayOf("5.0", "src/it/full-dsl-groovy") + arrayOf("6.0", "src/it/full-dsl-groovy") ) } diff --git a/allure-report-plugin/src/main/kotlin/io/qameta/allure/gradle/download/AllureCommandlineExtension.kt b/allure-report-plugin/src/main/kotlin/io/qameta/allure/gradle/download/AllureCommandlineExtension.kt index b12e89b..8fca4ab 100644 --- a/allure-report-plugin/src/main/kotlin/io/qameta/allure/gradle/download/AllureCommandlineExtension.kt +++ b/allure-report-plugin/src/main/kotlin/io/qameta/allure/gradle/download/AllureCommandlineExtension.kt @@ -1,7 +1,6 @@ package io.qameta.allure.gradle.download import io.qameta.allure.gradle.base.AllureExtension -import io.qameta.allure.gradle.util.conv import org.gradle.api.Project import org.gradle.api.model.ObjectFactory import org.gradle.kotlin.dsl.property @@ -25,7 +24,7 @@ open class AllureCommandlineExtension @Inject constructor( * The property corresponds to `[organization]` pattern in [downloadUrlPattern] */ val group = objects.property() - .conv(project.provider { + .convention(project.provider { // TODO: Provider.orElse(Provider) is Gradle 5.6+ if (downloadUrlPattern.isPresent) { "custom.io.qameta.allure" @@ -40,7 +39,7 @@ open class AllureCommandlineExtension @Inject constructor( * It corresponds to `[module]` pattern in [downloadUrlPattern] */ val module = objects.property() - .conv(allureExtension.version.map { + .convention(allureExtension.version.map { val normalized = it.replace(Regex("\\d+")) { it.value.padStart(5, '0') } @@ -57,7 +56,7 @@ open class AllureCommandlineExtension @Inject constructor( * It corresponds to `[ext]` pattern in [downloadUrlPattern] */ val extension = objects.property() - .conv("zip") + .convention("zip") /** * By default, allure-commandline is received from Maven Central, so the property is unset. diff --git a/allure-report-plugin/src/main/kotlin/io/qameta/allure/gradle/download/AllureDownloadPlugin.kt b/allure-report-plugin/src/main/kotlin/io/qameta/allure/gradle/download/AllureDownloadPlugin.kt index 8834ce8..df00fb7 100644 --- a/allure-report-plugin/src/main/kotlin/io/qameta/allure/gradle/download/AllureDownloadPlugin.kt +++ b/allure-report-plugin/src/main/kotlin/io/qameta/allure/gradle/download/AllureDownloadPlugin.kt @@ -5,7 +5,6 @@ import io.qameta.allure.gradle.base.AllureBasePlugin import io.qameta.allure.gradle.base.AllureExtension import io.qameta.allure.gradle.download.tasks.DownloadAllure import io.qameta.allure.gradle.report.AllureReportBasePlugin -import io.qameta.allure.gradle.util.gradleGe51 import org.gradle.api.Plugin import org.gradle.api.Project import org.gradle.api.artifacts.dsl.RepositoryHandler @@ -37,8 +36,7 @@ open class AllureDownloadPlugin : Plugin { val reportExtension = (allureExtension as ExtensionAware).extensions.create( AllureCommandlineExtension.NAME, allureExtension, - project, - objects + project ) val allureCommandLine = configurations.create(ALLURE_COMMANDLINE_CONFIGURATION) { @@ -116,11 +114,8 @@ open class AllureDownloadPlugin : Plugin { return } repository.create()!!.apply { - if (gradleGe51) { - // content filtering is Gradle 6.2+ feature - content { - includeModule(group, module) - } + content { + includeModule(group, module) } } } diff --git a/allure-report-plugin/src/main/kotlin/io/qameta/allure/gradle/report/AllureReportBasePlugin.kt b/allure-report-plugin/src/main/kotlin/io/qameta/allure/gradle/report/AllureReportBasePlugin.kt index e89906b..50db8e4 100644 --- a/allure-report-plugin/src/main/kotlin/io/qameta/allure/gradle/report/AllureReportBasePlugin.kt +++ b/allure-report-plugin/src/main/kotlin/io/qameta/allure/gradle/report/AllureReportBasePlugin.kt @@ -23,10 +23,7 @@ open class AllureReportBasePlugin : Plugin { apply() the().extensions.create( AllureReportExtension.NAME, - project, - // Gradle 5 can't inject objects yet - // TODO: remove when Gradle 5 support can be dropped - objects + project ) } } diff --git a/allure-report-plugin/src/main/kotlin/io/qameta/allure/gradle/report/AllureReportExtension.kt b/allure-report-plugin/src/main/kotlin/io/qameta/allure/gradle/report/AllureReportExtension.kt index e8205e7..700d987 100644 --- a/allure-report-plugin/src/main/kotlin/io/qameta/allure/gradle/report/AllureReportExtension.kt +++ b/allure-report-plugin/src/main/kotlin/io/qameta/allure/gradle/report/AllureReportExtension.kt @@ -1,6 +1,5 @@ package io.qameta.allure.gradle.report -import io.qameta.allure.gradle.util.conv import org.gradle.api.Project import org.gradle.api.file.DirectoryProperty import org.gradle.api.model.ObjectFactory @@ -25,7 +24,7 @@ open class AllureReportExtension @Inject constructor( * folders. */ val reportDir: DirectoryProperty = objects.directoryProperty().apply { - conv(project.the().baseDirectory.dir("allure-report")) + convention(project.the().baseDirectory.dir("allure-report")) } /** @@ -34,7 +33,7 @@ open class AllureReportExtension @Inject constructor( * approach: "the task should (re)build all its prerequisites", so the user could edit the source file, * launch `allureReport` and get the updated report with all the tests updated. */ - val dependsOnTests: Property = objects.property().conv( + val dependsOnTests: Property = objects.property().convention( project.provider { false } diff --git a/allure-report-plugin/src/main/kotlin/io/qameta/allure/gradle/report/tasks/AllureReport.kt b/allure-report-plugin/src/main/kotlin/io/qameta/allure/gradle/report/tasks/AllureReport.kt index c74c7d0..b8e4c18 100644 --- a/allure-report-plugin/src/main/kotlin/io/qameta/allure/gradle/report/tasks/AllureReport.kt +++ b/allure-report-plugin/src/main/kotlin/io/qameta/allure/gradle/report/tasks/AllureReport.kt @@ -2,11 +2,10 @@ package io.qameta.allure.gradle.report.tasks import io.qameta.allure.gradle.base.AllureExtension import io.qameta.allure.gradle.base.tasks.AllureExecTask -import io.qameta.allure.gradle.util.conv +import io.qameta.allure.gradle.base.tasks.ConditionalArgumentProvider import org.gradle.api.model.ObjectFactory import org.gradle.api.tasks.Input import org.gradle.api.tasks.OutputDirectory -import org.gradle.api.tasks.TaskAction import org.gradle.api.tasks.options.Option import org.gradle.kotlin.dsl.property import org.gradle.kotlin.dsl.the @@ -14,9 +13,9 @@ import report import java.io.File import javax.inject.Inject -open class AllureReport @Inject constructor(objects: ObjectFactory) : AllureExecTask(objects) { +abstract class AllureReport @Inject constructor(objects: ObjectFactory) : AllureExecTask(objects) { @OutputDirectory - val reportDir = objects.directoryProperty().conv( + val reportDir = objects.directoryProperty().convention( project.the().report.reportDir.map { it.dir(this@AllureReport.name) } ) @@ -27,29 +26,32 @@ open class AllureReport @Inject constructor(objects: ObjectFactory) : AllureExec @Input @Option(option = "clean", description = "Clean Allure report directory before generating a new one") - val clean = objects.property().conv(false) + val clean = objects.property().convention(false) companion object { const val NAME = "allureReport" const val GENERATE_COMMAND = "generate" } - @TaskAction - fun generateAllureReport() { - val rawResults = rawResults.map { it.absolutePath } - logger.info("Input directories for $name: $rawResults") - project.exec { - executable(allureExecutable) - if (verbose.get()) { - args("--verbose") + init { + executable(allureExecutable.map { it.absolutePath }.lazyToString()) + argumentProviders += ConditionalArgumentProvider( + project.provider { + val args = mutableListOf() + if (verbose.get()) { + args += "--verbose" + } + args += GENERATE_COMMAND + val rawResults = rawResults.get().map { it.absolutePath } + logger.info("Input directories for $name: $rawResults") + args.addAll(rawResults) + args += "-o" + args += reportDir.get().asFile.absolutePath + if (clean.get()) { + args += "--clean" + } + args } - args(GENERATE_COMMAND) - args(rawResults) - args("-o", reportDir.get().asFile.absolutePath) - // TODO: replace with Gradle's delete? - if (clean.get()) { - args("--clean") - } - } + ) } } diff --git a/allure-report-plugin/src/main/kotlin/io/qameta/allure/gradle/report/tasks/AllureServe.kt b/allure-report-plugin/src/main/kotlin/io/qameta/allure/gradle/report/tasks/AllureServe.kt index 985efec..d3f140e 100644 --- a/allure-report-plugin/src/main/kotlin/io/qameta/allure/gradle/report/tasks/AllureServe.kt +++ b/allure-report-plugin/src/main/kotlin/io/qameta/allure/gradle/report/tasks/AllureServe.kt @@ -1,20 +1,19 @@ package io.qameta.allure.gradle.report.tasks import io.qameta.allure.gradle.base.tasks.AllureExecTask +import io.qameta.allure.gradle.base.tasks.ConditionalArgumentProvider import org.apache.tools.ant.taskdefs.condition.Os import org.gradle.api.model.ObjectFactory import org.gradle.api.tasks.Internal -import org.gradle.api.tasks.TaskAction import org.gradle.api.tasks.options.Option import org.gradle.kotlin.dsl.property -import java.io.File import java.io.InputStream import java.io.PrintStream import java.lang.management.ManagementFactory import java.util.concurrent.TimeUnit import javax.inject.Inject -open class AllureServe @Inject constructor(objects: ObjectFactory) : AllureExecTask(objects) { +abstract class AllureServe @Inject constructor(objects: ObjectFactory) : AllureExecTask(objects) { companion object { const val NAME = "allureServe" const val SERVE_COMMAND = "serve" @@ -36,58 +35,75 @@ open class AllureServe @Inject constructor(objects: ObjectFactory) : AllureExecT this.port.set(port.toInt()) } - @TaskAction - fun serveAllureReport() { - val rawResults = rawResults.map { it.absolutePath } - logger.info("Input directories for $name: $rawResults") - val allureArgs = mutableListOf().apply { - if (verbose.get()) { - add("--verbose") - } - add(SERVE_COMMAND) - host.orNull?.let { - add("--host") - add(it) - } - port.orNull?.let { - add("--port") - add(it) + init { + executable(allureExecutable.map { it.absolutePath }.lazyToString()) + argumentProviders += ConditionalArgumentProvider( + project.provider { + val args = mutableListOf() + if (verbose.get()) { + args += "--verbose" + } + args += SERVE_COMMAND + host.orNull?.let { + args.add("--host") + args.add(it) + } + port.orNull?.let { + args.add("--port") + args.add(it.toString()) + } + val rawResults = rawResults.get().map { it.absolutePath } + logger.info("Input directories for $name: $rawResults") + args.addAll(rawResults) + args } - addAll(rawResults) - } + ) + } - if (Os.isFamily(Os.FAMILY_WINDOWS)) { - // Workaround https://github.com/gradle/gradle/issues/7603 - // The issues is that "terminate process" in Windows does not terminate its children - startWithProcessBuilder(allureExecutable, allureArgs) + override fun exec() { + if (!Os.isFamily(Os.FAMILY_WINDOWS)) { + super.exec() return } - - project.exec { - executable(allureExecutable) - args(allureArgs) - } + // Workaround https://github.com/gradle/gradle/issues/7603 + // The issues is that "terminate process" in Windows does not terminate its children + startWithProcessBuilder( + allureExecutable = executable!!, + allureArgs = (args?.toMutableList() ?: mutableListOf()) + + argumentProviders.flatMap { it.asArguments() }, + environment = environment + ) } - private fun startWithProcessBuilder(allureExecutable: File, allureArgs: List) { - val cmd = listOf("cmd", "/c", allureExecutable.toString()) + allureArgs.map { it.toString() } + private fun startWithProcessBuilder( + allureExecutable: String, + allureArgs: List, + environment: Map + ) { + val cmd = listOf("cmd", "/c", allureExecutable) + allureArgs.map { it.toString() } logger.info("Starting $cmd") - ProcessBuilder(cmd).start().apply { - if (isAlive) { - val allurePid = processOrParentPid - project.gradle.buildFinished { - logger.info("Terminating process $allurePid to stop allure serve") - // /T kills all the children, so it does terminate 'allure serve' command - ProcessBuilder("taskkill", "/PID", allurePid.toString(), "/T", "/F").start().apply { - forwardStreams("terminate allure serve") - waitFor(15, TimeUnit.SECONDS) + ProcessBuilder(cmd) + .apply { + for ((key, value) in environment) { + environment()[key] = value.toString() + } + } + .start().apply { + if (isAlive) { + val allurePid = processOrParentPid + project.gradle.buildFinished { + logger.info("Terminating process $allurePid to stop allure serve") + // /T kills all the children, so it does terminate 'allure serve' command + ProcessBuilder("taskkill", "/PID", allurePid.toString(), "/T", "/F").start().apply { + forwardStreams("terminate allure serve") + waitFor(15, TimeUnit.SECONDS) + } } } + outputStream.close() + forwardStreams("allure serve") + waitFor() } - outputStream.close() - forwardStreams("allure serve") - waitFor() - } } private val Process.processOrParentPid: Long diff --git a/allure-report-plugin/src/test/java/io/qameta/allure/gradle/report/ReportOnlyTest.java b/allure-report-plugin/src/test/java/io/qameta/allure/gradle/report/ReportOnlyTest.java index 3e73f37..6eef524 100644 --- a/allure-report-plugin/src/test/java/io/qameta/allure/gradle/report/ReportOnlyTest.java +++ b/allure-report-plugin/src/test/java/io/qameta/allure/gradle/report/ReportOnlyTest.java @@ -33,7 +33,6 @@ public static Collection getFrameworks() { return Arrays.asList( new Object[]{"src/it/report-only", "7.5.1"}, new Object[]{"src/it/report-only", "7.0"}, - new Object[]{"src/it/report-only", "5.0"}, new Object[]{"src/it/report-only", "6.0"} ); } diff --git a/sandbox/dsl-groovy/build.gradle b/sandbox/dsl-groovy/build.gradle index 67d97c4..ed02272 100644 --- a/sandbox/dsl-groovy/build.gradle +++ b/sandbox/dsl-groovy/build.gradle @@ -8,8 +8,9 @@ dependencies { } allure { - version = '2.15.0' - adapter { - allureJavaVersion = '2.15.0' - } + environment["TZ"] = "UTC" +} + +tasks.withType(Test).configureEach { + useJUnitPlatform() } diff --git a/sandbox/dsl-kotlin/build.gradle.kts b/sandbox/dsl-kotlin/build.gradle.kts index 0e5cf61..f28542d 100644 --- a/sandbox/dsl-kotlin/build.gradle.kts +++ b/sandbox/dsl-kotlin/build.gradle.kts @@ -8,8 +8,9 @@ dependencies { } allure { - version.set("2.15.0") - adapter { - allureJavaVersion.set("2.15.0") - } + environment.put("TZ", "UTC") +} + +tasks.withType().configureEach { + useJUnitPlatform() } diff --git a/testkit-junit4/src/main/java/io/qameta/allure/gradle/rule/GradleRunnerRule.java b/testkit-junit4/src/main/java/io/qameta/allure/gradle/rule/GradleRunnerRule.java index 138b3a4..7e1d5a4 100644 --- a/testkit-junit4/src/main/java/io/qameta/allure/gradle/rule/GradleRunnerRule.java +++ b/testkit-junit4/src/main/java/io/qameta/allure/gradle/rule/GradleRunnerRule.java @@ -1,25 +1,22 @@ package io.qameta.allure.gradle.rule; import org.apache.commons.io.FileUtils; -import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; import org.gradle.api.JavaVersion; import org.gradle.testkit.runner.BuildResult; import org.gradle.testkit.runner.GradleRunner; import org.gradle.util.GradleVersion; +import org.junit.Assert; import org.junit.Assume; import org.junit.rules.ExternalResource; import java.io.File; import java.io.IOException; -import java.io.InputStream; -import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Optional; import java.util.function.Supplier; -import java.util.stream.Collectors; import java.util.stream.Stream; import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic; @@ -91,10 +88,9 @@ protected void before() throws Throwable { String gradleVersion = versionSupplier.get(); GradleVersion testGradle = GradleVersion.version(gradleVersion); - // tasks.named requires Gradle 5.0+ // Configuration avoidance tasks.register requires Gradle 4.9+ - if (testGradle.compareTo(GradleVersion.version("5.0")) < 0) { - Assume.assumeTrue("Gradle " + testGradle + " is not supported, please upgrade to 5.0+", false); + if (testGradle.compareTo(GradleVersion.version("6.0")) < 0) { + Assert.fail("allure-gradle plugin requires Gradle 6.0+, the can't launch tests with Gradle " + testGradle); } Optional gradleRequirement = Stream.of(