branch: main
commit 8c47556404b97830b6ad05c03ede8fb25b5ad56b
Author: Romain GARBAGE <[email protected]>
AuthorDate: Mon Feb 24 15:38:09 2025 +0100

    register: Add support for event logging in builders.
    
    * src/cuirass/base.scm (local-builder, spawn-local-builder, remote-builder,
    spawn-remote-builder): Add support for logging events to the corresponding
    agent through Fibers.
    * src/cuirass/scripts/register.scm (cuirass-register): Add event-log-service
    agent and use it in builders.
    * tests/remote.scm (start-notification-server): Add event-log-service agent.
    
    Signed-off-by: Ludovic Courtès <[email protected]>
---
 src/cuirass/base.scm             | 29 ++++++++++++++++++++---------
 src/cuirass/scripts/register.scm |  5 +++--
 tests/remote.scm                 |  5 +++--
 3 files changed, 26 insertions(+), 13 deletions(-)

diff --git a/src/cuirass/base.scm b/src/cuirass/base.scm
index fa3481f..efa3dc8 100644
--- a/src/cuirass/base.scm
+++ b/src/cuirass/base.scm
@@ -439,7 +439,7 @@ OUTPUTS, a list of <build-output> records."
                     (checksum ""))))))            ;TODO: Implement it.
             outputs))
 
-(define (local-builder channel)
+(define (local-builder channel event-log)
   (lambda ()
     (log-info "builds will be made via the local build daemon")
     (let loop ()
@@ -460,14 +460,22 @@ OUTPUTS, a list of <build-output> records."
                      (fail (- (length derivations) success)))
 
                 (log-info "outputs:\n~a" (string-join outs "\n"))
+                ;; Log the same kind of information as remote-builder.
+                (for-each (lambda (build)
+                            (put-message event-log
+                             `(new-event (derivation-built
+                                          ,(build-derivation build)
+                                          ,(build-current-status build)))))
+                          results)
                 results))))))
       (loop))))
 
-(define (spawn-local-builder)
+(define (spawn-local-builder event-log)
   "Spawn a build actor that executes the derivation build requests it receives
-by handing them to the local build daemon."
+by handing them to the local build daemon. The build actor sends the build
+status to the event log service through EVENT-LOG, a Fibers channel."
   (let ((channel (make-channel)))
-    (spawn-fiber (local-builder channel))
+    (spawn-fiber (local-builder channel event-log))
     channel))
 
 (define (remote-builder-listener socket channel)
@@ -492,9 +500,10 @@ reads to CHANNEL."
                         (serve-client connection)))
          (loop))))))
 
-(define (remote-builder channel socket)
+(define (remote-builder channel socket event-log)
   "Spawn a remote builder that accepts messages on CHANNEL and receives
-notifications from 'cuirass remote-server' over SOCKET."
+notifications from 'cuirass remote-server' over SOCKET. It also sends the log
+events to the event log service using EVENT-LOG, a Fibers channel."
   (lambda ()
     (log-info "builds will be delegated to 'cuirass remote-server'")
     (spawn-fiber (remote-builder-listener socket channel))
@@ -508,10 +517,12 @@ notifications from 'cuirass remote-server' over SOCKET."
          (log-info "~a pending derivation builds" (length derivations)))
         (`(build-status-change ,derivation ,status)
          ;; TODO: Handle database operations, notifications, etc. from here.
-         (log-info "status of '~a' changed to ~a" derivation status)))
+         (log-info "status of '~a' changed to ~a" derivation status)
+         (put-message event-log
+                      `(new-event (derivation-built ,derivation ,status)))))
       (loop))))
 
-(define (spawn-remote-builder)
+(define (spawn-remote-builder event-log)
   "Spawn a build actor that performs builds using \"remote workers\".  Return
 once ready to listen for incoming connections from 'cuirass remote-server'."
   (log-info "listening for 'cuirass remote-server' notifications on '~a'"
@@ -519,7 +530,7 @@ once ready to listen for incoming connections from 'cuirass 
remote-server'."
   (let ((channel (make-channel))
         (socket (open-unix-listening-socket
                  (%remote-server-socket-file-name))))
-    (spawn-fiber (remote-builder channel socket))
+    (spawn-fiber (remote-builder channel socket event-log))
     channel))
 
 
diff --git a/src/cuirass/scripts/register.scm b/src/cuirass/scripts/register.scm
index e32fe52..1698a8c 100644
--- a/src/cuirass/scripts/register.scm
+++ b/src/cuirass/scripts/register.scm
@@ -271,9 +271,10 @@
                (if one-shot?
                    (leave (G_ "'--one-shot' is currently unimplemented~%"))
                    (let* ((exit-channel (make-channel))
+                          (event-log-service (spawn-event-log-service))
                           (builder (if (option-ref opts 'build-remote #f)
-                                       (spawn-remote-builder)
-                                       (spawn-local-builder)))
+                                       (spawn-remote-builder event-log-service)
+                                       (spawn-local-builder 
event-log-service)))
                           (evaluator (spawn-jobset-evaluator
                                       #:max-parallel-evaluations
                                       max-parallel-evaluations
diff --git a/tests/remote.scm b/tests/remote.scm
index 4a2e686..bfc1add 100644
--- a/tests/remote.scm
+++ b/tests/remote.scm
@@ -30,7 +30,8 @@
              (cuirass specification)
              ((cuirass remote) #:select (worker-systems))
              ((cuirass base) #:select (%remote-server-socket-file-name
-                                       spawn-remote-builder))
+                                       spawn-remote-builder
+                                       spawn-event-log-service))
              (gnu packages base)
              (guix build utils)
              (guix channels)
@@ -111,7 +112,7 @@
                               (setvbuf (current-error-port) 'none)
                               (run-fibers
                                (lambda ()
-                                 (spawn-remote-builder)
+                                 (spawn-remote-builder 
(spawn-event-log-service))
                                  (sleep 120))     ;wait
                                #:drain? #t)))))))
     ;; Wait until this process is accepting connections.

Reply via email to