gnu: services: Support channels when extending guix-service-type.

Most of the configuration for guix-service-type can be extended (build
machines, substitutes, etc), but channels currently cannot.  This commit adds
support for that.

* gnu/services/base.scm (guix-extension): Add `channels'.
(guix-extension-merge): Merge channels.
(guix-service-type): Add extension channels.
* doc/guix.texi (Getting Substitutes from Other Servers): Use a service
extension instead of modify-services.
(Base Services, guix-extension): Document channel field.

Change-Id: I26cd0556a536f49ecc61662fc10af080d6c6dc9f
This commit is contained in:
Ian Eure 2025-12-28 09:17:14 -08:00
parent 93e4c03938
commit 3dec0dbf14
No known key found for this signature in database
GPG key ID: 8499AC88F1A71CF2
2 changed files with 20 additions and 18 deletions

View file

@ -4018,12 +4018,9 @@ them in the specified order. You also need to explicitly authorize the
public keys of substitute servers to instruct Guix to accept the public keys of substitute servers to instruct Guix to accept the
substitutes they sign. substitutes they sign.
On Guix System, this is achieved by modifying the configuration of the On Guix System, this is achieved by extending the configuration of the
@code{guix} service. Since the @code{guix} service is part of the @code{guix} service. @pxref{Service Composition, Service extensions}
default lists of services, @code{%base-services} and allow users to easily add new configuration information.
@code{%desktop-services}, you can use @code{modify-services} to change
its configuration and add the URLs and substitute keys that you want
(@pxref{Service Reference, @code{modify-services}}).
As an example, suppose you want to fetch substitutes from As an example, suppose you want to fetch substitutes from
@code{guix.example.org} and to authorize the signing key of that server, @code{guix.example.org} and to authorize the signing key of that server,
@ -4035,18 +4032,13 @@ configuration will look something like:
(operating-system (operating-system
;; @dots{} ;; @dots{}
(services (services
;; Assume we're starting from '%desktop-services'. Replace it (cons
;; with the list of services you're actually using. (simple-service
(modify-services %desktop-services 'my-guix-configuration guix-service-type
(guix-service-type config => (guix-extension
(guix-configuration (substitute-urls (list "https://guix.example.org"))
(inherit config) (authorized-keys (list (local-file "./key.pub")))))
(substitute-urls %desktop-services)))
(append (list "https://guix.example.org")
%default-substitute-urls))
(authorized-keys
(append (list (local-file "./key.pub"))
%default-authorized-guix-keys)))))))
@end lisp @end lisp
This assumes that the file @file{key.pub} contains the signing key of This assumes that the file @file{key.pub} contains the signing key of
@ -20702,6 +20694,9 @@ a guix service extension.
@xref{Service Composition}, for more information. @xref{Service Composition}, for more information.
@table @asis @table @asis
@item @code{channels} (default: @code{'()})
A list of objects where each element is a channel record.
@item @code{authorized-keys} (default: @code{'()}) @item @code{authorized-keys} (default: @code{'()})
A list of file-like objects where each element contains a public key. A list of file-like objects where each element contains a public key.

View file

@ -241,6 +241,7 @@
guix-extension guix-extension
guix-extension? guix-extension?
guix-extension-authorized-keys guix-extension-authorized-keys
guix-extension-channels
guix-extension-substitute-urls guix-extension-substitute-urls
guix-extension-chroot-directories guix-extension-chroot-directories
@ -2428,6 +2429,8 @@ guix-daemon have the right ownership."))
(define-record-type* <guix-extension> (define-record-type* <guix-extension>
guix-extension make-guix-extension guix-extension make-guix-extension
guix-extension? guix-extension?
(channels guix-extension-channels ;list of channel
(default '()))
(authorized-keys guix-extension-authorized-keys ;list of file-like (authorized-keys guix-extension-authorized-keys ;list of file-like
(default '())) (default '()))
(substitute-urls guix-extension-substitute-urls ;list of strings (substitute-urls guix-extension-substitute-urls ;list of strings
@ -2439,6 +2442,8 @@ guix-daemon have the right ownership."))
(define (guix-extension-merge a b) (define (guix-extension-merge a b)
(guix-extension (guix-extension
(channels (append (guix-extension-channels a)
(guix-extension-channels b)))
(authorized-keys (append (guix-extension-authorized-keys a) (authorized-keys (append (guix-extension-authorized-keys a)
(guix-extension-authorized-keys b))) (guix-extension-authorized-keys b)))
(substitute-urls (append (guix-extension-substitute-urls a) (substitute-urls (append (guix-extension-substitute-urls a)
@ -2464,6 +2469,8 @@ guix-daemon have the right ownership."))
(extend (lambda (config extension) (extend (lambda (config extension)
(guix-configuration (guix-configuration
(inherit config) (inherit config)
(channels (append (guix-extension-channels extension)
(guix-configuration-channels config)))
(authorized-keys (append (guix-extension-authorized-keys extension) (authorized-keys (append (guix-extension-authorized-keys extension)
(guix-configuration-authorized-keys config))) (guix-configuration-authorized-keys config)))
(substitute-urls (append (guix-extension-substitute-urls extension) (substitute-urls (append (guix-extension-substitute-urls extension)