From 59e9f7983efcc1ee08609b075ea8345e5318b125 Mon Sep 17 00:00:00 2001 From: Frank Duncan Date: Fri, 13 Aug 2021 11:49:28 -0500 Subject: [PATCH 1/1] Version 1 of local running --- README.md | 13 +++++++++++++ bin/candle | 2 ++ candle.asd | 2 +- src/main/cli.lisp | 27 +++++++++++++++++---------- src/main/package.lisp | 2 +- src/main/run.lisp | 22 ++++++++++++++++++++++ 6 files changed, 56 insertions(+), 12 deletions(-) create mode 100644 README.md create mode 100644 src/main/run.lisp diff --git a/README.md b/README.md new file mode 100644 index 0000000..0a43cf8 --- /dev/null +++ b/README.md @@ -0,0 +1,13 @@ += Candle = + +Continuous Integration for SBCL based Lisp projects, using AWS instances +as the machines on which the CI's are run. + += .candle file = + +Each project with a candle file has a .candle file in the root of the project +with tasks to be run. + += Usage = + +Run bin/candle diff --git a/bin/candle b/bin/candle index 2fc54e1..ee68498 100755 --- a/bin/candle +++ b/bin/candle @@ -6,3 +6,5 @@ `(:source-registry (:tree ,(car (directory "."))) :INHERIT-CONFIGURATION)) (asdf:load-system :candle) (candle-cli:run) + +; vim:ft=lisp diff --git a/candle.asd b/candle.asd index 0eaba1c..0dbb24c 100644 --- a/candle.asd +++ b/candle.asd @@ -5,5 +5,5 @@ :author "Frank Duncan (frank@consxy.com)" :serial t :pathname "src/main" - :components ((:file "package") (:file "base") (:file "server") (:file "cli")) + :components ((:file "package") (:file "base") (:file "server") (:file "cli") (:file "run")) :depends-on (:herbie-utility :opera)) diff --git a/src/main/cli.lisp b/src/main/cli.lisp index 0dd036a..bbbf23c 100644 --- a/src/main/cli.lisp +++ b/src/main/cli.lisp @@ -6,19 +6,22 @@ :description "Port on which to listen for commands. Defaults to 25004") (:positional "" :required t :description "Command to send to candle server"))) -(defun project-options() +(defun project-options () '((:name :help :short "h" :long "help" :description "Print this usage.") (:name :add :long "add" :takes-argument t :description "Add a project. is the name of the project, which must not include colons, while is the location of the repository for cloning. This location must be accessible by the machine running candle." :variable-name ":"))) -(defun job-options() +(defun job-options () '((:name :help :short "h" :long "help" :description "Print this usage.") - (:name :project-name :short "p" :long "project" :takes-argument t :description "The project name for the jobs under consideration.") + (:name :project-name :long "project" :takes-argument t :description "The project name for the jobs under consideration.") (:name :add :long "add" :takes-argument t :description "Add a job to a project. is the commit for that project to run the job. Requires --project to be specified." :variable-name ""))) +(defun run-options () + '((:name :help :short "h" :long "help" :description "Print this usage."))) + (defun main-usage () (format t "~A" (opera:usage @@ -41,8 +44,7 @@ (t (let* ((name (subseq project-definition 0 pos)) - (src (subseq project-definition (1+ pos))) - (response (communication:query `(candle:add-project ,name ,src)))) + (src (subseq project-definition (1+ pos)))) (format t "Added project ~A at src definition ~A~%" name src)))))) (defmethod execute-command ((command (eql :project)) args) @@ -54,9 +56,7 @@ ((opera:option-present :add options) (add-project (opera:option-argument :add options)))))) (defun add-job (project-name sha) - (let - ((response (communication:query `(candle:add-job ,project-name ,sha)))) - (format t "Added job with sha ~A to project ~A~%" sha project-name))) + (format t "Added job with sha ~A to project ~A~%" sha project-name)) (defmethod execute-command ((command (eql :job)) args) (multiple-value-bind (options remaining-args error) (opera:process-arguments (job-options) args) @@ -71,6 +71,15 @@ (opera:option-argument :project-name options) (opera:option-argument :add options)))))) +(defmethod execute-command ((command (eql :run)) args) + (multiple-value-bind (options remaining-args error) (opera:process-arguments (run-options) args) + (cond + ((eql error :unknown-option) (format *error-output* "Unknown option: ~A. See 'candle run --help'.~%" (car remaining-args))) + ((eql error :required-argument-missing) (format *error-output* "Missing argument for ~A. See 'candle run --help'.~%" (car remaining-args))) + (remaining-args (format *error-output* "Unknown option: ~A. See 'candle run --help'.~%" (car remaining-args))) + ((opera:option-present :help options) (format t "~A" (opera:usage "candle run" (run-options)))) + (t (candle:run))))) + (defun run () (multiple-value-bind (options remaining-args error) (opera:process-arguments (main-options) (cdr sb-ext:*posix-argv*)) (cond @@ -88,5 +97,3 @@ (parse-integer (opera:option-argument :port options) :junk-allowed t)) 25004))) (execute-command (intern (string-upcase (car remaining-args)) :keyword) (cdr remaining-args))))))) - -; vim:ft=lisp diff --git a/src/main/package.lisp b/src/main/package.lisp index d7d001b..2eca806 100644 --- a/src/main/package.lisp +++ b/src/main/package.lisp @@ -1,4 +1,4 @@ (defpackage #:candle (:use :cl) - (:export #:server #:add-project #:add-job)) + (:export #:server #:add-project #:add-job #:run)) (defpackage #:candle-cli (:use :cl) (:export :run)) diff --git a/src/main/run.lisp b/src/main/run.lisp new file mode 100644 index 0000000..fa9edbe --- /dev/null +++ b/src/main/run.lisp @@ -0,0 +1,22 @@ +(in-package #:candle) + +(defun import-package (pkg) + (asdf:load-system pkg)) + +(defun run-task (task) + (format t "~%~c[1;33mRunning ~:(~A~)~c[0m~%" #\Esc (getf task :name) #\Esc) + (eval (getf task :directions)) +; (format t "~c[1;31mFailed doc check!~c[0m~%" #\Esc #\Esc) + (format t "~c[1;32m- ~:(~A~) Passed!~c[0m~%" #\Esc (getf task :name) #\Esc)) + +(defun run () + (if + (not (probe-file ".candle")) + :dot-candle-absent + (with-open-file (str ".candle") + (asdf:initialize-source-registry `(:source-registry (:tree ,(car (directory "."))) :INHERIT-CONFIGURATION)) + (mapcar #'import-package (cdr (read str))) + (let + ((candle-definition (read str))) + (format t "Running tasks for ~(~A~)~%" (getf candle-definition :name)) + (mapcar #'run-task (getf candle-definition :tasks)))))) -- 2.25.1