diff options
author | Mathieu Lirzin <mthl@gnu.org> | 2016-05-11 19:59:47 +0200 |
---|---|---|
committer | Mathieu Lirzin <mthl@gnu.org> | 2016-05-29 19:53:17 +0200 |
commit | 9d5fda76bbe7edd954d2a5112f453b9a6f625cf1 (patch) | |
tree | a5a82a74d2e1359454890472fb31e91943a62367 /bin | |
download | cuirass-9d5fda76bbe7edd954d2a5112f453b9a6f625cf1.tar cuirass-9d5fda76bbe7edd954d2a5112f453b9a6f625cf1.tar.gz |
Initial commit.
Diffstat (limited to 'bin')
-rw-r--r-- | bin/cuirass.in | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/bin/cuirass.in b/bin/cuirass.in new file mode 100644 index 0000000..91d74a5 --- /dev/null +++ b/bin/cuirass.in @@ -0,0 +1,103 @@ +#!/bin/sh +# -*- scheme -*- +exec ${GUILE:-@GUILE@} --no-auto-compile -e main -s "$0" "$@" +!# +;;;; cuirass - continuous integration system +;;; +;;; Copyright © 2016 Mathieu Lirzin <mthl@gnu.org> +;;; +;;; This file is part of Cuirass. +;;; +;;; Cuirass 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. +;;; +;;; Cuirass 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 Cuirass. If not, see <http://www.gnu.org/licenses/>. + +(use-modules (cuirass base) + (ice-9 match)) + +(define %guix-repository + (make-parameter "git://git.savannah.gnu.org/guix.git")) + +(define* (pull-changes dir) + "Get the latest version of Guix repository. Clone repository in directory +DIR if required." + (or (file-exists? dir) (mkdir dir)) + (with-directory-excursion dir + (let ((guixdir "guix")) + (or (file-exists? guixdir) + (system* "git" "clone" (%guix-repository) guixdir)) + (with-directory-excursion guixdir + (and (zero? (system* "git" "fetch")) ;no 'git pull' to avoid merges + (zero? (system* "git" "reset" "--hard" "origin/master"))))))) + +(define (compile dir) + "Compile files in Guix cloned repository in directory DIR." + (with-directory-excursion (string-append dir "/guix") + (or (file-exists? "configure") (system* "./bootstrap")) + (or (file-exists? "Makefile") + (system* "./configure" "--localstatedir=/var")) + (zero? (system* "make" "-j" (number->string (current-processor-count)))))) + +(define %user-module + ;; Cuirass user module. + (let ((m (make-module))) + (beautify-user-module! m) + m)) + +(define (build-packages store jobs) + "Build JOBS which is a list of job. ((job-symbol pair ...) ...)" + (map (lambda (thing) + (let ((name (symbol->string (car thing))) + (drv (cdadr thing))) + (format #t "building ~A => ~A~%" name drv) + ((guix-variable 'derivations 'build-derivations) store (list drv)))) + jobs)) + +(define (evaluate dir) + "Evaluate and build package derivations in directory DIR." + (save-module-excursion + (lambda () + (set-current-module %user-module) + (primitive-load (string-append dir "/guix/build-aux/hydra/gnu-system.scm")))) + (let ((store ((guix-variable 'store 'open-connection)))) + (dynamic-wind + (const #t) + (lambda () + ((guix-variable 'store 'set-build-options) store + #:use-substitutes? #f) + (build-packages + store + (match ((module-ref %user-module 'hydra-jobs) store '()) + (((names . thunks) ...) + (map (lambda (job thunk) + (format (current-error-port) "evaluating '~a'... " job) + (force-output (current-error-port)) + (cons job (call-with-time-display thunk))) + names thunks))))) + (lambda () + ((guix-variable 'store 'close-connection) store))))) + + +;;; +;;; Entry point. +;;; + +(define* (main #:optional (args (command-line))) + (match args + ((program interval) + (let ((cachedir (getenv "CUIRASS_CACHEDIR"))) + (while #t + (pull-changes cachedir) + (compile cachedir) + (evaluate cachedir) + (sleep (string->number interval))))) + (_ (main (list (car args) "60"))))) |