GH-2245 - Polishing.

See update to the original ticket:

> It turns out that a couple of aspects we need in setting up this scripts
> are very specific to our internal testing. Therefore, the scripts should
> live in a separate project.
>
> I do think that would also make complete sense for VMWares CI scripts
> and thus keeping that repo free of CI specific scripts, but this is
> maybe another ticket. Our scripts will be removed in an additional
> commit.
This commit is contained in:
Michael Simons
2021-05-11 18:00:49 +02:00
parent 660ee1ecf6
commit 3c50eb367c
3 changed files with 0 additions and 214 deletions

View File

@@ -1,54 +0,0 @@
#!/usr/bin/env bash
# This script is used to run SDN6's integration test against a Neo4j cluster via `runClusterTests.java`. The idea behind it is:
# 1. Build a local deployment of SDN 6 including a test jar containing all tests
# 2. Extract the version, direct dependencies and the repo path from the Maven build descriptor and replace the placeholders
# in the template.
# 3. Execute the Java script file via JBang.
#
# The result code of this script will be 0 in a successful run, a non-zero value otherwise. The Java program will try
# upto 100 times to get a completely successful test run, retrying on error cases that might happen in a cluster.
#
# Run this script with a pair of environmental values to point it to a cluster:
# SDN_NEO4J_URL=neo4j+s://your.neo4j.cluster.io SDN_NEO4J_PASSWORD=yourPassword ./ci/runClusterTests.sh
set -euo pipefail
CI_BASEDIR=$(dirname "$0")
BASEDIR=$(realpath $CI_BASEDIR/..)
CLUSTER_TEST_DIR=$BASEDIR/target/cluster-tests
(
cd $BASEDIR
SDN_VERSION=$(./mvnw --no-transfer-progress help:evaluate -Dexpression=project.version -q -DforceStdout)
mkdir -p $CLUSTER_TEST_DIR
# Create the distribution and deploy it into the target folder itself
./mvnw --no-transfer-progress -Pgenerate-test-jar -DskipTests clean deploy -DaltDeploymentRepository=snapshot-repo::default::file:///$CLUSTER_TEST_DIR/snapshot-repo
# Massage the directory name into something sed is happy with
SNAPSHOT_REPO=$(printf '%s\n' "$CLUSTER_TEST_DIR/snapshot-repo" | sed -e 's/[\/&]/\\&/g')
# Create a plain list of dependencies
./mvnw --no-transfer-progress dependency:list -DexcludeTransitive | sed -n -e 's/^\[INFO\] //p' > $CLUSTER_TEST_DIR/dependencies.txt
# Update repository path, version and dependencies in template
sed -e s/\$SDN_VERSION/$SDN_VERSION/ -e s/\$SNAPSHOT_REPO/$SNAPSHOT_REPO/ $CI_BASEDIR/runClusterTests.template.java |\
awk -F: -v deps=$CLUSTER_TEST_DIR/dependencies.txt -v target=$CLUSTER_TEST_DIR/runClusterTests.java '
/\/\/\$ADDITIONAL_DEPENDENCIES/ {
while((getline < deps) > 0) {
print "//DEPS " $1 ":" $2 ":" $4 > target
}
next
}
{print > target}'
# clean up
rm $CLUSTER_TEST_DIR/dependencies.txt
# Prepare run
chmod +x $CLUSTER_TEST_DIR/runClusterTests.java && cp src/test/resources/logback-silent.xml $CLUSTER_TEST_DIR/logback.xml
)
jbang $CLUSTER_TEST_DIR/runClusterTests.java

View File

@@ -1,123 +0,0 @@
///usr/bin/env jbang "$0" "$@" ; exit $?
//JAVA 11+
//REPOS mavencentral,spring-libs-snapshot=https://repo.spring.io/libs-snapshot,snapshot-repo=file://$SNAPSHOT_REPO
// This is a template to create a Java script runnable via JBang https://github.com/jbangdev/jbang and Java 11 to run.
// It takes most of the integration tests and runs them against Neo4j. It will react on exceptions happening due to cluster
// changes and retry them accordingly. While you can point it against a non-cluster deployment, it wouldn't make much sense,
// as this scenario is already covered based on the standard testing.
// The file is named `template.java` as it has some placeholders that needs to be replaced by the orchestrating `runClusterTests.sh`.
//FILES logback.xml
//DEPS org.junit.platform:junit-platform-launcher:1.7.1
//DEPS org.springframework.data:spring-data-neo4j:$SDN_VERSION
//DEPS org.springframework.data:spring-data-neo4j:$SDN_VERSION:tests@test-jar
//$ADDITIONAL_DEPENDENCIES
import static java.util.stream.Collectors.partitioningBy;
import static java.util.stream.Collectors.toList;
import static org.junit.platform.engine.discovery.ClassNameFilter.includeClassNamePatterns;
import static org.junit.platform.engine.discovery.DiscoverySelectors.selectPackage;
import static org.junit.platform.launcher.TagFilter.excludeTags;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.StandardCopyOption;
import java.util.List;
import org.junit.platform.engine.DiscoverySelector;
import org.junit.platform.engine.discovery.DiscoverySelectors;
import org.junit.platform.launcher.TestExecutionListener;
import org.junit.platform.launcher.TestIdentifier;
import org.junit.platform.launcher.core.LauncherConfig;
import org.junit.platform.launcher.core.LauncherDiscoveryRequestBuilder;
import org.junit.platform.launcher.core.LauncherFactory;
import org.junit.platform.launcher.listeners.SummaryGeneratingListener;
import org.neo4j.driver.internal.retry.ExponentialBackoffRetryLogic;
import org.slf4j.LoggerFactory;
import org.springframework.data.neo4j.core.support.RetryExceptionPredicate;
public class runClusterTests {
public static void main(String... args) throws IOException {
var logConfig = Files.createTempFile("logback", ".xml");
try (var s = runClusterTests.class.getResourceAsStream("logback.xml")) {
Files.copy(s, logConfig, StandardCopyOption.REPLACE_EXISTING);
}
System.setProperty("logback.configurationFile", logConfig.toAbsolutePath().normalize().toString());
var log = LoggerFactory.getLogger(runClusterTests.class);
var listener = new SummaryGeneratingListener();
var launcher = LauncherFactory
.create(LauncherConfig.builder()
.addTestExecutionListeners(new TestExecutionListener() {
@Override public void executionStarted(TestIdentifier testIdentifier) {
if (testIdentifier.isContainer() && testIdentifier.getParentId().isPresent()) {
log.debug(testIdentifier.getUniqueId());
}
}
})
.addTestExecutionListeners(listener).build());
var canRetry = new RetryExceptionPredicate().or(ExponentialBackoffRetryLogic::isRetryable);
var selectors = List.<DiscoverySelector>of(selectPackage("org.springframework.data.neo4j.integration"));
var maxRetries = 100;
var counter = 0;
while (!selectors.isEmpty() && ++counter <= maxRetries) {
log.info("Attempt {}/{}", counter, maxRetries);
var request = LauncherDiscoveryRequestBuilder.request()
.selectors(selectors)
.filters(
includeClassNamePatterns(".*IT.*"),
excludeTags("incompatible-with-clusters")
)
.build();
launcher.execute(request);
var failures = listener.getSummary().getFailures();
if (failures.isEmpty()) {
log.info("Finished succesfully after {} attempts.", counter);
System.exit(0);
}
var failuresByState = failures.stream().collect(partitioningBy(failure -> {
var ex = new Throwable[] { failure.getException() };
if (ex[0] instanceof AssertionError) {
ex = ((AssertionError) ex[0]).getSuppressed();
}
for (var candidate : ex) {
do {
if (canRetry.test(candidate)) {
return true;
}
candidate = candidate.getCause();
} while (candidate != null);
}
return false;
}));
if (!failuresByState.get(false).isEmpty()) {
log.error("The following tests failed in non retryable ways:");
failuresByState.get(false).forEach(failure -> {
log.error(failure.getTestIdentifier().getUniqueId());
failure.getException().printStackTrace();
});
System.exit(1);
}
selectors = failuresByState.get(true).stream()
.peek(failure -> log.info("{} will be retried", failure.getTestIdentifier().getUniqueId()))
.map(failure -> DiscoverySelectors.selectUniqueId(failure.getTestIdentifier().getUniqueId()))
.collect(toList());
}
log.error("Several tests failed despite a number of retries.");
System.exit(1);
}
}

View File

@@ -1,37 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
| Copyright 2011-2021 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.
-->
<configuration>
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>[%t] %d %5p %40.40c:%4L - %m%n</pattern>
</encoder>
</appender>
<logger name="org.springframework.data.neo4j.core.mapping.DefaultNeo4jIsNewStrategy" level="error" />
<logger name="org.springframework.data.neo4j.repository.query.Neo4jQuerySupport" level="error" />
<logger name="org.springframework.data.neo4j.test" level="warn"/>
<logger name="runClusterTests" level="info"/>
<root level="warn">
<appender-ref ref="console"/>
</root>
</configuration>