Building a Clojure project
What This Guide Covers #
For Language versions and other build-environment specific information visit our reference pages:
This guide covers build environment and configuration topics specific to Clojure projects. Please make sure to read our Onboarding and General Build configuration guides first.
Clojure builds are not available on the macOS environment.
CI Environment for Clojure Projects #
Travis CI environment provides a large set of build tools for JVM languages with multiple JDKs, Ant, Gradle, Maven and both Leiningen 1.7.x and 2.4.x (default).
Dependency Management #
If you use Leiningen, it will automatically install any dependencies that are
listed in the project.clj
file.
Alternate Install Step #
If you need to install other dependencies before your tests can run, you should
set up the proper :hooks
in project.clj
.
If for some reason you can’t use hooks,you can override the install step in your
.travis.yml
:
install: lein protobuf install
See the build configuration guide to learn more.
Build Script #
Using Midje #
If your project uses Midje, make sure
lein-midje is on your
project.clj
development dependencies list and override script:
in
.travis.yml
to run the Midje task:
script: lein midje
For Leiningen 1 add :dev-dependencies
to project.clj
:
:dev-dependencies [[midje "1.4.0"]
[lein-midje "1.0.10"]])
Leiningen 2 replaces :dev-dependencies
with profiles:
:profiles {:dev {:dependencies [[midje "1.6.3"]]
:plugins [[lein-midje "3.0.0"]]}}
Please note that for projects that only support Clojure 1.3.0 and later
versions, you may need to exclude transient org.clojure/clojure
for Midje in
project.clj:
:dev-dependencies [[midje "1.4.0" :exclusions [org.clojure/clojure]]
[lein-midje "1.0.10"]])
For real world example, see Knockbox.
Using Speclj on Travis CI #
If your project uses Speclj, make sure it is
listed in your development dependencies in project.clj
, and include this
script:
line in .travis.yml
:
script: lein spec
For Leiningen 1, Speclj should be listed under :dev-dependencies
in project.clj
:
:dev-dependencies [[speclj "3.3.1"]]
Leiningen 2 replaces :dev-dependencies
with profiles:
:profiles {:dev {:dependencies [[speclj "3.3.1"]]}}
Using Leiningen 1 #
Leiningen 1 is provided side by side with 2.4.x. To use it, specify lein
key in .travis.yml
:
lein: lein1
In case you need to use lein
binary in before_script
, install:
, script:
commands and so on, use lein1
:
before_install:
- lein1 bootstrap
Build Config Reference #
You can find more information on the build config format for Clojure in our Travis CI Build Config Reference.
Task chaining requires using the do
task:
script: lein1 do javac, test
Testing Against Multiple JDKs #
As for any JVM language, it is also possible to test against multiple JDKs.
Examples #
Testing Against Multiple Versions of Clojure #
With Leiningen 1 #
Leiningen has an excellent plugin called lein-multi that lets you effortlessly test against multiple versions of Clojure (for example, 1.3, 1.4 and alphas/betas/snapshots of the most recent development version). Because leiningen can run tests against any version of Clojure (not necessary the same version as Leiningen itself uses), there is no need for runtime switchers (like RVM) for Clojure.
To use lein-multi on Travis CI, add it to :plugins
in project.clj (note, this feature is only available starting with Leiningen 1.7.0) and
override script:
to run lein multi test
instead of default lein test
:
language: clojure
script: lein1 multi test
For a real world example, see Monger.
With Leiningen 2 #
Leiningen 2 has a core feature that replaces lein-multi
: Profiles. To run your tests against
multiple profiles (and thus, multiple dependency sets or Clojure versions), use lein with-profile
command like so:
lein: lein
script: lein with-profile dev:1.4 test
where dev:1.4
is a colon-separated list of profiles to run test
task against. Use lein profiles
to list your project’s profiles
and lein help with-profile
to learn more about the with-profiles
task.
Using a more recent versions of Leiningen #
If your Clojure project requires a more recent version of Leiningen, you can specify it with:
language: clojure
lein: 2.6.1 # version 2 and up
The job will install the specified version of Leiningen if it is not pre-installed, and move on to install your project’s dependencies.
Example #
For a real world example, see Neocons.