Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
187 changes: 138 additions & 49 deletions dev/run-tests-jenkins
Original file line number Diff line number Diff line change
Expand Up @@ -19,67 +19,156 @@

# Wrapper script that runs the Spark tests then reports QA results
# to github via its API.
# Environment variables are populated by the code here:
#+ https://github.com/jenkinsci/ghprb-plugin/blob/master/src/main/java/org/jenkinsci/plugins/ghprb/GhprbTrigger.java#L139

# Go to the Spark project root directory
FWDIR="$(cd `dirname $0`/..; pwd)"
cd "$FWDIR"

function get_jq () {
# Get jq so we can parse some JSON, man.
# Essential if we want to do anything with the GitHub API responses.
local JQ_EXECUTABLE_URL="http://stedolan.github.io/jq/download/linux64/jq"

echo "Fetching jq from ${JQ_EXECUTABLE_URL}"

curl --silent --output "$FWDIR/dev/jq" "$JQ_EXECUTABLE_URL"
local curl_status=$?

if [ $curl_status -ne 0 ]; then
echo "Failed to get jq." >&2
return $curl_status
fi

chmod u+x "$FWDIR/dev/jq"
}

COMMENTS_URL="https://api.github.com/repos/apache/spark/issues/$ghprbPullId/comments"
PULL_REQUEST_URL="https://github.com/apache/spark/pull/$ghprbPullId"

function post_message () {
local message=$1
local data="{\"body\": \"$message\"}"
local HTTP_CODE_HEADER="HTTP Response Code: "

echo "Attempting to post to Github..."

local curl_output=$(
curl `#--dump-header -` \
--silent \
--user x-oauth-basic:$GITHUB_OAUTH_KEY \
--request POST \
--data "$data" \
--write-out "${HTTP_CODE_HEADER}%{http_code}\n" \
--header "Content-Type: application/json" \
"$COMMENTS_URL" #> /dev/null #| "$FWDIR/dev/jq" .id #| head -n 8
)
local curl_status=${PIPESTATUS[0]}

if [ "$curl_status" -ne 0 ]; then
echo "Failed to post message to GitHub." >&2
echo " > curl_status: ${curl_status}" >&2
echo " > curl_output: ${curl_output}" >&2
echo " > data: ${data}" >&2
# exit $curl_status
fi

local api_response=$(
echo "${curl_output}" \
| grep -v -e "^${HTTP_CODE_HEADER}"
)

local http_code=$(
echo "${curl_output}" \
| grep -e "^${HTTP_CODE_HEADER}" \
| sed -r -e "s/^${HTTP_CODE_HEADER}//g"
)

if [ -n "$http_code" ] && [ "$http_code" -ne "201" ]; then
echo " > http_code: ${http_code}." >&2
echo " > api_response: ${api_response}" >&2
echo " > data: ${data}" >&2
fi

if [ "$curl_status" -eq 0 ] && [ "$http_code" -eq "201" ]; then
echo " > Post successful."
fi
}

COMMIT_URL="https://github.com/apache/spark/commit/${ghprbActualCommit}"
# GitHub doesn't auto-link short hashes when submitted via the API, unfortunately. :(
short_commit_hash=${ghprbActualCommit:0:7}

# check PR merge-ability and check for new public classes
{
if [ "$sha1" == "$ghprbActualCommit" ]; then
merge_note=" * This patch **does not** merge cleanly!"
else
merge_note=" * This patch merges cleanly."

non_test_files=$(git diff master --name-only | grep -v "\/test" | tr "\n" " ")
new_public_classes=$(
git diff master ${non_test_files} `# diff this patch against master and...` \
| grep "^\+" `# filter in only added lines` \
| sed -r -e "s/^\+//g" `# remove the leading +` \
| grep -e "trait " -e "class " `# filter in lines with these key words` \
| grep -e "{" -e "(" `# filter in lines with these key words, too` \
| grep -v -e "\@\@" -e "private" `# exclude lines with these words` \
| grep -v -e "^// " -e "^/\*" -e "^ \* " `# exclude comment lines` \
| sed -r -e "s/\{.*//g" `# remove from the { onwards` \
| sed -r -e "s/\}//g" `# just in case, remove }; they mess the JSON` \
| sed -r -e "s/\"/\\\\\"/g" `# escape double quotes; they mess the JSON` \
| sed -r -e "s/^(.*)$/\`\1\`/g" `# surround with backticks for style` \
| sed -r -e "s/^/ \* /g" `# prepend ' *' to start of line` \
| sed -r -e "s/$/\\\n/g" `# append newline to end of line` \
| tr -d "\n" `# remove actual LF characters`
)

function post_message {
message=$1
data="{\"body\": \"$message\"}"
echo "Attempting to post to Github:"
echo "$data"
if [ "$new_public_classes" == "" ]; then
public_classes_note=" * This patch adds no public classes."
else
public_classes_note=" * This patch adds the following public classes _(experimental)_:"
public_classes_note="${public_classes_note}\n${new_public_classes}"
fi
fi
}

curl -D- -u x-oauth-basic:$GITHUB_OAUTH_KEY -X POST --data "$data" -H \
"Content-Type: application/json" \
$COMMENTS_URL | head -n 8
# post start message
{
start_message="\
[QA tests have started](${BUILD_URL}consoleFull) for \
PR $ghprbPullId at commit [\`${short_commit_hash}\`](${COMMIT_URL})."

start_message="${start_message}\n${merge_note}"
# start_message="${start_message}\n${public_classes_note}"

post_message "$start_message"
}

start_message="QA tests have started for PR $ghprbPullId."
if [ "$sha1" == "$ghprbActualCommit" ]; then
start_message="$start_message This patch DID NOT merge cleanly! "
else
start_message="$start_message This patch merges cleanly. "
fi
start_message="$start_message<br>View progress: "
start_message="$start_message${BUILD_URL}consoleFull"

post_message "$start_message"

./dev/run-tests
test_result="$?"

result_message="QA results for PR $ghprbPullId:<br>"

if [ "$test_result" -eq "0" ]; then
result_message="$result_message- This patch PASSES unit tests.<br>"
else
result_message="$result_message- This patch FAILED unit tests.<br>"
fi

if [ "$sha1" != "$ghprbActualCommit" ]; then
result_message="$result_message- This patch merges cleanly<br>"
non_test_files=$(git diff master --name-only | grep -v "\/test" | tr "\n" " ")
new_public_classes=$(git diff master $non_test_files \
| grep -e "trait " -e "class " \
| grep -e "{" -e "(" \
| grep -v -e \@\@ -e private \
| grep \+ \
| sed "s/\+ *//" \
| tr "\n" "~" \
| sed "s/~/<br>/g")
if [ "$new_public_classes" == "" ]; then
result_message="$result_message- This patch adds no public classes<br>"
# run tests
{
./dev/run-tests
test_result="$?"

if [ "$test_result" -eq "0" ]; then
test_result_note=" * This patch **passes** unit tests."
else
result_message="$result_message- This patch adds the following public classes (experimental):<br>"
result_message="$result_message$new_public_classes"
test_result_note=" * This patch **fails** unit tests."
fi
fi
result_message="${result_message}<br>For more information see test ouptut:"
result_message="${result_message}<br>${BUILD_URL}consoleFull"
}

post_message "$result_message"
# post end message
{
result_message="\
[QA tests have finished](${BUILD_URL}consoleFull) for \
PR $ghprbPullId at commit [\`${short_commit_hash}\`](${COMMIT_URL})."

result_message="${result_message}\n${test_result_note}"
result_message="${result_message}\n${merge_note}"
result_message="${result_message}\n${public_classes_note}"

post_message "$result_message"
}

exit $test_result