From: Mathieu Lirzin <mthl@gnu.org>
To: guix-devel@gnu.org
Subject: [PATCH 2/2] services: Add 'cuirass-service'.
Date: Wed, 26 Oct 2016 15:05:58 +0200 [thread overview]
Message-ID: <20161026130558.31924-3-mthl@gnu.org> (raw)
In-Reply-To: <20161026130558.31924-1-mthl@gnu.org>
[-- Attachment #1: Type: text/plain, Size: 411 bytes --]
* gnu/services/cuirass.scm: New file.
* gnu/local.mk (GNU_SYSTEM_MODULES): Add it.
* doc/guix.texi (Continuous integration): New node.
---
doc/guix.texi | 86 +++++++++++++++++++++++++++++++
gnu/local.mk | 1 +
gnu/services/cuirass.scm | 128 +++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 215 insertions(+)
create mode 100644 gnu/services/cuirass.scm
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0002-services-Add-cuirass-service.patch --]
[-- Type: text/x-patch; name="0002-services-Add-cuirass-service.patch", Size: 10376 bytes --]
diff --git a/doc/guix.texi b/doc/guix.texi
index 86b82c8..f9cb9e4 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -7687,6 +7687,7 @@ declaration.
* Mail Services:: IMAP, POP3, SMTP, and all that.
* Web Services:: Web servers.
* Network File System:: NFS related services.
+* Continuous integration:: The cuirass service.
* Miscellaneous Services:: Other services.
@end menu
@@ -10524,6 +10525,91 @@ If it is @code{#f} then the daemon will use the host's fully qualified domain na
@end table
@end deftp
+@node Continuous integration
+@subsubsection Continuous integration
+
+@cindex continuous integration
+@uref{https://notabug.org/mthl/cuirass, Cuirass} is a continuous
+integration tool for Guix. It can be used both for development and
+for providing substitutes to others (@pxref{Substitutes}).
+
+The @code{(gnu services cuirass)} module provides the following service.
+
+@deffn {Scheme Procedure} cuirass-service @
+ [#:config @code{%default-cuirass-configuration}]
+Return a service that runs @command{cuirass}.
+
+The @var{#:config} keyword argument specifies the configuration for
+@command{cuirass}, which must be a @code{<cuirass-configuration>}
+object, by default it doesn't provide any build job. If you want to
+provide your own configuration you will most likely use the
+@code{cuirass-configuration} special form which returns such objects.
+@end deffn
+
+In order to add build jobs you will have to set the
+@code{specifications} field. Due to current limitations of Cuirass, the
+specifications are re-added each time the associated Shepherd service is
+restarted. This is indeed a bug. Here is an example of a cuirass
+service defining a build job based on a specification that can be found
+in Cuirass source tree.
+
+@example
+(let ((spec `((#:name . "guix")
+ (#:url . "git://git.savannah.gnu.org/guix.git")
+ (#:load-path . ".")
+ ;; Adapt to a valid absolute file name.
+ (#:file . "/.../cuirass/tests/gnu-system.scm")
+ (#:proc . hydra-jobs)
+ (#:arguments (subset . "hello"))
+ (#:branch . "master"))))
+ (cuirass-service #:config (cuirass-configuration
+ (specifications (list spec)))))
+@end example
+
+While information related to build jobs are located directly in the
+specifications, global parameters for the @command{cuirass} process are
+accessible in other @code{cuirass-configuration} fields.
+
+@deftp {Data Type} cuirass-configuration
+Data type representing the configuration of Cuirass.
+
+@table @asis
+@item @code{cache-directory} (default: "")
+Location of the repository cache.
+
+@item @code{user} (default: "cuirass")
+Owner of the @code{cuirass} process.
+
+@item @code{group} (default: "cuirass")
+Owner's group of the @code{cuirass} process.
+
+@item @code{interval} (default: 60)
+Number of seconds between the poll of the repositories followed by the
+Cuirass jobs.
+
+@item @code{database} (default: "/var/run/cuirass/cuirass.db")
+Location of sqlite database which contains the build results and previously
+added specifications.
+
+@item @code{specifications} (default: @code{'()})
+A list of specifications, where a specification is an association list
+(@pxref{Associations Lists,,, guile, GNU Guile Reference Manual}) whose
+keys are keywords (@code{#:keyword-example}) as shown in the example
+above.
+
+@item @code{use-substitutes?} (default: @code{#f})
+This allows using substitutes to avoid building every dependencies of a job
+from source.
+
+@item @code{one-shot?} (default: @code{#f})
+Only evaluate specifications and build derivations once.
+@end table
+@end deftp
+
+@defvar %default-cuirass-configuration
+This global variable contains a @code{cuirass-configuration} where all
+the fields contain their default value.
+@end defvar
@node Miscellaneous Services
@subsubsection Miscellaneous Services
diff --git a/gnu/local.mk b/gnu/local.mk
index c6cd586..e0ec339 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -392,6 +392,7 @@ GNU_SYSTEM_MODULES = \
%D%/services/admin.scm \
%D%/services/avahi.scm \
%D%/services/base.scm \
+ %D%/services/cuirass.scm \
%D%/services/databases.scm \
%D%/services/dbus.scm \
%D%/services/desktop.scm \
diff --git a/gnu/services/cuirass.scm b/gnu/services/cuirass.scm
new file mode 100644
index 0000000..93e2805
--- /dev/null
+++ b/gnu/services/cuirass.scm
@@ -0,0 +1,128 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2016 Mathieu Lirzin <mthl@gnu.org>
+;;;
+;;; This file is part of GNU Guix.
+;;;
+;;; GNU Guix 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.
+;;;
+;;; GNU Guix 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 GNU Guix. If not, see <http://www.gnu.org/licenses/>.
+
+(define-module (gnu services cuirass)
+ #:use-module (guix gexp)
+ #:use-module (guix records)
+ #:use-module (gnu packages admin)
+ #:autoload (gnu packages ci) (cuirass)
+ #:use-module (gnu services)
+ #:use-module (gnu services base)
+ #:use-module (gnu services shepherd)
+ #:use-module (gnu system shadow)
+ #:export (<cuirass-configuration>
+ cuirass-configuration
+ cuirass-configuration?
+ cuirass-configuration-cache-directory
+ cuirass-configuration-group
+ cuirass-configuration-interval
+ cuirass-configuration-database
+ cuirass-configuration-specifications
+ cuirass-configuration-use-substitutes?
+ cuirass-configuration-one-shot?
+ %default-cuirass-configuration
+
+ cuirass-service-type
+ cuirass-service))
+
+;;;; Commentary:
+;;;
+;;; This module implements a service that to run instances of Cuirass, a
+;;; continuous integration tool.
+;;;
+;;;; Code:
+
+(define-record-type* <cuirass-configuration>
+ cuirass-configuration make-cuirass-configuration
+ cuirass-configuration?
+ (cache-directory cuirass-configuration-cache-directory ;string (dir-name)
+ (default ""))
+ (user cuirass-configuration-user ;string
+ (default "cuirass"))
+ (group cuirass-configuration-group ;string
+ (default "cuirass"))
+ (interval cuirass-configuration-interval ;integer (seconds)
+ (default 60))
+ (database cuirass-configuration-database ;string (file-name)
+ (default "/var/run/cuirass/cuirass.db"))
+ (specifications cuirass-configuration-specifications ;string (file-name)
+ (default ""))
+ (use-substitutes? cuirass-configuration-use-substitutes? ;boolean
+ (default #f))
+ (one-shot? cuirass-configuration-one-shot? ;boolean
+ (default #f)))
+
+(define %default-cuirass-configuration
+ (cuirass-configuration))
+
+(define (cuirass-shepherd-service config)
+ "Return a <shepherd-service> for the Cuirass service with CONFIG."
+ (and
+ (cuirass-configuration? config)
+ (let ((cache-directory (cuirass-configuration-cache-directory config))
+ (interval (cuirass-configuration-interval config))
+ (database (cuirass-configuration-database config))
+ (specifications (cuirass-configuration-specifications config))
+ (use-substitutes? (cuirass-configuration-use-substitutes? config))
+ (one-shot? (cuirass-configuration-one-shot? config)))
+ (list (shepherd-service
+ (documentation "Run Cuirass.")
+ (provision '(cuirass))
+ (requirement '(guix-daemon))
+ (start #~(make-forkexec-constructor
+ (list (string-append #$cuirass "/bin/cuirass")
+ #$@(if (string=? "" cache-directory)
+ '()
+ (list "--cache-directory" cache-directory))
+ ;; XXX: the specifications are re-added each time
+ ;; this service restarts
+ #$@(if (string=? "" specifications)
+ '()
+ (list "--specifications" specifications))
+ "--database" #$database
+ "--interval" #$(number->string interval)
+ #$@(if use-substitutes? '("--use-substitutes") '())
+ #$@(if one-shot? "--one-shot" '()))))
+ (stop #~(make-kill-destructor)))))))
+
+(define (cuirass-account config)
+ "Return the user accounts and user groups for CONFIG."
+ (let ((cuirass-user (cuirass-configuration-user config))
+ (cuirass-group (cuirass-configuration-group config)))
+ (list (user-group
+ (name cuirass-group)
+ (system? #t))
+ (user-account
+ (name cuirass-user)
+ (group cuirass-group)
+ (system? #t)
+ (comment "Cuirass privilege separation user")
+ (home-directory (string-append "/var/run/" cuirass-user))
+ (shell #~(string-append #$shadow "/sbin/nologin"))))))
+
+(define cuirass-service-type
+ (service-type
+ (name 'cuirass)
+ (extensions
+ (list
+ (service-extension shepherd-root-service-type cuirass-shepherd-service)
+ (service-extension account-service-type cuirass-account)))))
+
+(define* (cuirass-service #:key (config %default-cuirass-configuration))
+ "Return a service that runs cuirass according to CONFIG."
+ (service cuirass-service-type config))
next prev parent reply other threads:[~2016-10-26 13:06 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-10-26 13:05 [PATCH 0/2] Cuirass package + service Mathieu Lirzin
2016-10-26 13:05 ` [PATCH 1/2] gnu: Add Cuirass Mathieu Lirzin
2016-10-26 13:36 ` David Craven
2016-11-29 22:25 ` Mathieu Lirzin
2016-11-30 13:10 ` Ludovic Courtès
2016-10-26 13:05 ` Mathieu Lirzin [this message]
2016-10-26 13:35 ` [PATCH 2/2] services: Add 'cuirass-service' David Craven
2016-10-26 14:42 ` Mathieu Lirzin
2016-10-26 18:57 ` David Craven
2016-10-27 0:22 ` Leo Famulari
2016-11-06 13:16 ` Andreas Enge
2016-10-27 13:36 ` Ludovic Courtès
2016-11-29 22:22 ` Mathieu Lirzin
2016-11-30 21:53 ` Unable to configure a system with 'cuirass-service' ng0
2016-11-30 23:14 ` Carlo Zancanaro
2016-12-01 12:41 ` ng0
2016-12-01 12:59 ` Carlo Zancanaro
2016-12-01 13:23 ` ng0
2016-12-01 15:13 ` Carlo Zancanaro
2016-12-01 20:22 ` Mathieu Lirzin
2016-12-15 21:58 ` Mathieu Lirzin
2016-12-15 22:55 ` ng0
2016-12-15 23:15 ` Mathieu Lirzin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://guix.gnu.org/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20161026130558.31924-3-mthl@gnu.org \
--to=mthl@gnu.org \
--cc=guix-devel@gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/guix.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).