aboutsummaryrefslogtreecommitdiff
path: root/guix-build-coordinator/hooks.scm
blob: 0116605ea9c140c51e88c65264902a5a13535356 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
;;; Guix Build Coordinator
;;;
;;; Copyright © 2020 Christopher Baines <mail@cbaines.net>
;;;
;;; This file is part of the guix-build-coordinator.
;;;
;;; The Guix Build Coordinator is free software; you can redistribute
;;; it and/or modify it under the terms of the GNU General Public
;;; License as published by the Free Software Foundation; either
;;; version 3 of the License, or (at your option) any later version.
;;;
;;; The Guix Build Coordinator is distributed in the hope that it will
;;; be useful, but WITHOUT ANY WARRANTY; without even the implied
;;; warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
;;; See the GNU General Public License for more details.
;;;
;;; You should have received a copy of the GNU General Public License
;;; along with the guix-data-service.  If not, see
;;; <http://www.gnu.org/licenses/>.

(define-module (guix-build-coordinator hooks)
  #:use-module (srfi srfi-1)
  #:use-module (ice-9 match)
  #:use-module (guix-build-coordinator datastore)
  #:use-module (guix-build-coordinator coordinator)
  #:export (default-build-success-hook
            default-build-failure-hook
            default-build-missing-inputs-hook))

(define (default-build-success-hook datastore build-id)
  (let ((agent-id
         (datastore-agent-for-build datastore build-id)))
    (display
     (simple-format #f
                    "build ~A succeeded (on agent ~A)\n"
                    build-id agent-id)
     (current-error-port))))

(define (default-build-failure-hook datastore build-id)
  (let ((agent-id
         (datastore-agent-for-build datastore build-id)))
    (display
     (simple-format #f
                    "build ~A failed (on agent ~A)\n"
                    build-id agent-id)
     (current-error-port))))

(define (default-build-missing-inputs-hook datastore build-id missing-inputs)
  (let ((build (datastore-find-build datastore build-id)))
    (let ((derivation-inputs
           (datastore-find-derivation-inputs datastore
                                             (assq-ref build 'derivation-name))))
      (simple-format #t "missing-inputs: ~A\n~A\n"
                     build-id
                     (string-join (map (lambda (input)
                                         (string-append " - " input))
                                       missing-inputs)
                                  "\n"))
      (for-each (lambda (missing-input)
                  (let ((input-derivation
                         (any (lambda (derivation-input)
                                (if (string=? (assq-ref derivation-input 'output)
                                              missing-input)
                                    (assq-ref derivation-input 'derivation)
                                    #f))
                              derivation-inputs)))
                    (unless input-derivation
                      (error "couldn't find a derivation for " missing-input))

                    (let ((builds-for-output
                           (datastore-list-builds-for-output datastore
                                                             missing-input)))
                      (if (null? builds-for-output)
                          (begin
                            (simple-format #t
                                           "submitting build for ~A\n"
                                           input-derivation)
                            (submit-build datastore input-derivation))
                          (simple-format #t "~A builds exist for ~A, skipping\n"
                                         (length builds-for-output)
                                         missing-input)))))
                missing-inputs))))