{ "info": { "author": "Gael Pasgrimaud", "author_email": "gael.pasgrimaud@ingeniweb.com", "bugtrack_url": null, "classifiers": [ "Framework :: Buildout", "Intended Audience :: Developers", "License :: OSI Approved :: Zope Public License", "Topic :: Software Development :: Build Tools", "Topic :: Software Development :: Libraries :: Python Modules" ], "description": ".. contents::\n\nPackage description\n*******************\n\nThis package provides a set of zc.buildout_ recipes that make it easy\nto configure a buildbot_ setup (build master, build slaves and\nprojects) and a scripts to run the buildbot master and slaves. The\nrecipes produce INI-style declarative configuration files based on the\nbuildout configuration. These configuration files are in turn read by\nthe buildbot runner script to initialize the buildbot environment.\n\nThe available recipes are:\n\n * ``collective.buildbot:master`` -- Produces a configuration file\n for the build master process.\n\n * ``collective.buildbot:slave`` -- Produces a configuration file for\n the build slave process.\n\n * ``collective.buildbot:project`` -- Produces a configuration for a\n project build on a selected slave.\n\n * ``collective.buildbot:poller`` -- Produces configuration for code\n repository pollers.\n\nIt is possible to use all the recipes in a single buildout and have\nboth the master and slave(s) on the same machine. However, in most\ncases you will have one buildout for the build master that uses the\n``collective.buildbot:master`` and ``collective.buildbot:project`` to\nset up the build processes and then separate buildouts on each of the\nslave machines that use the ``collective.buildbot:slave`` recipe.\n\n.. _zc.buildout: http://pypi.python.org/pypi/zc.buildout\n.. _buildbot: http://pypi.python.org/pypi/buildbot\n\nQuick start\n***********\n\nA paster template is provided with the package to generate a basic\nconfiguration. Just run::\n\n $ easy_install -U collective.buildbot\n $ paster create -t buildbot my.project\n $ cd my.project\n\nCheck the generated configuration in `master.cfg`.\n\nBuild the environnement::\n\n $ python bootstrap.py\n $ ./bin/buildout\n\nThen start the daemons::\n\n $ ./bin/master start\n $ ./bin/yourhostname start\n\nGo to http://localhost:9080 and enjoy your new buildbot\n\n\n\nThe build master recipe\n***********************\n\nThe ``collective.buildbot:master`` recipe produces a configuration\nfile that sets up the build master process. Once the build master is\nconfigured you can run in by executing the controller script under the\nbuildout's bin directory. The controller script will be named after\nthe section name, so if you had a ``[buildmaster]`` section in your\nbuildout.cfg you would get a ``bin/buildmaster`` script.\n\nSupported options\n=================\n\nThe recipe supports the following options:\n\n``port``\n The port the build master process listens for connections from\n build slaves. The slaves must be configured to use the\n corresponding port in the sections using the\n ``collective.buildbot:slave`` recipe.\n\n``wport``\n The web port for serving the buildbot web interface.\n\n``project-name``\n Project name. Displayed on the web interface.\n\n``project-url``\n Project url, used on the web interface.\n\n``url``\n buildbot url.\n\n``build-slaves``\n A sequence of build slave configurations. Each build slave must be\n defined on a separate line containing the name of the build slave\n and the password for the build slave separated by white space.\n\n``allow-force`` (optional)\n If ``true`` allows users to force builds using the web\n interface. Defaults to ``false``.\n\n``public-html`` (optional)\n Location of a directory that contains custom resources (HTML, CSS,\n images) for the web interface.\n\n``max-builds`` (optional)\n Maximum number of parallel builds to run on each slave. Defaults to\n ``None`` (i.e. no limits).\n\n\nAdditionally you can use the following options if you need to run an\nIRC bot:\n\n``irc-host``\n The irc host to connect to. ie: irc.freenode.net\n\n``irc-channels``\n A list of channels to join, ie: #plone\n If channel has password write it after colon, ie. #private:passwd\n\n``irc-nickname``\n The bot nickname. Defaults to ``buildbot``\n\n``irc-password``\n The password used to identify the bot. Defaults to an empty string\n\nYou can also use the following options if you need to run an ``PBListener``:\n\n``listener-port``\n The port on which ``PBListener`` should listen for connections.\n \n``listener-user``\n Username used for connection authentication.\n\n``listener-passwd``\n Password used for connection authentication.\n \n \nExample usage\n=============\n\nWe'll start by creating a buildout that uses the recipe::\n\n >>> write('buildout.cfg',\n ... \"\"\"\n ... [buildout]\n ... parts = buildmaster\n ... \n ... [buildmaster]\n ... recipe = collective.buildbot:master\n ... port = 8080\n ... wport = 8082\n ... project-name = The project\n ... project-url = http://example.com/\n ... url = http://example.com/buildbot\n ... slaves = \n ... slave1 password\n ... slave2 password\n ... \"\"\")\n\nRunning the buildout gives us::\n\n >>> print system(buildout)\n Installing buildmaster...\n New python executable in /sample-buildout/parts/buildmaster/.../python...\n Installing setuptools.............done.\n Generated script '/sample-buildout/parts/buildmaster/buildbot.tac'.\n Generated config '/sample-buildout/parts/buildmaster/buildbot.cfg'.\n Generated script '/sample-buildout/bin/buildmaster'.\n\nAs shown above, the buildout generated the required configuration\nfiles and the runner script under ``bin``. You can control build\nmaster process by running::\n\n $ ./bin/buildmaster [start | stop | restart]\n\n\nThe Twisted .tac file that is used to launch the buildbot process::\n\n >>> cat(join('parts', 'buildmaster', 'buildbot.tac'))\n from twisted.application import service\n from buildbot.master import BuildMaster\n import os\n import sys\n import collective.buildbot\n \n basedir = r'/sample-buildout/parts/buildmaster'\n buildbot = os.path.dirname(collective.buildbot.__file__)\n \n configfile = os.path.join(buildbot, 'master.py')\n application = service.Application('buildmaster')\n \n master = BuildMaster(basedir, configfile)\n master.setServiceParent(application)\n \n\nWe can also see that the configuration file generated by the recipe reflects\nthe options we chose in our buildout configuration::\n\n >>> config_path = os.path.join('parts', 'buildmaster', 'buildbot.cfg')\n >>> config = ConfigParser()\n >>> _ = config.read(config_path)\n >>> slave_res = []\n >>> for opt, val in (('slave1', 'password'), \n ... ('slave2','password'),\n ... ):\n ... slave_res.append(bool(val == config.get('slaves', opt)))\n >>> False not in slave_res\n True\n \n >>> buildbot_res = []\n >>> for opt, val in (('project-name','The project'),\n ... ('projects-directory', '%s/parts/projects' % os.getcwd()), \n ... ('pollers-directory', '%s/parts/pollers' % os.getcwd()),\n ... ('wport', '8082'),\n ... ('project-url', 'http://example.com/'),\n ... ('port', '8080'),\n ... ('allow-force', 'false'),\n ... ):\n ... buildbot_res.append(bool(val == config.get('buildbot', opt)))\n >>> False not in buildbot_res\n True\n\n\nThe build slave recipe\n**********************\n\nThe ``collective.buildbot:slave`` recipe produces a configuration\nfile that sets up a build slave process. Once the build slave is\nconfigured you can run it by executing the controller script under the\nbuildout's bin directory. The controller script will be named after\nthe section name, so if you had a ``[buildslave]`` section in your\nbuildout.cfg you would get a ``bin/buildslave`` script.\n\nSince the name of the section using this recipe will also become the\nname of the build slave it is important to choose the name that\ncorresponds to the buildmaster configuration.\n\nSupported options\n=================\n\nThe recipe supports the following options:\n\n``host``\n Hostname of the build master.\n\n``port``\n Port that the build master is listening. This should match the\n ``port`` option in the section using the\n ``collective.buildbot:master`` recipe in your buildmaster\n buildout.\n\n``password``\n Build slave password. This should match the password in the\n ``slave-names`` section in the buildmaster buildout.\n\n``eggs``\n Used to install extra eggs in slave environment.\n\n``environment``\n Can define the name of a section, containing environment variable\n that will be defined in the slave environment.\n\n``executable``\n You can here specify a diffrent Python, with a different version\n that will be used to setup the virtualenv.\n\n``umask``\n Override the default 0077 umask which is used in the build directory.\n\nExample usage\n=============\n\nWe'll start by creating a buildout that uses the recipe::\n\n >>> write('buildout.cfg',\n ... \"\"\"\n ... [buildout]\n ... parts =\n ...\t buildslave\n ...\n ... [buildslave]\n ... recipe = collective.buildbot:slave\n ... host = localhost\n ... port = 8888\n ... password = password\n ... environment = slaveenv\n ... umask = 0002\n ...\n ... [slaveenv]\n ... PATH = /bin:/usr/bin:/usr/local/bin:/usr/local/firefox\n ... \"\"\")\n\nRunning the buildout gives us::\n\n >>> print system(buildout)\n Installing buildslave.\n ...\n Generated script /sample-buildout/parts/buildslave/buildbot.tac.\n Generated script '/sample-buildout/bin/buildslave'.\n \n\nAs shown above, the buildout generated the required scripts. You can\ncontrol build slave process by running::\n\n $ ./bin/buildslave [start | stop | restart]\n\nThe project recipe\n******************\n\nThe ``collective.buildbot:project`` recipe is responsible for creating\nthe buildbot configuration for a project which is a single testable\ncomponent. Whether this project corresponds to a single sofware\npackage or many is up to you. In most cases a project corresponds to a\nbuildout which in turn may contain one or many software packages. Each\nproject has a separate state and is visualized as a column in the\nwaterfall display.\n\nThis recipe should be used in the same buildout with\n``collective.buildbot:master``.\n\n\nSupported options\n=================\n\nThe recipe supports the following options:\n\n``slave-names`` (mandatory)\n\n A white-space separated list of slave names that the project will be\n built on. These must correspond to the section names that use the\n ``collective.buildbot:slave`` recipe and that are consequently\n referred in the ``slaves`` option of the section using the\n ``collective.buildbot:master`` recipe.\n\n``vcs`` (optional)\n\n The version control system used to obtain the source code for the\n project. Defaults to ``svn``. Other possible values are: ``hg``,\n ``bzr``, ``git`` and ``cvs``.\n\n``vcs-mode`` (optional)\n\n The mode used to fetch the source code from the version control\n system. Defaults to ``update``. Other possible values are:\n ``clobber``, ``copy`` and ``export``. See the buildbot manual\n section for ``Source Checkout`` for a description of what each\n option does.\n\n``repositories`` (mandatory)\n\n A sequence of newline separated URLs to the code repositories that\n correspond to the selected version control system. For Subversion\n this could be something like\n ``https://svn.plone.org/svn/collective/collective.buildbot/trunk``\n for Git something like\n ``git@github.com:dokai/hexagonit-swfheader.git``\n and for CVS like\n ``:pserver:anonymous@cvs.sourceforge.net:/cvsroot/buildbot!buildbot``.\n\n For Subversion, if the url root is found in HOME/.buildout/.httpauth,\n username and password will be used to perform checkouts and updates.\n See: http://pypi.python.org/pypi/lovely.buildouthttp.\n\n For each repository you define, a separate Buildbot project\n configuration will be generated that shares all the other\n options. This is useful if you have multiple similar projects within\n the same repository and can save you a lot of typing. Since\n Subversion URLs contain the branch information it is even possible\n to pull in code from separate branches. For other version control\n system that use the ``branch`` option (e.g. Git) you're limited to a\n single shared branch name.\n\n``branch`` (optional)\n\n The branch in the version control system that will be checked out. For\n Subversion checkouts you should provide the full URL to the desired branch\n (e.g. something that ends with ``trunk`` or ``branches/foo``) and leave this\n option empty. For Git repositories the default value is ``master``. Note\n that for Git repositories you can use any identifier that resolves to (in\n the git rev-parse sense) to a treeish object.\n\n``always-use-latest`` (optional, defaults to ``False``)\n\n Whether to always update to the most recent available sources for\n this build. Please refer to the 'alwaysUseLatest' option of\n ``buildbot.steps.source.Source`` for more info.\n\n Basically, if your buildbot is watching changes from multiple\n repositories it is very likely that you will need to set this option\n to ``True``.\n\n``hg-branch-type`` (optional, defaults to ``inrepo``)\n\n If mercurial is used, define which branch type to use. By default it\n is ``inrepo``. An another possible value is ``dirname``.\n\n``email-notification-sender`` (optional)\n\n An email address that will be used in the From: header for the\n notification messages.\n\n``email-notification-recipients`` (optional)\n\n A newline separated sequence of email addresses the notification\n messages will be sent to.\n\n``mail-mode`` (optional)\n\n The mode to use for sending mails. Available options are:\n\n * all\n\n Send mail about all builds, both passing and failing\n\n * failing\n\n Only send mail about builds which fail\n\n * problem\n\n Only send mail about a build which failed when the previous build\n has passed. If your builds usually pass, then this will only send\n mail when a problem occurs.\n\n Defaults to::\n \n failing\n\n``build-sequence`` (optional)\n\n A newline separated sequence of shell commands executed on the build\n slave after checking out the code from the repository that will\n build the project.\n\n Defaults to::\n\n bin/python bootstrap.py\n bin/buildout\n\n which is appropriate for buildout based projects.\n \n If a command starts with python, the command will be replaced with the\n full path to the python of the buildbot slave. The slave has its own\n virtualenv python\n\n``test-sequence`` (optional)\n\n A newline separated sequence of shell commands executed on the build\n slave to execute the test suite. Defaults to::\n\n bin/test\n\n``default-scheduler`` (optional)\n\n Sets up the default scheduler that triggers a build after every change\n using a grace period waiting for more changes. The period can be specified\n in seconds.\n\n``periodic-scheduler`` (optional)\n\n Sets up a periodic scheduler that schedules a build every ``n``\n minutes, where ``n`` is the given integer value.\n\n``cron-scheduler`` (optional)\n\n Sets up a cron-like scheduler that schedules a build at a given\n time. The time is configured in a crontab manner using white space\n separated values for the following fields::\n\n [minute] [hour] [day of month] [month] [day of week]\n\n The values should be either:\n\n - integers in the appropriate range for the given field,\n\n - a list of intergers in the format ``2,4,6``. Specified integers\n needs to be in the appropriate range for the given field,\n\n - ``*/n`` where ``n`` is an integer which means every ``n`` integers\n in the appropriate range of the given field,\n\n - ``*`` (asterisk) for all possible values of the field.\n\n For example to schedule a build at 3:00 am every night you would\n use::\n\n cron-scheduler = 0 3 * * *\n\n To schedule a build every 2 hours on the quarter of the time, you\n would use::\n\n cron-scheduler = 15 */2 * * *\n\n``dependent-scheduler`` (optional)\n\n Sets up a dependency between the given project and the current\n one. After a successful build of the given project, this one will be\n triggered.\n\n``dependencies`` (optional)\n\n A sequence of newline-separated paths that when found on a change\n set should cause a build to be triggered on this slave.\n\n For example, if you would like to cause your build to be run\n whenever a change to a project you depend on named\n ``some.other-project`` happens, you would use::\n\n dependencies = some.other-project/trunk\n\n The paths you list here are checked using substring matching. So for\n example, if you don't care which branch of ``some.other-project``\n has changed, you could use::\n\n dependencies = some.other-project\n\n Or, alternatively, if you only care if a single file inside that\n project is changed, you could use a more specific path as well::\n\n dependencies = some.other-project/trunk/versions.cfg\n\n``pyflakes`` (optional)\n\n A sequence of newline separated PyFlakes_ commands to run. If\n defined, the given PyFlakes commands will be run after the test\n sequence.\n\n The commands should consist of a path to the ``pyflakes`` script and\n a path to the source code container. For example, using a global\n pyflakes installation on a project located under\n ``src/some.project`` within the build directory you would set::\n\n pyflakes = pyflakes src/some.project\n\n You can also have your slave buildout install pyflakes and use that\n instead of a globally installed version.\n\n .. _PyFlakes: http://divmod.org/trac/wiki/DivmodPyflakes\n\nExample usage\n=============\n\nWe'll start by creating a buildout that uses the recipe. A full\nexample would propably have other sections defining the build master\nand slaves, but here we will demonstrate only the use of the\n``collective.buildbot:project`` recipe.\n\n >>> write('buildout.cfg',\n ... \"\"\"\n ... [buildout]\n ... parts = my.package other.package\n ...\n ... [my.package]\n ... recipe = collective.buildbot:project\n ... email-notification-sender = email@example.com\n ... slave-names = slave1\n ... mail-host = localhost\n ... email-notification-recipients = \n ... \temail@example.com\n ... vcs = svn\n ... vcs-mode = clobber\n ... repositories = http://example.com/svn/my.package/trunk\n ... always-use-latest = yes\n ...\n ... [other.package]\n ... recipe = collective.buildbot:project\n ... slave-names = slave1\n ... vcs = git\n ... branch = 3720f2e9b3a6a148b01843bc64fbea5af59df2af\n ... repositories = git://github.com/dokai/other.package.git\n ... dependencies = my.package/trunk\n ... \"\"\")\n\nRunning the buildout gives us::\n\n >>> print system(buildout)\n Installing my.package.\n Generated config '/sample-buildout/parts/projects/my.package.cfg'.\n Installing other.package.\n Generated config '/sample-buildout/parts/projects/other.package.cfg'.\n\nAs we can see, the recipe generated the project configuration files\nunder the ``projects`` directory in the parts::\n\n >>> config_path = os.path.join('parts', 'projects', 'my.package.cfg')\n >>> config = ConfigParser()\n >>> _ = config.read(config_path)\n >>> res = []\n >>> for opt, val in (('name', 'my.package'), \n ... ('repository','http://example.com/svn/my.package/trunk'),\n ... ('email-notification-sender', 'email@example.com'),\n ... ('slave-names', 'slave1'),\n ... ('mail-host', 'localhost'),\n ... ('email-notification-recipients', '\\nemail@example.com'),\n ... ('vcs', 'svn'),\n ... ('vcs-mode', 'clobber'),\n ... ('always-use-latest', 'yes'),\n ... ):\n ... res.append(bool(val == config.get('project', opt)))\n >>> False not in res\n True\n\n >>> config_path = os.path.join('parts', 'projects', 'other.package.cfg')\n >>> config = ConfigParser()\n >>> _ = config.read(config_path)\n >>> res = []\n >>> for opt, val in (('name', 'other.package'), \n ... ('repository', 'git://github.com/dokai/other.package.git'),\n ... ('slave-names', 'slave1'),\n ... ('vcs', 'git'),\n ... ('dependencies', 'my.package/trunk'),\n ... ('branch', '3720f2e9b3a6a148b01843bc64fbea5af59df2af'),\n ... ):\n ... res.append(bool(val == config.get('project', opt)))\n >>> False not in res\n True\n\nIf you have multiple similar projects you can define them within a\nsingle buildout section by providing multiple repository URLs. All the\nprojects share the same options (except the repository URL). To\nfurther reduce repetition we've defined the base URL to our repository\nin the buildout section::\n\n >>> write('buildout.cfg',\n ... \"\"\"\n ... [buildout]\n ... parts = my_project\n ... svn = http://svn.example.com/svnroot\n ...\n ... [my_project]\n ... recipe = collective.buildbot:project\n ... slave-names = slave1\n ... vcs = svn\n ... repositories =\n ... ${buildout:svn}/my.package/trunk\n ... ${buildout:svn}/other.package/tags/1.2.3\n ... ${buildout:svn}/third.package/branches/foobar\n ... ${buildout:svn}/third.package/branches/another\n ... ${buildout:svn}/third.package/branches/another\n ... \"\"\")\n\nWhen we run the buildout we can see that it generated a separate configuration\nfile for each project representing a single repository. A branch name is used\nas extra identifier if detectable, otherwise an integer is added::\n\n >>> print system(buildout)\n Uninstalling other.package.\n Uninstalling my.package.\n Installing my_project.\n Generated config '/sample-buildout/parts/projects/my.package.cfg'.\n Generated config '/sample-buildout/parts/projects/other.package.cfg'.\n Generated config '/sample-buildout/parts/projects/third.package.cfg'.\n Generated config '/sample-buildout/parts/projects/third.package_another.cfg'.\n Generated config '/sample-buildout/parts/projects/third.package_2.cfg'.\n\n\nThe poller recipe\n******************\n\nThe poller recipe defines pollers that automatically query the code\nrepositories for changes in project code base and then execute the\nbuilders if changes are found.\n\nSupported options\n=================\n\nThe recipe supports the following options:\n\n``vcs``\n\n The version control system. Defaults to ``svn``. Currently only\n Subversion repositories are supported.\n\n``repositories``\n\n A sequence of newline separated URLs to the root of the Subversion\n repository containing the project code. Note: This is the root URL\n to the repository and not the full path to your project. You only\n need to provide one URL per repository, not per project.\n\n``splitter``\n\n A regexp used to parse paths analyzed by the poller. The regexp must return 2\n groups. The only important one is the project name to match in a builder\n repository. \n\n Note that the regexp you provide will be treated as in raw-string\n format for you (e.g. this \n ``(?P\\S+\\/foo|\\S+\\/bar\\/[^\\/]+)/(?P.*))`` becomes\n ``r'(?P\\S+\\/foo|\\S+\\/bar\\/[^\\/]+)/(?P.*))'``\n\n (Default\n ``'(?P\\S+\\/trunk|\\S+\\/branches\\/[^\\/]+)/(?P.*)'``).\n\n``hist-max``\n\n Number of history lines to look at (Default 100).\n\n``user``\n\n A svn user (Default None).\n\n``password``\n\n A valid svn password for the user (Default None).\n\n``poll-interval``\n\n Interval in seconds to check for changes (Default 600).\n\n``svn-binary``\n\n Path to the ``svn`` binary. Defaults to ``svn`` which should work if\n you have in your ``PATH``.\n\nExample usage\n=============\n\nWe can define a poller to make our buildbot aware of commits:: \n\n >>> write('buildout.cfg',\n ... \"\"\"\n ... [buildout]\n ... parts = svnpoller\n ... \n ... [svnpoller]\n ... recipe = collective.buildbot:poller\n ... repositories = http://example.com/svn\n ... user = h4x0r\n ... password = passwd\n ... \"\"\")\n\n >>> print system(buildout)\n Installing svnpoller.\n Generated config '/sample-buildout/parts/pollers/svnpoller.cfg'.\n\nPoller generation. You can see here all the available options::\n\n >>> config_path = os.path.join('parts', 'pollers', 'svnpoller.cfg')\n >>> config = ConfigParser()\n >>> _ = config.read(config_path)\n >>> res = []\n >>> for opt, val in (('hist-max', '100'), \n ... ('repository','http://example.com/svn'),\n ... ('vcs','svn'),\n ... ('user','h4x0r'),\n ... ('svn-binary','svn'),\n ... ('password','passwd'),\n ... ('poll-interval','60')\n ... ):\n ... res.append(bool(val == config.get('poller', opt)))\n >>> False not in res\n True\n\nYou can also have the poller to observe multiple repositories.\n\n >>> write('buildout.cfg',\n ... \"\"\"\n ... [buildout]\n ... parts = svnpoller\n ... \n ... [svnpoller]\n ... recipe = collective.buildbot:poller\n ... repositories =\n ... http://example.com/svn\n ... http://otherexample.com/svn\n ... http://other.server.com/svn\n ... user = h4x0r\n ... password = passwd\n ... \"\"\")\n\n >>> print system(buildout)\n Uninstalling svnpoller.\n Installing svnpoller.\n Generated config '/sample-buildout/parts/pollers/svnpoller_0.cfg'.\n Generated config '/sample-buildout/parts/pollers/svnpoller_1.cfg'.\n Generated config '/sample-buildout/parts/pollers/svnpoller_2.cfg'.\n \n\n\nPutting it all together\n***********************\n\nBelow we will demonstrate how to put all the pieces together to create\na buildbot environment for your own projects. We will use two separate\nbuildouts: one for the build master and one for a single build\nslave. For your own projects you may choose to use multiple build\nslaves with each running, for example, on a different architecture or\na different python version.\n\nWe'll start with the build master buildout that defines the build\nmaster process and all the projects that we wish to build and test. We\nalso include a poller configuration that will poll the Subversion\nrepository for changes the projects and execute the build when changes\nhave occurred. If we were to use another version control system, such\nas Git, we would need to use a commit-hook or a time-based build\nscheduler.\n\nWe'll also use PyFlakes to perform additional checks on the source\ncode.\n\n >>> write('buildout.cfg',\n ... \"\"\"\n ... [buildout]\n ... parts =\n ... buildmaster\n ... svnpoller\n ... my.project\n ... my.buildout\n ... another.package\n ... \n ... [buildmaster]\n ... recipe = collective.buildbot:master\n ... port = 8080\n ... wport = 8082\n ... project-name = The company buildout\n ... project-url = http://my.company.com\n ... url = http://buildbot.my.company.com\n ... allow-force = true\n ... public-html = ${buildout:directory}/buildbot_css\n ... slaves = \n ... buildslave secretpassword\n ... \n ... [svnpoller]\n ... recipe = collective.buildbot:poller\n ... repositories =\n ... ${my.project:svnroot}\n ... ${my.buildout:svnroot}\n ... user = someuser\n ... password = anothersecret\n ... \n ... [my.project]\n ... recipe = collective.buildbot:project\n ... slave-names = slave1\n ... svnroot = https://svn.company.com/svn\n ... repositories = ${my.project:svnroot}/my.project/trunk\n ... email-notification-sender = buildbot@my.company.com\n ... email-notification-recipients =\n ... my.project@my.company.com\n ... dev@my.company.com\n ... mail-mode = problem\n ... mail-lookup = plone.org\n ... build-sequence =\n ... test-sequence = ../../bin/python setup.py test\n ... \n ... [my.buildout]\n ... recipe = collective.buildbot:project\n ... slave-names = slave1\n ... svnroot = https://svn.othercompany.com/svn\n ... repositories = ${my.buildout:svnroot}/my.buildout/trunk\n ... email-notification-sender = buildbot@my.company.com\n ... email-notification-recipients = dev@my.company.com\n ... test-sequence = bin/zope-instance test -v -vv\n ... pyflakes =\n ... ../../../../bin/pyflakes src/collective.foo\n ... ../../../../bin/pyflakes src/collective.bar\n ... \n ... [another.package]\n ... recipe = collective.buildbot:project\n ... slave-names = slave1\n ... vcs = git\n ... repositories = git://git.company.com/projects/another-package.git\n ... email-notification-sender = buildbot@my.company.com\n ... email-notification-recipients = dev@my.company.com\n ... build-sequence =\n ... test-sequence = ../../bin/python setup.py test\n ... periodic-scheduler = 60\n ... pyflakes = ../../../../bin/pyflakes .\n ... \"\"\")\n\nWe've allowed forced builds which is quite handy sometimes. Since the\ndefault buildbot web interface is not the most aesthetic we've also\nincluded a directory that contains our custom css.\n\nThe ``my.project`` and ``another.package`` packages are simple python\npackages so we use the setup.py script to run the test suites. Because\nthese are simple packages we also clear out the ``build-sequence``\noption since there is nothing to do before running the tests. The\n``my.buildout`` section is your typical Zope buildout and uses the\nZope controller script, ``zope-instance`` in this particular case, to\nrun the tests.\n\nAlso, because the ``another.package`` project uses a Git repository,\nthe SVN poller won't apply to it so we've set up a periodic scheduler\nthat builds the project once in an hour. An alternative would be to\ninstall a post-commit hook to the Git repository that notifies the\nbuildout of changes and schedules a build.\n\nThe ``my.buildout`` project is a buildout based project, so we can use\nthe default ``build-sequence`` which will bootstrap and run the\nbuildout for us. For the zope.testing test runner we pass the\n``--exit-with-status`` parameter so that buildbot will know whether\nthe tests failed or not. The trunk may have additional svn:externals\ndefined that actually pull in the code that is tested which is the\ncommon place. We've also demonstrated using pyflakes on multiple\nsource packages which may be the case in a full buildout.\n\nLet's run the buildout now.\n\n >>> mkdir('buildbot_css')\n >>> print system(buildout)\n Installing buildmaster...\n New python executable in /sample-buildout/parts/buildmaster/.../python...\n Installing setuptools............done.\n Generated script '/sample-buildout/parts/buildmaster/buildbot.tac'.\n Generated config '/sample-buildout/parts/buildmaster/buildbot.cfg'.\n Generated script '/sample-buildout/bin/buildmaster'.\n Installing my.project.\n Generated config '/sample-buildout/parts/projects/my.project.cfg'.\n Installing my.buildout.\n Generated config '/sample-buildout/parts/projects/my.buildout.cfg'.\n Installing svnpoller.\n Generated config '/sample-buildout/parts/pollers/svnpoller_0.cfg'.\n Generated config '/sample-buildout/parts/pollers/svnpoller_1.cfg'.\n Installing another.package.\n Generated config '/sample-buildout/parts/projects/another.package.cfg'.\n \n\nAs we can see we got the ``bin/buildmaster`` script to run the build\nmaster process and the corresponding configuration files. Our build\nmaster is now ready and you can start it by running::\n\n $ ./bin/buildmaster start\n\nNext, we create the buildout for the build slave. This buildout may be\nlocated on a different machine although having it on the same machine\nwill work just as fine.\n\n >>> write('buildout.cfg',\n ... \"\"\"\n ... [buildout]\n ... parts = \n ... buildslave\n ... pyflakes\n ... \n ... [buildslave]\n ... recipe = collective.buildbot:slave\n ... host = buildbot.my.company.com\n ... port = 8080\n ... password = secretpassword\n ... \n ... [pyflakes]\n ... recipe = zc.recipe.egg\n ... eggs = pyflakes\n ... entry-points = pyflakes=pkg_resources:run_script\n ... arguments = 'pyflakes', 'pyflakes'\n ... \"\"\")\n\nThe slave buildout is very simple since the build master is in charge\nof everything and the slave simply needs to contact the master and\nreceive instructions. We configured the address of the build master\nand the password to match the configuration in the build master\nbuildout above.\n\nWe've also included PyFlakes in the slave buildout to assure that it\nis available on the slave machine. The pyflakes commands in the master\nbuildout use a path referring to this version of pyflakes.\n\nRunning the buildout will give us the controller script for the slave\nand the pyflakes script::\n\n >>> print system(buildout)\n Uninstalling...\n Installing buildslave...\n New python executable in /sample-buildout/parts/buildslave/.../python...\n Installing setuptools............done.\n Generated script /sample-buildout/parts/buildslave/buildbot.tac.\n Generated script '/sample-buildout/bin/buildslave'.\n Installing pyflakes...\n Generated script '/sample-buildout/bin/pyflakes'.\n \n\nThe build slave can be started by running::\n\n $ ./bin/buildslave start\n\nOnce you have both the build master and slave running the poller\nshould react to commits to the SVN repositories and run the builds\nafter each change. You can view the buildbot status pages at the\nconfigured address, http://buildbot.my.company.com:8082/ in this\ncase. You can use the web interface to force a build which can be\nuseful to verify that the buildbot and projects are configured\ncorrectly.\n\nIt is now easy to add new projects or build slaves by modifying the\nbuildout configurations and rerunning the buildouts.\n\nSupport\n*******\n\n- Documentation: http://pypi.python.org/pypi/collective.buildbot\n\n- Mailing list (and bug reports): http://groups.google.fr/group/collectivebuildbot\n\n- Source: http://svn.plone.org/svn/collective/collective.buildbot/trunk/\n\n\nContributors\n************\n\nProject initiated at Ingeniweb (http://ingeniweb.com)\n\nInitial Authors:\n - Gael Pasgrimaud\n - Tarek Ziade\n\nMoved to the collective during the Plone Paris Sprint 2008.\n\nContributors:\n - Gael Pasgrimaud [gawel]\n - Tarek Ziade [tarek]\n - Kai Lautaportti [dokai]\n - Jean-Francois Roche\n - Mustapha Benali [mustapha]\n - Sylvain Viollon [thefunny]\n - Reinout van Rees [reinout]\n - Kevin Deldycke [kdeldycke]\n\nChange history\n**************\n\n0.4.1 (2010-04-13)\n==================\n\n - Add hg-branch-type option and support branch for Mercurial.\n [thefunny42]\n\n\n0.4 (2010-02-19)\n================\n\n - Set extended CSS as the default style. This was imported from brand new\n buildbot v0.7.12.\n [kdeldycke]\n\n - Projects are now sorted by ids.\n [thefunny42]\n\n - Slaves can use different python interpreter than the buildout\n does. You can define your interpretor with the ``executable``\n option.\n [thefunny42]\n\n - Values like ``*/4`` or ``8,12,16`` are now supported as valid cron\n specifiers.\n [thefunny42]\n\n\n0.3.7 (2010-01-24)\n==================\n\n - add num_events and num_events_max parameters. Thanks to Baiju M.\n [gawel]\n\n - buildbot requires the max_builds slave parameter to be an integer.\n [kdeldycke]\n\n\n0.3.6 (2009-12-22)\n==================\n\n - Better fix for similar project names that occur in different buildout\n parts. For svn projects, this fixes that _trunk is appended unnecessarily\n and it allows the automatic projectname_branchname names to work again.\n\n - Setting \"usepty\" in the slave.tac to buildbot's new default of 0. See\n http://buildbot.net/trac/ticket/158 and especially\n http://buildbot.net/trac/ticket/255 . This fixes problems with simple\n shell commands like \"cp\" and \"rm\" failing for no apparent good reason.\n And the stdio output seems to react much quicker now: nice.\n [reinout]\n\n - Allow configuration updates to work again.\n [hannosch]\n\n - Add possibility to use the default scheduler that triggers a build after\n every change using a grace period waiting for more changes.\n [witsch]\n\n - When using svn and you test multiple branches of the same project, you now\n get project_branch-a, project_branch-b instead of project_2, project_3.\n Named after the branch/tag name.\n [reinout]\n\n - SVNScheduler changed the incoming change object in addChange to match\n to its internal structure. But the change is reused in the next project\n where it won't match any longer because of the change.\n [do3cc]\n\n - Offering two more mail features of buildbot for configuration in\n collective.buildbot mail-mode and mail-lookup. See updated\n collective.buildbot documentation [do3cc]\n\n - Fixed an issue with similar project names that appeared in different\n buildout parts [do3cc]\n\n - Fixed an issue with multiple repositories in a poller recipe\n [do3cc]\n\n\n0.3.5 (2009-07-17)\n====================\n\n - buildbot 0.7.11 compatibility\n\n - various small fixes\n\n\n0.3.4 (2009-05-21)\n====================\n\n - Remove useless imports in docs.\n [gawel]\n\n - Possible to configure ``PBListener``\n [stxnext]\n\n - Added support for CVS repositories in project recipe. Location of code in\n CVS is described by `cvsroot` and `cvsmodule`. This two parameters are\n taken by spliting on `!` sign on repository location.\n [stxnext]\n\n - IRC bot can join password protected channels.\n [stxnext]\n\n - Refactor of all doctests that demonstrate recipes that subclass BaseRecipe\n and rely upon it's write_config method. The implementation relies upon the\n ConfigParser module which utilizes a dictionary data structure for storage\n of sections and options. This can never be assumed to be ordered across\n Python versions and we really shouldn't care upon order in our\n implementation. Tests now verify existence within intended section and\n correct value, rather than placement.\n [andrewb]\n\n - Completing work from r67547 (e.g. Fixed occurrences of\n `email-notification-recipients` to the plural form). When initializing\n collective.buildbot.project.Project we want to actually look for the plural\n version. Additionally, we want our comment regarding notifications in\n master.cfg_tmpl to suggest the correct value to be set.\n [andrewb]\n\n - Make timeout configurable, globally and independently for build\n and test steps.\n [sidnei]\n\n - Strip always_use_latest option to avoid issues with whitespace.\n [sidnei]\n\n - Make Source Checkout retry up to 3 times, 10 seconds\n apart. Somehow later versions of buildbot seem to fail much more\n often when removing the checkout directory, and hopefully this\n will work around that.\n [sidnei]\n\n - Make Source Checkout mode configurable through ``vcs-mode``.\n [sidnei]\n\n - Make ``build`` steps set ``haltOnFailure=True``. No point in doing\n any testing if the build steps failed.\n [sidnei]\n\n - Fixed compatibility problem with buildbot 0.7.9\n [dokai]\n\n - Fixed problem with the test suite initialization which resulted in all\n the doctests not being run. Also fixed test regressions that had surfaced\n undetected because of the problem.\n [dokai]\n\n0.3.3 (2008-09-26)\n==================\n\n - Apply patch from Chris Shenton to override default umask\n [gawel]\n\n - Improve default template configuration\n [gawel]\n\n - Add clean css to template\n [gawel]\n\n0.3.2 (2008-09-14)\n==================\n\n - Add paster template to quickly generate a basic configuration\n [gawel]\n\n - Fixed occurrences of `email-notification-recipients` to the singular form\n as used in most places.\n [hannosch]\n\n - Added a mechanism to have username/password for Subversion authentication\n Which consists of a buildbot patch and a link to .httpauth on buildout\n side\n [tarek]\n\n - Add dependency between projects. The build of one project can\n trigger the build of one other. [thefunny]\n\n - Improve the virtual env creation for Windows (mingw) and Cygwin.\n Installation of eggs works with mingw, and we should get a python\n ../../bin/python for Cygwin as well (symlink to the python used to\n run buildout). [thefunny]\n\n0.3.1 (2008-05-31)\n==================\n\n - Fixed poller documentation and examples [mustapha]\n\n - Fixed failed tests when your executable is called something other\n than python, e.g python2.4 [mustapha]\n\n0.3.0 (2008-05-28)\n==================\n\n - Use a custom scheduler to get poller working again [gawel]\n\n - Add splitter option to the poller recipe [gawel]\n\n - Added support for running PyFlakes on projects [dokai]\n\n - Refactored project name extraction logic [dokai]\n\n - Added Git support\n\n - Added support for defining multiple projects that result in\n duplicate project names (e.g. projects referring to different\n branches in a Subversion repository.)\n\n - Try to retrieve project name from svn urls [gawel]\n\n - Use a random minute in cron-scheduler when we have more than one\n repository [gawel]\n\n - Deactive virtualenv under cygwin, this doesn't work [thefunny]\n\n - 'environment' can be used to specify environment variable on\n slaves [thefunny]\n\n - 'eggs' can be used to install extra eggs in slaves [thefunny]\n\n - Refactored the functionality of the 'projects' recipe into the\n 'project' recipe and removed the 'projects' entry point. [dokai]\n\n - Refactored the functionality of the 'pollers' recipe into the\n 'poller' recipe and removed the 'pollers' entry point. [dokai]\n\n - Poller config files are now named after the section name, allowing\n multiple poller sections to be defined. [dokai]\n\n0.2.1 (2008-05-21)\n==================\n\n - Fixed a critical typo in the slave name configuration in\n fullexample.txt [dokai]\n\n0.2.0 (2008-05-21)\n==================\n\n - Added irc options so you can attach an irc bot to the master buildbot\n [mustapha]\n\n - Allow public_html customization [gawel]\n\n - Added custom about page to link to collective.buildout [gawel]\n\n - Added support for Git repositories [dokai]\n\n - Refactored the repository URL configuration. For Subversion, you\n should use only the ``repository`` option to specify a full URL to\n the desired branch (trunk, tag or branch) that will be built. For\n Git in addition to setting the ``repository`` option you can use\n the ``branch`` option to specify a specific branch to build. By\n default the ``master`` branch will be used for Git\n repositories. [dokai]\n\n - Cleaned up a lot of redundant imports. [dokai]\n\n - Updated the documentation and examples. [dokai]\n\n - Deprecated the collective.buildbot:projects recipe [dokai]\n\n - Fixed problem with missing twistd.log files on first run [dokai]\n\n - Fixed bug that prevented the master from starting if there weren't\n any SVN pollers configured. [dokai]\n\n - Added new options ``periodic-scheduler`` and ``cron-scheduler`` to\n set up passive schedulers for projects. [dokai]\n\n\n0.1.1 (2008-05-02)\n==================\n\n - bugs fixes [gawel]\n\n0.1.0 (xxxx-xx-xx)\n==================\n\n - Created recipe with ZopeSkel [Gael Pasgrimaud].\n\nDownload\n********", "description_content_type": null, "docs_url": null, "download_url": "UNKNOWN", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "http://pypi.python.org/pypi/collective.buildbot", "keywords": "buildout buildbot", "license": "ZPL", "maintainer": null, "maintainer_email": null, "name": "collective.buildbot", "package_url": "https://pypi.org/project/collective.buildbot/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/collective.buildbot/", "project_urls": { "Download": "UNKNOWN", "Homepage": "http://pypi.python.org/pypi/collective.buildbot" }, "release_url": "https://pypi.org/project/collective.buildbot/0.4.1/", "requires_dist": null, "requires_python": null, "summary": "A set of zc.buildout recipes and support for declarative configuration for Buildbot", "version": "0.4.1" }, "last_serial": 754920, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "65ef0c0705b1cb2644dda035ccc19ea7", "sha256": "3c8e688d7e4cf63eaf14b5a5ddf9bf031d7b30d67169369639a7aadc5719d368" }, "downloads": -1, "filename": "collective.buildbot-0.1.0-py2.4.egg", "has_sig": false, "md5_digest": "65ef0c0705b1cb2644dda035ccc19ea7", "packagetype": "bdist_egg", "python_version": "2.4", "requires_python": null, "size": 50271, "upload_time": "2008-04-30T16:17:06", "url": "https://files.pythonhosted.org/packages/3d/5c/e1f62b1118e91fbde834cb5d3532a775a292e67e1b49e7d6d61d3db66b37/collective.buildbot-0.1.0-py2.4.egg" }, { "comment_text": "", "digests": { "md5": "719fbf2f0544539e68b40e58ce84e037", "sha256": "4d75461fafde0083a4529e919e16120f24bcea40149339280b3267d6368d64b4" }, "downloads": -1, "filename": "collective.buildbot-0.1.0.tar.gz", "has_sig": false, "md5_digest": "719fbf2f0544539e68b40e58ce84e037", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20839, "upload_time": "2008-04-30T16:17:05", "url": "https://files.pythonhosted.org/packages/0e/d2/f60738ffe160d67c2c87e40245bcd92c3ddcf2935fb4f8eb9608fdd4974d/collective.buildbot-0.1.0.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "ae67cef76ad0c2cbebb7ecb69983f926", "sha256": "2a73268ea1054f67438bbfae7344958dbf89a74ffa5e8796b8ded943371e5ae4" }, "downloads": -1, "filename": "collective.buildbot-0.1.1-py2.4.egg", "has_sig": false, "md5_digest": "ae67cef76ad0c2cbebb7ecb69983f926", "packagetype": "bdist_egg", "python_version": "2.4", "requires_python": null, "size": 50469, "upload_time": "2008-05-02T10:02:08", "url": "https://files.pythonhosted.org/packages/58/62/a37d459d2996404ea428619e03469dd6a7a176eada0de439334228814f11/collective.buildbot-0.1.1-py2.4.egg" }, { "comment_text": "", "digests": { "md5": "296e179e13ddef9f9da3065fe6a83caf", "sha256": "b74e6d779f72e70d518fcd4e167a325d7f67daa840458d3197b5ff4d580f8204" }, "downloads": -1, "filename": "collective.buildbot-0.1.1.tar.gz", "has_sig": false, "md5_digest": "296e179e13ddef9f9da3065fe6a83caf", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20970, "upload_time": "2008-05-02T10:02:07", "url": "https://files.pythonhosted.org/packages/26/c4/3acb2d0a5670b31dd7602dce63396311942065325b4cb56668f016875664/collective.buildbot-0.1.1.tar.gz" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "bd071b925d795d266a7d0e3f674b6c61", "sha256": "1b3c93cdaa7de1a62855c1b9fd75f6fdaf2b7d8907460ef94fdf976cac8624f8" }, "downloads": -1, "filename": "collective.buildbot-0.2.0.tar.gz", "has_sig": false, "md5_digest": "bd071b925d795d266a7d0e3f674b6c61", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 36004, "upload_time": "2008-05-21T18:05:30", "url": "https://files.pythonhosted.org/packages/94/d7/814a7e4f1eb89ac4bc5c73b03f3ca68c732253112f0da92819f59e4dcc1a/collective.buildbot-0.2.0.tar.gz" } ], "0.2.1": [ { "comment_text": "", "digests": { "md5": "dbcea587a3f99ead25c1ecb010169d8e", "sha256": "3560a9fc602cdfef8c3ebad094565a681e346b305de87ae0d741f8f0298354bd" }, "downloads": -1, "filename": "collective.buildbot-0.2.1.tar.gz", "has_sig": false, "md5_digest": "dbcea587a3f99ead25c1ecb010169d8e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 36128, "upload_time": "2008-05-21T20:09:34", "url": "https://files.pythonhosted.org/packages/0f/40/a9c334765bbd3449d3c1200be92c258349d8ff90511e358ef186beb7fd6f/collective.buildbot-0.2.1.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "ad640153b12db41c3184a36546f38b06", "sha256": "db676155c9529d9e5d2d021fe8ad1c064934168830ecdc68ee67634ec1901f2b" }, "downloads": -1, "filename": "collective.buildbot-0.3.0.tar.gz", "has_sig": false, "md5_digest": "ad640153b12db41c3184a36546f38b06", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 42151, "upload_time": "2008-05-28T09:15:09", "url": "https://files.pythonhosted.org/packages/30/b0/42d338f3417561a960bb0a09841f3c7ada5edf5d5eac2e89c458a4023243/collective.buildbot-0.3.0.tar.gz" } ], "0.3.1": [ { "comment_text": "", "digests": { "md5": "f5c99dd7dd5cb0abf424f435934f1e55", "sha256": "9e472ca8e91ffc533d4d06f6fc3a4cbf4d5dc6812392283cd089daa456fd5823" }, "downloads": -1, "filename": "collective.buildbot-0.3.1.tar.gz", "has_sig": false, "md5_digest": "f5c99dd7dd5cb0abf424f435934f1e55", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 42449, "upload_time": "2008-05-31T18:31:36", "url": "https://files.pythonhosted.org/packages/4e/4f/a33755e9a008fa3a08b8e96e27171301a51967c1220f0a4a2794822265b9/collective.buildbot-0.3.1.tar.gz" } ], "0.3.2": [ { "comment_text": "", "digests": { "md5": "63996b3f80c4aa64fe19bee89b68b945", "sha256": "61aa10118c1b3cac1b21e4bd2eb9cb754bde2f6795ab10574b4eb740c08ba8b2" }, "downloads": -1, "filename": "collective.buildbot-0.3.2.tar.gz", "has_sig": false, "md5_digest": "63996b3f80c4aa64fe19bee89b68b945", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 51089, "upload_time": "2008-09-14T17:15:48", "url": "https://files.pythonhosted.org/packages/08/d5/7b2e128ad8bfd428f23eabb486708fee4f0ce0faf22e6a5962ae021e6144/collective.buildbot-0.3.2.tar.gz" } ], "0.3.3": [ { "comment_text": "", "digests": { "md5": "c87dafd01c73a83246c5e3b60f750200", "sha256": "7dd2a5776b52258002702f0a99e0a41610332bdcd45058ec9ea864935444b99e" }, "downloads": -1, "filename": "collective.buildbot-0.3.3.tar.gz", "has_sig": false, "md5_digest": "c87dafd01c73a83246c5e3b60f750200", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 51214, "upload_time": "2008-09-26T20:45:46", "url": "https://files.pythonhosted.org/packages/bd/8b/e46f0bb7ba753d360cca0010b6f39a29e075d0a4bc029381075a57392927/collective.buildbot-0.3.3.tar.gz" } ], "0.3.4": [ { "comment_text": "", "digests": { "md5": "e2967e37314eb53f8172d779cee0fc07", "sha256": "2249227b15a2e939b84efcd468664d75cd4ace4fd5fa8c8cf2e4bba511343c65" }, "downloads": -1, "filename": "collective.buildbot-0.3.4.tar.gz", "has_sig": false, "md5_digest": "e2967e37314eb53f8172d779cee0fc07", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 59163, "upload_time": "2009-05-21T11:32:51", "url": "https://files.pythonhosted.org/packages/8c/bb/2063b26e3e7b17268c83a6272145de9e3e3346401445d8b6cc6d4e0bbe95/collective.buildbot-0.3.4.tar.gz" } ], "0.3.4dev-r86539": [ { "comment_text": "", "digests": { "md5": "ebce8aaed15707c1706f570fe2a94ee8", "sha256": "e7b41edf8f425c084d63269af190d2d37c9b977b805d83ecd9d955a6680a9209" }, "downloads": -1, "filename": "collective.buildbot-0.3.4dev-r86539.tar.gz", "has_sig": false, "md5_digest": "ebce8aaed15707c1706f570fe2a94ee8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 59208, "upload_time": "2009-05-21T11:32:31", "url": "https://files.pythonhosted.org/packages/94/dc/ba296297c0c8962442d5929fd38f984c2b1224efbcdd12973ebeb5d4b7f3/collective.buildbot-0.3.4dev-r86539.tar.gz" } ], "0.3.5": [ { "comment_text": "", "digests": { "md5": "87f8207c4305035f03797181a2205bff", "sha256": "594ed7e7367a4f936dc4af350ceddb38c0b7e2bbde04d7cd4258912187861e54" }, "downloads": -1, "filename": "collective.buildbot-0.3.5.tar.gz", "has_sig": false, "md5_digest": "87f8207c4305035f03797181a2205bff", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 59345, "upload_time": "2009-07-17T13:37:20", "url": "https://files.pythonhosted.org/packages/d5/fb/8536db5e3e8ee1c8490a90331b101c8fed5b011a8387f891b446798e26f3/collective.buildbot-0.3.5.tar.gz" } ], "0.3.6": [ { "comment_text": "", "digests": { "md5": "cbc74eb06edc838501f2a1466af0a4ad", "sha256": "cc532b76f8a5acddd7aa8322b9796f786176c56d268ad104bffa7ca852a66d51" }, "downloads": -1, "filename": "collective.buildbot-0.3.6.tar.gz", "has_sig": false, "md5_digest": "cbc74eb06edc838501f2a1466af0a4ad", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 64346, "upload_time": "2009-12-22T11:35:44", "url": "https://files.pythonhosted.org/packages/5b/82/6ee5b4daadb87a52aa3b5d2cdaf8ec2f50adf499d894c0d52b01256ad0b2/collective.buildbot-0.3.6.tar.gz" } ], "0.3.7": [ { "comment_text": "", "digests": { "md5": "08aba2dd336c9a19c96ed7cbb736b8a8", "sha256": "081e8d8ea09e317dfaa83cd4c3f51c2d955903cc848991908e71e2bcf0b87f1b" }, "downloads": -1, "filename": "collective.buildbot-0.3.7.tar.gz", "has_sig": false, "md5_digest": "08aba2dd336c9a19c96ed7cbb736b8a8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 64896, "upload_time": "2010-01-24T12:39:33", "url": "https://files.pythonhosted.org/packages/7e/1e/aad37c68f8aac4811a5bea3f9aa07104dda944ed316bd8722454fb1714ac/collective.buildbot-0.3.7.tar.gz" } ], "0.4": [ { "comment_text": "", "digests": { "md5": "a91f220514a965db1a8e89052bdc910e", "sha256": "fdc2425f3cda93e1a7c86707f2dfe15567843e4d97386f7cb0a8691e99eecec6" }, "downloads": -1, "filename": "collective.buildbot-0.4.tar.gz", "has_sig": false, "md5_digest": "a91f220514a965db1a8e89052bdc910e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 68304, "upload_time": "2010-02-19T12:03:44", "url": "https://files.pythonhosted.org/packages/83/a2/4653a93bd7cb8dacb11f2a7712f933919e5330ed2e13db5bbb3b6376e513/collective.buildbot-0.4.tar.gz" } ], "0.4.1": [ { "comment_text": "", "digests": { "md5": "f495c143b035e4c0ced40d6d2214a9ea", "sha256": "7162f0dbf2d250f4465d10afc2c678d6e4b0d2c93fe547923ef2e7303df09903" }, "downloads": -1, "filename": "collective.buildbot-0.4.1.tar.gz", "has_sig": false, "md5_digest": "f495c143b035e4c0ced40d6d2214a9ea", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 68188, "upload_time": "2010-04-13T18:51:38", "url": "https://files.pythonhosted.org/packages/8c/1a/e39344e7f80f4ca1ddd1cb4520c984067ef4391e83e87c0d35f22bff2688/collective.buildbot-0.4.1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "f495c143b035e4c0ced40d6d2214a9ea", "sha256": "7162f0dbf2d250f4465d10afc2c678d6e4b0d2c93fe547923ef2e7303df09903" }, "downloads": -1, "filename": "collective.buildbot-0.4.1.tar.gz", "has_sig": false, "md5_digest": "f495c143b035e4c0ced40d6d2214a9ea", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 68188, "upload_time": "2010-04-13T18:51:38", "url": "https://files.pythonhosted.org/packages/8c/1a/e39344e7f80f4ca1ddd1cb4520c984067ef4391e83e87c0d35f22bff2688/collective.buildbot-0.4.1.tar.gz" } ] }