From e6e6cb634614dfd212c933e66db614486072d848 Mon Sep 17 00:00:00 2001 From: erabii Date: Mon, 22 May 2023 16:21:35 +0300 Subject: [PATCH] Pipeline tests simplification (#1348) --- .../action.yaml | 20 +++++ .github/workflows/maven.yaml | 86 +++---------------- .../pom.xml | 5 ++ spring-cloud-kubernetes-client-config/pom.xml | 5 ++ .../pom.xml | 5 ++ .../pom.xml | 4 +- ...ernetesClientLoadBalancerPodModeTests.java | 5 +- ...tesClientLoadBalancerServiceModeTests.java | 5 +- spring-cloud-kubernetes-commons/pom.xml | 5 ++ .../pom.xml | 5 ++ .../pom.xml | 5 ++ .../pom.xml | 5 ++ spring-cloud-kubernetes-discovery/pom.xml | 8 +- .../pom.xml | 5 ++ .../pom.xml | 5 ++ .../pom.xml | 5 ++ spring-cloud-kubernetes-fabric8-istio/pom.xml | 6 +- .../pom.xml | 25 ++---- .../pom.xml | 5 ++ .../DisabledTestsCondition.java | 51 +++++++++++ .../org.junit.jupiter.api.extension.Extension | 1 + .../main/resources/junit-platform.properties | 1 + 22 files changed, 158 insertions(+), 109 deletions(-) create mode 100644 .github/workflows/composites/maven-build-with-dry-run-for-tests/action.yaml create mode 100644 spring-cloud-kubernetes-test-support/src/main/java/org/springframework/cloud/kubernetes/tests/commons/junit_extension/DisabledTestsCondition.java create mode 100644 spring-cloud-kubernetes-test-support/src/main/resources/META-INF/services/org.junit.jupiter.api.extension.Extension create mode 100644 spring-cloud-kubernetes-test-support/src/main/resources/junit-platform.properties diff --git a/.github/workflows/composites/maven-build-with-dry-run-for-tests/action.yaml b/.github/workflows/composites/maven-build-with-dry-run-for-tests/action.yaml new file mode 100644 index 00000000..bc515129 --- /dev/null +++ b/.github/workflows/composites/maven-build-with-dry-run-for-tests/action.yaml @@ -0,0 +1,20 @@ +name: maven-build-with-dry-run-for-tests +description: maven-build-with-dry-run-for-tests +runs: + using: "composite" + steps: + - name: maven-build-with-dry-run-for-tests + shell: bash + run: | + # find all the tests that are supposed to be run, but don't actually run them. + # this is achieved via: 'spring.cloud.k8s.skip.tests=true' in DisabledTestsCondition + ./mvnw clean install -Dskip.build.image=true -Dspring.cloud.k8s.skip.tests=true \ + -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=error \ + -T 1C > /tmp/tests.txt + + - name: upload test + uses: actions/upload-artifact@v3 + with: + name: tests.txt + path: /tmp/tests.txt + diff --git a/.github/workflows/maven.yaml b/.github/workflows/maven.yaml index 8a145ebd..14ac8603 100644 --- a/.github/workflows/maven.yaml +++ b/.github/workflows/maven.yaml @@ -34,8 +34,8 @@ jobs: - name: build fabric8 istio uses: ./.github/workflows/composites/fabric8-istio - - name: build with skip tests and skip images - run: ./mvnw -T 1C -s .settings.xml clean install -U -DskipTests -Dskip.build.image=true + - name: maven build with dry-run for tests + uses: ./.github/workflows/composites/maven-build-with-dry-run-for-tests - name: build controllers project uses: ./.github/workflows/composites/build-controllers-project @@ -136,86 +136,23 @@ jobs: uses: ./.github/workflows/composites/load-docker-images if: env.BASE_BRANCH != '2.1.x' + - name: download tests + uses: actions/download-artifact@v3 + with: + name: tests.txt + path: /tmp + - name: run tests env: CURRENT_INDEX: ${{ matrix.current_index }} NUMBER_OF_JOBS: ${{ matrix.number_of_jobs }} run: | - # - find all tests - # - exclude Fabric8IstionIT - # - only take classes that have @Test inside them - # - ignore the ones that have 'abstract class'. we do this because otherwise we would pass - # to -DtestsToRun an abstract class, and it will not run anything. - # - drop the "begining" xxx/src/test/java - # - replace / with . - # - drop last ".java" - # - replace newline with space - # - replace '\n' with ' ' - # exclude all integration tests for branch '2.1.x' via 'grep -v '.*IT.java'' - - echo "base_branch : $BASE_BRANCH" - declare -a PLAIN_TEST_CLASSNAMES - baseBranch=$BASE_BRANCH - if [[ $baseBranch == "2.1.x" ]]; then - - PLAIN_TEST_CLASSNAMES=($(find . -name '*.java' \ - | grep 'src/test/java' \ - | grep -v 'Fabric8IstioIT' \ - | grep -v '.*IT.java' \ - | xargs grep -l '@Test' \ - | xargs grep -L 'abstract class' \ - | sed 's/.*src.test.java.//g' \ - | sed 's@/@.@g' \ - | sed 's/.\{5\}$//' \ - | tr '\n' ' ')) - else - PLAIN_TEST_CLASSNAMES=($(find . -name '*.java' \ - | grep 'src/test/java' \ - | grep -v 'Fabric8IstioIT' \ - | xargs grep -l '@Test' \ - | xargs grep -L 'abstract class' \ - | sed 's/.*src.test.java.//g' \ - | sed 's@/@.@g' \ - | sed 's/.\{5\}$//' \ - | tr '\n' ' ')) - fi - - # classes that have @Test and are abstract, for example: "LabeledSecretWithPrefixTests" - # - exclude Fabric8IstionIT - # - only take classes that have @Test inside them - # - only take classes that are abstract - # - drop everything up until the last "/" - # - drop ".java" - - ABSTRACT_TEST_CLASSNAMES_COMMAND="find . -name '*.java' \ - | grep 'src/test/java' \ - | grep -v 'Fabric8IstioIT' \ - | xargs grep -l '@Test' \ - | xargs grep -l 'abstract class' \ - | sed 's/.*\///g' \ - | sed 's/.java//g'" - - # find classes that extend abstract test classes - DERIVED_FROM_ABSTRACT_CLASSES_COMMAND="find . -name '*.java' \ - | grep 'src/test/java' \ - | grep -v 'Fabric8IstioIT' \ - | xargs grep -l 'extends replace_me ' \ - | sed 's/.*src.test.java.//g' \ - | sed 's@/@.@g' \ - | sed 's/.\{5\}$//' \ - | tr '\n' ' '" - - while read class_name; do - replaced=$(echo ${DERIVED_FROM_ABSTRACT_CLASSES_COMMAND/replace_me/"$class_name"}) - result=($(eval $replaced)) - PLAIN_TEST_CLASSNAMES+=(${result[@]}) - done < <(eval $ABSTRACT_TEST_CLASSNAMES_COMMAND) - + PLAIN_TEST_CLASSNAMES=($(cat /tmp/tests.txt | grep 'spring.cloud.k8s.test.to.run' | awk '{print $3}')) IFS=$'\n' - SORTED_TEST_CLASSNAMES=( $(sort <<< "${PLAIN_TEST_CLASSNAMES[*]} | uniq -u") ) + SORTED_TEST_CLASSNAMES=( $(sort <<< "${PLAIN_TEST_CLASSNAMES[*]}") ) unset IFS - + number_of_tests=${#SORTED_TEST_CLASSNAMES[@]} number_of_jobs=${NUMBER_OF_JOBS} current_index=${CURRENT_INDEX} @@ -299,4 +236,3 @@ jobs: -Dmaven.wagon.http.retryHandler.count=3 \ -Dskip.build.image=true fi - diff --git a/spring-cloud-kubernetes-client-autoconfig/pom.xml b/spring-cloud-kubernetes-client-autoconfig/pom.xml index e94d7b5b..afcaec16 100644 --- a/spring-cloud-kubernetes-client-autoconfig/pom.xml +++ b/spring-cloud-kubernetes-client-autoconfig/pom.xml @@ -54,6 +54,11 @@ mockito-inline test + + org.springframework.cloud + spring-cloud-kubernetes-test-support + test + diff --git a/spring-cloud-kubernetes-client-config/pom.xml b/spring-cloud-kubernetes-client-config/pom.xml index f5bbb615..9f0ccab5 100644 --- a/spring-cloud-kubernetes-client-config/pom.xml +++ b/spring-cloud-kubernetes-client-config/pom.xml @@ -109,6 +109,11 @@ mockito-inline test + + org.springframework.cloud + spring-cloud-kubernetes-test-support + test + diff --git a/spring-cloud-kubernetes-client-discovery/pom.xml b/spring-cloud-kubernetes-client-discovery/pom.xml index 20f6bce4..dbc68126 100644 --- a/spring-cloud-kubernetes-client-discovery/pom.xml +++ b/spring-cloud-kubernetes-client-discovery/pom.xml @@ -75,6 +75,11 @@ wiremock-jre8-standalone test + + org.springframework.cloud + spring-cloud-kubernetes-test-support + test + diff --git a/spring-cloud-kubernetes-client-loadbalancer/pom.xml b/spring-cloud-kubernetes-client-loadbalancer/pom.xml index f7acf855..4f96ca13 100644 --- a/spring-cloud-kubernetes-client-loadbalancer/pom.xml +++ b/spring-cloud-kubernetes-client-loadbalancer/pom.xml @@ -52,8 +52,8 @@ test - org.junit.vintage - junit-vintage-engine + org.springframework.cloud + spring-cloud-kubernetes-test-support test diff --git a/spring-cloud-kubernetes-client-loadbalancer/src/test/java/org/springframework/cloud/kubernetes/client/loadbalancer/KubernetesClientLoadBalancerPodModeTests.java b/spring-cloud-kubernetes-client-loadbalancer/src/test/java/org/springframework/cloud/kubernetes/client/loadbalancer/KubernetesClientLoadBalancerPodModeTests.java index 62ac7f31..bfc95cf5 100644 --- a/spring-cloud-kubernetes-client-loadbalancer/src/test/java/org/springframework/cloud/kubernetes/client/loadbalancer/KubernetesClientLoadBalancerPodModeTests.java +++ b/spring-cloud-kubernetes-client-loadbalancer/src/test/java/org/springframework/cloud/kubernetes/client/loadbalancer/KubernetesClientLoadBalancerPodModeTests.java @@ -21,8 +21,7 @@ import java.util.Collections; import io.kubernetes.client.openapi.ApiClient; import io.kubernetes.client.util.ClientBuilder; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.SpringBootApplication; @@ -39,7 +38,6 @@ import org.springframework.context.annotation.Bean; import org.springframework.http.HttpStatus; import org.springframework.http.client.ClientHttpResponse; import org.springframework.mock.http.client.MockClientHttpResponse; -import org.springframework.test.context.junit4.SpringRunner; import org.springframework.web.client.RestTemplate; import static org.assertj.core.api.Assertions.assertThat; @@ -52,7 +50,6 @@ import static org.mockito.Mockito.when; /** * @author Ryan Baxter */ -@RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = KubernetesClientLoadBalancerPodModeTests.App.class) public class KubernetesClientLoadBalancerPodModeTests { diff --git a/spring-cloud-kubernetes-client-loadbalancer/src/test/java/org/springframework/cloud/kubernetes/client/loadbalancer/KubernetesClientLoadBalancerServiceModeTests.java b/spring-cloud-kubernetes-client-loadbalancer/src/test/java/org/springframework/cloud/kubernetes/client/loadbalancer/KubernetesClientLoadBalancerServiceModeTests.java index 8ea4359f..bebf4b07 100644 --- a/spring-cloud-kubernetes-client-loadbalancer/src/test/java/org/springframework/cloud/kubernetes/client/loadbalancer/KubernetesClientLoadBalancerServiceModeTests.java +++ b/spring-cloud-kubernetes-client-loadbalancer/src/test/java/org/springframework/cloud/kubernetes/client/loadbalancer/KubernetesClientLoadBalancerServiceModeTests.java @@ -28,8 +28,7 @@ import io.kubernetes.client.openapi.models.V1ServiceListBuilder; import io.kubernetes.client.openapi.models.V1ServicePortBuilder; import io.kubernetes.client.openapi.models.V1ServiceSpecBuilder; import io.kubernetes.client.util.ClientBuilder; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.Test; import org.mockito.Mockito; import org.springframework.beans.factory.annotation.Autowired; @@ -46,7 +45,6 @@ import org.springframework.context.annotation.Bean; import org.springframework.http.HttpStatus; import org.springframework.http.client.ClientHttpResponse; import org.springframework.mock.http.client.MockClientHttpResponse; -import org.springframework.test.context.junit4.SpringRunner; import org.springframework.web.client.RestTemplate; import static org.assertj.core.api.Assertions.assertThat; @@ -58,7 +56,6 @@ import static org.mockito.Mockito.when; /** * @author Ryan Baxter */ -@RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = KubernetesClientLoadBalancerServiceModeTests.App.class, properties = { "spring.cloud.kubernetes.loadbalancer.mode=SERVICE" }) diff --git a/spring-cloud-kubernetes-commons/pom.xml b/spring-cloud-kubernetes-commons/pom.xml index 4d2391b9..9259517e 100644 --- a/spring-cloud-kubernetes-commons/pom.xml +++ b/spring-cloud-kubernetes-commons/pom.xml @@ -102,6 +102,11 @@ spring-test test + + org.springframework.cloud + spring-cloud-kubernetes-test-support + test + diff --git a/spring-cloud-kubernetes-controllers/spring-cloud-kubernetes-configserver/pom.xml b/spring-cloud-kubernetes-controllers/spring-cloud-kubernetes-configserver/pom.xml index 2aaadd69..6b10b0cc 100644 --- a/spring-cloud-kubernetes-controllers/spring-cloud-kubernetes-configserver/pom.xml +++ b/spring-cloud-kubernetes-controllers/spring-cloud-kubernetes-configserver/pom.xml @@ -52,6 +52,11 @@ mockito-inline test + + org.springframework.cloud + spring-cloud-kubernetes-test-support + test + diff --git a/spring-cloud-kubernetes-controllers/spring-cloud-kubernetes-configuration-watcher/pom.xml b/spring-cloud-kubernetes-controllers/spring-cloud-kubernetes-configuration-watcher/pom.xml index e63c0cea..81648c43 100644 --- a/spring-cloud-kubernetes-controllers/spring-cloud-kubernetes-configuration-watcher/pom.xml +++ b/spring-cloud-kubernetes-controllers/spring-cloud-kubernetes-configuration-watcher/pom.xml @@ -76,6 +76,11 @@ mockito-inline test + + org.springframework.cloud + spring-cloud-kubernetes-test-support + test + diff --git a/spring-cloud-kubernetes-controllers/spring-cloud-kubernetes-discoveryserver/pom.xml b/spring-cloud-kubernetes-controllers/spring-cloud-kubernetes-discoveryserver/pom.xml index f45f29ed..ff992103 100644 --- a/spring-cloud-kubernetes-controllers/spring-cloud-kubernetes-discoveryserver/pom.xml +++ b/spring-cloud-kubernetes-controllers/spring-cloud-kubernetes-discoveryserver/pom.xml @@ -44,6 +44,11 @@ wiremock-jre8-standalone test + + org.springframework.cloud + spring-cloud-kubernetes-test-support + test + diff --git a/spring-cloud-kubernetes-discovery/pom.xml b/spring-cloud-kubernetes-discovery/pom.xml index 773d1707..0b981777 100644 --- a/spring-cloud-kubernetes-discovery/pom.xml +++ b/spring-cloud-kubernetes-discovery/pom.xml @@ -11,9 +11,6 @@ spring-cloud-kubernetes-discovery - - - org.springframework.boot @@ -54,6 +51,11 @@ reactor-test test + + org.springframework.cloud + spring-cloud-kubernetes-test-support + test + diff --git a/spring-cloud-kubernetes-fabric8-autoconfig/pom.xml b/spring-cloud-kubernetes-fabric8-autoconfig/pom.xml index 90aa2a89..2e34233d 100644 --- a/spring-cloud-kubernetes-fabric8-autoconfig/pom.xml +++ b/spring-cloud-kubernetes-fabric8-autoconfig/pom.xml @@ -125,6 +125,11 @@ mockito-inline test + + org.springframework.cloud + spring-cloud-kubernetes-test-support + test + diff --git a/spring-cloud-kubernetes-fabric8-config/pom.xml b/spring-cloud-kubernetes-fabric8-config/pom.xml index d932b7e6..87a9c7b7 100644 --- a/spring-cloud-kubernetes-fabric8-config/pom.xml +++ b/spring-cloud-kubernetes-fabric8-config/pom.xml @@ -159,6 +159,11 @@ junit-platform-launcher test + + org.springframework.cloud + spring-cloud-kubernetes-test-support + test + diff --git a/spring-cloud-kubernetes-fabric8-discovery/pom.xml b/spring-cloud-kubernetes-fabric8-discovery/pom.xml index 6bf31ca6..3a5d07c0 100644 --- a/spring-cloud-kubernetes-fabric8-discovery/pom.xml +++ b/spring-cloud-kubernetes-fabric8-discovery/pom.xml @@ -115,6 +115,11 @@ junit-platform-launcher test + + org.springframework.cloud + spring-cloud-kubernetes-test-support + test + diff --git a/spring-cloud-kubernetes-fabric8-istio/pom.xml b/spring-cloud-kubernetes-fabric8-istio/pom.xml index c1692cad..72b62819 100644 --- a/spring-cloud-kubernetes-fabric8-istio/pom.xml +++ b/spring-cloud-kubernetes-fabric8-istio/pom.xml @@ -45,10 +45,14 @@ spring-boot-starter-web test - org.junit.platform junit-platform-launcher + + + + org.springframework.cloud + spring-cloud-kubernetes-test-support test diff --git a/spring-cloud-kubernetes-fabric8-leader/pom.xml b/spring-cloud-kubernetes-fabric8-leader/pom.xml index afc41510..6b15d0ab 100644 --- a/spring-cloud-kubernetes-fabric8-leader/pom.xml +++ b/spring-cloud-kubernetes-fabric8-leader/pom.xml @@ -61,31 +61,16 @@ org.springframework.boot spring-boot-starter-test test - - - org.junit.vintage - junit-vintage-engine - - org.junit.platform junit-platform-launcher test + + org.springframework.cloud + spring-cloud-kubernetes-test-support + test + - - - - org.apache.maven.plugins - maven-surefire-plugin - ${maven-surefire-plugin.version} - - - org.apache.maven.plugins - maven-failsafe-plugin - ${maven-failsafe-plugin.version} - - - diff --git a/spring-cloud-kubernetes-fabric8-loadbalancer/pom.xml b/spring-cloud-kubernetes-fabric8-loadbalancer/pom.xml index 67961057..6f63d7dd 100644 --- a/spring-cloud-kubernetes-fabric8-loadbalancer/pom.xml +++ b/spring-cloud-kubernetes-fabric8-loadbalancer/pom.xml @@ -46,5 +46,10 @@ kubernetes-server-mock test + + org.springframework.cloud + spring-cloud-kubernetes-test-support + test + diff --git a/spring-cloud-kubernetes-test-support/src/main/java/org/springframework/cloud/kubernetes/tests/commons/junit_extension/DisabledTestsCondition.java b/spring-cloud-kubernetes-test-support/src/main/java/org/springframework/cloud/kubernetes/tests/commons/junit_extension/DisabledTestsCondition.java new file mode 100644 index 00000000..10f84ea8 --- /dev/null +++ b/spring-cloud-kubernetes-test-support/src/main/java/org/springframework/cloud/kubernetes/tests/commons/junit_extension/DisabledTestsCondition.java @@ -0,0 +1,51 @@ +/* + * Copyright 2013-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.cloud.kubernetes.tests.commons.junit_extension; + +import org.junit.jupiter.api.extension.ConditionEvaluationResult; +import org.junit.jupiter.api.extension.ExecutionCondition; +import org.junit.jupiter.api.extension.ExtensionContext; + +/** + * This is mainly needed for our pipeline, to get the test classes names. Its purpose is + * to act like a 'dry-run': show all the tests fully qualified names without actually + * running them. + * + * The way to use it: "mvn clean test -Dspring.cloud.k8s.skip.tests=true". This way all + * tests will be skipped, but also will be printed to the standard output as a fully + * qualified name, i.e.: + * + *
+ *     spring.cloud.k8s.test.to.run -> org.springframework.cloud.kubernetes.Fabric8InsideHealthIndicatorTest
+ * 
+ * + * @author wind57 + */ +public class DisabledTestsCondition implements ExecutionCondition { + + @Override + public ConditionEvaluationResult evaluateExecutionCondition(ExtensionContext extensionContext) { + if ("true".equals(System.getProperty("spring.cloud.k8s.skip.tests"))) { + System.out.println("spring.cloud.k8s.test.to.run -> " + extensionContext.getRequiredTestClass().getName()); + return ConditionEvaluationResult.disabled(""); + } + else { + return ConditionEvaluationResult.enabled(""); + } + } + +} diff --git a/spring-cloud-kubernetes-test-support/src/main/resources/META-INF/services/org.junit.jupiter.api.extension.Extension b/spring-cloud-kubernetes-test-support/src/main/resources/META-INF/services/org.junit.jupiter.api.extension.Extension new file mode 100644 index 00000000..483f8049 --- /dev/null +++ b/spring-cloud-kubernetes-test-support/src/main/resources/META-INF/services/org.junit.jupiter.api.extension.Extension @@ -0,0 +1 @@ +org.springframework.cloud.kubernetes.tests.commons.junit_extension.DisabledTestsCondition diff --git a/spring-cloud-kubernetes-test-support/src/main/resources/junit-platform.properties b/spring-cloud-kubernetes-test-support/src/main/resources/junit-platform.properties new file mode 100644 index 00000000..6efc0d5e --- /dev/null +++ b/spring-cloud-kubernetes-test-support/src/main/resources/junit-platform.properties @@ -0,0 +1 @@ +junit.jupiter.extensions.autodetection.enabled=true