tools.build
With the recent release of tools.build,
I wanted to provide a quick example of using it for a CI-like pipeline.
tools.build is focused on "building" things and when the subject has come up
on Slack, the feedback has been that the CLI already has a good story for running
tests etc, and the consensus seems to be that running multiple CLI commands is
the intended usage.
That consensus has never stopped me from wanting something more integrated. I'd like to be able to run a single CLI command that runs tests and if they pass then create a JAR file, ready to deploy -- as a minimum CI-like pipeline.
tools.build provides create-basis, java-command, and process functions
so that you can fairly easily run arbitrary java commands in a subprocess.
That makes it fairly easy to run your tests from a build.clj script:
(defn run-tests
[_]
(let [basis (b/create-basis {:aliases [:test]})
combined (t/combine-aliases basis [:test])
cmds (b/java-command {:basis basis
:java-opts (:jvm-opts combined)
:main 'clojure.main
:main-args ["-m" "cognitect.test-runner"]})
{:keys [exit]} (b/process cmds)]
(when-not (zero? exit)
(throw (ex-info "Tests failed" {})))))
As a concrete example of this, I've added a build.clj script to next.jdbc
so that I can run:
clojure -T:build ci
and have it run tests and, if they pass, go ahead and create the pom.xml and
build the JAR file for the project based on MAJOR.MINOR.COMMITS for the version.
Deploying to Clojars is then a single CLI command:
clojure -X:deploy :artifact target/next<TAB>
this will autocomplete to target/next.jdbc-1.2.nnn.jar where nnn is the number
of commits. A more confident workflow would be to run deps-deploy via
create-basis, java-command, and process to automatically deploy the JAR
to Clojars as part of the ci process.
Update: As of August 12th, HoneySQL also has build.clj and the ci function there runs the readme tests, Eastwood, ClojureScript tests, and multi-version Clojure testing, before building the JAR file!