aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristopher Baines <mail@cbaines.net>2020-04-25 16:42:48 +0100
committerChristopher Baines <mail@cbaines.net>2020-04-25 17:45:21 +0100
commita6a93d2d0a49332b08c53480f3f6e5d0bbb846c0 (patch)
tree17721bb19d097384e7fcfbbbe62d5d61948a71e9
parent121b5628fb9d380c25a1b5470704adf26e58bbe4 (diff)
downloadbuild-coordinator-a6a93d2d0a49332b08c53480f3f6e5d0bbb846c0.tar
build-coordinator-a6a93d2d0a49332b08c53480f3f6e5d0bbb846c0.tar.gz
Support sending and storing log files for builds
-rw-r--r--guix-build-coordinator/agent-messaging/http.scm50
-rw-r--r--guix-build-coordinator/agent.scm6
-rw-r--r--guix-build-coordinator/config.scm.in7
-rw-r--r--guix-build-coordinator/coordinator.scm10
4 files changed, 73 insertions, 0 deletions
diff --git a/guix-build-coordinator/agent-messaging/http.scm b/guix-build-coordinator/agent-messaging/http.scm
index 669981f..8fba5c2 100644
--- a/guix-build-coordinator/agent-messaging/http.scm
+++ b/guix-build-coordinator/agent-messaging/http.scm
@@ -44,6 +44,7 @@
#:export (http-agent-messaging-start-server
submit-status
+ submit-log-file
submit-build-result
report-setup-failure
submit-output
@@ -214,6 +215,25 @@ port. Also, the port used can be changed by passing the --port option.\n"
(render-json
"access denied"
#:code 403))))
+ (('PUT "build" uuid "log" format)
+ (let ((agent-id-for-build
+ (datastore-agent-for-build datastore uuid)))
+ (if (authenticated? agent-id-for-build request)
+ (let ((output-file-name
+ (build-log-file-location datastore uuid format)))
+ (mkdir-p (dirname output-file-name))
+ (call-with-output-file output-file-name
+ (lambda (output-port)
+ (let loop ((line (get-line body)))
+ (unless (eof-object? line)
+ (base64-decode line
+ base64-alphabet
+ output-port)
+ (loop (get-line body))))))
+ (no-content))
+ (render-json
+ "access denied"
+ #:code 403))))
(('PUT "build" uuid "output" output-name)
(let ((agent-id-for-build
(datastore-agent-for-build datastore uuid)))
@@ -309,6 +329,36 @@ port. Also, the port used can be changed by passing the --port option.\n"
#:level 9))
#:headers `((Authorization . ,auth-value))))
+(define (submit-log-file coordinator-uri agent-uuid password
+ build-id file)
+ (define auth-value
+ (string-append
+ "Basic "
+ (base64-encode
+ (string->utf8
+ (string-append agent-uuid ":" password)))))
+
+ (define format
+ (cond
+ ((string-suffix? ".bz2" file) "bzip2")
+ ((string-suffix? ".gz" file) "gzip")
+ (else
+ (error "unsupported log format for" file))))
+
+ (define uri
+ (coordinator-uri-for-path
+ coordinator-uri
+ (string-append "/build/" build-id "/log/" format)))
+
+ (call-with-streaming-http-request
+ uri
+ (lambda (request-port)
+ (call-with-input-file file
+ (lambda (file-port)
+ (dump-port file-port request-port))
+ #:binary #t))
+ #:headers `((Authorization . ,auth-value))))
+
(define (submit-build-result coordinator-uri agent-uuid password
build-id result)
(define auth-value
diff --git a/guix-build-coordinator/agent.scm b/guix-build-coordinator/agent.scm
index ac89db6..780f7d5 100644
--- a/guix-build-coordinator/agent.scm
+++ b/guix-build-coordinator/agent.scm
@@ -47,6 +47,12 @@
(let ((pre-build-status (pre-build-process derivation-name)))
(if (eq? (assq-ref pre-build-status 'result) 'success)
(let ((result (perform-build derivation-name)))
+ (and=> (derivation-log-file derivation-name)
+ (lambda (log-file)
+ (submit-log-file
+ coordinator-uri uuid password
+ (assoc-ref build "uuid")
+ log-file)))
((if result
post-build-success
post-build-failure)
diff --git a/guix-build-coordinator/config.scm.in b/guix-build-coordinator/config.scm.in
index 69cc98e..de65835 100644
--- a/guix-build-coordinator/config.scm.in
+++ b/guix-build-coordinator/config.scm.in
@@ -33,6 +33,13 @@
(if (file-exists? install-dir)
install-dir
dev-dir)))
+ (build-logs-dir . ,(let ((install-dir
+ "/var/lib/guix-build-coordinator/build-logs")
+ (dev-dir
+ (string-append (getcwd) "/data/build-logs")))
+ (if (file-exists? install-dir)
+ install-dir
+ dev-dir)))
(sqitch . "@sqitch@")
(sqitch-psql . "@psql@")
diff --git a/guix-build-coordinator/coordinator.scm b/guix-build-coordinator/coordinator.scm
index 6bbae04..f641ca8 100644
--- a/guix-build-coordinator/coordinator.scm
+++ b/guix-build-coordinator/coordinator.scm
@@ -38,6 +38,7 @@
make-hook-channel
build-output-file-location
+ build-log-file-location
handle-build-result
handle-setup-failure-report))
@@ -201,6 +202,15 @@
(basename output)
".nar.lz")))
+(define (build-log-file-location datastore build-id format)
+ (string-append (%config 'build-logs-dir) "/"
+ build-id "/"
+ (cond
+ ((string=? format "bzip2") "log.bz2")
+ ((string=? format "gzip") "log.gz")
+ (else
+ (error "unknown log format" format)))))
+
(define (handle-build-result datastore hook-channel
agent-id build-id result-json)
(let* ((result (assoc-ref result-json "result"))