zuul-jobs/roles/tox/tasks/main.yaml
Monty Taylor 4b9fc09a1c
Port in tox jobs from openstack-zuul-jobs
The original idea was that we'd have a "python27" job. But it turns out
that "python27" isn't actually as universal as you might think.
"tox-py27" on the other hand is a thing that can and should always work
for people who want to run tox with the py27 env.

Port in the jobs we had in openstack-zuul-jobs.

Also, copy in the text of the old shell scripts so that we can iterate on
them and make them better piecemeal.

These are named zuul-tox not tox because we already have tox jobs
defined elsewhere. We'll need to do the naming dance while we work on
them.

Change-Id: I813f3f2ae138c07918556bc81655518023527131
2017-07-06 11:18:47 -05:00

141 lines
4.5 KiB
YAML

- name: Run tox
args:
chdir: "src/{{ zuul.project.canonical_name }}"
executable: /bin/bash
shell: |
# 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.
venv={{ tox_environment }}
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 ".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
/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
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
}
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