services: cuirass: Add "simple-cuirass-services".

* gnu/services/cuirass.scm (<build-manifest>,
<simple-cuirass-configuration>): New records.
(build-manifest, build-manifest?, simple-cuirass-configuration,
simple-cuirass-configuration?, simple-cuirass-services): New procedures.
(%default-cuirass-config): New variable.
* gnu/tests/cuirass.scm (%cuirass-simple-test): New variable.
* doc/guix.texi (Continuous Integration): Document it.
This commit is contained in:
Mathieu Othacehe 2021-01-22 09:44:45 +01:00
parent 25ad6e1d8e
commit e9bf511082
No known key found for this signature in database
GPG key ID: 8354763531769CA6
3 changed files with 230 additions and 2 deletions

View file

@ -27133,6 +27133,108 @@ The Cuirass package to use.
@end table
@end deftp
@cindex simple cuirass
@subsubheading Simple Cuirass
The Cuirass service configuration described above can be a little
intimidating. The @code{simple-cuirass-services} procedure offers a way
to setup a continuous integration server more readily.
It takes a @code{simple-cuirass-configuration} record as its first
argument.
@deftp {Data Type} simple-cuirass-configuration
Data type representing the configuration of a simple Cuirass instance.
@table @asis
@item @code{build} (default: @code{'all})
The packages to be built by Cuirass. It defaults to @code{'all}, which
means that all the discovered packages in the subsequent @code{channels}
field are to be selected.
It is also possible to set this field to a list of @code{build-manifest}
records, so that only the packages that are part of the declared
manifests are built. This record is described below.
@deftp {Data Type} build-manifest
@table @asis
@item @code{channel-name}
The name of the channel where the manifest is located.
@item @code{manifest}
The manifest path inside the channel.
@end table
@end deftp
@item @code{channels} (default: @code{%default-channels})
The channels to be fetched by Cuirass, see @pxref{Channels}.
@item @code{non-package-channels} (default: @code{'()})
List the channel names that must not be searched for packages. That is
often the case for the channel containing the manifest.
@item @code{systems} (default: @code{(list (%current-system))})
Build every discovered package for each system in this list. By default
only the current system is selected.
@end table
@end deftp
Here is an example of how to setup a Cuirass instance that builds all
the packages declared by Guix and a user repository. The package list
is re-evaluated each time a commit is pushed in one of the declared
channels.
@lisp
(simple-cuirass-services
(simple-cuirass-configuration
(build 'all)
(channels (cons (channel
(name 'my-guix)
(url "https://my-git-repo/guix.git"))
%default-channels))))
@end lisp
In the same spirit, this builds all the packages that are part of the
@code{'guix} or @code{'my-guix} channels and declared in the manifest
located in the @code{'conf} channel.
@lisp
(simple-cuirass-services
(simple-cuirass-configuration
(build (list
(build-manifest
(channel-name 'conf)
(manifest "guix/manifest.scm"))))
(channels (cons* (channel
(name 'my-guix)
(url "https://my-git-repo/guix.git"))
(channel
(name 'conf)
(url "https://my-git-repo/conf.git"))
%default-channels))
(non-package-channels '(conf))))
@end lisp
Finally, @code{simple-cuirass-services} takes as a second optional
argument a @code{cuirass-configuration} record. It can be used to
customize the configuration of the Cuirass instance.
@lisp
(simple-cuirass-services
(simple-cuirass-configuration
(build 'all)
(channels (cons (channel
(name 'my-guix)
(url "https://my-git-repo/guix.git"))
%default-channels))
(non-package-channels '(conf)))
(cuirass-configuration
(inherit %default-cuirass-config)
(host "0.0.0.0"))) ;listen on all interfaces.
@end lisp
@node Power Management Services
@subsection Power Management Services

View file

@ -22,11 +22,13 @@
;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>.
(define-module (gnu services cuirass)
#:use-module (guix channels)
#:use-module (guix gexp)
#:use-module (guix records)
#:use-module (guix utils)
#:use-module (gnu packages admin)
#:use-module (gnu packages ci)
#:use-module (gnu packages databases)
#:use-module (gnu packages version-control)
#:use-module (gnu services)
#:use-module (gnu services base)
@ -34,6 +36,8 @@ (define-module (gnu services cuirass)
#:use-module (gnu services shepherd)
#:use-module (gnu services admin)
#:use-module (gnu system shadow)
#:use-module (srfi srfi-1)
#:use-module (ice-9 match)
#:export (<cuirass-remote-server-configuration>
cuirass-remote-server-configuration
cuirass-remote-server-configuration?
@ -46,7 +50,18 @@ (define-module (gnu services cuirass)
<cuirass-remote-worker-configuration>
cuirass-remote-worker-configuration
cuirass-remote-worker-configuration?
cuirass-remote-worker-service-type))
cuirass-remote-worker-service-type
<build-manifest>
build-manifest
build-manifest?
<simple-cuirass-configuration>
simple-cuirass-configuration
simple-cuirass-configuration?
%default-cuirass-config
simple-cuirass-services))
;;;; Commentary:
;;;
@ -373,3 +388,88 @@ (define cuirass-remote-worker-service-type
cuirass-remote-worker-shepherd-service)))
(description
"Run the Cuirass remote build worker service.")))
(define-record-type* <build-manifest>
build-manifest make-build-manifest
build-manifest?
(channel-name build-manifest-channel-name) ;symbol
(manifest build-manifest-manifest)) ;string
(define-record-type* <simple-cuirass-configuration>
simple-cuirass-configuration make-simple-cuirass-configuration
simple-cuirass-configuration?
(build simple-cuirass-configuration-build
(default 'all)) ;symbol or list of <build-manifest>
(channels simple-cuirass-configuration-channels
(default %default-channels)) ;list of <channel>
(non-package-channels simple-cuirass-configuration-package-channels
(default '())) ;list of channels name
(systems simple-cuirass-configuration-systems
(default (list (%current-system))))) ;list of strings
(define %default-cuirass-config
(cuirass-configuration
(specifications #~())))
(define* (simple-cuirass-services config
#:optional
(cuirass %default-cuirass-config))
(define (format-name name)
(if (string? name)
name
(symbol->string name)))
(define (format-manifests build-manifests)
(map (lambda (build-manifest)
(match-record build-manifest <build-manifest>
(channel-name manifest)
(cons (format-name channel-name) manifest)))
build-manifests))
(define (channel->input channel)
(let ((name (channel-name channel))
(url (channel-url channel))
(branch (channel-branch channel)))
`((#:name . ,(format-name name))
(#:url . ,url)
(#:load-path . ".")
(#:branch . ,branch)
(#:no-compile? #t))))
(define (package-path channels non-package-channels)
(filter-map (lambda (channel)
(let ((name (channel-name channel)))
(and (not (member name non-package-channels))
(not (eq? name 'guix))
(format-name name))))
channels))
(define (config->spec config)
(match-record config <simple-cuirass-configuration>
(build channels non-package-channels systems)
`((#:name . "simple-config")
(#:load-path-inputs . ("guix"))
(#:package-path-inputs . ,(package-path channels
non-package-channels))
(#:proc-input . "guix")
(#:proc-file . "build-aux/cuirass/gnu-system.scm")
(#:proc . cuirass-jobs)
(#:proc-args . ((systems . ,systems)
,@(if (eq? build 'all)
'()
`((subset . "manifests")
(manifests . ,(format-manifests build))))))
(#:inputs . ,(map channel->input channels))
(#:build-outputs . ())
(#:priority . 1))))
(list
(service cuirass-service-type
(cuirass-configuration
(inherit cuirass)
(specifications #~(list
'#$(config->spec config)))))
(service postgresql-service-type
(postgresql-configuration
(postgresql postgresql-10)))
(service postgresql-role-service-type)))

View file

@ -35,7 +35,8 @@ (define-module (gnu tests cuirass)
#:use-module (guix gexp)
#:use-module (guix store)
#:export (%cuirass-test
%cuirass-remote-test))
%cuirass-remote-test
%cuirass-simple-test))
(define %derivation-file
(scheme-file
@ -284,3 +285,28 @@ (define %cuirass-remote-test
(name "cuirass-remote")
(description "Connect to a Cuirass server with remote build.")
(value (run-cuirass-test name os)))))
(define %cuirass-simple-test
(let ((os (operating-system
(inherit %simple-os)
(services
(append
(list cow-service
(service dhcp-client-service-type)
git-service)
(simple-cuirass-services
(simple-cuirass-configuration
(build 'all)
(channels (list (channel
(name 'guix)
(url "file:///tmp/cuirass-main/")))))
(cuirass-configuration
(inherit %default-cuirass-config)
(host "0.0.0.0")
(use-substitutes? #t)))
(operating-system-user-services %simple-os))))))
(system-test
(name "cuirass-simple")
(description "Connect to a simple Cuirass server.")
(value
(run-cuirass-test name os)))))