[Buildroot] [PATCH 1/2] autobuild-run: create reason file on build failures
Atharva Lele
itsatharva at gmail.com
Sat Jun 22 17:44:48 UTC 2019
When a build fails, we calculate the reason of failure on
the server side as well as client side. To solve this redundancy
we only calculate on the client side and submit a file which
contains the reason of failure.
Signed-off-by: Atharva Lele <itsatharva at gmail.com>
---
NOTE: This series depends on work from builder-class series
---
scripts/autobuild-run | 38 +++++++++++++++++++++++++++-----------
1 file changed, 27 insertions(+), 11 deletions(-)
diff --git a/scripts/autobuild-run b/scripts/autobuild-run
index 92afb26..6068376 100755
--- a/scripts/autobuild-run
+++ b/scripts/autobuild-run
@@ -582,20 +582,38 @@ class Builder:
return
def get_failure_reason():
- # Output is a tuple (package, version), or None.
- lastlines = decode_bytes(subprocess.Popen(
- ["tail", "-n", "3", os.path.join(self.outputdir, "logfile")],
- stdout=subprocess.PIPE).communicate()[0]).splitlines()
+ # Output is a tuple (package, version), or None in case of package failure
+ # Output is "reproducible" in case of reproducibility failure
+
+ reproducible_results = os.path.join(self.resultdir, "reproducible_results")
+ if os.path.exists(reproducible_results):
+ if os.stat(reproducible_results).st_size > 0:
+ reason = "reproducible"
+ return reason
+ else:
+ return None
+ else:
+ lastlines = decode_bytes(subprocess.Popen(
+ ["tail", "-n", "3", os.path.join(self.outputdir, "logfile")],
+ stdout=subprocess.PIPE).communicate()[0]).splitlines()
- regexp = re.compile(r'make: \*\*\* .*/(?:build|toolchain)/([^/]*)/')
- for line in lastlines:
- m = regexp.search(line)
- if m:
- return m.group(1).rsplit('-', 1)
+ regexp = re.compile(r'make: \*\*\* .*/(?:build|toolchain)/([^/]*)/')
+ for line in lastlines:
+ m = regexp.search(line)
+ if m:
+ return m.group(1).rsplit('-', 1)
# not found
return None
+ reason = get_failure_reason()
+ if reason:
+ with open(os.path.join(self.resultdir, "reason"), "w+") as reasonf:
+ if reason == "reproducible":
+ reasonf.write(reason)
+ else:
+ reasonf.write("-".join(reason))
+
def extract_end_log(resultfile):
"""Save the last part of the build log, starting from the failed package"""
@@ -604,7 +622,6 @@ class Builder:
(os.path.join(self.outputdir, "logfile"), resultfile)],
shell=True)
- reason = get_failure_reason()
if not reason:
extract_last_500_lines()
else:
@@ -628,7 +645,6 @@ class Builder:
def copy_config_log_files():
"""Recursively copy any config.log files from the failing package"""
- reason = get_failure_reason()
if not reason:
return
--
2.20.1
More information about the buildroot
mailing list