[Buildbot-devel] User/pass authentication in buildbot.step.source SVN

Degremont, Guillaume guillaume.degremont at hp.com
Fri Feb 1 10:39:42 UTC 2008


Hello,

I am trying to setup a buildbot. My source code is located in a svn repository, which requires authentication for checkout.

Reading from buildbot/steps/source.py, it seems that the username/password is not handled in the SVN class.
I am a newbie to python, but I tried to create a class Authenticated_SVN(SVN), with the __init__ handling the storage of username and password. In the startVC, I first tried to add the username and the password in the self.args dictionnary that is transmitted to the LoggedRemoteCommand, but it failed.

I then tried to replace the "svn" passed to LoggedRemoteCommand, with "snv --username %s --password %s". And it still failed.


Can anyone help me ?

And by the way, is there a reason why the user/pass authentication is implemented in the svnPoller but not in the SVN ? (maybe there is a good reason I missed)

Best regards,
Guillaume



Here is the code of my class and how I use it:
class Authenticated_SVN(SVN):
    def __init__(self, svnuser, svnpasswd, **kwargs):
        """
        @type  svnuser: string
        @param svnuser: the user name used to authenticate to the svn base

        @type  svnpasswd: string
        @param svnpasswd: the password used to authenticate to the svn base
        """
        self.svnuser = svnuser
        self.svnpasswd = svnpasswd
        SVN.__init__(self, **kwargs)


    def startVC(self, branch, revision, patch):

        # handle old slaves
        warnings = []
        slavever = self.slaveVersion("svn", "old")
        if not slavever:
            m = "slave does not have the 'svn' command"
            raise BuildSlaveTooOldError(m)

        if self.slaveVersionIsOlderThan("svn", "1.39"):
            # the slave doesn't know to avoid re-using the same sourcedir
            # when the branch changes. We have no way of knowing which branch
            # the last build used, so if we're using a non-default branch and
            # either 'update' or 'copy' modes, it is safer to refuse to
            # build, and tell the user they need to upgrade the buildslave.
            if (branch != self.branch
                and self.args['mode'] in ("update", "copy")):
                m = ("This buildslave (%s) does not know about multiple "
                     "branches, and using mode=%s would probably build the "
                     "wrong tree. "
                     "Refusing to build. Please upgrade the buildslave to "
                     "buildbot-0.7.0 or newer." % (self.build.slavename,
                                                   self.args['mode']))
                raise BuildSlaveTooOldError(m)

        if slavever == "old":
            # 0.5.0 compatibility
            if self.args['mode'] in ("clobber", "copy"):
                # TODO: use some shell commands to make up for the
                # deficiency, by blowing away the old directory first (thus
                # forcing a full checkout)
                warnings.append("WARNING: this slave can only do SVN updates"
                                ", not mode=%s\n" % self.args['mode'])
                log.msg("WARNING: this slave only does mode=update")
            if self.args['mode'] == "export":
                raise BuildSlaveTooOldError("old slave does not have "
                                            "mode=export")
            self.args['directory'] = self.args['workdir']
            if revision is not None:
                # 0.5.0 can only do HEAD. We have no way of knowing whether
                # the requested revision is HEAD or not, and for
                # slowly-changing trees this will probably do the right
                # thing, so let it pass with a warning
                m = ("WARNING: old slave can only update to HEAD, not "
                     "revision=%s" % revision)
                log.msg(m)
                warnings.append(m + "\n")
            revision = "HEAD" # interprets this key differently
            if patch:
                raise BuildSlaveTooOldError("old slave can't do patch")

        if self.svnurl:
            assert not branch # we need baseURL= to use branches
            self.args['svnurl'] = self.svnurl
        else:
            self.args['svnurl'] = self.baseURL + branch
        self.args['revision'] = revision
        self.args['patch'] = patch

        revstuff = []
        if branch is not None and branch != self.branch:
            revstuff.append("[branch]")
        if revision is not None:
            revstuff.append("r%s" % revision)
        if patch is not None:
            revstuff.append("[patch]")
        self.description.extend(revstuff)
        self.descriptionDone.extend(revstuff)

        ## first try, failed spectacularly
        #self.args['username'] = self.svnuser
        #self.args['password'] = self.svnpasswd
        #cmd = LoggedRemoteCommand("svn", self.args)

        ## second try, failed too :/
        svn_string = "snv --username %s --password %s " % (self.svnuser, self.svnpasswd)
        cmd = LoggedRemoteCommand(svn_string, self.args)
        self.startCommand(cmd, warnings)

mybuildFactory.addStep(Authenticated_SVN(svnuser=svnuser, svnpasswd=svnpass, baseURL=svnurl+'/', defaultBranch='trunk', mode='update'),haltOnFailure=True)


Here is my error log:

2008/02/01 12:33 +0200 [Broker,0,16.16.91.200] Build.setupBuild failed
2008/02/01 12:33 +0200 [Broker,0,16.16.91.200] Unhandled Error
        Traceback (most recent call last):
          File "/usr/lib/python2.4/site-packages/twisted/internet/defer.py", line 239, in callback
            self._startRunCallbacks(result)
          File "/usr/lib/python2.4/site-packages/twisted/internet/defer.py", line 304, in _startRunCallbacks
            self._runCallbacks()
          File "/usr/lib/python2.4/site-packages/twisted/internet/defer.py", line 317, in _runCallbacks
            self.result = callback(self.result, *args, **kw)
          File "/usr/lib/python2.4/site-packages/buildbot/process/builder.py", line 616, in _startBuild_2
            d = build.startBuild(bs, self.expectations, sb)
        --- <exception caught here> ---
          File "/usr/lib/python2.4/site-packages/buildbot/process/base.py", line 300, in startBuild
            self.setupBuild(expectations) # create .steps
          File "/usr/lib/python2.4/site-packages/buildbot/process/base.py", line 351, in setupBuild
            step = factory(**args)
        exceptions.TypeError: __init__() takes exactly 3 non-keyword arguments (1 given)




More information about the devel mailing list