X-Git-Url: https://git.tld-linux.org/?p=TLD.git;a=blobdiff_plain;f=pld-builder.new%2FPLD_Builder%2Fsrpm_builder.py;fp=pld-builder.new%2FPLD_Builder%2Fsrpm_builder.py;h=5762711e7ae31167320f208bbf7833ba034bfb57;hp=0000000000000000000000000000000000000000;hb=90809c8fec988489786ce00247d9a4150070748b;hpb=ab3934fab858112cd552359b18cb980ea07c310b diff --git a/pld-builder.new/PLD_Builder/srpm_builder.py b/pld-builder.new/PLD_Builder/srpm_builder.py new file mode 100644 index 0000000..5762711 --- /dev/null +++ b/pld-builder.new/PLD_Builder/srpm_builder.py @@ -0,0 +1,181 @@ +# vi: encoding=utf-8 ts=8 sts=4 sw=4 et + +import email +import string +import time +import os +import StringIO +import sys +import re +import shutil +import atexit +import tempfile + +import gpg +import request +import log +import path +import util +import loop +import chroot +import ftp +import buildlogs +import notify +import status +import build +import report + +from lock import lock +from bqueue import B_Queue +from config import config, init_conf + +def pick_request(q): + def mycmp(r1, r2): + if r1.kind != 'group' or r2.kind != 'group': + raise Exception, "non-group requests" + pri_diff = cmp(r1.priority, r2.priority) + if pri_diff == 0: + return cmp(r1.time, r2.time) + else: + return pri_diff + q.requests.sort(mycmp) + ret = q.requests[0] + q.requests = q.requests[1:] + return ret + +def store_binary_request(r): + new_b = [] + for b in r.batches: + if not b.build_failed: new_b.append(b) + if new_b == []: + return + r.batches = new_b + # store new queue and max_req_no for binary builders + num = int(string.strip(open(path.max_req_no_file, "r").read())) + 1 + + r.no = num + q = B_Queue(path.req_queue_file) + q.lock(0) + q.read() + q.add(r) + q.write() + q.dump(path.queue_stats_file) + q.dump_html(path.queue_html_stats_file) + q.write_signed(path.req_queue_signed_file) + q.unlock() + + (fdno, tmpfname) = tempfile.mkstemp(dir=os.path.dirname(path.max_req_no_file)) + cnt_f = os.fdopen(fdno, "w") + cnt_f.seek(0) + cnt_f.write("%d\n" % num) + cnt_f.flush() + os.fsync(cnt_f.fileno()) + cnt_f.close() + os.chmod(tmpfname, 0644) + os.rename(tmpfname, path.max_req_no_file) + +def transfer_file(r, b): + local = path.srpms_dir + '/' + r.id + "/" + b.src_rpm + f = b.src_rpm_file + # export files from chroot + chroot.cp(f, outfile = local, rm = True) + os.chmod(local, 0644) + ftp.add(local) + + if config.gen_upinfo and 'test-build' not in r.flags: + fname = path.srpms_dir + '/' + r.id + "/" + b.src_rpm + ".uploadinfo" + f = open(fname, "w") + 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)) + f.close() + ftp.add(fname, "uploadinfo") + +def build_srpm(r, b): + if len(b.spec) == 0: + # should not really get here + util.append_to(b.logfile, "error: No .spec given but build src.rpm wanted") + return "FAIL" + + status.push("building %s" % b.spec) + + b.src_rpm = "" + builder_opts = "-nu -nm --nodeps --http" + if ("test-build" in r.flags) or b.branch and b.branch.startswith(config.tag_prefixes[0]): + tag_test="" + else: + tag_test=" -Tp %s -tt" % (config.tag_prefixes[0],) + cmd = ("cd rpm/packages; nice -n %s ./builder %s -bs %s -r %s %s %s %s 2>&1" % + (config.nice, builder_opts, b.bconds_string(), b.branch, + tag_test, b.kernel_string(), b.spec)) + util.append_to(b.logfile, "request from: %s" % r.requester) + util.append_to(b.logfile, "started at: %s" % time.asctime()) + util.append_to(b.logfile, "building SRPM using: %s\n" % cmd) + res = chroot.run(cmd, logfile = b.logfile) + util.append_to(b.logfile, "exit status %d" % res) + files = util.collect_files(b.logfile) + if len(files) > 0: + if len(files) > 1: + util.append_to(b.logfile, "error: More than one file produced: %s" % files) + res = "FAIL_TOOMANYFILES" + last = files[len(files) - 1] + b.src_rpm_file = last + b.src_rpm = os.path.basename(last) + r.chroot_files.extend(files) + else: + util.append_to(b.logfile, "error: No files produced.") + res = "FAIL" + if res == 0 and not "test-build" in r.flags: + for pref in config.tag_prefixes: + util.append_to(b.logfile, "Tagging with prefix: %s" % pref) + res = chroot.run("cd rpm/packages; ./builder -r %s -Tp %s -Tv %s" % \ + (b.branch, pref, b.spec), logfile = b.logfile) + if res == 0: + transfer_file(r, b) + + packagedir = "rpm/packages/%s" % b.spec[:-5] + packagename = b.spec[:-5] + chroot.run("rpm/packages/builder -m %s" % \ + (b.spec,), logfile = b.logfile) + chroot.run("rm -rf %s" % packagedir, logfile = b.logfile) + status.pop() + + if res: + res = "FAIL" + return res + +def handle_request(r): + os.mkdir(path.srpms_dir + '/' + r.id) + os.chmod(path.srpms_dir + '/' + r.id, 0755) + ftp.init(r) + buildlogs.init(r) + build.build_all(r, build_srpm) + report.send_report(r, is_src = True) + report.send_cia_report(r, is_src = True) + store_binary_request(r) + ftp.flush() + notify.send(r) + +def main(): + init_conf("src") + if lock("building-srpm", non_block = 1) == None: + return + while True: + status.push("srpm: processing queue") + q = B_Queue(path.queue_file) + if not q.lock(1): + status.pop() + return + q.read() + if q.requests == []: + q.unlock() + status.pop() + return + r = pick_request(q) + q.write() + q.unlock() + status.pop() + status.push("srpm: handling request from %s" % r.requester) + handle_request(r) + status.pop() + +if __name__ == '__main__': + loop.run_loop(main)