[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[bug#29995] [PATCH 2/5] publish: Publish build logs.
From: |
Ludovic Courtès |
Subject: |
[bug#29995] [PATCH 2/5] publish: Publish build logs. |
Date: |
Fri, 5 Jan 2018 18:02:55 +0100 |
* guix/scripts/publish.scm (render-log-file): New procedure.
(make-request-handler): Add "log" case.
* tests/publish.scm ("/log/NAME")
("/log/NAME not found"): New tests.
* doc/guix.texi (Invoking guix publish): Document /log URLs.
---
doc/guix.texi | 14 ++++++++++++++
guix/scripts/publish.scm | 29 +++++++++++++++++++++++++++++
tests/publish.scm | 28 ++++++++++++++++++++++++++++
3 files changed, 71 insertions(+)
diff --git a/doc/guix.texi b/doc/guix.texi
index 1d1f30f00..f6ed3ef87 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -5674,6 +5674,7 @@ collection as soon as the build completes.
@xref{Invoking guix gc}, for
more on GC roots.
@item --log-file
address@hidden build logs, access
Return the build log file names or URLs for the given
@var{package-or-derivation}, or raise an error if build logs are
missing.
@@ -7236,6 +7237,19 @@
http://example.org/file/hello-2.10.tar.gz/sha256/address@hidden
Obviously, these URLs only work for files that are in the store; in
other cases, they return 404 (``Not Found'').
address@hidden build logs, publication
+Build logs are available from @code{/log} URLs like:
+
address@hidden
+http://example.org/log/address@hidden
address@hidden example
+
address@hidden
+When @command{guix-daemon} is configured to save compressed build logs,
+as is the case by default (@pxref{Invoking guix-daemon}), @code{/log}
+URLs return the compressed log as-is, with an appropriate
address@hidden and/or @code{Content-Encoding} header.
+
The following options are available:
@table @code
diff --git a/guix/scripts/publish.scm b/guix/scripts/publish.scm
index 7e6d3fb23..1bc0ff3b6 100644
--- a/guix/scripts/publish.scm
+++ b/guix/scripts/publish.scm
@@ -572,6 +572,31 @@ has the given HASH of type ALGO."
(not-found request)))
(not-found request)))
+(define (render-log-file store request name)
+ "Render the log file for NAME, the base name of a store item. Don't attempt
+to compress or decompress the log file; just return it as-is."
+ (define (response-headers file)
+ ;; XXX: We're not returning the actual contents, deferring instead to
+ ;; 'http-write'. This is a hack to work around
+ ;; <http://bugs.gnu.org/21093>.
+ (cond ((string-suffix? ".gz" file)
+ `((content-type . (text/plain (charset . "UTF-8")))
+ (content-encoding . gzip)
+ (x-raw-file . ,file)))
+ ((string-suffix? ".bz2" file)
+ `((content-type . (application/x-bzip2
+ (charset . "ISO-8859-1")))
+ (x-raw-file . ,file)))
+ (else ;uncompressed
+ `((content-type . (text/plain (charset . "UTF-8")))
+ (x-raw-file . ,file)))))
+
+ (let ((log (log-file store
+ (string-append (%store-prefix) "/" name))))
+ (if log
+ (values (response-headers log) log)
+ (not-found request))))
+
(define (render-home-page request)
"Render the home page."
(values `((content-type . (text/html (charset . "UTF-8"))))
@@ -772,6 +797,10 @@ blocking."
(render-content-addressed-file store request
name 'sha256 hash))))
+ ;; /log/OUTPUT
+ (("log" name)
+ (render-log-file store request name))
+
;; Use different URLs depending on the compression type. This
;; guarantees that /nar URLs remain valid even when 'guix publish'
;; is restarted with different compression parameters.
diff --git a/tests/publish.scm b/tests/publish.scm
index 352caf532..bd1a75cf0 100644
--- a/tests/publish.scm
+++ b/tests/publish.scm
@@ -1,5 +1,6 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2015 David Thompson <address@hidden>
+;;; Copyright © 2016, 2017, 2018 Ludovic Courtès <address@hidden>
;;;
;;; This file is part of GNU Guix.
;;;
@@ -439,4 +440,31 @@ FileSize: ~a~%"
(assoc-ref narinfo "FileSize"))
(response-code compressed))))))))))
+(test-equal "/log/NAME"
+ `(200 #t application/x-bzip2)
+ (let ((drv (run-with-store %store
+ (gexp->derivation "with-log"
+ #~(call-with-output-file #$output
+ (lambda (port)
+ (display "Hello, build log!"
+ (current-error-port))
+ (display "" port)))))))
+ (build-derivations %store (list drv))
+ (let* ((response (http-get
+ (publish-uri (string-append "/log/"
+ (basename
(derivation->output-path drv))))
+ #:decode-body? #f))
+ (base (basename (derivation-file-name drv)))
+ (log (string-append (dirname %state-directory)
+ "/log/guix/drvs/" (string-take base 2)
+ "/" (string-drop base 2) ".bz2")))
+ (list (response-code response)
+ (= (response-content-length response) (stat:size (stat log)))
+ (first (response-content-type response))))))
+
+(test-equal "/log/NAME not found"
+ 404
+ (let ((uri (publish-uri "/log/does-not-exist")))
+ (response-code (http-get uri))))
+
(test-end "publish")
--
2.15.1
- [bug#29995] [PATCH 0/5] Publish build logs, compress as gzip, Ludovic Courtès, 2018/01/05
- [bug#29995] [PATCH 1/5] publish: Use 'x-raw-file' internal response header., Ludovic Courtès, 2018/01/05
- [bug#29995] [PATCH 0/5] Publish build logs, compress as gzip, Ludovic Courtès, 2018/01/05
- bug#29995: [PATCH 0/5] Publish build logs, compress as gzip, Ludovic Courtès, 2018/01/07
- [bug#29995] [PATCH 0/5] Publish build logs, compress as gzip, Ludovic Courtès, 2018/01/07