[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