[Buildbot-devel] copying properties from a triggered build to the triggering build
Yasser LEBON
yasser.lebon at gmail.com
Tue Jun 24 09:38:26 UTC 2014
You can do something like this to set the sharre the property to your next
build.
step1 = Trigger(
set_parent_properties = ['<your_shared_property>']
)
step2 = Trigger(
set_properties = {
'property1': <your_shared_property>
}
)
2014-06-24 3:09 GMT+02:00 AMARASINGHAM, Chandra <
Chandra.Amarasingham at sdspathology.com.au>:
> the property does get set on the parent...I can see it...but I think
> there is a slight delay, so the next trigger does not get it.
>
> Chandra
>
>
> *Chandra Amarasingham*
> Analyst Programmer
> Specialist Diagnostic Services Pty Ltd
> 17 Enterprise Grove, Mt Helen, 3350
> Federation University Technology Park
>
> T: (03) 5330 1056 ext 212
>
> This email (including any attachments) is intended only for the
> addressee. It may contain confidential or legally privileged information.
> Confidentiality and privilege are not waived or lost if you are not the
> intended recipient of this email, nor may you use, review, disclose,
> disseminate or copy any information contained in or attached to it. If you
> receive this email in error, please delete it and any attachments from your
> system and notify us immediately. It is your responsibility to check this
> email and any attachments, before opening or using them, for viruses or
> defects. You assume all liability arising from opening or using this email
> and any attachment.
> ------------------------------
> *From:* AMARASINGHAM, Chandra
> *Sent:* Tuesday, 24 June 2014 11:00 AM
> *To:* buildbot-devel at lists.sourceforge.net
>
> *Subject:* Re: [Buildbot-devel] copying properties from a triggered build
> to the triggering build
>
> Hi Vasily, Yasser.
>
>
>
> Yasser's suggestion worked for me except for one hitch...I think due to
> the asynchronous nature of things. I copied code from where Yasser
> suggested and have included the new class I created below. I think the
> problem is due to self.createLinksAndProperties firing slightly after the
> next buildstep (also a trigger) runs. I want the next buildstep to inherit
> a property from the previous trigger, thus the reason for this code. Any
> comments or ideas?
>
>
>
> class CopyPropertyParentTrigger(LoggingBuildStep):
> name = "trigger"
>
> renderables = [ 'set_properties', 'schedulerNames', 'sourceStamps',
> 'updateSourceStamp', 'alwaysUseLatest' ]
>
> flunkOnFailure = True
>
> def __init__(self, schedulerNames=[], sourceStamp = None, sourceStamps
> = None,
> updateSourceStamp=None, alwaysUseLatest=False,
> waitForFinish=False, set_properties={},
> set_parent_properties=[],
> copy_properties=[], **kwargs):
> if not schedulerNames:
> config.error(
> "You must specify a scheduler to trigger")
> if (sourceStamp or sourceStamps) and (updateSourceStamp is not
> None):
> config.error(
> "You can't specify both sourceStamps and
> updateSourceStamp")
> if (sourceStamp or sourceStamps) and alwaysUseLatest:
> config.error(
> "You can't specify both sourceStamps and alwaysUseLatest")
> if alwaysUseLatest and (updateSourceStamp is not None):
> config.error(
> "You can't specify both alwaysUseLatest and
> updateSourceStamp"
> )
> self.schedulerNames = schedulerNames
> self.sourceStamps = sourceStamps or []
> if sourceStamp:
> self.sourceStamps.append(sourceStamp)
> if updateSourceStamp is not None:
> self.updateSourceStamp = updateSourceStamp
> else:
> self.updateSourceStamp = not (alwaysUseLatest or
> self.sourceStamps)
> self.alwaysUseLatest = alwaysUseLatest
> self.waitForFinish = waitForFinish
> properties = {}
> properties.update(set_properties)
> for i in copy_properties:
> properties[i] = Property(i)
> self.set_properties = properties
> self.set_parent_properties = set_parent_properties
> self.running = False
> self.ended = False
> LoggingBuildStep.__init__(self, **kwargs)
>
> def interrupt(self, reason):
> if self.running and not self.ended:
> self.step_status.setText(["interrupted"])
> return self.end(EXCEPTION)
>
> def end(self, result):
> if not self.ended:
> self.ended = True
> return self.finished(result)
>
> # Create the properties that are used for the trigger
> def createTriggerProperties(self):
> # make a new properties object from a dict rendered by the old
> # properties object
> trigger_properties = Properties()
> trigger_properties.update(self.set_properties, "Trigger")
> return trigger_properties
>
> # Get all scheduler instances that were configured
> # A tuple of (triggerables, invalidnames) is returned
> def getSchedulers(self):
> all_schedulers =
> self.build.builder.botmaster.parent.allSchedulers()
> all_schedulers = dict([(sch.name, sch) for sch in all_schedulers])
> invalid_schedulers = []
> triggered_schedulers = []
> # don't fire any schedulers if we discover an unknown one
> for scheduler in self.schedulerNames:
> scheduler = scheduler
> if all_schedulers.has_key(scheduler):
> sch = all_schedulers[scheduler]
> if ITriggerableScheduler.providedBy(sch):
> triggered_schedulers.append(sch)
> else:
> invalid_schedulers.append(scheduler)
> else:
> invalid_schedulers.append(scheduler)
>
> return (triggered_schedulers, invalid_schedulers)
>
> def prepareSourcestampListForTrigger(self):
> if self.sourceStamps:
> ss_for_trigger = {}
> for ss in self.sourceStamps:
> codebase = ss.get('codebase','')
> assert codebase not in ss_for_trigger, "codebase specified
> multiple times"
> ss_for_trigger[codebase] = ss
> return ss_for_trigger
>
> if self.alwaysUseLatest:
> return {}
>
> # start with the sourcestamps from current build
> ss_for_trigger = {}
> objs_from_build = self.build.getAllSourceStamps()
> for ss in objs_from_build:
> ss_for_trigger[ss.codebase] = ss.asDict()
>
> # overrule revision in sourcestamps with got revision
> if self.updateSourceStamp:
> got = self.build.build_status.getAllGotRevisions()
> for codebase in ss_for_trigger:
> if codebase in got:
> ss_for_trigger[codebase]['revision'] = got[codebase]
>
> return ss_for_trigger
>
> @defer.inlineCallbacks
> def start(self):
> # Get all triggerable schedulers and check if there are invalid
> schedules
> (triggered_schedulers, invalid_schedulers) = self.getSchedulers()
> if invalid_schedulers:
> self.step_status.setText(['not valid scheduler:'] +
> invalid_schedulers)
> self.end(FAILURE)
> return
>
> self.running = True
>
> props_to_set = self.createTriggerProperties()
>
> ss_for_trigger = self.prepareSourcestampListForTrigger()
>
> dl = []
> triggered_names = []
> for sch in triggered_schedulers:
> dl.append(sch.trigger(ss_for_trigger, set_props=props_to_set))
> triggered_names.append(sch.name)
> self.step_status.setText(['triggered'] + triggered_names)
>
> if self.waitForFinish:
> rclist = yield defer.DeferredList(dl, consumeErrors=1)
> else:
> # do something to handle errors
> for d in dl:
> d.addErrback(log.err,
> '(ignored) while invoking Triggerable schedulers:')
> rclist = None
> self.end(SUCCESS)
> return
>
> was_exception = was_failure = False
> brids = {}
> for was_cb, results in rclist:
> if isinstance(results, tuple):
> results, some_brids = results
> brids.update(some_brids)
>
> if not was_cb:
> was_exception = True
> log.err(results)
> continue
>
> if results==FAILURE:
> was_failure = True
>
> if was_exception:
> result = EXCEPTION
> elif was_failure:
> result = FAILURE
> else:
> result = SUCCESS
>
> if brids:
> master = self.build.builder.botmaster.parent
> def add_links(res):
> # reverse the dictionary lookup for brid to builder name
> brid_to_bn = dict((_brid,_bn) for _bn,_brid in
> brids.iteritems())
>
> for was_cb, builddicts in res:
> if was_cb:
> for build in builddicts:
> bn = brid_to_bn[build['brid']]
> num = build['number']
>
> url = master.status.getURLForBuild(bn, num)
> self.step_status.addURL("%s #%d" % (bn,num),
> url)
>
> return self.end(result)
>
> builddicts = [master.db.builds.getBuildsForRequest(br) for br
> in brids.values()]
> dl = defer.DeferredList(builddicts, consumeErrors=1)
> dl.addCallback(self.createLinksAndProperties, result, brids)
> # import time
> # while not dl.called:
> # time.sleep(1000)
> # pass
> #log = LogPublisher()
> #log.msg("after adding createLinksAndProperties callback")
> self.step_status.setText("after adding
> createLinksAndProperties callback")
>
> self.end(result)
> return
>
> def createLinksAndProperties(self, res, result, brids):
>
> master = self.build.builder.botmaster.parent
>
> # reverse the dictionary lookup for brid to builder name
>
> brid_to_bn = dict((_brid, _bn) for _bn, _brid in brids.iteritems())
>
>
>
> for was_cb, builddicts in res:
>
> if was_cb:
>
> for build in builddicts:
>
> bn = brid_to_bn[build['brid']]
>
> num = build['number']
>
> url = master.status.getURLForBuild(bn, num)
>
> self.step_status.addURL("%s #%d" % (bn, num), url)
> self.step_status.setText("in createLinksAndProperties")
>
>
>
> if self.waitForFinish and self.set_parent_properties:
>
> build_instance =
> master.status.getBuilder(bn).getBuildByNumber(build['number'])
>
> for prop_name in self.set_parent_properties:
>
> if build_instance.getProperty(prop_name):
>
> prop_value = build_instance.getProperty(prop_name)
>
> self.setProperty(prop_name, prop_value, "Trigger")
> self.step_status.setText("in setting property " +
> prop_name)
> #log = LogPublisher()
> #log.msg("after setting property")
>
>
>
>
> return self.end(result)
>
>
> *Chandra Amarasingham*
> Analyst Programmer
> Specialist Diagnostic Services Pty Ltd
> 17 Enterprise Grove, Mt Helen, 3350
> Federation University Technology Park
>
> T: (03) 5330 1056 ext 212
>
> This email (including any attachments) is intended only for the
> addressee. It may contain confidential or legally privileged information.
> Confidentiality and privilege are not waived or lost if you are not the
> intended recipient of this email, nor may you use, review, disclose,
> disseminate or copy any information contained in or attached to it. If you
> receive this email in error, please delete it and any attachments from your
> system and notify us immediately. It is your responsibility to check this
> email and any attachments, before opening or using them, for viruses or
> defects. You assume all liability arising from opening or using this email
> and any attachment.
> ------------------------------
> *From:* Vasily [vasslitvinov at pisem.net]
> *Sent:* Wednesday, 18 June 2014 6:10 PM
> *To:* AMARASINGHAM, Chandra
> *Cc:* buildbot-devel at lists.sourceforge.net
> *Subject:* Re: [Buildbot-devel] copying properties from a triggered build
> to the triggering build
>
> Hi,
>
> That seems to be impossible, at least without tinkering with low-level
> stuff.
>
> Could you post what you're trying to achieve? Maybe there's an easier
> way...
>
> Thanks,
> Vasily
> 18.06.2014 6:15 пользователь "AMARASINGHAM, Chandra" <
> Chandra.Amarasingham at sdspathology.com.au> написал:
>
>> Hi All,
>>
>>
>>
>> Is there an easy way to copy properties from a triggered build to the
>> triggering build?
>>
>>
>>
>> The approach I am trying to take at the moment, is to pass a property
>> which contains a parent build identifier (I am a little confused as to what
>> I should use...bid, brid, bsid. And the set the property on the parent
>> build from the triggered build....I am bit confused as to how to achieve
>> this also.
>>
>>
>>
>> Regards,
>>
>> Chandra
>>
>>
>> *Chandra Amarasingham*
>> Analyst Programmer
>> Specialist Diagnostic Services Pty Ltd
>> 17 Enterprise Grove, Mt Helen, 3350
>> Federation University Technology Park
>>
>> T: (03) 5330 1056 ext 212
>>
>> This email (including any attachments) is intended only for the
>> addressee. It may contain confidential or legally privileged information.
>> Confidentiality and privilege are not waived or lost if you are not the
>> intended recipient of this email, nor may you use, review, disclose,
>> disseminate or copy any information contained in or attached to it. If you
>> receive this email in error, please delete it and any attachments from your
>> system and notify us immediately. It is your responsibility to check this
>> email and any attachments, before opening or using them, for viruses or
>> defects. You assume all liability arising from opening or using this email
>> and any attachment.
>>
>>
>> ------------------------------------------------------------------------------
>> HPCC Systems Open Source Big Data Platform from LexisNexis Risk Solutions
>> Find What Matters Most in Your Big Data with HPCC Systems
>> Open Source. Fast. Scalable. Simple. Ideal for Dirty Data.
>> Leverages Graph Analysis for Fast Processing & Easy Data Exploration
>> http://p.sf.net/sfu/hpccsystems
>> _______________________________________________
>> Buildbot-devel mailing list
>> Buildbot-devel at lists.sourceforge.net
>> https://lists.sourceforge.net/lists/listinfo/buildbot-devel
>>
>>
>
> ------------------------------------------------------------------------------
> Open source business process management suite built on Java and Eclipse
> Turn processes into business applications with Bonita BPM Community Edition
> Quickly connect people, data, and systems into organized workflows
> Winner of BOSSIE, CODIE, OW2 and Gartner awards
> http://p.sf.net/sfu/Bonitasoft
> _______________________________________________
> 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/20140624/0fc573ef/attachment.html>
More information about the devel
mailing list