[Buildbot-devel] Exec debuild shell command only if debian/changelog was commited at subversion

J. Félix Ontañón fontanon at emergya.es
Wed Mar 12 09:57:12 UTC 2008

El Wed, 12 Mar 2008 08:37:31 +0100
"A.T.Hofkamp" <a.t.hofkamp at tue.nl> escribió:

> J. Félix Ontañón wrote:
> > I've a lot of source-packages in a subversion, and i want my
> > buildslave to, after any commit, do svn-export and make debuild
> > only of the packages that has been commited their debian/changelog
> > file.
> In general, it is considered better not to have special build magic
> in buildbot. Instead consider such scripts as part of your source
> code, so you can maintain (and use it!) away from buildbot too.
> In your case, you may want to first start writing one or more scripts
> that does what you want from the command line in a working copy.
> Once you have that, you can move it to buildbot.

First, thanks for your help, Albert.

I understand, maybe it's better to code scripts that do the checks and
only build if changelog has been changed.

But my idea behind is:

 * A SVNPoller checks svn changes every 30min (thats easy)
 * There is one Builder (buildbot builder) for each source-package in
my svn (easy too).
 * After a svn polling, a Scheduler it's dinamically created to only
execute the Builder of the source-packages with debian/changelog
modified (hard ... isnt?)
 * Final Effect: In the Waterfall you'll only see the results of the
launched Builders. (wow !)

It's possible?

>  > It's there any helping documentation?, any ideas?
> Maybe compare the MD5 hash of the changelog with the MD5 hashes of
> the already built packages?

I did that implementation to check if the debian/changelog was commited
to svn and exec something.

from twisted.python import log
from buildbot.steps import shell
from buildbot.process.buildstep import RemoteShellCommand

class ExecIfChangelogModified(shell.ShellCommand):
  def start(self):
    # Substitute build properties
    command = self._interpolateProperties(self.command)

    # fail assert if is not of correct type
    assert isinstance(command, (list, tuple, str))

    # Get changed file list from the build which invoked this step
    files = self.build.allFiles()

    # We have created the final command string
    # so we can fill out the arguments for a RemoteShellCommand
    # using our new command string
    kwargs = self.remote_kwargs
    kwargs['logfiles'] = self.logfiles

    changelog_modified = False
    for file in files:
            if kwargs['changelog'] in file:
                changelog_modified = True

    if changelog_modified:
        kwargs['command'] = command
        kwargs['command'] = ":"
        self.command = "None to build"
        # BuildStepStatus log
        self.step_status.setText(['No', 'need', 'to', 'build'])
        # Log the changed files to twistd.log
        log.msg("No build requiered: %s" % files)

    # Create the RemoteShellCommand and start it
    cmd = RemoteShellCommand(**kwargs)

In master.cfg i did:

f0 = factory.BuildFactory()
f0.addStep(ExecIfChangelogModified, command=["debuild", "-uc", "-us"])

b0 = {'name' : "apps-grubaker",
      'slavename' : "appsbuilder",
      'builddir' : "apps/grubaker",
      'factory': f0,

c['builders'] = [b0, b1, b2] <----- One builder for each source-package

But it's a real pity to have to exec every Builder in each svn-polling.

> Sincerely,
> Albert

Thanks again for your help.
> -------------------------------------------------------------------------
> This SF.net email is sponsored by: Microsoft
> Defy all challenges. Microsoft(R) Visual Studio 2008.
> http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
> _______________________________________________
> Buildbot-devel mailing list
> Buildbot-devel at lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/buildbot-devel

More information about the devel mailing list