“Pretty” Continuous Integration for Python?

You might want to check out Nose and NoseXUnit You can have it run pylint, your unit tests, and coverage checks with this command.

You might want to check out Nose and NoseXUnit. You can have it run pylint, your unit tests, and coverage checks with this command: nosetests --with-nosexunit --enable-audit --enable-cover That'll be helpful if you want to go the Hudson route or if you want to use another CI server that has support for JUnit test reporting. (And yes, you realize how regrettable a name NoseXUnit is when you see it in all-lowercase :-/ ).

11 Ah the joys of open-source application names.. – dbr Mar 21 '09 at 9:13 3 Nose now includes the xunit plugin by default - nosetests --with-xunit – dbr Oct 13 '09 at 1:01.

Don't know if it would do : Bitten is made by the guys who write Trac and is integrated with Trac. Apache Gump is the CI tool used by Apache. It is written in Python.

Buildbot's waterfall page can be considerably prettified. Here's a nice example build.chromium.org/buildbot/waterfall/wa....

We've had great success with TeamCity as our CI server and using nose as our test runner. Teamcity plugin for nosetests gives you count pass/fail, readable display for failed test( that can be E-Mailed). You can even see details of the test failures while you stack is running.

If of course supports things like running on multiple machines, and it's much simpler to setup and maintain than buildbot.

I guess this thread is quite old but here is my take on it with hudson: I decided to go with pip and set up a repo (the painful to get working but nice looking eggbasket), which hudson auto uploads to with a successful tests. Here is my rough and ready script for use with a hudson config execute script like: /var/lib/hudson/venv/main/bin/hudson_script. Py -w $WORKSPACE -p my.

Package -v $BUILD_NUMBER, just put in **/coverage. Xml, pylint. Txt and nosetests.

Xml in the config bits: #! /usr/bin/python import subprocess import logging import optparse logging. BasicConfig(level=logging.INFO, format='%(asctime)s %(levelname)s %(message)s') REPO_URL = "my_repo" def call_command(command, cwd, ignore_error_code=False): try: logging.

Info("Running: %s" % command) status = subprocess. Call(command, cwd=cwd, shell=True) if not ignore_error_code and status! = 0: raise Exception("Last command failed") return status except: logging.

Exception("Could not run command %s" % command) raise def main(): usage = "usage: %prog options" parser = optparse. OptionParser(usage) parser. Add_option("-w", "--workspace", dest="workspace", help="workspace folder for the job") parser.

Add_option("-p", "--package", dest="package", help="the package name i.e. , company. Package") parser.

Add_option("-v", "--build_number", dest="build_number", help="the build number, which will get put at the end of the package version") options, args = parser. Parse_args() if not options. Workspace or not options.

Package: raise Exception("Need both args, do --help for info") venvDir = options. Package + "_venv/" #install the venv/make sure its there plus install the local package call_command("pip -E %s install -e . / --extra-index %s" % (venvDir, REPO_URL), options.

Workspace) #make sure pylint, nose and coverage are installed call_command("pip -E %s install nose pylint coverage" % venvDir, options. Workspace) test_status = call_command("%sbin/nosetests %s --with-xunit --with-coverage --cover-package %s --cover-erase" % (venvDir, options.package. Replace(".

", "/"), options. Package), options. Workspace, True) #produce coverage report -i for ignore weird missing file errors call_command("%sbin/coverage xml -i" % venvDir, options.

Workspace) #move it so that the code coverage plugin can find it call_command("mv coverage. Xml %s" % (options.package. Replace(".

", "/")), options. Workspace) #run pylint call_command("%sbin/pylint --rcfile ~/pylint. Rc -f parseable %s > pylint.

Txt" % (venvDir, options. Package), options. Workspace, True) #remove old dists so we only have the newest at the end call_command("rm -rfv %s" % (options.

Workspace + "/dist"), options. Workspace) #if the build passes upload the result to the egg_basket if test_status == 0: logging.Info("Success - uploading egg") upload_bit = "upload -r %s/upload" % REPO_URL else: logging. Info("Failure - not uploading egg") upload_bit = "" #create egg call_command("%sbin/python setup.

Py egg_info --tag-build=.0. %s --tag-svn-revision --tag-date sdist %s" % (venvDir, options. Build_number, upload_bit), options.

Workspace) logging.Info("Complete") if __name__ == "__main__": main() When it comes to deploying stuff you can do something like: pip -E /location/of/my/venv/ install my_package==X.Y.Z --extra-index http://my_repo And then people can develop stuff using: pip -E /location/of/my/venv/ install -e . / --extra-index http://my_repo This stuff assumes you have a repo structure per package with a setup. Py and dependencies all set up then you can just check out the trunk and run this stuff on it.

I hope this helps someone out.

Signal is another option. You can know more about it and watch a video also here.

Another one : Shining Panda is a hosted tool for python.

We have used bitten quite a bit. It is pretty and integrates well with Trac, but it is a pain in the butt to customize if you have any nonstandard workflow. Also there just aren't as many plugins as there are for the more popular tools.

Currently we are evaluating Hudson as a replacement.

Atlassian's Bamboo is also definitely worth checking out. The entire Atlassian suite (JIRA, Confluence, FishEye, etc) is pretty sweet.

I cant really gove you an answer,but what I can give you is a way to a solution, that is you have to find the anglde that you relate to or peaks your interest. A good paper is one that people get drawn into because it reaches them ln some way.As for me WW11 to me, I think of the holocaust and the effect it had on the survivors, their families and those who stood by and did nothing until it was too late.

Related Questions