[yocto] [[yocto-autobuilder][PATCHv2] 02/15] lib/buildsteps.py: Add BitbakeLogLineObserver for BitbakeShellCommands.
Aníbal Limón
anibal.limon at linux.intel.com
Tue Jun 21 16:07:39 PDT 2016
The BitbakeLogLineObserver look into stdio output of bitbake process and
identify for exception/errors into log,
Signed-off-by: Aníbal Limón <anibal.limon at linux.intel.com>
---
.../site-packages/autobuilder/lib/buildsteps.py | 51 ++++++++++++++++++++++
1 file changed, 51 insertions(+)
diff --git a/lib/python2.7/site-packages/autobuilder/lib/buildsteps.py b/lib/python2.7/site-packages/autobuilder/lib/buildsteps.py
index 4f15dcf..9822b3c 100644
--- a/lib/python2.7/site-packages/autobuilder/lib/buildsteps.py
+++ b/lib/python2.7/site-packages/autobuilder/lib/buildsteps.py
@@ -11,8 +11,10 @@ __email__ = "anibal.limon at linux.intel.com"
'''
import os
+import re
from buildbot.steps.shell import ShellCommand
+from buildbot.process.buildstep import LogLineObserver
DEFAULT_SHELL = 'bash'
@@ -42,6 +44,55 @@ class ShellCommandCleanEnv(ShellCommand):
return "env -i %s %s -c " % (pe_cmd, shell)
+class BitbakeLogLineObserver(LogLineObserver):
+ """
+ Search in the stdio bitbake log for exception/errors, identify
+ if the error is a recipe/task one if not turn on the flag of
+ bitbake error/exception and save the log.
+ """
+
+ rexp_error = re.compile("^ERROR: .*$")
+
+ # recipe task errors regex'es
+ rexp_pnpv_error = re.compile("^ERROR: (?P<pnpv>.*) do_(?P<task>.*):.*$")
+ rexp_task_error = re.compile("^ERROR: Task .*$")
+ rexp_log_error = re.compile("^ERROR: Logfile of failure stored in: "\
+ "(?P<path>.*)$")
+
+ def _handleError(self, line):
+ if not hasattr(self.step, 'errors'):
+ self.step.errors = {}
+ self.step.errors['bitbake'] = False
+ self.step.errors['log'] = []
+
+ # save all the log for be able to get report variables like
+ # machine, target, distro, etc
+ self.step.errors['log'].append(line)
+
+ # discard line that are not errors and line that
+ # is recipe task errors
+ if (not self.rexp_error.match(line)) or \
+ self.rexp_pnpv_error.match(line) or \
+ self.rexp_task_error.match(line) or \
+ self.rexp_log_error.match(line):
+ return
+
+ # if not match recipe task type is a bitbake exception/error
+ self.step.errors['bitbake'] = True
+
+ def outLineReceived(self, line):
+ self._handleError(line)
+
+ def errLineReceived(self, line):
+ self._handleError(line)
+
class BitbakeShellCommand(ShellCommand):
def __init__(self, factory, argdict=None, **kwargs):
super(BitbakeShellCommand, self).__init__(**kwargs)
+
+ self.stdio_observer = BitbakeLogLineObserver()
+ self.addLogObserver('stdio', self.stdio_observer)
+
+ def commandComplete(self, cmd):
+ if cmd.didFail():
+ pass
--
2.1.4
More information about the yocto
mailing list