[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