[Buildbot-devel] BuildBot, twisted reactor and dynamic config
Edward Armes
edward.armes at gmail.com
Thu Nov 6 10:55:23 UTC 2014
Hi Vitali,
Thank you for your response. I has coincided doing something similar but
sadly its not quite what I'm trying to achieve. Thanks for your suggestion.
Edward
On Wed, Nov 5, 2014 at 10:19 AM, Vitali Lovich <vlovich at gmail.com> wrote:
> The builder is pretty simple. CommandInjectionStep is a custom build step
> I have to have the repository generate some sanitized python code that I
> parse the AST for & convert into build steps.
> It’s pretty hacky: a formal JSON protocol might be nicer & safer (if
> potentially more limiting).
> SubmissionBuildMixin is something else that lets me inject locks into a
> build. Dustin suggested in an earlier thread a better mechanism that would
> be appropriate for buildbot.
>
> class DynamicRemoteBuild(Build, SubmissionBuildMixin):
> def startBuild(self, build_status, expectations, slavebuilder):
> SubmissionBuildMixin.configureSubmissionLock(self, build_status)
> return Build.startBuild(self, build_status, expectations,
> slavebuilder)
>
> def stepDone(self, result, step):
> # I have a special CommandInjectionStep that I know about.
> # If this were part of buildbot proper, we could just add all of
> this to the base builder/step (i.e. any step
> # could declare extraNextSteps or something like that.
> if isinstance(step, CommandInjectionStep):
> # Python doesn't have an API to do bulk insert in-place
> # reverse in-place & appending seems like it should be OK
> toInject = step.stepsToInject()
> for injectedStep in toInject:
> step_status =
> self.build_status.addStepWithName(injectedStep.name)
> injectedStep.setStepStatus(step_status)
>
> log.msg("Injecting {} steps: [{}]".format(len(toInject),
> '\n\t'.join([str(s) for s in toInject])))
>
> # step == step0
> # (remaining) self.steps = [step1, step2, step3, step4]
> # toInject = [step0a, step0b, step0c]
> # we want self.steps to be:
> # [step0a, step0b, step0c, step1, step2, step3, step4]
>
> # reverse both lists:
> # self.steps = [step4, step3, step2, step1]
> # toInject = [step0c, step0b, step0a]
> toInject.reverse()
> self.steps.reverse()
> # append all the steps to inject
> # [step4, step3, step2, step1, step0c, step0b, step0a]
> self.steps.extend(toInject)
> # reverse again & we get the intended ordering
> self.steps.reverse()
> log.msg("remaining steps after injection =
> {}".format(self.steps))
>
> # Build is currently an old-style class for some reason
> if issubclass(self.__class__, object):
> terminate = super(Build, self).stepDone(result, step)
> else:
> terminate = Build.stepDone(self, result, step)
> return terminate
>
>
>
> On Nov 5, 2014, at 1:48 AM, Vasily <vasslitvinov at pisem.net> wrote:
>
> Hi Vitali,
>
> Could you please post some snippets of how your idea works?
> Maybe posting it to Buildbot Wiki as well would be great...
>
> Thanks,
> Vasily
>
> 2014-11-03 21:37 GMT+03:00 Vitali Lovich <vlovich at gmail.com>:
>
>>
>> > On Nov 3, 2014, at 10:12 AM, Edward Armes <edward.armes at gmail.com>
>> wrote:
>> >
>> > Hi all,
>> >
>> > I'm currently using BuildBot in a personal project and I'm looking into
>> doing dynamic config.
>> >
>> > First of all a disclaimer: I know that the documented way of doing this
>> is to make a change and then tell BuildBot to restart.
>> >
>> > That being said I'm currently looking at more complex methods involving
>> concurrency and the twisted reactor. However I could do with knowing a few
>> more things or knowing the best place to look.
>> >
>> > 1. Does the BuildBot configuration object store the items in some way
>> that would prevent a dynamic dictionary of some form?
>> I did something similar, but without a dynamic dictionary (I don’t
>> imagine it would work).
>> Instead, I just set a custom Build class. I wanted to allow for a step
>> whereby the project could specify it’s own steps (e.g. build source code,
>> run tests, etc) instead of the typical way of having a single giant
>> shell script. So I overrode stepDone: if the step that was done was my
>> special injection step, I grab the new set of steps and simply extend
>> self.steps (actually self.steps.reverse(), self.steps.extend(newSteps),
>> self.steps.reverse()). Then I just delegate to the parent’s stepDone.
>>
>> This works reasonably well.
>>
>> > 2. Can all items that use the configuration object handle twisted defer
>> objects?
>> >
>> > 3. How difficult is it to customize and modify the web status to add
>> auth (via twisted.cred).
>> >
>> > 4. Other than the "magic" URL's described in the docs are there any
>> other undocumented gotchas to watch out for?
>> >
>> ------------------------------------------------------------------------------
>> > _______________________________________________
>> > Buildbot-devel mailing list
>> > Buildbot-devel at lists.sourceforge.net
>> > https://lists.sourceforge.net/lists/listinfo/buildbot-devel
>>
>>
>>
>> ------------------------------------------------------------------------------
>> _______________________________________________
>> Buildbot-devel mailing list
>> Buildbot-devel at lists.sourceforge.net
>> https://lists.sourceforge.net/lists/listinfo/buildbot-devel
>>
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://buildbot.net/pipermail/devel/attachments/20141106/8bc1f849/attachment.html>
More information about the devel
mailing list