mirror of
https://github.com/SAP/jenkins-library.git
synced 2024-12-14 11:03:09 +02:00
140 lines
4.5 KiB
Bash
Executable File
140 lines
4.5 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
function fail() {
|
|
local message="$1"
|
|
local returnCode=${2:-1}
|
|
echo "[ERROR] ${message}" >&2
|
|
exit "${returnCode}"
|
|
}
|
|
|
|
function notify() {
|
|
|
|
local state=${1}
|
|
local description=${2}
|
|
local hash=${3}
|
|
|
|
echo "[INFO] Notifying about state \"${state}\" for commit \"${hash}\"."
|
|
|
|
curl -X POST \
|
|
--fail \
|
|
--silent \
|
|
--output /dev/null \
|
|
--data "{\"state\": \"${state}\", \"target_url\": \"${TRAVIS_BUILD_WEB_URL}\", \"description\": \"${description}\", \"context\": \"integration-tests\"}" \
|
|
--user "${INTEGRATION_TEST_VOTING_USER}:${INTEGRATION_TEST_VOTING_TOKEN}" \
|
|
"https://api.github.com/repos/SAP/jenkins-library/statuses/${hash}" || fail "Cannot send notification. curl return code: $?"
|
|
}
|
|
|
|
function cleanup() {
|
|
[[ -z "${notificationThreadPid}" ]] || kill -PIPE "${notificationThreadPid}" &>/dev/null
|
|
}
|
|
|
|
trap cleanup EXIT
|
|
|
|
#
|
|
# In case the build is performed for a pull request TRAVIS_COMMIT is a merge
|
|
# commit between the base branch and the PR branch HEAD. That commit is actually built.
|
|
# But for notifying about a build status we need the commit which is currently
|
|
# the HEAD of the PR branch.
|
|
#
|
|
# In case the build is performed for a simple branch (not associated with a PR)
|
|
# In this case there is no merge commit between any base branch and HEAD of a PR branch.
|
|
# The commit which we need for notifying about a build status is in this case simply
|
|
# TRAVIS_COMMIT itself.
|
|
#
|
|
COMMIT_HASH_FOR_STATUS_NOTIFICATIONS="${TRAVIS_PULL_REQUEST_SHA}"
|
|
[[ -z "${COMMIT_HASH_FOR_STATUS_NOTIFICATIONS}" ]] && COMMIT_HASH_FOR_STATUS_NOTIFICATIONS="${TRAVIS_COMMIT}"
|
|
|
|
notify "pending" "Integration tests in progress." "${COMMIT_HASH_FOR_STATUS_NOTIFICATIONS}"
|
|
|
|
WORKSPACES_ROOT=workspaces
|
|
[[ -e "${WORKSPACES_ROOT}" ]] && rm -rf ${WORKSPACES_ROOT}
|
|
|
|
TEST_CASES=$(find testCases -name '*.yml')
|
|
|
|
# This auxiliary thread is needed in order to produce some output while the
|
|
# test are running. Otherwise the job will be canceled after 10 minutes without
|
|
# output.
|
|
while true; do sleep 10; echo "[INFO] Integration tests still running."; done &
|
|
notificationThreadPid=$!
|
|
|
|
declare -a processes
|
|
i=0
|
|
for f in ${TEST_CASES}
|
|
do
|
|
testCase=$(basename "${f%.*}")
|
|
area=$(dirname "${f#*/}")
|
|
echo "[INFO] Running test case \"${testCase}\" in area \"${area}\"."
|
|
TEST_CASE_ROOT="${WORKSPACES_ROOT}/${area}/${testCase}"
|
|
[[ -e "${TEST_CASE_ROOT}" ]] && rm -rf "${TEST_CASE_ROOT}"
|
|
mkdir -p "${TEST_CASE_ROOT}" || fail "Cannot create test case root directory for test case \"${testCase}\"." 1
|
|
source ./runTest.sh "${testCase}" "${TEST_CASE_ROOT}" &> "${TEST_CASE_ROOT}/log.txt" &
|
|
pid=$!
|
|
processes[$i]="${area}/${testCase}:${pid}"
|
|
echo "[INFO] Test case \"${testCase}\" in area \"${area}\" launched. (PID: \"${pid}\")."
|
|
let i=i+1
|
|
done
|
|
|
|
[[ "${i}" == 0 ]] && fail "No tests has been executed." 1
|
|
|
|
#
|
|
# wait for the test cases and cat the log
|
|
for p in "${processes[@]}"
|
|
do
|
|
area=$(dirname "${p%:*}")
|
|
testCase=$(basename "${p%:*}")
|
|
processId="${p#*:}"
|
|
echo "[INFO] Waiting for test case \"${testCase}\" in area \"${area}\" (PID: \"${processId}\")."
|
|
wait "${processId}"
|
|
echo "[INFO] Test case \"${testCase}\" in area \"${area}\" finished (PID: \"${processId}\")."
|
|
done
|
|
|
|
kill -PIPE "${notificationThreadPid}" &>/dev/null && notificationThreadPid=""
|
|
|
|
#
|
|
# provide the logs
|
|
for p in "${processes[@]}"
|
|
do
|
|
area=$(dirname "${p%:*}")
|
|
testCase=$(basename "${p%:*}")
|
|
TEST_CASE_ROOT="${WORKSPACES_ROOT}/${area}/${testCase}"
|
|
echo "[INFO] === START === Logs for test case \"${testCase}\" ===."
|
|
cat "${TEST_CASE_ROOT}/log.txt"
|
|
echo "[INFO] === END === Logs for test case \"${testCase}\" ===."
|
|
done
|
|
|
|
#
|
|
# list test case status
|
|
echo "[INFO] Build status:"
|
|
failure="false"
|
|
for p in "${processes[@]}"
|
|
do
|
|
status="UNDEFINED"
|
|
area=$(dirname "${p%:*}")
|
|
testCase=$(basename "${p%:*}")
|
|
TEST_CASE_ROOT="${WORKSPACES_ROOT}/${area}/${testCase}"
|
|
if [[ -f "${TEST_CASE_ROOT}/SUCCESS" ]]
|
|
then
|
|
status="SUCCESS"
|
|
else
|
|
status="FAILURE"
|
|
failure="true"
|
|
fi
|
|
printf "[INFO] %-30s: %s\n" "${testCase}" "${status}"
|
|
done
|
|
|
|
STATUS_DESCRIPTION="The integration tests failed."
|
|
STATUS_STATE="failure"
|
|
|
|
if [[ "${failure}" == "false" ]]
|
|
then
|
|
STATUS_DESCRIPTION="The integration tests succeeded."
|
|
STATUS_STATE="success"
|
|
fi
|
|
|
|
notify "${STATUS_STATE}" "${STATUS_DESCRIPTION}" "${COMMIT_HASH_FOR_STATUS_NOTIFICATIONS}"
|
|
|
|
[[ "${failure}" != "false" ]] && fail "Integration tests failed." 1
|
|
|
|
echo "[INFO] Integration tests succeeded."
|
|
exit 0
|