summaryrefslogtreecommitdiff
path: root/build.py
diff options
context:
space:
mode:
authorHelmut Grohne <helmut@subdivi.de>2019-02-03 12:42:23 +0100
committerHelmut Grohne <helmut@subdivi.de>2019-02-03 12:42:23 +0100
commita3cc49725febb2cca1c915ef768604831563954f (patch)
tree5249650a54703ef9a10ffb808ec7f64007c616c9 /build.py
downloadcrossqa-a3cc49725febb2cca1c915ef768604831563954f.tar.gz
initial checkin
Diffstat (limited to 'build.py')
-rwxr-xr-xbuild.py62
1 files changed, 62 insertions, 0 deletions
diff --git a/build.py b/build.py
new file mode 100755
index 0000000..c0def3b
--- /dev/null
+++ b/build.py
@@ -0,0 +1,62 @@
+#!/usr/bin/python3
+
+import collections
+import contextlib
+import datetime
+import lzma
+import os.path
+import sqlite3
+import subprocess
+
+from common import decompress_stream, yield_lines
+
+def yield_chunks(filelike, chunksize=65536):
+ while True:
+ data = filelike.read(chunksize)
+ if not data:
+ break
+ yield data
+
+def scan_log_status(filelike):
+ it = yield_chunks(filelike)
+ it = decompress_stream(it, lzma.LZMADecompressor())
+ it = yield_lines(it)
+ last_lines = collections.deque(it, 25)
+ status = [l.split(b':', 1)[1].strip()
+ for l in last_lines if l.startswith(b"Status:")]
+ if status:
+ return status[0].decode("ascii")
+ return "unknown"
+
+def do_build(source, version, architecture):
+ now = datetime.datetime.utcnow()
+ logtarget = "%s_%s_%s_%s.log.xz" % (source, version, architecture,
+ now.strftime("%Y%m%d%H%M%S"))
+ cmdline = ["ssh", "gcc131", "sh", "/dev/stdin", architecture,
+ "%s_%s" % (source, version)]
+ with open(os.path.join("logs", logtarget), "w+b") as output:
+ with open("build.sh", "rb") as instructions:
+ code = subprocess.call(cmdline, stdin=instructions, stdout=output)
+ output.seek(0)
+ status = scan_log_status(output)
+ print("status %s code %d" % (status, code))
+ return (now, code == 0, logtarget, status == "given-back")
+
+def main():
+ db = sqlite3.connect("db", detect_types=sqlite3.PARSE_DECLTYPES)
+ with contextlib.closing(db.cursor()) as cur:
+ cur.execute("SELECT source, version, depstate.architecture FROM depstate JOIN depcheck ON depstate.architecture = depcheck.architecture WHERE satisfiable = 1 AND giveback = 0 ORDER BY random() LIMIT 1;")
+ source, version, architecture = cur.fetchone()
+ print("building %s_%s for %s" % (source, version, architecture))
+ timestamp, success, filename, giveback = do_build(source, version, architecture)
+ with contextlib.closing(db.cursor()) as cur:
+ cur.execute("INSERT INTO builds (source, version, architecture, success, starttime, filename) VALUES (?, ?, ?, ?, ?, ?);",
+ (source, version, architecture, success, timestamp,
+ filename))
+ if giveback:
+ cur.execute("UPDATE depcheck SET giveback = 1 WHERE architecture = ?;",
+ (architecture,))
+ db.commit()
+
+if __name__ == "__main__":
+ main()