adjust build scripts for git
[build.git] / run-nightlies.py
1 #!/usr/bin/python
2 # Script to read build configs in /etc/build_conf.py, turn the configuration into command lines and execute it
3
4 import os
5 import re
6 import shlex
7 import subprocess
8 import time
9
10 PARALLEL_BUILD = False
11
12 # Assemble a list of builds from a single build spec
13 def interpret_build(build, param_names, current_concrete_build={}, concrete_build_list=[]):
14         
15         if (param_names==[]):
16                 concrete_build_list.extend([current_concrete_build])
17         else:
18                 (cur_param_name,remaining_param_names)=(param_names[0],param_names[1:])
19                 cur_param = build[cur_param_name]
20
21                 # If it's a list, produce a concrete build for each element of the list
22                 if (type(cur_param)==type([])):
23                         for value in cur_param:
24                                 new_concrete_build = current_concrete_build.copy()
25                                 new_concrete_build[cur_param_name] = value
26                                 concrete_build_list = interpret_build(build, remaining_param_names, new_concrete_build, concrete_build_list)
27                 
28                 # If not, just tack on the value and move on
29                 else:
30                         current_concrete_build[cur_param_name] = cur_param
31                         concrete_build_list = interpret_build(build, remaining_param_names, current_concrete_build,concrete_build_list)
32
33         return concrete_build_list
34                         
35
36 # Fill in parameters that are not defined in __default_build__
37 def complete_build_spec_with_defaults (build, default_build):
38         for default_param in default_build.keys():
39                 if (not build.has_key(default_param)):
40                         build[default_param]=default_build[default_param]
41         return build
42         
43
44 # Turn a concrete build into a commandline
45
46 def concrete_build_to_commandline(concrete_build):
47     
48     cmdline = '''%(sh)s 
49             %(vbuildnightly)s
50             -b pl-%(fcdistro)s-%(arch)s-%(myplcversion)s-%(release)s-%(date)s
51             -f %(fcdistro)s 
52             -m %(mailto)s 
53             -p %(personality)s
54             -r %(webpath)s
55             -s %(scmpath)s
56             -t %(tags)s
57             -w %(webpath)s/%(pldistro)s/%(fcdistro)s
58             %(runtests)s'''.replace('\n','')
59
60     cmdline = cmdline % concrete_build
61
62     purge_spaces = re.compile('\s+')
63
64     return purge_spaces.sub(' ', cmdline)
65
66                     
67 # reduce dependencies in a build 
68 def reduce_dependencies(concrete_build):
69     for b in concrete_build.keys():
70         val = concrete_build[b]
71         if (type(val)==type(lambda x:x)):
72             concrete_build[b] = val(concrete_build)
73     return concrete_build
74
75
76 # Turn build parameter dicts into commandlines and execute them
77 def process_builds (builds, build_names, default_build):
78         for build_name in build_names:
79                 build = complete_build_spec_with_defaults (builds[build_name], default_build)
80                 concrete_builds_without_deps = interpret_build (build, build.keys(), {}, [])
81                 concrete_builds = map(reduce_dependencies, concrete_builds_without_deps)
82                 commandlines = map(concrete_build_to_commandline, concrete_builds)
83                 for commandline in commandlines:
84                     if PARALLEL_BUILD == True:
85                         args = shlex.split(commandline)
86                         subprocess.Popen(args)
87                         # workaround the vserver race
88                         time.sleep(60)
89                     else:           
90                         os.system(commandline)
91
92 def main():
93         config_file = '/etc/build-conf-planetlab.py'
94         builds = {}
95         try:
96                 execfile(config_file, builds)
97         except IOError, e:
98                 raise IOError, "Could not open %s\n" % config_file
99
100
101         config_file_attributes = builds.keys()
102         build_names = [e for e in config_file_attributes if not e.startswith('__')]     
103
104         try:
105                 default_build = builds['__default_build__']
106         except KeyError:
107                 raise KeyError, "Please define the default build config in %s\n" % config_file
108         
109         process_builds(builds, build_names, default_build)
110
111
112 if __name__ == "__main__":
113         main()
114