BuildStep classes have some extra equipment, because they are their own factories. Consider the use of a BuildStep in master.cfg:
This creates a single instance of class
MyStep. However, Buildbot needs
a new object each time the step is executed. this is accomplished by storing
the information required to instantiate a new object in the
attribute. When the time comes to construct a new Build, BuildFactory consults
this attribute (via
getStepFactory) and instantiates a new step object.
When writing a new step class, then, keep in mind are that you cannot do
anything "interesting" in the constructor – limit yourself to checking and
storing arguments. To ensure that these arguments are provided to any new
self.addFactoryArguments with any keyword arguments your
**kwargs argument on the end of your options, and pass that up to
the parent class's constructor.
The whole thing looks like this:
class Frobinfy(LoggingBuildStep): def __init__(self, frob_what="frobee", frob_how_many=None, frob_how=None, **kwargs): # check if frob_how_many is None: raise TypeError("Frobinfy argument how_many is required") # call parent LoggingBuildStep.__init__(self, **kwargs) # set Frobnify attributes self.frob_what = frob_what self.frob_how_many = how_many self.frob_how = frob_how # and record arguments for later self.addFactoryArguments( frob_what=frob_what, frob_how_many=frob_how_many, frob_how=frob_how) class FastFrobnify(Frobnify): def __init__(self, speed=5, **kwargs) Frobnify.__init__(self, **kwargs) self.speed = speed self.addFactoryArguments( speed=speed)