extras-buildsys/server PackageJob.py,1.8,1.9

Daniel Williams (dcbw) fedora-extras-commits at redhat.com
Sat Jul 16 14:57:39 UTC 2005


Author: dcbw

Update of /cvs/fedora/extras-buildsys/server
In directory cvs-int.fedora.redhat.com:/tmp/cvs-serv8987/server

Modified Files:
	PackageJob.py 
Log Message:
2005-07-16  Dan Williams <dcbw at redhat.com>

    * server/PackageJob.py
        - Include last 20 lines of relevant log file for failed build jobs




Index: PackageJob.py
===================================================================
RCS file: /cvs/fedora/extras-buildsys/server/PackageJob.py,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- PackageJob.py	14 Jul 2005 19:25:22 -0000	1.8
+++ PackageJob.py	16 Jul 2005 14:57:37 -0000	1.9
@@ -58,11 +58,12 @@
         return self.args
         
 class BuildError(exceptions.Exception):
-    def __init__(self, args=None):
+    def __init__(self, msg, arch):
         exceptions.Exception.__init__(self)
-        self.args = args
+        self.msg = msg
+        self.arch = arch
     def __str__(self):
-        return self.args
+        return self.msg
 
 
 class PackageJobController(threading.Thread):
@@ -464,7 +465,9 @@
             self._failed()
         except BuildError, e:
             subj = 'Build Error (Job %s): %s on %s' % (self.uid, self.cvs_tag, self.target)
-            msg = "%s\n\n         Build logs may be found at %s" % (e.args, self._make_log_url())
+            msg = "%s\n\n         Build logs may be found at %s\n\n" % (e.msg, self._make_log_url())
+            logtail = self._get_log_tail(e.arch)
+            msg = "%s\n-------------------------------------------------\n\n%s\n" % (msg, logtail)
             self.email_result(resultstring=msg, subject=subj)
             # Kill remaining jobs on other arches
             self._archjobs_lock.acquire()
@@ -493,7 +496,7 @@
                 if job.builder_failed():
                     msg = "Job failed on arch %s\n" % (job.arch)
                     self._archjobs_lock.release()
-                    raise BuildError(msg)
+                    raise BuildError(msg, job.arch)
                 else:
                     completed_jobs = completed_jobs + 1
         self._archjobs_lock.release()
@@ -542,9 +545,6 @@
         self._set_cur_stage('repodone')
         self.wake()
 
-    def _make_log_url(self, arch=None):
-        return "%s/%s/%s-%s-%s-%s/" % (config_opts['log_url'], self.target, self.uid, self.name, self.ver, self.release)
-
     def _succeeded(self):
         self._set_cur_stage('needsign')
         resultstring = """ %s (%s): Build on target %s succeeded.
@@ -554,6 +554,53 @@
         self.email_result(resultstring)
         self.bm.notify_job_done(self)
 
+    def _make_log_url(self, arch=None):
+        return "%s/%s/%s-%s-%s-%s/" % (config_opts['log_url'], self.target, self.uid, self.name, self.ver, self.release)
+
+    def _get_log_tail(self, arch):
+        """ Returns the last 20 lines of the most relevant log file """
+
+        pkg_dir = "%s-%s-%s-%s" % (self.uid, self.name, self.ver, self.release)
+        log_dir = os.path.join(config_opts['server_work_dir'], self.target, pkg_dir, arch)
+        final_log = None
+        build_log = "%s/%s" % (log_dir, "build.log")
+        root_log = "%s/%s" % (log_dir, "root.log")
+        builder_log = "%s/%s" % (log_dir, "builder.log")
+
+        # Try the most relevant log file first
+        if os.path.exists(build_log) and os.path.getsize(build_log) > 0:
+            final_log = build_log
+        elif os.path.exists(root_log) and os.path.getsize(root_log) > 0:
+            final_log = root_log
+        elif os.path.exists(builder_log) and os.path.getsize(builder_log) > 0:
+            final_log = builder_log
+
+        if not final_log:
+            return ""
+
+        seek_pos = os.path.getsize(final_log) - 4096
+        f = open(final_log, "r", 4096);
+        if seek_pos > 0:
+            f.seek(seek_pos)
+        try:
+            # throw away the rest of the line
+            t = f.next()
+        except:
+            pass
+        lines = []
+        # Grab the last 20 lines from the file
+        while True:
+            try:
+                line = f.next()
+            except StopIteration:
+                break
+            lines.append(line)
+            if len(lines) > 20:  # only want last 20 lines
+                del lines[0]
+
+        f.close()
+        return "".join(lines)
+
     def email_result(self, resultstring, subject=None):
         """send 'resultstring' to self.email from self.email_from"""
         




More information about the scm-commits mailing list