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.li...@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.li...@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 -- _______________________________________________ yocto mailing list yocto@yoctoproject.org https://lists.yoctoproject.org/listinfo/yocto