1 from buildbot
.process
.buildstep
import LoggingBuildStep
, SUCCESS
, FAILURE
, EXCEPTION
2 from buildbot
.steps
.shell
import WithProperties
3 from buildbot
.scheduler
import Triggerable
4 from twisted
.internet
import defer
6 class Trigger(LoggingBuildStep
):
8 I trigger a Triggerable. It's fun.
16 updateSourceStamp
=False,
20 Trigger the given schedulers when this step is executed.
22 @var schedulers: list of schedulers' names that should be triggered. Schedulers
23 can be specified using WithProperties, if desired.
25 @var updateSourceStamp: should I update the source stamp to
26 an absolute SourceStamp before triggering a new build?
28 @var waitForFinish: should I wait for all of the triggered schedulers to finish
31 assert schedulers
, "You must specify a scheduler to trigger"
32 self
.schedulers
= schedulers
33 self
.updateSourceStamp
= updateSourceStamp
34 self
.waitForFinish
= waitForFinish
36 LoggingBuildStep
.__init
__(self
, **kwargs
)
37 self
.addFactoryArguments(schedulers
=schedulers
,
38 updateSourceStamp
=updateSourceStamp
,
39 waitForFinish
=waitForFinish
)
41 def interrupt(self
, reason
):
43 self
.step_status
.setColor("red")
44 self
.step_status
.setText(["interrupted"])
48 ss
= self
.build
.getSourceStamp()
49 if self
.updateSourceStamp
:
50 ss
= ss
.getAbsoluteSourceStamp(self
.build
.getProperty('got_revision'))
51 # (is there an easier way to find the BuildMaster?)
52 all_schedulers
= self
.build
.builder
.botmaster
.parent
.allSchedulers()
53 all_schedulers
= dict([(sch
.name
, sch
) for sch
in all_schedulers
])
54 unknown_schedulers
= []
55 triggered_schedulers
= []
58 for scheduler
in self
.schedulers
:
59 if isinstance(scheduler
, WithProperties
):
60 scheduler
= scheduler
.render(self
.build
)
61 if all_schedulers
.has_key(scheduler
):
62 sch
= all_schedulers
[scheduler
]
63 if isinstance(sch
, Triggerable
):
64 dl
.append(sch
.trigger(ss
))
65 triggered_schedulers
.append(scheduler
)
67 unknown_schedulers
.append(scheduler
)
69 unknown_schedulers
.append(scheduler
)
71 if unknown_schedulers
:
72 self
.step_status
.setColor("red")
73 self
.step_status
.setText(['no scheduler:'] + unknown_schedulers
)
77 self
.step_status
.setText(['triggered'] + triggered_schedulers
)
78 if self
.waitForFinish
:
79 self
.step_status
.setColor("yellow")
81 self
.step_status
.setColor("green")
83 if self
.waitForFinish
:
84 d
= defer
.DeferredList(dl
, consumeErrors
=1)
90 for was_cb
, buildsetstatus
in rclist
:
91 # TODO: make this algo more configurable
95 if buildsetstatus
.getResults() == FAILURE
:
97 return self
.finished(rc
)
100 return self
.finished(FAILURE
)
102 d
.addCallbacks(cb
, eb
)