diff options
Diffstat (limited to 'security/nss/automation/buildbot-slave/build.sh')
-rwxr-xr-x | security/nss/automation/buildbot-slave/build.sh | 380 |
1 files changed, 380 insertions, 0 deletions
diff --git a/security/nss/automation/buildbot-slave/build.sh b/security/nss/automation/buildbot-slave/build.sh new file mode 100755 index 000000000..0917cec6b --- /dev/null +++ b/security/nss/automation/buildbot-slave/build.sh @@ -0,0 +1,380 @@ +#! /bin/bash + +# Ensure a failure of the first command inside a pipe +# won't be hidden by commands later in the pipe. +# (e.g. as in ./dosomething | grep) + +set -o pipefail + +proc_args() +{ + while [ -n "$1" ]; do + OPT=$(echo $1 | cut -d= -f1) + VAL=$(echo $1 | cut -d= -f2) + + case $OPT in + "--build-nss") + BUILD_NSS=1 + ;; + "--test-nss") + TEST_NSS=1 + ;; + "--build-jss") + BUILD_JSS=1 + ;; + "--test-jss") + TEST_JSS=1 + ;; + "--memtest") + NSS_TESTS="memleak" + export NSS_TESTS + ;; + "--nojsssign") + NO_JSS_SIGN=1 + ;; + *) + echo "Usage: $0 ..." + echo " --memtest - run the memory leak tests" + echo " --nojsssign - try to sign jss" + echo " --build-nss" + echo " --build-jss" + echo " --test-nss" + echo " --test-jss" + exit 1 + ;; + esac + + shift + done +} + +set_env() +{ + TOPDIR=$(pwd) + HGDIR=$(pwd)$(echo "/hg") + OUTPUTDIR=$(pwd)$(echo "/output") + LOG_ALL="${OUTPUTDIR}/all.log" + LOG_TMP="${OUTPUTDIR}/tmp.log" + + echo "hello" |grep --line-buffered hello >/dev/null 2>&1 + [ $? -eq 0 ] && GREP_BUFFER="--line-buffered" +} + +print_log() +{ + DATE=$(date "+TB [%Y-%m-%d %H:%M:%S]") + echo "${DATE} $*" + echo "${DATE} $*" >> ${LOG_ALL} +} + +print_result() +{ + TESTNAME=$1 + RET=$2 + EXP=$3 + + if [ ${RET} -eq ${EXP} ]; then + print_log "${TESTNAME} PASSED" + else + print_log "${TESTNAME} FAILED" + fi +} + +print_env() +{ + print_log "######## Environment variables ########" + + uname -a | tee -a ${LOG_ALL} + if [ -e "/etc/redhat-release" ]; then + cat "/etc/redhat-release" | tee -a ${LOG_ALL} + fi + # don't print the MAIL command, it might contain a password + env | grep -v "^MAIL=" | tee -a ${LOG_ALL} +} + +set_cycle() +{ + BITS=$1 + OPT=$2 + + if [ "${BITS}" = "64" ]; then + USE_64=1 + JAVA_HOME=${JAVA_HOME_64} + PORT_DBG=${PORT_64_DBG} + PORT_OPT=${PORT_64_OPT} + else + USE_64= + JAVA_HOME=${JAVA_HOME_32} + PORT_DBG=${PORT_32_DBG} + PORT_OPT=${PORT_32_OPT} + fi + export USE_64 + export JAVA_HOME + + BUILD_OPT= + if [ "${OPT}" = "OPT" ]; then + BUILD_OPT=1 + XPCLASS=xpclass.jar + PORT=${PORT_OPT} + else + BUILD_OPT= + XPCLASS=xpclass_dbg.jar + PORT=${PORT_DBG} + fi + export BUILD_OPT + + PORT_JSS_SERVER=$(expr ${PORT} + 20) + PORT_JSSE_SERVER=$(expr ${PORT} + 40) + + export PORT + export PORT_JSS_SERVER + export PORT_JSSE_SERVER +} + +build_nss() +{ + print_log "######## NSS - build - ${BITS} bits - ${OPT} ########" + + print_log "$ cd ${HGDIR}/nss" + cd ${HGDIR}/nss + + print_log "$ ${MAKE} ${NSS_BUILD_TARGET}" + #${MAKE} ${NSS_BUILD_TARGET} 2>&1 | tee -a ${LOG_ALL} | grep ${GREP_BUFFER} "^${MAKE}" + ${MAKE} ${NSS_BUILD_TARGET} 2>&1 | tee -a ${LOG_ALL} + RET=$? + print_result "NSS - build - ${BITS} bits - ${OPT}" ${RET} 0 + + if [ ${RET} -eq 0 ]; then + return 0 + else + tail -100 ${LOG_ALL} + return ${RET} + fi +} + +build_jss() +{ + print_log "######## JSS - build - ${BITS} bits - ${OPT} ########" + + print_log "$ cd ${HGDIR}/jss" + cd ${HGDIR}/jss + + print_log "$ ${MAKE} ${JSS_BUILD_TARGET}" + #${MAKE} ${JSS_BUILD_TARGET} 2>&1 | tee -a ${LOG_ALL} | grep ${GREP_BUFFER} "^${MAKE}" + ${MAKE} ${JSS_BUILD_TARGET} 2>&1 | tee -a ${LOG_ALL} + RET=$? + print_result "JSS build - ${BITS} bits - ${OPT}" ${RET} 0 + [ ${RET} -eq 0 ] || return ${RET} + + print_log "$ cd ${HGDIR}/dist" + cd ${HGDIR}/dist + + if [ -z "${NO_JSS_SIGN}" ]; then + print_log "cat ${TOPDIR}/keystore.pw | ${JAVA_HOME}/bin/jarsigner -keystore ${TOPDIR}/keystore -internalsf ${XPCLASS} jssdsa" + cat ${TOPDIR}/keystore.pw | ${JAVA_HOME}/bin/jarsigner -keystore ${TOPDIR}/keystore -internalsf ${XPCLASS} jssdsa >> ${LOG_ALL} 2>&1 + RET=$? + print_result "JSS - sign JAR files - ${BITS} bits - ${OPT}" ${RET} 0 + [ ${RET} -eq 0 ] || return ${RET} + fi + print_log "${JAVA_HOME}/bin/jarsigner -verify -certs ${XPCLASS}" + ${JAVA_HOME}/bin/jarsigner -verify -certs ${XPCLASS} >> ${LOG_ALL} 2>&1 + RET=$? + print_result "JSS - verify JAR files - ${BITS} bits - ${OPT}" ${RET} 0 + [ ${RET} -eq 0 ] || return ${RET} + + return 0 +} + +test_nss() +{ + print_log "######## NSS - tests - ${BITS} bits - ${OPT} ########" + + if [ "${OS_TARGET}" = "Android" ]; then + print_log "$ cd ${HGDIR}/nss/tests/remote" + cd ${HGDIR}/nss/tests/remote + print_log "$ make test_android" + make test_android 2>&1 | tee ${LOG_TMP} | grep ${GREP_BUFFER} ": #" + OUTPUTFILE=${HGDIR}/tests_results/security/*.1/output.log + else + print_log "$ cd ${HGDIR}/nss/tests" + cd ${HGDIR}/nss/tests + print_log "$ ./all.sh" + ./all.sh 2>&1 | tee ${LOG_TMP} | egrep ${GREP_BUFFER} ": #|^\[.{10}\] " + OUTPUTFILE=${LOG_TMP} + fi + + cat ${LOG_TMP} >> ${LOG_ALL} + tail -n2 ${HGDIR}/tests_results/security/*.1/results.html | grep END_OF_TEST >> ${LOG_ALL} + RET=$? + + print_log "######## details of detected failures (if any) ########" + grep -B50 FAILED ${OUTPUTFILE} + [ $? -eq 1 ] || RET=1 + + print_result "NSS - tests - ${BITS} bits - ${OPT}" ${RET} 0 + return ${RET} +} + +test_jss() +{ + print_log "######## JSS - tests - ${BITS} bits - ${OPT} ########" + + print_log "$ cd ${HGDIR}/jss" + cd ${HGDIR}/jss + + print_log "$ ${MAKE} platform" + PLATFORM=$(${MAKE} platform) + print_log "PLATFORM=${PLATFORM}" + + print_log "$ cd ${HGDIR}/jss/org/mozilla/jss/tests" + cd ${HGDIR}/jss/org/mozilla/jss/tests + + print_log "$ perl all.pl dist ${HGDIR}/dist/${PLATFORM}" + perl all.pl dist ${HGDIR}/dist/${PLATFORM} 2>&1 | tee ${LOG_TMP} + cat ${LOG_TMP} >> ${LOG_ALL} + + tail -n2 ${LOG_TMP} | grep JSSTEST_RATE > /dev/null + RET=$? + + grep FAIL ${LOG_TMP} + [ $? -eq 1 ] || RET=1 + + print_result "JSS - tests - ${BITS} bits - ${OPT}" ${RET} 0 + return ${RET} +} + +build_and_test() +{ + if [ -n "${BUILD_NSS}" ]; then + build_nss + [ $? -eq 0 ] || return 1 + fi + + if [ -n "${TEST_NSS}" ]; then + test_nss + [ $? -eq 0 ] || return 1 + fi + + if [ -n "${BUILD_JSS}" ]; then + build_jss + [ $? -eq 0 ] || return 1 + fi + + if [ -n "${TEST_JSS}" ]; then + test_jss + [ $? -eq 0 ] || return 1 + fi + + return 0 +} + +run_cycle() +{ + print_env + build_and_test + RET=$? + + grep ^TinderboxPrint ${LOG_ALL} + + return ${RET} +} + +prepare() +{ + rm -rf ${OUTPUTDIR}.oldest >/dev/null 2>&1 + mv ${OUTPUTDIR}.older ${OUTPUTDIR}.oldest >/dev/null 2>&1 + mv ${OUTPUTDIR}.old ${OUTPUTDIR}.older >/dev/null 2>&1 + mv ${OUTPUTDIR}.last ${OUTPUTDIR}.old >/dev/null 2>&1 + mv ${OUTPUTDIR} ${OUTPUTDIR}.last >/dev/null 2>&1 + mkdir -p ${OUTPUTDIR} + + # Remove temporary test files from previous jobs, that weren't cleaned up + # by move_results(), e.g. caused by unexpected interruptions. + rm -rf ${HGDIR}/tests_results/ + + cd ${HGDIR}/nss + + if [ -n "${FEWER_STRESS_ITERATIONS}" ]; then + sed -i 's/-c_1000_/-c_500_/g' tests/ssl/sslstress.txt + fi + + return 0 +} + +move_results() +{ + cd ${HGDIR} + if [ -n "${TEST_NSS}" ]; then + mv -f tests_results ${OUTPUTDIR} + fi + tar -c -z --dereference -f ${OUTPUTDIR}/dist.tgz dist + rm -rf dist +} + +run_all() +{ + set_cycle ${BITS} ${OPT} + prepare + run_cycle + RESULT=$? + print_log "### result of run_cycle is ${RESULT}" + move_results + return ${RESULT} +} + +main() +{ + VALID=0 + RET=1 + + for BITS in 32 64; do + echo ${RUN_BITS} | grep ${BITS} > /dev/null + [ $? -eq 0 ] || continue + for OPT in DBG OPT; do + echo ${RUN_OPT} | grep ${OPT} > /dev/null + [ $? -eq 0 ] || continue + + VALID=1 + set_env + run_all + RET=$? + print_log "### result of run_all is ${RET}" + done + done + + if [ ${VALID} -ne 1 ]; then + echo "Need to set valid bits/opt values." + return 1 + fi + + return ${RET} +} + +#function killallsub() +#{ +# FINAL_RET=$? +# for proc in `jobs -p` +# do +# kill -9 $proc +# done +# return ${FINAL_RET} +#} +#trap killallsub EXIT + +#IS_RUNNING_FILE="./build-is-running" + +#if [ -a $IS_RUNNING_FILE ]; then +# echo "exiting, because old job is still running" +# exit 1 +#fi + +#touch $IS_RUNNING_FILE + +echo "tinderbox args: $0 $@" +. ${ENVVARS} +proc_args "$@" +main + +#RET=$? +#rm $IS_RUNNING_FILE +#exit ${RET} |