diff --git a/dev-support/adhoc_run_tests/Jenkinsfile b/dev-support/adhoc_run_tests/Jenkinsfile new file mode 100644 index 00000000000..b3793cd97fb --- /dev/null +++ b/dev-support/adhoc_run_tests/Jenkinsfile @@ -0,0 +1,93 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you 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 +// +// http://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. +pipeline { + parameters { + string(name: 'tests', description: 'space separated list of tests to run. e.g. ' + + 'TestLogRollingNoCluster TestMetricRegistryImpl TestConstraints') + string(name: 'node', defaultValue: 'Hadoop', + description: 'the node label that should be used to run the test.') + string(name: 'repeat_count', defaultValue: '100', + description: 'number of iterations to run looking for a failure.') + string(name: 'fork_count', defaultValue: '0.5C', description: ''' + Given to surefire to set the number of parallel forks for a given test attempt (i.e. one + maven invocation that has all of the specified tests. The default tries to use half of the + available cores on the system. + + For more information see + + the surefire docs on the forkCount parameter +''') + } + agent { + node { + label "${params.node}" + } + } + options { + timeout (time: 6, unit: 'HOURS') + timestamps() + } + environment { + // where we check out to across stages + BASEDIR = "${env.WORKSPACE}/component" + OUTPUT_RELATIVE = 'output' + OUTPUTDIR = "${env.WORKSPACE}/output" + BRANCH_SPECIFIC_DOCKERFILE = "${env.BASEDIR}/dev-support/docker/Dockerfile" + } + stages { + stage ('run tests') { + tools { + maven 'Maven (latest)' + // this needs to be set to the jdk that ought to be used to build releases on the branch + // the Jenkinsfile is stored in. + jdk "JDK 1.8 (latest)" + } + steps { + sh """#!/bin/bash -e + echo "Setting up directories" + rm -rf "${env.OUTPUTDIR}" && mkdir "${env.OUTPUTDIR}" + rm -rf ".m2-repo" && mkdir ".m2-repo" + mkdir "${env.OUTPUTDIR}/machine" +""" + sh """#!/bin/bash -e + "${env.BASEDIR}/dev-support/gather_machine_environment.sh" \ + "${OUTPUT_RELATIVE}/machine" +""" + dir ("component") { + sh '''#!/bin/bash -e + ./dev-support/adhoc_run_tests/adhoc_run_tests.sh \ + --force-timeout 1800 \ + --maven-local-repo ".m2-repo" \ + --log-output "${OUTPUTDIR}" \ + --surefire-fork-count "${fork_count}" \ + --repeat "${repeat_count}" \ + "${tests}" +''' + } + } + post { + always { + archive 'output/*' + archive 'output/**/*' + } + failure { + archive 'component/**/target/surefire-reports/*' + } + } + } + } +} diff --git a/dev-support/adhoc_run_tests/adhoc_run_tests.sh b/dev-support/adhoc_run_tests/adhoc_run_tests.sh new file mode 100755 index 00000000000..1dedcb1c45f --- /dev/null +++ b/dev-support/adhoc_run_tests/adhoc_run_tests.sh @@ -0,0 +1,102 @@ +#!/usr/bin/env bash +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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 +# +# http://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. + +set -e +function usage { + echo "Usage: ${0} [options] TestSomeTestName [TestOtherTest...]" + echo "" + echo " --repeat times number of times to repeat if successful" + echo " --force-timeout seconds Seconds to wait before killing a given test run." + echo " --maven-local-repo /path/to/use Path for maven artifacts while building" + echo " --surefire-fork-count set the fork-count. only useful if multiple " \ + "tests running (default 0.5C)" + echo " --log-output /path/to/use path to directory to hold attempt log" + exit 1 +} +# Get arguments +declare -i force_timeout=7200 +declare fork_count="0.5C" +declare -i attempts=1 +declare maven_repo="${HOME}/.m2/repository" +declare output="." +while [ $# -gt 0 ] +do + case "$1" in + --force-timeout) shift; force_timeout=$1; shift;; + --maven-local-repo) shift; maven_repo=$1; shift;; + --repeat) shift; attempts=$1; shift;; + --log-output) shift; output=$1; shift;; + --surefire-fork-count) shift; fork_count=$1; shift;; + --) shift; break;; + -*) usage ;; + *) break;; # terminate while loop + esac +done + +if [ "$#" -lt 1 ]; then + usage +fi + +function find_modules +{ + declare testmaybepattern=$1 + declare path + while IFS= read -r -d $'\0' path; do + while [ -n "${path}" ]; do + path=$(dirname "${path}") + if [ -f "${path}/pom.xml" ]; then + echo "${path}" + break + fi + done + done < <(find . -name "${testmaybepattern}.java" -a -type f -a -not -path '*/target/*' -print0) +} + +function echo_run_redirect +{ + declare log=$1 + shift + echo "${*}" >"${log}" + "${@}" >>"${log}" 2>&1 +} + +declare -a modules + +for test in "${@}"; do + for module in $(find_modules "${test}"); do + if [[ ! "${modules[*]}" =~ ${module} ]]; then + echo "adding module '${module}' to set." + modules+=(${module}) + fi + done +done + +declare -a mvn_module_arg + +for module in "${modules[@]}"; do + mvn_module_arg+=(-pl "${module}") +done +declare tests="${*}" +for attempt in $(seq "${attempts}"); do + echo "Attempt ${attempt}" >&2 + echo_run_redirect "${output}/mvn_test.log" mvn --batch-mode -Dmaven.repo.local="${maven_repo}" \ + -Dtest="${tests// /,}" \ + -Dsurefire.rerunFailingTestsCount=0 -Dsurefire.parallel.forcedTimeout="${force_timeout}" \ + -Dsurefire.shutdown=kill -DtrimStackTrace=false -am "${mvn_module_arg[@]}" \ + -DforkCount="${fork_count}" package +done diff --git a/dev-support/gather_machine_environment.sh b/dev-support/gather_machine_environment.sh new file mode 100755 index 00000000000..8f2c74ea41e --- /dev/null +++ b/dev-support/gather_machine_environment.sh @@ -0,0 +1,50 @@ +#!/usr/bin/env bash +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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 +# +# http://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. + +set -e +function usage { + echo "Usage: ${0} /path/for/output/dir" + echo "" + echo " Gather info about a build machine that test harnesses should poll before running." + echo " presumes you'll then archive the passed output dir." + + exit 1 +} + +if [ "$#" -lt 1 ]; then + usage +fi + + +declare output=$1 + +echo "getting machine specs, find in ${BUILD_URL}/artifact/${output}/" +echo "JAVA_HOME: ${JAVA_HOME}" >"${output}/java_home" 2>&1 || true +ls -l "${JAVA_HOME}" >"${output}/java_home_ls" 2>&1 || true +echo "MAVEN_HOME: ${MAVEN_HOME}" >"${output}/mvn_home" 2>&1 || true +mvn --offline --version >"${output}/mvn_version" 2>&1 || true +cat /proc/cpuinfo >"${output}/cpuinfo" 2>&1 || true +cat /proc/meminfo >"${output}/meminfo" 2>&1 || true +cat /proc/diskstats >"${output}/diskstats" 2>&1 || true +cat /sys/block/sda/stat >"${output}/sys-block-sda-stat" 2>&1 || true +df -h >"${output}/df-h" 2>&1 || true +ps -Aww >"${output}/ps-Aww" 2>&1 || true +ifconfig -a >"${output}/ifconfig-a" 2>&1 || true +lsblk -ta >"${output}/lsblk-ta" 2>&1 || true +lsblk -fa >"${output}/lsblk-fa" 2>&1 || true +ulimit -l >"${output}/ulimit-l" 2>&1 || true