diff mbox series

[yocto-autobuilder2,1/2] steps: observer: Extract yocto.io links form logs

Message ID 20251013-contrib-mathieu-bb-log-links-v1-1-79db0af7bdce@bootlin.com
State New
Headers show
Series steps: observer: Extract yocto.io links form logs | expand

Commit Message

Mathieu Dubois-Briand Oct. 13, 2025, 3:07 p.m. UTC
Add a new log section on build steps, with yocto.io links found on
stdio.

Signed-off-by: Mathieu Dubois-Briand <mathieu.dubois-briand@bootlin.com>
---
 steps/observer.py | 14 ++++++++++++++
 1 file changed, 14 insertions(+)
diff mbox series

Patch

diff --git a/steps/observer.py b/steps/observer.py
index a1260690e770..555321993836 100644
--- a/steps/observer.py
+++ b/steps/observer.py
@@ -2,6 +2,8 @@ 
 # SPDX-License-Identifier: GPL-2.0-only
 #
 
+import re
+
 from twisted.internet import defer
 from twisted.python import log
 
@@ -29,11 +31,13 @@  class SimpleLogObserver(ShellCommand):
         super().__init__(*args, **kwargs)
         self.warningLines = []
         self.errorLines = []
+        self.links = []
         if "description" in kwargs:
             self.description = kwargs["description"]
         else:
             self.description = "run-config"
         self.addLogObserver('stdio', logobserver.LineConsumerLogObserver(partial(self.logConsumer, 'stdio')))
+        self.yocto_io_re = re.compile(".*/([^/]*yocto.io/pub/(non-release|repro-fail[^/]*/)([^ ']|$)+).*")
 
     def describe(self, done=False):
         return self.description
@@ -47,6 +51,9 @@  class SimpleLogObserver(ShellCommand):
             if line.startswith("ERROR:"):
                 self.errorCount += 1
                 self.errorLines.append(logname + ": " + line)
+            url, matched = self.yocto_io_re.subn('https://\\1', line)
+            if matched:
+                self.links.append(url)
 
     @defer.inlineCallbacks
     def finish_logs(self):
@@ -59,6 +66,13 @@  class SimpleLogObserver(ShellCommand):
             yield self.addCompleteLog('warnings', '\n'.join(self.warningLines) + '\n')
         if self.errorLines:
             yield self.addCompleteLog('errors', '\n'.join(self.errorLines) + '\n')
+        if self.links:
+            # Remove duplicates but preserve order
+            links = list(dict.fromkeys(self.links))
+            htmlLinks = ['Found links:<ul>']
+            htmlLinks.extend([f'<li><a href="{link}">{link}</a></li>' for link in links])
+            htmlLinks.append('</ul>')
+            yield self.addHTMLLog('links', '\n'.join(htmlLinks))
 
         warnings_stat = self.getStatistic('warnings', 0)
         self.setStatistic('warnings', warnings_stat + self.warnCount)