summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJon TURNEY <jon.turney@dronecode.org.uk>2015-08-30 13:14:21 +0100
committerJon TURNEY <jon.turney@dronecode.org.uk>2015-08-30 13:14:21 +0100
commit00b039dca69a48ecf02c6db497dce1ab8a9fb51c (patch)
treefdd0bf797e4ac3db21bbd1677cf32acbecac08a0
parentc10e6b232ba091acd88f5312c99cf4426341ae08 (diff)
Add triggerable schedulers for all dependencies
-rwxr-xr-x[-rw-r--r--]master.cfg3
-rwxr-xr-xmoduleset_parser.py75
2 files changed, 51 insertions, 27 deletions
diff --git a/master.cfg b/master.cfg
index 9a7a1de..7436b72 100644..100755
--- a/master.cfg
+++ b/master.cfg
@@ -60,9 +60,8 @@ from buildbot.status.web import authz, auth
authz_cfg=authz.Authz(
# change any of these to True to enable; see the manual for more
# options
- auth=auth.BasicAuth([("pyflakes","pyflakes")]),
gracefulShutdown = False,
- forceBuild = 'auth', # use this to test your slave once it is set up
+ forceBuild = True,
forceAllBuilds = False,
pingBuilder = False,
stopBuild = False,
diff --git a/moduleset_parser.py b/moduleset_parser.py
index 97d858f..aa3c578 100755
--- a/moduleset_parser.py
+++ b/moduleset_parser.py
@@ -1,19 +1,23 @@
#!/usr/bin/env python
+from collections import defaultdict
from lxml import etree
from buildbot.changes.gitpoller import GitPoller
from buildbot.schedulers.basic import SingleBranchScheduler
from buildbot.schedulers.forcesched import ForceScheduler
+from buildbot.schedulers.triggerable import Triggerable
from buildbot.changes.filter import ChangeFilter
from buildbot.process.factory import BuildFactory
from buildbot.process.properties import Interpolate
from buildbot.steps.source.git import Git
from buildbot.steps.shell import Configure,Compile
+from buildbot.steps.trigger import Trigger
from buildbot.config import BuilderConfig
tree = None
repos = {}
default_repo = None
+rdep = defaultdict(list)
def parse():
global tree
@@ -27,7 +31,7 @@ def parse():
moduleset = open('xorg.modules', 'r')
tree = etree.parse(moduleset)
- # process 'repository' nodes
+ # process 'repository' elements
for r in tree.iter('repository'):
t = r.get('type')
n = r.get('name')
@@ -44,6 +48,12 @@ def parse():
else:
default_repo = r
+ # process module elements
+ for m in tree.iter('autotools', 'metamodule'):
+ for d in m.iter('dependencies'):
+ for p in m.iter('dep'):
+ rdep[p.get('package')].append(m.get('id'))
+
return
def get_repo(e):
@@ -69,8 +79,9 @@ def changesources():
repo = get_repo(e)
if repo.get('type') == 'git':
- result.append(GitPoller(repo.get('href') + b.get('module'), branches=['master'],
- workdir='gitpoller-work/' + e.get('id')))
+ pass
+# result.append(GitPoller(repo.get('href') + b.get('module'), branches=['master'],
+# workdir='gitpoller-work/' + e.get('id')))
else:
print("error: repo type %s unhandled" % repo.get('type'))
@@ -81,22 +92,28 @@ def schedulers():
result = []
- for e in tree.iter('autotools'):
+ for e in tree.iter('autotools', 'metamodule'):
b = e.find('branch')
- repo = get_repo(e)
- repo_url = repo.get('href') + b.get('module')
-
- # a scheduler which builds the repo when changes occur in that repo
- filter = ChangeFilter(repository=repo_url, branch='master')
- result.append(SingleBranchScheduler(
- name=e.get('id'),
- change_filter=filter,
- treeStableTimer=None,
- builderNames=[e.get('id')]))
-
+ if b is not None:
+ repo = get_repo(e)
+ repo_url = repo.get('href') + b.get('module')
+
+ # a scheduler which builds the repo when changes occur in that repo
+ filter = ChangeFilter(repository=repo_url, branch='master')
+ result.append(SingleBranchScheduler(
+ name=e.get('id'),
+ change_filter=filter,
+ treeStableTimer=None,
+ builderNames=[e.get('id')]))
+
+ # a scheduler to force building the module
result.append(ForceScheduler(name='force-' + e.get('id'),
builderNames=[e.get('id')]))
+ # a scheduler to trigger building the module when a dependency is rebuilt
+ result.append(Triggerable(name='triggerable-' + e.get('id'),
+ builderNames=[e.get('id')]))
+
return result
def builders(slaves):
@@ -104,17 +121,25 @@ def builders(slaves):
result = []
- for e in tree.iter('autotools'):
+ for e in tree.iter('autotools','metamodule'):
+ factory = BuildFactory()
+
b = e.find('branch')
- repo = get_repo(e)
- repo_url = repo.get('href') + b.get('module')
+ if b is not None:
+ repo = get_repo(e)
+ repo_url = repo.get('href') + b.get('module')
- # construct a build factory which knows how to build this repo
- factory = BuildFactory()
- factory.addStep(Git(repourl=repo_url, mode='full', method='fresh', logEnviron=False))
- factory.addStep(Configure(command=['./autogen.sh', Interpolate('--prefix=%(prop:workdir)s/install')], logEnviron=False))
- factory.addStep(Compile(logEnviron=False))
- factory.addStep(Compile(['make','install'], name='install', logEnviron=False))
+ # construct a build factory which knows how to build this repo
+ factory.addStep(Git(repourl=repo_url, mode='full', method='fresh', logEnviron=False))
+ factory.addStep(Configure(command=['./autogen.sh', Interpolate('--prefix=%(prop:workdir)s/install')], logEnviron=False))
+ factory.addStep(Compile(logEnviron=False))
+ factory.addStep(Compile(command=['make','install'], name='install', logEnviron=False))
+
+ # add build step to trigger dependent modules (if any)
+# print("%s rdeps are %s" % (e.get('id'), rdep[e.get('id')]))
+ if len(rdep[e.get('id')]):
+ factory.addStep(Trigger(schedulerNames=['triggerable-' + i for i in rdep[e.get('id')] ],
+ alwaysUseLatest=True))
result.append(BuilderConfig(name=e.get('id'),
builddir='builder-work/' + e.get('id'),
@@ -126,4 +151,4 @@ def builders(slaves):
if __name__ == "__main__":
print("%d changesources " % len(changesources()))
print("%d schedulers " % len(schedulers()))
- print("%d builder" % len(builders('')))
+ print("%d builders" % len(builders('')))