HBASE-19189 Ad-hoc test job for running a subset of tests lots of times

Signed-off-by: Michael Stack <st...@apache.org>


Project: http://git-wip-us.apache.org/repos/asf/hbase/repo
Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/68a74f6c
Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/68a74f6c
Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/68a74f6c

Branch: refs/heads/branch-1.4
Commit: 68a74f6c3211af048f8122b4b6c7fd4a7db47fbb
Parents: 110f2db
Author: Sean Busbey <bus...@apache.org>
Authored: Mon Nov 6 13:48:05 2017 -0600
Committer: Sean Busbey <bus...@apache.org>
Committed: Thu Nov 9 15:08:24 2017 -0600

----------------------------------------------------------------------
 dev-support/adhoc_run_tests/Jenkinsfile        |  93 ++++++++++++++++++
 dev-support/adhoc_run_tests/adhoc_run_tests.sh | 102 ++++++++++++++++++++
 dev-support/gather_machine_environment.sh      |  50 ++++++++++
 3 files changed, 245 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hbase/blob/68a74f6c/dev-support/adhoc_run_tests/Jenkinsfile
----------------------------------------------------------------------
diff --git a/dev-support/adhoc_run_tests/Jenkinsfile 
b/dev-support/adhoc_run_tests/Jenkinsfile
new file mode 100644
index 0000000..b3793cd
--- /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
+        <a 
href="http://maven.apache.org/surefire/maven-surefire-plugin/test-mojo.html#forkCount";>
+        the surefire docs on the forkCount parameter</a>
+''')
+  }
+  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/*'
+        }
+      }
+    }
+  }
+}

http://git-wip-us.apache.org/repos/asf/hbase/blob/68a74f6c/dev-support/adhoc_run_tests/adhoc_run_tests.sh
----------------------------------------------------------------------
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 0000000..1dedcb1
--- /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

http://git-wip-us.apache.org/repos/asf/hbase/blob/68a74f6c/dev-support/gather_machine_environment.sh
----------------------------------------------------------------------
diff --git a/dev-support/gather_machine_environment.sh 
b/dev-support/gather_machine_environment.sh
new file mode 100755
index 0000000..8f2c74e
--- /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

Reply via email to