BuildStep classes have some extra equipment, because they are their own factories. Consider the use of a BuildStep in master.cfg:
f.addStep(MyStep(someopt="stuff", anotheropt=1))
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 factory
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
objects, call self.addFactoryArguments
with any keyword arguments your
constructor needs.
Keep a **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)