Permalink
| #!/bin/bash -x | |
| # If a bundle file is present, call tox with the jenkins version of | |
| # the test environment so it is used. Otherwise, use the normal | |
| # (non-bundle) test environment. Also, run pbr freeze on the | |
| # resulting environment at the end so that we have a record of exactly | |
| # what packages we ended up testing. | |
| # | |
| # Usage: run-tox.sh VENV | |
| # | |
| # Where VENV is the name of the tox environment to run (specified in the | |
| # project's tox.ini file). | |
| venv=$1 | |
| if [[ -z "$venv" ]]; then | |
| echo "Usage: $?" | |
| echo | |
| echo "VENV: The tox environment to run (eg 'python27')" | |
| exit 1 | |
| fi | |
| function freeze_venv { | |
| [ -e $bin_path/pbr ] && freezecmd=pbr || freezecmd=pip | |
| echo "Begin $freezecmd freeze output from test virtualenv:" | |
| echo "======================================================================" | |
| ${bin_path}/${freezecmd} freeze | sort -f | |
| echo "======================================================================" | |
| } | |
| function process_testr_artifacts { | |
| if [ -d ".stestr" ] ; then | |
| if [ -f ".stestr/0" ] ; then | |
| $bin_path/stestr last --subunit > ./testrepository.subunit | |
| fi | |
| else | |
| if [ ! -d ".testrepository" ] ; then | |
| return | |
| fi | |
| if [ -f ".testrepository/0.2" ] ; then | |
| cp .testrepository/0.2 ./testrepository.subunit | |
| elif [ -f ".testrepository/0" ] ; then | |
| $bin_path/testr last --subunit > ./testrepository.subunit | |
| fi | |
| fi | |
| /usr/os-testr-env/bin/subunit2html ./testrepository.subunit testr_results.html | |
| SUBUNIT_SIZE=$(du -k ./testrepository.subunit | awk '{print $1}') | |
| gzip -9 ./testrepository.subunit | |
| gzip -9 ./testr_results.html | |
| if [[ "$SUBUNIT_SIZE" -gt 50000 ]]; then | |
| echo | |
| echo "testrepository.subunit was > 50 MB of uncompressed data!!!" | |
| echo "Something is causing tests for this project to log significant amounts" | |
| echo "of data. This may be writers to python logging, stdout, or stderr." | |
| echo "Failing this test as a result" | |
| echo | |
| exit 1 | |
| fi | |
| # By default stestr will fail if no tests are run. | |
| if [[ ! -d ".stestr" ]] ; then | |
| rancount=$($bin_path/testr last | sed -ne 's/Ran \([0-9]\+\).*tests in.*/\1/p') | |
| if [ -z "$rancount" ] || [ "$rancount" -eq "0" ] ; then | |
| echo | |
| echo "Zero tests were run. At least one test should have been run." | |
| echo "Failing this test as a result" | |
| echo | |
| exit 1 | |
| fi | |
| fi | |
| } | |
| function check_sudo_usage { | |
| sudo $script_path/jenkins-sudo-grep.sh post | |
| sudoresult=$? | |
| if [ $sudoresult -ne "0" ]; then | |
| echo | |
| echo "This test has failed because it attempted to execute commands" | |
| echo "with sudo. See above for the exact commands used." | |
| echo | |
| exit 1 | |
| fi | |
| } | |
| function check_oom { | |
| $script_path/jenkins-oom-grep.sh post | |
| oomresult=$? | |
| if [ $oomresult -ne "0" ]; then | |
| echo | |
| echo "This test has failed because it attempted to exceed configured" | |
| echo "memory limits and was killed prior to completion. See above" | |
| echo "for related kernel messages." | |
| echo | |
| exit 1 | |
| fi | |
| } | |
| function check_nose_html { | |
| htmlreport=$(find . -name $NOSE_HTML_OUT_FILE) | |
| if [ -f "$htmlreport" ]; then | |
| passcount=$(grep -c 'tr class=.passClass' $htmlreport) | |
| if [ $passcount -eq "0" ]; then | |
| echo | |
| echo "Zero tests passed, which probably means there was an error" | |
| echo "parsing one of the python files, or that some other failure" | |
| echo "during test setup prevented a sane run." | |
| echo | |
| exit 1 | |
| fi | |
| fi | |
| } | |
| script_path=/usr/local/jenkins/slave_scripts | |
| bin_path=.tox/$venv/bin | |
| export PYTHON=$bin_path/python | |
| export NOSE_WITH_XUNIT=1 | |
| export NOSE_WITH_HTML_OUTPUT=1 | |
| export NOSE_HTML_OUT_FILE='nose_results.html' | |
| if [[ -z "$TMPDIR" ]]; then | |
| export TMPDIR=$(/bin/mktemp -d) | |
| fi | |
| export UPPER_CONSTRAINTS_FILE=$(pwd)/upper-constraints.txt | |
| trap "rm -rf $TMPDIR" EXIT | |
| cat /etc/image-hostname.txt | |
| $script_path/jenkins-oom-grep.sh pre | |
| sudo $script_path/jenkins-sudo-grep.sh pre | |
| tox -vv -e$venv | |
| result=$? | |
| freeze_venv | |
| process_testr_artifacts | |
| check_sudo_usage | |
| check_oom | |
| check_nose_html | |
| # Rename tox' .log files to .log.txt so that Apache serves them as | |
| # text/plain files since it can handle .txt special - and .log is | |
| # unknown and therefore served as binary. | |
| find .tox -type f -name "*.log" -exec mv {} {}.txt \; | |
| exit $result |