[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