Python & Java: a unified build process (4/4)

In our previous blog posts dedicated to Python and Java (see the first, second and third, we saw how to get a fully functional build, release and deployment workflow with Maven.


It's now time to introduce Jenkins and see how can we put our sample project in integration.

First of all, Jenkins needs some parseable test results. In Java, the maven-surefire-plugin handles this by default. In Python, nose will generate them for us.

Modify setuptools/pom.xml to call python nosetests instead of python test on test phase:

  <id>setuptools test</id>

Then edit the of Python projects to add the nose dependency:

    # ...
    setup_requires = [
        'nose >= 1.0',

Finally create or update a setup.cfg file along the and add the following lines:

with-xunit = true
xunit-file = TEST-nosetests.xml

Note the xunit-file value that matches the pattern of the reports generated by maven-surefire-plugin

Time to create a New Job on Jenkins:



  • the source: git://,
  • the build trigger policy: scm polling every five minutes,
  • the build steps: we are using the Virtualenv Builder of the ShiningPanda Plugin. This builder creates an isolated Python environment with virtualenv, so installed packages won't conflict with the ones installed on the system. Then we simply add the following Maven call in it: mvn clean install,
  • the post-build actions: to ask Jenkins to parse and display the test results (note the pattern).


Then click on Save and Build Now and that's it.

Release and Deployment

Jenkins can also be helpful to run the release and deployment tasks. Here is a sample job configuration to tag the project:


Note the parameters allowing the user to input the desired versions for the release:


Same principles can applies to create a deployment job.

In addition to a Hosted Continuous Integration Service, ShiningPanda CI is also offering build and release management expertise, so if you have questions or if you are stuck with your internal build process do not hesitate to contact our service team!