[SCM] live-studio branch, master, updated. a816e008e6ebb9547fc51d020252219299825e94

Chris Lamb lamby at debian.org
Sat Jul 31 02:53:48 UTC 2010


The following commit has been merged in the master branch:
commit a10e22b5ad8470cac29b593dc0078b360d03414c
Author: Chris Lamb <lamby at debian.org>
Date:   Fri Jul 30 22:50:54 2010 -0400

    Make the queue runner more resilient and also a bit tidier

diff --git a/live_studio/build/management/commands/queue_runner.py b/live_studio/build/management/commands/queue_runner.py
index b8eedef..37ad239 100644
--- a/live_studio/build/management/commands/queue_runner.py
+++ b/live_studio/build/management/commands/queue_runner.py
@@ -63,9 +63,6 @@ class Command(NoArgsCommand):
             f.write(str(os.getpid()))
             f.close()
 
-        self.run(options)
-
-    def run(self, options):
         logging.basicConfig(filename=options['logfile'], level=logging.INFO)
         self.log = logging.getLogger('live-studio-runner')
 
@@ -74,96 +71,105 @@ class Command(NoArgsCommand):
 
         while True:
             try:
-                build = Build.objects.pop()
+                self.run()
+            except Exception:
+                self.log.exception("Caught exception")
+
+    def run(self):
+        try:
+            build = Build.objects.pop()
+        except IndexError:
+            self.log.debug('No items in queue, sleeping for 2s')
+
+            try:
+                time.sleep(2)
+            except KeyboardInterrupt:
+                sys.exit(1)
+
+            return
 
-                def update(**kwargs):
-                    self.log.debug('Updating #%d with %r', build.pk, kwargs)
-                    Build.objects.filter(pk=build.pk).update(**kwargs)
+        def update(**kwargs):
+            self.log.debug('Updating #%d with %r', build.pk, kwargs)
+            Build.objects.filter(pk=build.pk).update(**kwargs)
 
-                    # Also set attributes on the local object so the are up to
-                    # date
-                    for k, v in kwargs.iteritems():
-                        setattr(build, k, v)
+            # Also set attributes on the local object so the are up to date
+            for k, v in kwargs.iteritems():
+                setattr(build, k, v)
 
-                update(started=datetime.datetime.now())
+        update(started=datetime.datetime.now())
 
-                tempdir = tempfile.mkdtemp(prefix='live-studio_')
-                target_dir = os.path.join(settings.BUILDS_ROOT, build.ident)
+        tempdir = tempfile.mkdtemp(prefix='live-studio_')
+        target_dir = os.path.join(settings.BUILDS_ROOT, build.ident)
 
-                os.makedirs(target_dir)
-                logfile = open(os.path.join(target_dir, 'log.txt'), 'a')
+        os.makedirs(target_dir)
+        logfile = open(os.path.join(target_dir, 'log.txt'), 'a')
 
-                self.log.info("Building #%d in %s", build.pk, tempdir)
+        self.log.info("Building #%d in %s", build.pk, tempdir)
 
-                status = 'failure'
+        try:
+            filename = self.build(build, tempdir, logfile, target_dir)
 
-                try:
-                    os.chdir(tempdir)
+            update(
+                filename=filename,
+                finished=datetime.datetime.now(),
+            )
 
-                    call(logfile, ('lh', 'config') + build.config.options())
+            status = 'success'
+            self.log.info("#%d built successfully", build.pk)
 
-                    if settings.DEBUG:
-                        open('binary.iso', 'w').write('iso here')
-                    else:
-                        call(logfile, ('lh', 'build'))
+        except:
+            status = 'failure'
+            update(finished=datetime.datetime.now())
+            self.log.error("#%d failed to build", build.pk)
+            raise
 
-                    # Find file that was created
-                    filename = None
-                    for extension in ('iso', 'img'):
-                        if not os.path.exists('binary.%s' % extension):
-                            continue
+        finally:
+            os.chdir(tempdir)
+            call(logfile, ('lh', 'clean', '--purge'))
+            shutil.rmtree(tempdir)
 
-                        filename = 'Debian_Live_Studio_%s.%s' % \
-                            (build.ident, extension)
+            context = {
+                'site': Site.objects.get_current(),
+                'build': build,
+            }
 
-                        os.rename(
-                            'binary.%s' % extension,
-                            os.path.join(target_dir, filename),
-                        )
+            subject = render_to_string(
+                'builds/%s_subject.txt' % status,
+                context,
+            )
 
-                        break
+            send_mail(
+                ''.join(subject.splitlines()),
+                render_to_string('builds/%s_body.txt' % status, context),
+                settings.DEFAULT_FROM_EMAIL,
+                (build.config.user.email,),
+            )
 
-                    assert filename, "Did not create any image"
+            self.log.info("Finished processing #%d", build.pk)
 
-                    update(
-                        finished=datetime.datetime.now(),
-                        filename=filename,
-                    )
+    def build(self, build, tempdir, logfile, target_dir):
+        os.chdir(tempdir)
 
-                    status = 'success'
+        call(logfile, ('lh', 'config') + build.config.options())
 
-                    self.log.info("#%d built successfully", build.pk)
-                except:
-                    self.log.exception("#%d failed", build.pk)
-                    update(finished=datetime.datetime.now())
-                    continue
-                finally:
-                    os.chdir(tempdir)
-                    call(logfile, ('lh', 'clean', '--purge'))
-                    shutil.rmtree(tempdir)
+        if settings.DEBUG:
+            open('binary.iso', 'w').write('iso here')
+        else:
+            call(logfile, ('lh', 'build'))
 
-                    ec = {
-                        'site': Site.objects.get_current(),
-                        'build': build,
-                    }
+        # Find file that was created, if any
+        filename = None
+        for extension in ('iso', 'img'):
+            if not os.path.exists('binary.%s' % extension):
+                continue
 
-                    subject = render_to_string(
-                        'builds/%s_subject.txt' % status,
-                        ec,
-                    )
+            filename = 'Debian_Live_Studio_%s.%s' % (build.ident, extension)
 
-                    send_mail(
-                        ''.join(subject.splitlines()),
-                        render_to_string('builds/%s_body.txt' % status, ec),
-                        settings.DEFAULT_FROM_EMAIL,
-                        (build.config.user.email,),
-                    )
+            os.rename(
+                'binary.%s' % extension,
+                os.path.join(target_dir, filename),
+            )
 
-                    self.log.info("Finished processing #%d", build.pk)
+            return filename
 
-            except IndexError:
-                self.log.debug('No items in queue, sleeping for 2s')
-                try:
-                    time.sleep(2)
-                except KeyboardInterrupt:
-                    sys.exit(1)
+        assert False, "Did not create any image"

-- 
live-studio



More information about the debian-live-changes mailing list