[jhbuild] [builbot] add support for the nightly scheduler (GNOME bug 591231)



commit 0f4548721255ac5172bc0cc55c5484710da0ac6b
Author: Frédéric Péters <fpeters 0d be>
Date:   Fri Nov 27 15:08:22 2009 +0100

    [builbot] add support for the nightly scheduler (GNOME bug 591231)
    
    A slave can be set to use that scheduler from its configuration file, from
    /config/scheduler:
      <config>
        <scheduler>nightly</scheduler>
      </config>
    
    And there is support for all buildbot nightly scheduler keywords (minute,
    hour, dayOfWeek, month, dayOfMonth); to get a build started every xx:06:
      <nightly_scheduler>
        <minute>6</minute>
      </nightly_scheduler>

 jhbuild/buildbot/scheduler.py |   35 +++++++++++++++++++++++++++++++++--
 jhbuild/commands/bot.py       |   33 ++++++++++++++++++++++++++++++---
 2 files changed, 63 insertions(+), 5 deletions(-)
---
diff --git a/jhbuild/buildbot/scheduler.py b/jhbuild/buildbot/scheduler.py
index 4c3749a..d7dc242 100644
--- a/jhbuild/buildbot/scheduler.py
+++ b/jhbuild/buildbot/scheduler.py
@@ -23,7 +23,7 @@ from twisted.application import service, internet
 from twisted.python import log
 
 from twisted.internet import reactor
-from buildbot.scheduler import Periodic, BaseUpstreamScheduler, Scheduler
+from buildbot.scheduler import Periodic, BaseUpstreamScheduler, Scheduler, Nightly
 from buildbot.sourcestamp import SourceStamp
 from buildbot import buildset, util
 
@@ -33,6 +33,14 @@ def SerialScheduler(name, project, builderNames, periodicBuildTimer=60*60*12,
         return StartSerial(name, project, builderNames, periodicBuildTimer, branch)
     return Serial(name, project, upstream, builderNames, branch)
 
+def NightlySerialScheduler(name, project, builderNames,
+        minute=0, hour='*', dayOfMonth='*', month='*', dayOfWeek='*',
+        upstream=None, branch=None):
+    if not upstream:
+        return NightlyStartSerial(name, project, builderNames,
+                minute, hour, dayOfMonth, month, dayOfWeek, branch)
+    return Serial(name, project, upstream, builderNames, branch)
+
 
 class OnCommitScheduler(Scheduler):
     '''
@@ -70,7 +78,6 @@ class OnCommitScheduler(Scheduler):
         else:
             self.addUnimportantChange(change)
 
-
 class StartSerial(Periodic):
 
     def __init__(self, name, project, builderNames, periodicBuildTimer,
@@ -140,3 +147,27 @@ class Serial(BaseUpstreamScheduler):
         bs = buildset.BuildSet(self.builderNames, SourceStamp(branch=self.branch))
         self.submitBuildSet(bs)
 
+
+class NightlyStartSerial(Nightly):
+    def __init__(self, name, project, builderNames,
+                 minute=0, hour='*', dayOfMonth='*', month='*', dayOfWeek='*',
+                 branch=None):
+        Nightly.__init__(self, name, builderNames, minute, hour, dayOfMonth,
+                         month, dayOfWeek, branch)
+        self.project = project
+        self.finishedWatchers = []
+
+    def subscribeToFinishedBuilds(self, watcher):
+        self.finishedWatchers.append(watcher)
+
+    def unsubscribeToFinishedBuilds(self, watcher):
+        self.finishedWatchers.remove(watcher)
+
+    def buildSetFinished(self, bss):
+        if not self.running:
+            return
+        ss = bss.getSourceStamp()
+        for w in self.finishedWatchers:
+            w(ss)
+        Nightly.buildSetFinished(self,bss)
+
diff --git a/jhbuild/commands/bot.py b/jhbuild/commands/bot.py
index 8996056..db3de5b 100644
--- a/jhbuild/commands/bot.py
+++ b/jhbuild/commands/bot.py
@@ -279,6 +279,7 @@ class cmd_bot(Command):
             version = None
 
             max_builds = 2
+            scheduler = None
 
             run_checks = True
             run_coverage_report = False
@@ -296,6 +297,12 @@ class cmd_bot(Command):
                 for attribute in ('config/max_builds', 'config/missing_timeout',
                             'config/run_checks', 'config/run_coverage_report',
                             'config/run_clean_afterwards',
+                            'config/scheduler',
+                            'nightly_scheduler/minute',
+                            'nightly_scheduler/hour',
+                            'nightly_scheduler/dayOfMonth',
+                            'nightly_scheduler/month',
+                            'nightly_scheduler/dayOfWeek',
                             'info/contact_name', 'info/contact_email',
                             'info/url', 'info/distribution', 'info/architecture',
                             'info/version'):
@@ -303,6 +310,7 @@ class cmd_bot(Command):
                     try:
                         value = cfg.find(attribute).text
                     except AttributeError:
+                        print 'FAILED 1'
                         continue
 
                     if attr_name in ('max_builds', 'missing_timeout'): # int value
@@ -314,8 +322,20 @@ class cmd_bot(Command):
                     if attr_name in ('run_checks', 'run_coverage_report', 'run_clean_afterwards'):
                         value = (value == 'yes')
 
+                    if attr_name in ('minute', 'hour', 'dayOfMonth', 'month', 'dayOfWeek'):
+                        try:
+                            value = int(value)
+                        except ValueError:
+                            value = '*'
+
                     setattr(self, attr_name, value)
 
+                if self.scheduler == 'nightly':
+                    self.nightly_kwargs = {}
+                    for attr_name in ('minute', 'hour', 'dayOfMonth', 'month', 'dayOfWeek'):
+                        if hasattr(self, attr_name):
+                            self.nightly_kwargs[attr_name] = getattr(self, attr_name)
+
         class JhBuildMaster(BuildMaster):
             jhbuild_config = config
             def loadConfig(self, f):
@@ -389,14 +409,21 @@ class cmd_bot(Command):
                     config['change_source'] = PBChangeSource()
 
                 # Schedulers
-                from jhbuild.buildbot.scheduler import SerialScheduler, OnCommitScheduler
+                from jhbuild.buildbot.scheduler import SerialScheduler, NightlySerialScheduler, OnCommitScheduler
                 config['schedulers'] = []
                 for slave in config['slaves']:
                     s = None
                     for project in config['projects']:
                         buildername = str('%s-%s' % (project, slave.slavename))
-                        s = SerialScheduler(buildername, project, upstream=s,
-                                            builderNames=[buildername])
+                        scheduler_kwargs = {}
+                        if slave.scheduler == 'nightly':
+                            scheduler_class = NightlySerialScheduler
+                            scheduler_kwargs = slave.nightly_kwargs
+                        else:
+                            scheduler_class = SerialScheduler
+                        s = scheduler_class(buildername, project, upstream=s,
+                                            builderNames=[buildername],
+                                            **scheduler_kwargs)
                         config['schedulers'].append(s)
                         if self.jhbuild_config.jhbuildbot_svn_commits_box:
                             # schedulers that will launch job when receiving



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]