diff --git a/MANIFEST.in b/MANIFEST.in
index 573e21f41dc6d1ef558406c814046e08d1710302..5668665db75f4e139e0fa59578c794cde9e3a263 100644
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -20,4 +20,6 @@ recursive-include synapse/static *.gif
 recursive-include synapse/static *.html
 recursive-include synapse/static *.js
 
+exclude jenkins.sh
+
 prune demo/etc
diff --git a/jenkins.sh b/jenkins.sh
new file mode 100755
index 0000000000000000000000000000000000000000..2680d16b4219b5e63d20213fb163576bad645419
--- /dev/null
+++ b/jenkins.sh
@@ -0,0 +1,4 @@
+#!/bin/bash -eu
+
+export PYTHONDONTWRITEBYTECODE=yep
+TOXSUFFIX="--reporter=subunit | subunit-1to2 | subunit2junitxml --no-passthrough --output-to=results.xml" tox
diff --git a/tox.ini b/tox.ini
index 01b23e6bd967b1a2c5395461128f2464673f330e..cf54ebb0aca0792bd098e5d41a71518a412f7ebf 100644
--- a/tox.ini
+++ b/tox.ini
@@ -6,10 +6,12 @@ deps =
     coverage
     Twisted>=15.1
     mock
+    python-subunit
+    junitxml
 setenv =
     PYTHONDONTWRITEBYTECODE = no_byte_code
 commands =
-    coverage run --source=synapse {envbindir}/trial {posargs:tests}
+    /bin/bash -c "coverage run --source=synapse {envbindir}/trial {posargs:tests} {env:TOXSUFFIX:}"
     coverage report -m
 
 [testenv:packaging]