summaryrefslogtreecommitdiff
path: root/doc/example/jenkins.txt
diff options
context:
space:
mode:
Diffstat (limited to 'doc/example/jenkins.txt')
-rw-r--r--doc/example/jenkins.txt152
1 files changed, 152 insertions, 0 deletions
diff --git a/doc/example/jenkins.txt b/doc/example/jenkins.txt
new file mode 100644
index 0000000..ad26f60
--- /dev/null
+++ b/doc/example/jenkins.txt
@@ -0,0 +1,152 @@
+
+Using Tox with the Jenkins Integration Server
+=================================================
+
+Using Jenkins multi-configuration jobs
+-------------------------------------------
+
+The Jenkins_ continous integration server allows to define "jobs" with
+"build steps" which can be test invocations. If you :doc:`install <../install>` ``tox`` on your
+default Python installation on each Jenkins slave, you can easily create
+a Jenkins multi-configuration job that will drive your tox runs from the CI-server side,
+using these steps:
+
+* create a "multi-configuration" job, give it a name of your choice
+* configure your repository so that Jenkins can pull it
+* (optional) configure multiple nodes so that tox-runs are performed
+ on multiple hosts
+* configure ``axes`` by using :ref:`TOXENV <TOXENV>` as an axis
+ name and as values provide space-separated test environment names
+ you want Jenkins/tox to execute.
+
+* add a **Python-build step** with this content (see also next example)::
+
+ import tox
+ tox.cmdline() # environment is selected by ``TOXENV`` env variable
+
+* check ``Publish JUnit test result report`` and enter
+ ``**/junit-*.xml`` as the pattern so that Jenkins collects
+ test results in the JUnit XML format.
+
+The last point requires that your test command creates JunitXML files,
+for example with ``py.test`` it is done like this:
+
+ commands=py.test --junitxml=junit-{envname}.xml
+
+See a real-life example in action with the `pytest Jenkins job`_
+
+.. _`pytest Jenkins job`: http://jenkins.testrun.org/view/pytest/job/pytest/
+
+**zero-installation** for slaves
+-------------------------------------------------------------
+
+.. versionadded:: 0.9
+
+If you manage many Jenkins slaves and want to use the latest officially
+released tox (or latest development version) and want to skip manually
+installing ``tox`` then substitute the above **Python build step** code
+with this::
+
+ import urllib, os
+ url = "https://pytox.googlecode.com/hg/toxbootstrap.py"
+ #os.environ['USETOXDEV']="1" # use tox dev version
+ d = dict(__file__='toxbootstrap.py')
+ exec urllib.urlopen(url).read() in d
+ d['cmdline'](['--recreate'])
+
+The downloaded `toxbootstrap.py`_ file downloads all neccessary files to
+install ``tox`` in a virtual sub environment. Notes:
+
+* uncomment the line containing ``USETOXDEV`` to use the latest
+ development-release version of tox instead of the
+ latest released version.
+
+* adapt the options in the last line as needed (the example code
+ will cause tox to reinstall all virtual environments all the time
+ which is often what one wants in CI server contexts)
+
+.. _`toxbootstrap.py`: https://pytox.googlecode.com/hg/toxbootstrap.py
+
+Integrating "sphinx" documentation checks in a Jenkins job
+----------------------------------------------------------------
+
+If you are using a multi-configuration Jenkins job which collects
+JUnit Test results you will run into problems using the previous
+method of running the sphinx-build command because it will not
+generate JUnit results. To accomodate this issue one solution
+is to have ``py.test`` wrap the sphinx-checks and create a
+JUnit result file which wraps the result of calling sphinx-build.
+Here is an example:
+
+1. create a ``docs`` environment in your ``tox.ini`` file like this::
+
+ [testenv:docs]
+ basepython=python
+ changedir=doc # or whereever you keep your sphinx-docs
+ deps=sphinx
+ py
+ commands=
+ py.test --tb=line -v --junitxml=junit-{envname}.xml check_sphinx.py
+
+2. create a ``doc/check_sphinx.py`` file like this::
+
+ import py
+ import subprocess
+ def test_linkcheck(tmpdir):
+ doctrees = tmpdir.join("doctrees")
+ htmldir = tmpdir.join("html")
+ subprocess.check_call(
+ ["sphinx-build", "-W", "-blinkcheck",
+ "-d", str(doctrees), ".", str(htmldir)])
+ def test_build_docs(tmpdir):
+ doctrees = tmpdir.join("doctrees")
+ htmldir = tmpdir.join("html")
+ subprocess.check_call([
+ "sphinx-build", "-W", "-bhtml",
+ "-d", str(doctrees), ".", str(htmldir)])
+
+3. run ``tox -e docs`` and then you may integrate this environment
+ along with your other environments into Jenkins.
+
+Note that ``py.test`` is only installed into the docs environment
+and does not need to be in use or installed with any other environment.
+
+.. _`jenkins artifact example`:
+
+Access package artifacts between Jenkins jobs
+--------------------------------------------------------
+
+.. _`Jenkins Copy Artifact plugin`: http://wiki.jenkins-ci.org/display/HUDSON/Copy+Artifact+Plugin
+
+In an extension to :ref:`artifacts` you can also configure Jenkins jobs to
+access each others artifacts. ``tox`` uses the ``distshare`` directory
+to access artifacts and in a Jenkins context (detected via existence
+of the environment variable ``HUDSON_URL``); it defaults to
+to ``{toxworkdir}/distshare``.
+
+This means that each workspace will have its own ``distshare``
+directory and we need to configure Jenkins to perform artifact copying.
+The recommend way to do this is to install the `Jenkins Copy Artifact plugin`_
+and for each job which "receives" artifacts you add a **Copy artifacts from another project** build step using roughly this configuration::
+
+ Project-name: name of the other (tox-managed) job you want the artifact from
+ Artifacts to copy: .tox/dist/*.zip # where tox jobs create artifacts
+ Target directory: .tox/distshare # where we want it to appear for us
+ Flatten Directories: CHECK # create no subdir-structure
+
+You also need to configure the "other" job to archive artifacts; This
+is done by checking ``Archive the artifacts`` and entering::
+
+ Files to archive: .tox/dist/*.zip
+
+So our "other" job will create an sdist-package artifact and
+the "copy-artifacts" plugin will copy it to our ``distshare`` area.
+Now everything proceeds as :ref:`artifacts` shows it.
+
+So if you are using defaults you can re-use and debug exactly the
+same ``tox.ini`` file and make use of automatical sharing of
+your artifacts between runs or Jenkins jobs.
+
+.. include:: ../links.txt
+
+