[yocto] [[yocto-autobuilder][PATCHv2] 03/15] lib/buildsteps: BitbakeShellCommand add support for create error reports

Aníbal Limón anibal.limon at linux.intel.com
Tue Jun 21 16:07:40 PDT 2016


When bitbake command fails and isn't a recipe task failure then create
an error report and store into yocto-controller folder for be able to
transfer to the worker in order to send to the Error report web.

Signed-off-by: Aníbal Limón <anibal.limon at linux.intel.com>
---
 .../site-packages/autobuilder/lib/buildsteps.py    | 63 +++++++++++++++++++++-
 1 file changed, 62 insertions(+), 1 deletion(-)

diff --git a/lib/python2.7/site-packages/autobuilder/lib/buildsteps.py b/lib/python2.7/site-packages/autobuilder/lib/buildsteps.py
index 9822b3c..7354c83 100644
--- a/lib/python2.7/site-packages/autobuilder/lib/buildsteps.py
+++ b/lib/python2.7/site-packages/autobuilder/lib/buildsteps.py
@@ -13,9 +13,15 @@ __email__ = "anibal.limon at linux.intel.com"
 import os
 import re
 
+import time
+import json
+import codecs
+
 from buildbot.steps.shell import ShellCommand
 from buildbot.process.buildstep import LogLineObserver
 
+from autobuilder.config import YOCTO_ABBASE
+
 DEFAULT_SHELL = 'bash'
 
 class ShellCommandCleanEnv(ShellCommand):
@@ -86,6 +92,12 @@ class BitbakeLogLineObserver(LogLineObserver):
     def errLineReceived(self, line):
         self._handleError(line)
 
+def get_error_report_bitbake_dir(buildername, buildnumber):
+    errordir_base = os.path.join(YOCTO_ABBASE, 'yocto-controller', buildername,
+            'error-report')
+    errordir = os.path.join(errordir_base, str(buildnumber))
+    return errordir
+
 class BitbakeShellCommand(ShellCommand):
     def __init__(self, factory, argdict=None, **kwargs):
         super(BitbakeShellCommand, self).__init__(**kwargs)
@@ -93,6 +105,55 @@ class BitbakeShellCommand(ShellCommand):
         self.stdio_observer = BitbakeLogLineObserver()
         self.addLogObserver('stdio', self.stdio_observer)
 
+    def _get_variables(self, log):
+        vrs = {}
+
+        rexp = re.compile("^(.*)=.*\"(.*)\"$")
+        for line in log:
+            m = rexp.match(line)
+            if m:
+                vrs[m.group(1).rstrip()] = m.group(2)
+
+        return vrs
+
+    def _createBitbakeErrorReport(self, log):
+        vrs = self._get_variables(log)
+
+        report = {}
+        report['machine'] = vrs['MACHINE']
+        report['build_sys'] = vrs['BUILD_SYS']
+        report['nativelsb'] = vrs['NATIVELSBSTRING']
+        report['distro'] = vrs['DISTRO']
+        report['target_sys'] = vrs['TARGET_SYS']
+
+        report['component'] = 'bitbake'
+        report['branch_commit'] = self.getProperty('branch') + ': ' + \
+                self.getProperty('got_revision')
+
+        failure = {}
+        failure['package'] = "bitbake-%s" % vrs['BB_VERSION']
+        failure['task'] = self.command
+        failure['log'] = "\n".join(log)
+
+        report['failures'] = [failure]
+
+        return report
+
+    def _saveBitbakeErrorReport(self, report):
+        buildername = self.getProperty('buildername')
+        buildnumber = self.getProperty('buildnumber')
+
+        errordir = get_error_report_bitbake_dir(buildername, buildnumber)
+        if not os.path.exists(errordir):
+            os.makedirs(errordir)
+
+        filename = os.path.join(errordir, "error_report_bitbake_%d.txt" % \
+                int(time.time()))
+        with codecs.open(filename, 'w', 'utf-8') as f:
+            json.dump(report, f, indent=4, sort_keys=True)
+
     def commandComplete(self, cmd):
         if cmd.didFail():
-            pass
+            if self.errors['bitbake']:
+                report = self._createBitbakeErrorReport(self.errors['log'])
+                self._saveBitbakeErrorReport(report)
-- 
2.1.4




More information about the yocto mailing list