diff options
| -rwxr-xr-x | script/autobuild.py | 58 | 
1 files changed, 48 insertions, 10 deletions
diff --git a/script/autobuild.py b/script/autobuild.py index 1f1e6b47d5..62cef69197 100755 --- a/script/autobuild.py +++ b/script/autobuild.py @@ -6,7 +6,8 @@  from subprocess import Popen, PIPE  import os, signal, tarfile, sys, time  from optparse import OptionParser - +import smtplib +from email.mime.text import MIMEText  samba_master = os.getenv('SAMBA_MASTER', 'git://git.samba.org/samba.git')  samba_master_ssh = os.getenv('SAMBA_MASTER_SSH', 'git+ssh://git.samba.org/data/git/samba.git') @@ -102,10 +103,11 @@ class builder:          self.tag = self.name.replace('/', '_')          self.sequence = sequence          self.next = 0 -        self.stdout_path = "%s/%s.stdout" % (testbase, self.tag) -        self.stderr_path = "%s/%s.stderr" % (testbase, self.tag) -        cleanup_list.append(self.stdout_path) -        cleanup_list.append(self.stderr_path) +        self.stdout_path = "%s/%s.stdout" % (gitroot, self.tag) +        self.stderr_path = "%s/%s.stderr" % (gitroot, self.tag) +        if options.verbose: +            print("stdout for %s in %s" % (self.name, self.stdout_path)) +            print("stderr for %s in %s" % (self.name, self.stderr_path))          run_cmd("rm -f %s %s" % (self.stdout_path, self.stderr_path))          self.stdout = open(self.stdout_path, 'w')          self.stderr = open(self.stderr_path, 'w') @@ -204,10 +206,10 @@ class buildlist:                  break              if os.WIFSIGNALED(b.status) or os.WEXITSTATUS(b.status) != 0:                  self.kill_kids() -                return (b.status, "%s: failed '%s' with status %d" % (b.name, b.cmd, b.status)) +                return (b.status, b.name, b.tag, "%s: failed '%s' with status %d" % (b.name, b.cmd, b.status))              b.start_next()          self.kill_kids() -        return (0, "All OK") +        return (0, None, None, "All OK")      def tarlogs(self, fname):          tar = tarfile.open(fname, "w:gz") @@ -297,7 +299,40 @@ parser.add_option("", "--fix-whitespace", help="fix whitespace on rebase",                    default=False, action="store_true")  parser.add_option("", "--retry", help="automatically retry if master changes",                    default=False, action="store_true") +parser.add_option("", "--email", help="send email to the given address on failure", +                  type='str', default=None) + + +def email_failure(status, failed_task, failed_tag, errstr): +    '''send an email to options.email about the failure''' +    user = os.getenv("USER") +    text = ''' +Dear Developer, + +Your autobuild failed when trying to test %s with the following error: +   %s + +the autobuild has been abandoned. Please fix the error and resubmit. + +You can see logs of the failed task here: +  http://git.samba.org/%s/samba-autobuild/%s.stdout +  http://git.samba.org/%s/samba-autobuild/%s.stderr + +or you can get full logs of all tasks in this job here: + +  http://git.samba.org/%s/samba-autobuild/logs.tar.gz + +''' % (failed_task, errstr, user, failed_tag, user, failed_tag, user) +    msg = MIMEText(text) +    msg['Subject'] = 'autobuild failure for task %s' % failed_task +    msg['From'] = 'autobuild@samba.org' +    msg['To'] = options.email + +    s = smtplib.SMTP() +    s.connect() +    s.sendmail(msg['From'], [msg['To']], msg.as_string()) +    s.quit()  (options, args) = parser.parse_args() @@ -305,7 +340,7 @@ if options.retry:      if not options.rebase_master and options.rebase is None:          raise Exception('You can only use --retry if you also rebase') -testbase = "%s/build.%u" % (options.testbase, os.getpid()) +testbase = "%s/b%u" % (options.testbase, os.getpid())  test_master = "%s/master" % testbase  gitroot = find_git_root() @@ -335,7 +370,7 @@ while True:          blist = buildlist(tasks, args)          if options.tail:              blist.start_tail() -        (status, errstr) = blist.run() +        (status, failed_task, failed_tag, errstr) = blist.run()          if status != 0 or errstr != "retry":              break          cleanup() @@ -367,7 +402,10 @@ if status == 0:  # something failed, gather a tar of the logs  blist.tarlogs("logs.tar.gz") -blist.remove_logs() + +if options.email is not None: +    email_failure(status, failed_task, failed_tag, errstr) +  cleanup()  print(errstr)  print("Logs in logs.tar.gz")  | 
