From 6fed6572cb4dbcc25b92ee27f44bfef38e57c7b7 Mon Sep 17 00:00:00 2001 From: Gareth Clay Date: Tue, 9 Jun 2020 17:16:23 +0100 Subject: [PATCH] Fix CI log interleaving * Stop logs from parallel tests interleaving with each other * Cut down on noise and reduce page load times by only logging std streams for tests that fail * @Validated AT cloud foundry configuration * Remove unnecessary Gradle tasks from the AT job since they've already been performed as part of `build` * Stop tests and javadoc Gradle tasks being run against docs subproject and causing failures #380 --- build.gradle | 93 ++++++++++++------- ci/scripts/acceptance-tests.sh | 10 +- ci/scripts/build-project.sh | 7 +- ci/tasks/acceptance-tests.yml | 1 + ci/tasks/build-project.yml | 2 + .../fixtures/cf/CloudFoundryProperties.java | 13 +++ spring-cloud-app-broker-docs/build.gradle | 6 +- .../src/docs/asciidoc/index.adoc | 2 +- .../src/docs/asciidoc/service-bindings.adoc | 2 +- .../src/docs/asciidoc/service-instances.adoc | 2 +- ...ServiceInstanceBindingStateRepository.java | 0 ...ExampleServiceInstanceStateRepository.java | 0 .../example/appbroker/ServiceInstance.java | 0 .../appbroker/ServiceInstanceBinding.java | 0 ...iceInstanceBindingStateCrudRepository.java | 0 .../ServiceInstanceStateCrudRepository.java | 0 16 files changed, 91 insertions(+), 47 deletions(-) rename spring-cloud-app-broker-docs/src/{test => main}/java/com/example/appbroker/ExampleServiceInstanceBindingStateRepository.java (100%) rename spring-cloud-app-broker-docs/src/{test => main}/java/com/example/appbroker/ExampleServiceInstanceStateRepository.java (100%) rename spring-cloud-app-broker-docs/src/{test => main}/java/com/example/appbroker/ServiceInstance.java (100%) rename spring-cloud-app-broker-docs/src/{test => main}/java/com/example/appbroker/ServiceInstanceBinding.java (100%) rename spring-cloud-app-broker-docs/src/{test => main}/java/com/example/appbroker/ServiceInstanceBindingStateCrudRepository.java (100%) rename spring-cloud-app-broker-docs/src/{test => main}/java/com/example/appbroker/ServiceInstanceStateCrudRepository.java (100%) diff --git a/build.gradle b/build.gradle index 41276c4..4940b9c 100644 --- a/build.gradle +++ b/build.gradle @@ -1,3 +1,4 @@ +import java.util.concurrent.ConcurrentHashMap /* * Copyright 2002-2020 the original author or authors. * @@ -51,6 +52,9 @@ if (project.hasProperty("springFrameworkVersion")) { if (project.hasProperty("reactorVersion")) { ext['reactor-bom.version'] = ext.reactorVersion } +if (!project.hasProperty("onlyShowStandardStreamsOnTestFailure")) { + ext.onlyShowStandardStreamsOnTestFailure = false +} apply plugin: "io.spring.nohttp" @@ -69,6 +73,59 @@ configure(allprojects) { if (subproject.description == null || subproject.description.isEmpty()) { throw new InvalidUserDataException("A project description is required for publishing to maven central") } + + tasks.withType(Test).forEach { Test task -> + task.with { + // enable JUnit 5 + useJUnitPlatform() + scanForTestClasses = true + group = "verification" + + testLogging { + exceptionFormat = "full" + events = ["passed", "skipped", "failed"] + showStandardStreams = !project.onlyShowStandardStreamsOnTestFailure + } + + if (project.onlyShowStandardStreamsOnTestFailure) { + Map testOutput = new ConcurrentHashMap<>() + + onOutput { TestDescriptor descriptor, TestOutputEvent event -> + testOutput.compute(descriptor.displayName, { k, v -> + v == null ? new StringBuilder(event.message) : v.append(event.message) + }) + } + + afterTest { TestDescriptor descriptor, TestResult result -> + if (result.resultType == TestResult.ResultType.FAILURE && testOutput.containsKey(descriptor.displayName)) { + logger.lifecycle("\n\n${testOutput.get(descriptor.displayName)}") + testOutput.remove(descriptor.displayName) + } + } + } + + // print failed tests after the execution + def failedTests = [] + afterTest { test, result -> + if (result.resultType == TestResult.ResultType.FAILURE) { + failedTests << test + } + } + + // create a summary after the execution + afterSuite { desc, result -> + if (!desc.parent) { + println "\nTest result: ${result.resultType}" + println "Test summary: ${result.testCount} tests, " + + "${result.successfulTestCount} succeeded, " + + "${result.failedTestCount} failed, " + + "${result.skippedTestCount} skipped" + + failedTests.each { test -> println "FAILED test: ${test.className} > ${test.name}" } + } + } + } + } } apply from: "${rootProject.projectDir}/publish-maven.gradle" @@ -116,42 +173,6 @@ configure(allprojects - [project(":spring-cloud-app-broker-docs")]) { ruleSetFiles = files("${project.rootDir}/src/pmd/pmdTestRuleSet.xml") source = "src/test/java" } - - test { - // enable JUnit 5 - useJUnitPlatform() - - testLogging { - // display all the events - events 'PASSED', 'FAILED', 'SKIPPED' - // display stdout and stderr - showStandardStreams = true - } - - // create a summary after the execution - afterSuite { desc, result -> - if (!desc.parent) { - println "\nTest result: ${result.resultType}" - println "Test summary: ${result.testCount} tests, " + - "${result.successfulTestCount} succeeded, " + - "${result.failedTestCount} failed, " + - "${result.skippedTestCount} skipped" - } - } - - // print failed tests after the execution - def failedTests = [] - - afterTest { test, result -> - if (result.resultType == TestResult.ResultType.FAILURE) { - failedTests << test - } - } - - afterSuite { - failedTests.each { test -> println "FAILED test: ${test.className} > ${test.name}" } - } - } } subprojects { diff --git a/ci/scripts/acceptance-tests.sh b/ci/scripts/acceptance-tests.sh index 3808a47..e6cdded 100755 --- a/ci/scripts/acceptance-tests.sh +++ b/ci/scripts/acceptance-tests.sh @@ -11,10 +11,7 @@ readonly CLIENT_SECRET="${CLIENT_SECRET:?must be set}" readonly DEFAULT_ORG="${DEFAULT_ORG:?must be set}" readonly DEFAULT_SPACE="${DEFAULT_SPACE:?must be set}" readonly SKIP_SSL_VALIDATION="${SKIP_SSL_VALIDATION:?must be set}" - -build() { - ./gradlew assemble -x test -} +readonly ONLY_SHOW_STANDARD_STREAMS_ON_TEST_FAILURE="${ONLY_SHOW_STANDARD_STREAMS_ON_TEST_FAILURE:?must be set}" run_tests() { export SPRING_CLOUD_APPBROKER_ACCEPTANCETEST_CLOUDFOUNDRY_API_HOST="${API_HOST}" @@ -27,12 +24,13 @@ run_tests() { export SPRING_CLOUD_APPBROKER_ACCEPTANCETEST_CLOUDFOUNDRY_DEFAULT_SPACE="${DEFAULT_SPACE}" export SPRING_CLOUD_APPBROKER_ACCEPTANCETEST_CLOUDFOUNDRY_SKIP_SSL_VALIDATION="${SKIP_SSL_VALIDATION}" export TESTS_BROKERAPPPATH=build/libs/spring-cloud-app-broker-acceptance-tests.jar - ./gradlew clean assemble check -PacceptanceTests -b spring-cloud-app-broker-acceptance-tests/build.gradle + ./gradlew -PacceptanceTests \ + -PonlyShowStandardStreamsOnTestFailure="${ONLY_SHOW_STANDARD_STREAMS_ON_TEST_FAILURE}" \ + :spring-cloud-app-broker-acceptance-tests:test } main() { pushd "git-repo" > /dev/null - build run_tests popd > /dev/null } diff --git a/ci/scripts/build-project.sh b/ci/scripts/build-project.sh index 3844184..7396833 100755 --- a/ci/scripts/build-project.sh +++ b/ci/scripts/build-project.sh @@ -1,10 +1,15 @@ #!/bin/bash set -e +readonly ONLY_SHOW_STANDARD_STREAMS_ON_TEST_FAILURE="${ONLY_SHOW_STANDARD_STREAMS_ON_TEST_FAILURE:"true"}" + # shellcheck source=scripts/common.sh source "$(dirname "$0")/common.sh" repository=$(pwd)/distribution-repository pushd git-repo >/dev/null -./gradlew --no-daemon clean build install -Dmaven.repo.local="${repository}" -Dorg.gradle.jvmargs="-Xmx512m -Xmx2048m" +./gradlew --no-daemon clean build install \ + -PonlyShowStandardStreamsOnTestFailure="${ONLY_SHOW_STANDARD_STREAMS_ON_TEST_FAILURE}" \ + -Dmaven.repo.local="${repository}" \ + -Dorg.gradle.jvmargs="-Xmx512m -Xmx2048m" popd >/dev/null diff --git a/ci/tasks/acceptance-tests.yml b/ci/tasks/acceptance-tests.yml index 943c934..d5f82ab 100644 --- a/ci/tasks/acceptance-tests.yml +++ b/ci/tasks/acceptance-tests.yml @@ -23,3 +23,4 @@ params: DEFAULT_ORG: DEFAULT_SPACE: SKIP_SSL_VALIDATION: + ONLY_SHOW_STANDARD_STREAMS_ON_TEST_FAILURE: true diff --git a/ci/tasks/build-project.yml b/ci/tasks/build-project.yml index 5ca3b7e..5816051 100644 --- a/ci/tasks/build-project.yml +++ b/ci/tasks/build-project.yml @@ -13,3 +13,5 @@ run: - -ec - | ${PWD}/git-repo/ci/scripts/build-project.sh +params: + ONLY_SHOW_STANDARD_STREAMS_ON_TEST_FAILURE: true diff --git a/spring-cloud-app-broker-acceptance-tests/src/test/java/org/springframework/cloud/appbroker/acceptance/fixtures/cf/CloudFoundryProperties.java b/spring-cloud-app-broker-acceptance-tests/src/test/java/org/springframework/cloud/appbroker/acceptance/fixtures/cf/CloudFoundryProperties.java index f74b100..8a7accd 100644 --- a/spring-cloud-app-broker-acceptance-tests/src/test/java/org/springframework/cloud/appbroker/acceptance/fixtures/cf/CloudFoundryProperties.java +++ b/spring-cloud-app-broker-acceptance-tests/src/test/java/org/springframework/cloud/appbroker/acceptance/fixtures/cf/CloudFoundryProperties.java @@ -18,31 +18,44 @@ package org.springframework.cloud.appbroker.acceptance.fixtures.cf; import java.net.URI; +import javax.validation.constraints.Min; +import javax.validation.constraints.NotBlank; + import org.cloudfoundry.reactor.ProxyConfiguration; import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.validation.annotation.Validated; import static org.springframework.cloud.appbroker.acceptance.fixtures.cf.CloudFoundryProperties.PROPERTY_PREFIX; @ConfigurationProperties(PROPERTY_PREFIX) +@Validated public class CloudFoundryProperties { protected static final String PROPERTY_PREFIX = "spring.cloud.appbroker.acceptancetest.cloudfoundry"; + @NotBlank private String apiHost; + @Min(1) private Integer apiPort; + @NotBlank private String defaultOrg; + @NotBlank private String defaultSpace; + @NotBlank private String username; + @NotBlank private String password; + @NotBlank private String clientId; + @NotBlank private String clientSecret; private String identityZoneSubdomain; diff --git a/spring-cloud-app-broker-docs/build.gradle b/spring-cloud-app-broker-docs/build.gradle index b89d344..790e3f5 100644 --- a/spring-cloud-app-broker-docs/build.gradle +++ b/spring-cloud-app-broker-docs/build.gradle @@ -49,6 +49,10 @@ dependencies { docs("io.spring.docresources:spring-doc-resources:0.2.1.RELEASE@zip") } +javadoc { + enabled = false +} + task prepareAsciidocBuild(type: Sync) { dependsOn configurations.docs // copy doc resources @@ -84,7 +88,7 @@ asciidoctorPdf { asciidoctor { dependsOn asciidoctorPdf - baseDirFollowsSourceFile() + baseDirFollowsSourceFile() sourceDir = file("$buildDir/asciidoc") sources { include '*.adoc' diff --git a/spring-cloud-app-broker-docs/src/docs/asciidoc/index.adoc b/spring-cloud-app-broker-docs/src/docs/asciidoc/index.adoc index 0aa14e7..3c7f56d 100644 --- a/spring-cloud-app-broker-docs/src/docs/asciidoc/index.adoc +++ b/spring-cloud-app-broker-docs/src/docs/asciidoc/index.adoc @@ -6,7 +6,7 @@ :toclevels: 4 :sectlinks: -:examples-dir: ../../src/test/java/com/example/appbroker/ +:examples-dir: ../../src/main/java/com/example/appbroker/ :sapbr: https://cloud.spring.io/spring-cloud-app-broker/ :sapbr-href: {sapbr}[Spring Cloud App Broker] :sapbr-api: https://docs.spring.io/spring-cloud-app-broker/docs/{project-version}/api/ diff --git a/spring-cloud-app-broker-docs/src/docs/asciidoc/service-bindings.adoc b/spring-cloud-app-broker-docs/src/docs/asciidoc/service-bindings.adoc index 060319f..daf6100 100644 --- a/spring-cloud-app-broker-docs/src/docs/asciidoc/service-bindings.adoc +++ b/spring-cloud-app-broker-docs/src/docs/asciidoc/service-bindings.adoc @@ -1,4 +1,4 @@ -:examples-dir: ../../src/test/java/com/example/appbroker/ +:examples-dir: ../../src/main/java/com/example/appbroker/ [[service-bindings]] == Service Bindings diff --git a/spring-cloud-app-broker-docs/src/docs/asciidoc/service-instances.adoc b/spring-cloud-app-broker-docs/src/docs/asciidoc/service-instances.adoc index 165bec3..a28fb02 100644 --- a/spring-cloud-app-broker-docs/src/docs/asciidoc/service-instances.adoc +++ b/spring-cloud-app-broker-docs/src/docs/asciidoc/service-instances.adoc @@ -1,4 +1,4 @@ -:examples-dir: ../../src/test/java/com/example/appbroker/ +:examples-dir: ../../src/main/java/com/example/appbroker/ [[service-instances]] == Service Instances diff --git a/spring-cloud-app-broker-docs/src/test/java/com/example/appbroker/ExampleServiceInstanceBindingStateRepository.java b/spring-cloud-app-broker-docs/src/main/java/com/example/appbroker/ExampleServiceInstanceBindingStateRepository.java similarity index 100% rename from spring-cloud-app-broker-docs/src/test/java/com/example/appbroker/ExampleServiceInstanceBindingStateRepository.java rename to spring-cloud-app-broker-docs/src/main/java/com/example/appbroker/ExampleServiceInstanceBindingStateRepository.java diff --git a/spring-cloud-app-broker-docs/src/test/java/com/example/appbroker/ExampleServiceInstanceStateRepository.java b/spring-cloud-app-broker-docs/src/main/java/com/example/appbroker/ExampleServiceInstanceStateRepository.java similarity index 100% rename from spring-cloud-app-broker-docs/src/test/java/com/example/appbroker/ExampleServiceInstanceStateRepository.java rename to spring-cloud-app-broker-docs/src/main/java/com/example/appbroker/ExampleServiceInstanceStateRepository.java diff --git a/spring-cloud-app-broker-docs/src/test/java/com/example/appbroker/ServiceInstance.java b/spring-cloud-app-broker-docs/src/main/java/com/example/appbroker/ServiceInstance.java similarity index 100% rename from spring-cloud-app-broker-docs/src/test/java/com/example/appbroker/ServiceInstance.java rename to spring-cloud-app-broker-docs/src/main/java/com/example/appbroker/ServiceInstance.java diff --git a/spring-cloud-app-broker-docs/src/test/java/com/example/appbroker/ServiceInstanceBinding.java b/spring-cloud-app-broker-docs/src/main/java/com/example/appbroker/ServiceInstanceBinding.java similarity index 100% rename from spring-cloud-app-broker-docs/src/test/java/com/example/appbroker/ServiceInstanceBinding.java rename to spring-cloud-app-broker-docs/src/main/java/com/example/appbroker/ServiceInstanceBinding.java diff --git a/spring-cloud-app-broker-docs/src/test/java/com/example/appbroker/ServiceInstanceBindingStateCrudRepository.java b/spring-cloud-app-broker-docs/src/main/java/com/example/appbroker/ServiceInstanceBindingStateCrudRepository.java similarity index 100% rename from spring-cloud-app-broker-docs/src/test/java/com/example/appbroker/ServiceInstanceBindingStateCrudRepository.java rename to spring-cloud-app-broker-docs/src/main/java/com/example/appbroker/ServiceInstanceBindingStateCrudRepository.java diff --git a/spring-cloud-app-broker-docs/src/test/java/com/example/appbroker/ServiceInstanceStateCrudRepository.java b/spring-cloud-app-broker-docs/src/main/java/com/example/appbroker/ServiceInstanceStateCrudRepository.java similarity index 100% rename from spring-cloud-app-broker-docs/src/test/java/com/example/appbroker/ServiceInstanceStateCrudRepository.java rename to spring-cloud-app-broker-docs/src/main/java/com/example/appbroker/ServiceInstanceStateCrudRepository.java