Chapter 20. Continuous integration

Erlang.mk comes with some support for continuous integration, aimed at open source projects that need to support more than one specific Erlang/OTP release. (If you target one specific release, check the OTP version pinning Section 12.2, “OTP version pinning” section of the OTP version management Chapter 12, OTP version management chapter.)

20.1. Configuring Erlang/OTP versions to test

To use the CI plugin you must first configure which versions of Erlang/OTP will be used. Erlang.mk provides three separate configuration variables depending on whether you need a normal OTP release, a HiPE-enabled release or an ErLLVM-enabled release.

At the time of writing, this is how you would test against all the most recent patch releases of Erlang/OTP 19 and above:

CI_OTP = OTP-19.0.7 OTP-19.1.6 OTP-19.2.3 OTP-19.3.6.2 OTP-20.0.4

If you want to test against HiPE and ErLLVM but only with the latest version of Erlang/OTP, the following could work:

CI_HIPE = $(lastword $(CI_OTP))
CI_ERLLVM = $(CI_HIPE)

Consult the OTP version management Chapter 12, OTP version management chapter for more information about Erlang/OTP versions and customization of the Erlang/OTP builds.

20.2. Running tests across all configured versions

The recommended way to run the ci target is with the option -k. It will ensure that tests are run for all configured Erlang/OTP versions, even if there are errors:

$ make ci -k

20.3. Extending the CI targets

The ci target can be extended. For example to run Dialyzer at the end of CI:

ci:: dialyze

Additional setup can be done by extending the ci-setup target. This target is ran before testing each individual Erlang/OTP version.

For example, to ensure dependencies are re-fetched/built before testing individual Erlang/OTP releases:

ci-setup:: distclean

Similarly, the ci-extra target can be extended to run extra commands after an Erlang/OTP version has been tested.