aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xdev/run-tests-jenkins41
-rwxr-xr-xdev/tests/pr_new_dependencies.sh117
2 files changed, 140 insertions, 18 deletions
diff --git a/dev/run-tests-jenkins b/dev/run-tests-jenkins
index 3a937b637e..f10aa6b59e 100755
--- a/dev/run-tests-jenkins
+++ b/dev/run-tests-jenkins
@@ -55,13 +55,14 @@ TESTS_TIMEOUT="120m" # format: http://linux.die.net/man/1/timeout
# To write a PR test:
#+ * the file must reside within the dev/tests directory
#+ * be an executable bash script
-#+ * accept two arguments on the command line, the first being the Github PR long commit
-#+ hash and the second the Github SHA1 hash
+#+ * accept three arguments on the command line, the first being the Github PR long commit
+#+ hash, the second the Github SHA1 hash, and the final the current PR hash
#+ * and, lastly, return string output to be included in the pr message output that will
#+ be posted to Github
PR_TESTS=(
"pr_merge_ability"
"pr_public_classes"
+ "pr_new_dependencies"
)
function post_message () {
@@ -146,34 +147,38 @@ function send_archived_logs () {
fi
}
+# post start message
+{
+ start_message="\
+ [Test build ${BUILD_DISPLAY_NAME} has started](${BUILD_URL}consoleFull) for \
+ PR $ghprbPullId at commit [\`${SHORT_COMMIT_HASH}\`](${COMMIT_URL})."
+
+ post_message "$start_message"
+}
+
# Environment variable to capture PR test output
pr_message=""
+# Ensure we save off the current HEAD to revert to
+current_pr_head="`git rev-parse HEAD`"
# Run pull request tests
for t in "${PR_TESTS[@]}"; do
this_test="${FWDIR}/dev/tests/${t}.sh"
- # Ensure the test is a file and is executable
- if [ -x "$this_test" ]; then
- echo "ghprb: $ghprbActualCommit sha1: $sha1"
- this_mssg="`bash \"${this_test}\" \"${ghprbActualCommit}\" \"${sha1}\" 2>/dev/null`"
+ # Ensure the test can be found and is a file
+ if [ -f "${this_test}" ]; then
+ echo "Running test: $t"
+ this_mssg="$(bash "${this_test}" "${ghprbActualCommit}" "${sha1}" "${current_pr_head}")"
# Check if this is the merge test as we submit that note *before* and *after*
# the tests run
[ "$t" == "pr_merge_ability" ] && merge_note="${this_mssg}"
pr_message="${pr_message}\n${this_mssg}"
+ # Ensure, after each test, that we're back on the current PR
+ git checkout -f "${current_pr_head}" &>/dev/null
+ else
+ echo "Cannot find test ${this_test}."
fi
done
-# post start message
-{
- start_message="\
- [Test build ${BUILD_DISPLAY_NAME} has started](${BUILD_URL}consoleFull) for \
- PR $ghprbPullId at commit [\`${SHORT_COMMIT_HASH}\`](${COMMIT_URL})."
-
- start_message="${start_message}\n${merge_note}"
-
- post_message "$start_message"
-}
-
# run tests
{
timeout "${TESTS_TIMEOUT}" ./dev/run-tests
@@ -222,7 +227,7 @@ done
PR $ghprbPullId at commit [\`${SHORT_COMMIT_HASH}\`](${COMMIT_URL})."
result_message="${result_message}\n${test_result_note}"
- result_message="${result_message}\n${pr_message}"
+ result_message="${result_message}${pr_message}"
post_message "$result_message"
}
diff --git a/dev/tests/pr_new_dependencies.sh b/dev/tests/pr_new_dependencies.sh
new file mode 100755
index 0000000000..115a5cd135
--- /dev/null
+++ b/dev/tests/pr_new_dependencies.sh
@@ -0,0 +1,117 @@
+#!/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.
+#
+
+#
+# This script follows the base format for testing pull requests against
+# another branch and returning results to be published. More details can be
+# found at dev/run-tests-jenkins.
+#
+# Arg1: The Github Pull Request Actual Commit
+#+ known as `ghprbActualCommit` in `run-tests-jenkins`
+# Arg2: The SHA1 hash
+#+ known as `sha1` in `run-tests-jenkins`
+# Arg3: Current PR Commit Hash
+#+ the PR hash for the current commit
+#
+
+ghprbActualCommit="$1"
+sha1="$2"
+current_pr_head="$3"
+
+MVN_BIN="build/mvn"
+CURR_CP_FILE="my-classpath.txt"
+MASTER_CP_FILE="master-classpath.txt"
+
+# First switch over to the master branch
+git checkout master &>/dev/null
+# Find and copy all pom.xml files into a *.gate file that we can check
+# against through various `git` changes
+find -name "pom.xml" -exec cp {} {}.gate \;
+# Switch back to the current PR
+git checkout "${current_pr_head}" &>/dev/null
+
+# Check if any *.pom files from the current branch are different from the master
+difference_q=""
+for p in $(find -name "pom.xml"); do
+ [[ -f "${p}" && -f "${p}.gate" ]] && \
+ difference_q="${difference_q}$(diff $p.gate $p)"
+done
+
+# If no pom files were changed we can easily say no new dependencies were added
+if [ -z "${difference_q}" ]; then
+ echo " * This patch does not change any dependencies."
+else
+ # Else we need to manually build spark to determine what, if any, dependencies
+ # were added into the Spark assembly jar
+ ${MVN_BIN} clean package dependency:build-classpath -DskipTests 2>/dev/null | \
+ sed -n -e '/Building Spark Project Assembly/,$p' | \
+ grep --context=1 -m 2 "Dependencies classpath:" | \
+ head -n 3 | \
+ tail -n 1 | \
+ tr ":" "\n" | \
+ rev | \
+ cut -d "/" -f 1 | \
+ rev | \
+ sort > ${CURR_CP_FILE}
+
+ # Checkout the master branch to compare against
+ git checkout master &>/dev/null
+
+ ${MVN_BIN} clean package dependency:build-classpath -DskipTests 2>/dev/null | \
+ sed -n -e '/Building Spark Project Assembly/,$p' | \
+ grep --context=1 -m 2 "Dependencies classpath:" | \
+ head -n 3 | \
+ tail -n 1 | \
+ tr ":" "\n" | \
+ rev | \
+ cut -d "/" -f 1 | \
+ rev | \
+ sort > ${MASTER_CP_FILE}
+
+ DIFF_RESULTS="`diff my-classpath.txt master-classpath.txt`"
+
+ if [ -z "${DIFF_RESULTS}" ]; then
+ echo " * This patch does not change any dependencies."
+ else
+ # Pretty print the new dependencies
+ added_deps=$(echo "${DIFF_RESULTS}" | grep "<" | cut -d' ' -f2 | awk '{print " * \`"$1"\`"}')
+ removed_deps=$(echo "${DIFF_RESULTS}" | grep ">" | cut -d' ' -f2 | awk '{print " * \`"$1"\`"}')
+ added_deps_text=" * This patch **adds the following new dependencies:**\n${added_deps}"
+ removed_deps_text=" * This patch **removes the following dependencies:**\n${removed_deps}"
+
+ # Construct the final returned message with proper
+ return_mssg=""
+ [ -n "${added_deps}" ] && return_mssg="${added_deps_text}"
+ if [ -n "${removed_deps}" ]; then
+ if [ -n "${return_mssg}" ]; then
+ return_mssg="${return_mssg}\n${removed_deps_text}"
+ else
+ return_mssg="${removed_deps_text}"
+ fi
+ fi
+ echo "${return_mssg}"
+ fi
+
+ # Remove the files we've left over
+ [ -f "${CURR_CP_FILE}" ] && rm -f "${CURR_CP_FILE}"
+ [ -f "${MASTER_CP_FILE}" ] && rm -f "${MASTER_CP_FILE}"
+
+ # Clean up our mess from the Maven builds just in case
+ ${MVN_BIN} clean &>/dev/null
+fi