Django Autotest on Hudson/Jenkins with VirtualEnv

September 29, 2011

I wanted to run an autotest (./manage.py test) on my Django project, after first installing dependencies into a virtualenv. Here's the setup I used.

Jenkins Environment Variables

In the build, set the environment variables so that the virtualenv is added to the PATH, and the workspace is added to the PYTHONPATH:

PATH=${WORKSPACE}/.env/bin:$PATH
PYTHONPATH=$PYTHONPATH:${WORKSPACE}

Jenkins Build - Execute Shell

In the Jenkins build, we need to execute a shell script:

if [ -d ".env" ]; then
  echo "**> virtualenv exists"
else
  echo  "**> creating virtualenv"
  virtualenv --no-site-packages .env
fi

source .env/bin/activate
pip install -r requirements.txt
cd project_folder
./manage.py test --settings=settingsautotest

Note that I'm using a specific settings file for the autotest.

Also note that we're loading dependencies into the virtualenv using a requirements.txt file. This file for me contains:

psycopg2==2.2.1
slimmer
gunicorn

All the other dependencies I had are included in the project folder and version controlled along with my project source.

We create the virtualenv using the --no-site-packages flag in order to limit our dependency on the system installed packages.

Problems

I had a problem installing psycopg2 under the virtual env - it failed with the following error:

Error: pg_config executable not found.

This was solved using by installing a few extra packages:

# apt-get install libpq-dev python-dev

Once this was sorted I got the following error:

psycopg2.ProgrammingError: autocommit cannot be used inside a transaction

This was solved by limiting the psycopg2 version to 2.2.1 in the requirements.txt file, rather than the default 2.4.2.

References