aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--guix-data-service/builds.scm4
-rw-r--r--guix-data-service/model/build.scm97
-rw-r--r--guix-data-service/web/build-server/controller.scm23
-rw-r--r--guix-data-service/web/build-server/html.scm12
-rw-r--r--guix-data-service/web/view/html.scm21
5 files changed, 128 insertions, 29 deletions
diff --git a/guix-data-service/builds.scm b/guix-data-service/builds.scm
index c3421b9..20cf094 100644
--- a/guix-data-service/builds.scm
+++ b/guix-data-service/builds.scm
@@ -284,6 +284,7 @@ WHERE derivation_output_details.path = $1"
conn
build-server-id
derivation
+ #f
#:derivation-output-details-set-id
(match
(vhash-assoc
@@ -333,7 +334,8 @@ WHERE derivation_output_details.path = $1"
(let ((build-id
(ensure-build-exists conn
build-server-id
- (assoc-ref data "derivation"))))
+ (assoc-ref data "derivation")
+ #f)))
(insert-build-statuses-from-data
conn
build-server-id
diff --git a/guix-data-service/model/build.scm b/guix-data-service/model/build.scm
index 2a2cf99..9e81611 100644
--- a/guix-data-service/model/build.scm
+++ b/guix-data-service/model/build.scm
@@ -23,6 +23,7 @@
#:export (select-build-stats
select-builds-with-context
select-builds-with-context-by-derivation-file-name
+ select-build-by-build-server-and-build-server-build-id
select-build-by-build-server-and-derivation-file-name
select-required-builds-that-failed
update-builds-derivation-output-details-set-id
@@ -198,6 +199,7 @@ LIMIT 100"))
"
SELECT build_servers.id,
build_servers.url,
+ builds.build_server_build_id,
latest_build_status.timestamp,
latest_build_status.status
FROM builds
@@ -219,11 +221,50 @@ ORDER BY latest_build_status.timestamp DESC")
(exec-query conn query (list derivation-file-name)))
+(define (select-build-by-build-server-and-build-server-build-id
+ conn build-server-id build-server-build-id)
+ (define query
+ "
+SELECT build_servers.url,
+ builds.derivation_file_name,
+ JSON_AGG(
+ json_build_object(
+ 'timestamp', build_status.timestamp,
+ 'status', build_status.status
+ )
+ ORDER BY build_status.timestamp
+ ) AS statuses
+FROM builds
+INNER JOIN build_servers
+ ON build_servers.id = builds.build_server_id
+INNER JOIN build_status
+ ON builds.id = build_status.build_id
+INNER JOIN derivations_by_output_details_set
+ ON builds.derivation_output_details_set_id =
+ derivations_by_output_details_set.derivation_output_details_set_id
+INNER JOIN derivations
+ ON derivations.id = derivations_by_output_details_set.derivation_id
+WHERE build_server_id = $1 AND
+ builds.build_server_build_id = $2
+GROUP BY build_servers.url, builds.derivation_file_name")
+
+ (match (exec-query conn
+ query
+ (list (number->string build-server-id)
+ build-server-build-id))
+ (((build-server-url derivation-file-name statuses-json))
+ (list build-server-url
+ derivation-file-name
+ (json-string->scm statuses-json)))
+ (()
+ #f)))
+
(define (select-build-by-build-server-and-derivation-file-name
conn build-server-id derivation-file-name)
(define query
"
SELECT build_servers.url,
+ builds.derivation_file_name,
JSON_AGG(
json_build_object(
'timestamp', build_status.timestamp,
@@ -243,14 +284,17 @@ INNER JOIN derivations
ON derivations.id = derivations_by_output_details_set.derivation_id
WHERE build_server_id = $1 AND
derivations.file_name = $2
-GROUP BY build_servers.url")
+GROUP BY build_servers.url, builds.derivation_file_name")
(match (exec-query conn
query
(list (number->string build-server-id)
derivation-file-name))
- (((build-server-url statuses-json))
+ (((build-server-url derivation-file-name statuses-json))
+ ;; Returning the derivation-file-name is for consistency with
+ ;; select-build-by-build-server-and-build-server-build-id
(list build-server-url
+ derivation-file-name
(json-string->scm statuses-json)))
(()
#f)))
@@ -310,6 +354,23 @@ WHERE build_server_id = $1 AND derivation_file_name = $2")
(_
#f)))
+(define (select-build-id-by-build-server-and-build-server-build-id
+ conn build-server-id build-server-build-id)
+ (define query
+ "
+SELECT id
+FROM builds
+WHERE build_server_id = $1 AND build_server_build_id = $2")
+
+ (match (exec-query conn
+ query
+ (list (number->string build-server-id)
+ build-server-build-id))
+ (((id))
+ (string->number id))
+ (_
+ #f)))
+
(define (update-builds-derivation-output-details-set-id conn derivation-file-names)
(exec-query
conn
@@ -344,16 +405,21 @@ WHERE derivations.file_name = $1"
(_
#f)))
-(define (insert-builds conn build-server-id derivation-file-names)
+(define (insert-builds conn build-server-id derivation-file-names
+ build-server-build-ids)
(let ((build-ids
(insert-missing-data-and-return-all-ids
conn
"builds"
- '(build_server_id derivation_file_name)
- (map (lambda (derivation-file-name)
+ '(build_server_id derivation_file_name build_server_build_id)
+ (map (lambda (derivation-file-name build-server-build-id)
(list build-server-id
- derivation-file-name))
- derivation-file-names)
+ derivation-file-name
+ (if (string? build-server-build-id)
+ build-server-build-id
+ '())))
+ derivation-file-names
+ build-server-build-ids)
#:delete-duplicates? #t)))
(exec-query
@@ -375,13 +441,15 @@ UPDATE builds SET derivation_output_details_set_id = (
build-ids))
(define* (insert-build conn build-server-id derivation-file-name
+ build-server-build-id
#:key derivation-output-details-set-id)
(match (exec-query
conn
(string-append
"
INSERT INTO builds
- (build_server_id, derivation_file_name, derivation_output_details_set_id)
+ (build_server_id, derivation_file_name, derivation_output_details_set_id,
+ build_server_build_id)
VALUES ("
(number->string build-server-id)
", "
@@ -396,6 +464,10 @@ VALUES ("
derivation-file-name))
number->string)
"NULL")
+ ", "
+ (or (and=> build-server-build-id
+ quote-string)
+ "NULL")
")
RETURNING (id)"))
(((id))
@@ -404,10 +476,14 @@ RETURNING (id)"))
(define* (ensure-build-exists conn
build-server-id
derivation-file-name
+ build-server-build-id
#:key derivation-output-details-set-id)
(let ((existing-build-id
- (select-build-id-by-build-server-and-derivation-file-name
- conn build-server-id derivation-file-name)))
+ (if build-server-build-id
+ (select-build-id-by-build-server-and-build-server-build-id
+ conn build-server-id build-server-build-id)
+ (select-build-id-by-build-server-and-derivation-file-name
+ conn build-server-id derivation-file-name))))
(if existing-build-id
(begin
@@ -423,5 +499,6 @@ WHERE builds.id = $1 AND derivation_output_details_set_id IS NULL"
(insert-build conn
build-server-id
derivation-file-name
+ build-server-build-id
#:derivation-output-details-set-id
derivation-output-details-set-id))))
diff --git a/guix-data-service/web/build-server/controller.scm b/guix-data-service/web/build-server/controller.scm
index c9db9a0..c68ef7d 100644
--- a/guix-data-service/web/build-server/controller.scm
+++ b/guix-data-service/web/build-server/controller.scm
@@ -53,18 +53,25 @@
#f))))
(let* ((derivation-file-name
(assq-ref query-parameters 'derivation_file_name))
+ (build-server-build-id
+ (assq-ref query-parameters 'build_server_build_id))
(build
- (select-build-by-build-server-and-derivation-file-name
- conn
- build-server-id
- derivation-file-name)))
+ (if build-server-build-id
+ (select-build-by-build-server-and-build-server-build-id
+ conn
+ build-server-id
+ build-server-build-id)
+ (select-build-by-build-server-and-derivation-file-name
+ conn
+ build-server-id
+ derivation-file-name))))
(if build
(render-html
#:sxml
(view-build query-parameters
build
(if (string=?
- (assoc-ref (last (vector->list (second build)))
+ (assoc-ref (last (vector->list (third build)))
"status")
"failed-dependency")
(select-required-builds-that-failed
@@ -105,6 +112,9 @@
build-server-id
(map (lambda (item)
(assoc-ref item "derivation"))
+ items)
+ (map (lambda (item)
+ (assoc-ref item "build_id"))
items))))
(insert-build-statuses
conn
@@ -212,7 +222,8 @@
(let ((parsed-query-parameters
(parse-query-parameters
request
- `((derivation_file_name ,identity #:required)))))
+ `((derivation_file_name ,identity)
+ (build_server_build_id ,identity)))))
(render-build mime-types
conn
(string->number build-server-id)
diff --git a/guix-data-service/web/build-server/html.scm b/guix-data-service/web/build-server/html.scm
index 319ab79..0078e8e 100644
--- a/guix-data-service/web/build-server/html.scm
+++ b/guix-data-service/web/build-server/html.scm
@@ -27,9 +27,6 @@
(define (view-build query-parameters
build
required-failed-builds)
- (define derivation
- (assq-ref query-parameters 'derivation_file_name))
-
(layout
#:body
`(,(header)
@@ -43,13 +40,13 @@
(div
(@ (class "row"))
,@(match build
- ((url statuses)
+ ((url derivation-file-name statuses)
`((div
(@ (class "col-sm-6"))
(dl
(@ (class "dl-horizontal"))
(dt "Derivation")
- (dd ,(display-possible-store-item derivation))
+ (dd ,(display-possible-store-item derivation-file-name))
(dt "Build server URL")
(dd (a (@ (href ,url))
,url))))
@@ -65,7 +62,10 @@
(tbody
,@(map (lambda (status)
`(tr
- (td ,(assoc-ref status "timestamp"))
+ (td ,(let ((timestamp (assoc-ref status "timestamp")))
+ (if (eq? timestamp 'null)
+ "(unknown)"
+ timestamp)))
(td ,(build-status-span
(assoc-ref status "status")))))
(vector->list statuses)))))))))
diff --git a/guix-data-service/web/view/html.scm b/guix-data-service/web/view/html.scm
index d734cd0..cf5421a 100644
--- a/guix-data-service/web/view/html.scm
+++ b/guix-data-service/web/view/html.scm
@@ -631,15 +631,24 @@ time."
,(build-status-span "")))
(map
(match-lambda
- ((build-server-id build-server-url timestamp status)
+ ((build-server-id build-server-url
+ build-server-build-id
+ timestamp status)
+ (define build-url
+ (if (string? build-server-build-id)
+ (simple-format
+ #f "/build-server/~A/build?build_server_build_id=~A"
+ build-server-id
+ build-server-build-id)
+ (simple-format
+ #f "/build-server/~A/build?derivation_file_name=~A"
+ build-server-id
+ (second derivation))))
+
`(div
(@ (class "text-center"))
(div
- (a (@ (href
- ,(simple-format
- #f "/build-server/~A/build?derivation_file_name=~A"
- build-server-id
- (second derivation))))
+ (a (@ (href ,build-url))
,(build-status-span status)))
(a (@ (style "display: inline-block; margin-top: 0.4em;")
(href ,(simple-format