Jenkins als CI server voor Python

Sunday 01 May 2011, 22:54:00 | python

Jenkins is een CI-server. (Zie →Jenkins CI server: installatie voor de installatie ervan) De focus is Java maar hij kan ook andere jobs aan. Dat wilde ik wel uitproberen omdat ik nieuwsgierig was hoe dat werkt voor Python projecten. :-)

Ik wil een continuous build job en een nightly build job maken. De continuous build job is bedoeld voor het continuous integration aspect. De nightly build is bedoeld om daadwerkelijk buildresultaten op te leveren, die je kunt publiceren (de zogenaamde artefacts).

We beginnen met de continuous builds. Lees hieronder verder hoe dat in zijn werk gaat.

EEN CONTINUOUS BUILD JOB

Ik wil een continuous build job die het project build bij elke wijziging (ingechecked in source control), en de unit tests aftrapt om te controleren of de boel nog in orde is.

Test subject: mijn eigen Pyro4 project.

De python-coverage resultaten kun je gelukkig omzetten naar een coverage.xml die de Cobertura plugin snapt. De unit test resultaten van nose (nosetests.xml) zijn standaard al in te lezen met de JUnit plugin.

Wat moeten we dan doen om zo'n Job te maken in Jenkins?

[[image: jenkins-projectoptions.jpg]]

Ga naar de Jenkins dashboard pagina en kies New Job. Verzien iets voor Job Name: "Pyro4 continuous build". Kies Build a free-style software project.

Dan kom je op de settings pagina van de nieuwe job. De volgende dingen heb ik ingeregeld voor mijn project:

Discard old builds: Max # of builds to keep: het is het overwegen waard om maar een beperkt aantal build reports te laten bestaan voor continous builds. Maar niet te weinig, anders is de 'trend' feature niet meer zo zinvol ;-) (ik denk dat 50 wel een mooi getal is).

Source code management: Subversion. Repository url: svn url naar de trunk van het project. Check-out strategy: use svn update. Dit is snel, maar laat crap achter van oude builds. Als dat problemen geeft kun je hier iets anders kiezen.

[[image: jenkins-build.jpg]]

Build Triggers: Poll SCM. Het is een continuous build dus hij moet elke zoveel minuten checken of er nog wijzigigen zijn ingechecked. De schedule is in cron-formaat en * * * * * betekent elke minuut. */5 * * * * is elke 5 minuten.

Build: de build stappen zelf. We moeten het project builden en daarna de unit tests uitvoeren:

  1. Execute Shell: python setup.py build Standaard distutils build stap.
  2. Execute Shell: python tests/run_suite.py Simpel scriptje dat nose toepast om alle test suites uit te voeren. In dat scriptje zit een optie om ook coverage te laten lopen. Maar de output daarvan is een speciaal formaat. Dat moeten we omzetten naar XML formaat wat de Cobertura plugin van Jenkins begrijpt. Vandaar de volgende stap.
  3. Execute Python Script: om de coverage informatie naar een cobertura-achtige xml om te zetten:
    import sys, coverage
    result=coverage.main(argv=["xml"])  # generate xml report of coverage info
    sys.exit(result)

[[image: jenkins-postbuild.jpg]]

Post-build Actions: Publish JUnit test result report: aanvinken en **/nosetests.xml invullen als xml pattern. Archive the artifacts: niet aanvinken want we zijn bezig met een continuous build Job die normaal gesproken geen build artefacts oplevert. Publish Cobertura Coverage Report: aanvinken. Cobertura plugin: aanvinken en coverage.xml invullen als xml pattern. LET OP, niet **/coverage.xml als pattern gebruiken, dan krijg je namelijk errors tijdens het genereren van de report (Terug te vinden in de console output, het zijn dan fouten als "Cannot parse coverage results", "Premature end of file") Source encoding op UTF-8 zetten.

Dat was 't, terug naar het Dashboard en dan op Schedule a Build klikken van de nieuwe Job (als je ongeduldig bent, want binnen een minuut begint hij zelf met een checkout en build).

Na anderhalve minuut is de build klaar en zijn de unittests gedraaid. Het zonnetje schijnt bij ons project (yay!) en als je de details bekijkt door op de job te klikken, kun je ook de grafiekjes van de unittests en de code coverage bekijken en daar verder op inzoomen. Zie hieronder. Best aardig tot nu toe!

Volgende keer bekijken we hoe je een nightly build inregelt (om releases te maken).

[[image: jenkins-buildstatus.jpg]] [[image: jenkins-project.jpg]] [[image: jenkins-coverage.jpg]]