]> TLD Linux GIT Repositories - tld-builder.git/blob - PLD_Builder/srpm_builder.py
- use pkgrevs instead of tagging
[tld-builder.git] / PLD_Builder / srpm_builder.py
1 # vi: encoding=utf-8 ts=8 sts=4 sw=4 et
2
3 import email
4 import string
5 import time
6 import os
7 import StringIO
8 import sys
9 import re
10 import shutil
11 import atexit
12 import tempfile
13
14 import gpg
15 import request
16 import log
17 import path
18 import util
19 import loop
20 import chroot
21 import ftp
22 import buildlogs
23 import notify
24 import status
25 import build
26 import report
27
28 from lock import lock
29 from bqueue import B_Queue
30 from config import config, init_conf
31
32 def pick_request(q):
33     def mycmp(r1, r2):
34         if r1.kind != 'group' or r2.kind != 'group':
35             raise Exception, "non-group requests"
36         pri_diff = cmp(r1.priority, r2.priority)
37         if pri_diff == 0:
38             return cmp(r1.time, r2.time)
39         else:
40             return pri_diff
41     q.requests.sort(mycmp)
42     ret = q.requests[0]
43     q.requests = q.requests[1:]
44     return ret
45
46 def store_binary_request(r):
47     new_b = []
48     for b in r.batches:
49         if not b.build_failed: new_b.append(b)
50     if new_b == []:
51         return
52     r.batches = new_b
53     # store new queue and max_req_no for binary builders
54     num = int(string.strip(open(path.max_req_no_file, "r").read())) + 1
55
56     r.no = num
57     q = B_Queue(path.req_queue_file)
58     q.lock(0)
59     q.read()
60     q.add(r)
61     q.write()
62     q.dump(path.queue_stats_file)
63     q.dump_html(path.queue_html_stats_file)
64     q.write_signed(path.req_queue_signed_file)
65     q.unlock()
66
67     (fdno, tmpfname) = tempfile.mkstemp(dir=os.path.dirname(path.max_req_no_file))
68     cnt_f = os.fdopen(fdno, "w")
69     cnt_f.seek(0)
70     cnt_f.write("%d\n" % num)
71     cnt_f.flush()
72     os.fsync(cnt_f.fileno())
73     cnt_f.close()
74     os.chmod(tmpfname, 0644)
75     os.rename(tmpfname, path.max_req_no_file)
76
77 def transfer_file(r, b):
78     local = path.srpms_dir + '/' + r.id + "/" + b.src_rpm
79     f = b.src_rpm_file
80     # export files from chroot
81     chroot.cp(f, outfile = local, rm = True)
82     os.chmod(local, 0644)
83     ftp.add(local)
84
85     if config.gen_upinfo and 'test-build' not in r.flags:
86         fname = path.srpms_dir + '/' + r.id + "/" + b.src_rpm + ".uploadinfo"
87         f = open(fname, "w")
88         f.write("info:build:%s:requester:%s\ninfo:build:%s:requester_email:%s\nfile:SRPMS:%s\nEND\n" % (b.gb_id, b.requester, b.gb_id, b.requester_email, b.src_rpm))
89         f.close()
90         ftp.add(fname, "uploadinfo")
91
92 def build_srpm(r, b):
93     if len(b.spec) == 0:
94         # should not really get here
95         util.append_to(b.logfile, "error: No .spec given but build src.rpm wanted")
96         return "FAIL"
97
98     status.push("building %s" % b.spec)
99
100     b.src_rpm = ""
101     builder_opts = "-nu -nm --nodeps --http"
102     if ("test-build" in r.flags) or b.branch and b.branch.startswith(config.tag_prefixes[0]):
103                     tag_test=""
104     else:
105                     tag_test=" -Tp %s -tt" % (config.tag_prefixes[0],)
106     cmd = ("cd rpm/packages; nice -n %s ./builder %s -bs %s -r %s %s %s %s 2>&1" %
107              (config.nice, builder_opts, b.bconds_string(), b.branch,
108               tag_test, b.kernel_string(), b.spec))
109     util.append_to(b.logfile, "request from: %s" % r.requester)
110     util.append_to(b.logfile, "started at: %s" % time.asctime())
111     util.append_to(b.logfile, "building SRPM using: %s\n" % cmd)
112     res = chroot.run(cmd, logfile = b.logfile)
113     util.append_to(b.logfile, "exit status %d" % res)
114     files = util.collect_files(b.logfile)
115     if len(files) > 0:
116         if len(files) > 1:
117             util.append_to(b.logfile, "error: More than one file produced: %s" % files)
118             res = "FAIL_TOOMANYFILES"
119         last = files[len(files) - 1]
120         b.src_rpm_file = last
121         b.src_rpm = os.path.basename(last)
122         r.chroot_files.extend(files)
123     else:
124         util.append_to(b.logfile, "error: No files produced.")
125         res = "FAIL"
126     if res == 0 and not "test-build" in r.flags:
127         for pref in config.tag_prefixes:
128             util.append_to(b.logfile, "Tagging with prefix: %s" % pref)
129             res = chroot.run("cd rpm/packages; ./builder -r %s -Tp %s -Tv --pkgrev %s" % \
130                         (b.branch, pref, b.spec), logfile = b.logfile)
131     if res == 0:
132         transfer_file(r, b)
133
134     packagename = b.spec[:-5]
135     packagedir = "rpm/packages/%s" % packagename
136     chroot.run("rpm/packages/builder -m %s" % \
137             (b.spec,), logfile = b.logfile)
138     chroot.run("rm -rf %s" % packagedir, logfile = b.logfile)
139     status.pop()
140
141     if res:
142         res = "FAIL"
143     return res
144
145 def handle_request(r):
146     os.mkdir(path.srpms_dir + '/' + r.id)
147     os.chmod(path.srpms_dir + '/' + r.id, 0755)
148     ftp.init(r)
149     buildlogs.init(r)
150     build.build_all(r, build_srpm)
151     report.send_report(r, is_src = True)
152     report.send_cia_report(r, is_src = True)
153     store_binary_request(r)
154     ftp.flush()
155     notify.send(r)
156
157 def main():
158     init_conf("src")
159     if lock("building-srpm", non_block = 1) == None:
160         return
161     while True:
162         status.push("srpm: processing queue")
163         q = B_Queue(path.queue_file)
164         if not q.lock(1):
165             status.pop()
166             return
167         q.read()
168         if q.requests == []:
169             q.unlock()
170             status.pop()
171             return
172         r = pick_request(q)
173         q.write()
174         q.unlock()
175         status.pop()
176         status.push("srpm: handling request from %s" % r.requester)
177         handle_request(r)
178         status.pop()
179
180 if __name__ == '__main__':
181     loop.run_loop(main)