Erlang-ci - Standardized GitHub Actions CI for Erlang/OTP projects

Taure
Sat, 14 Mar 2026 06:06:15 +0000
Libraries

I got tired of copying and tweaking the same 50–100 lines of CI YAML across every Erlang project, so I built erlang-ci — a reusable GitHub Actions workflow and composite action for Erlang/OTP projects.

The before/after is pretty simple:

yaml

# before: 50-120 lines of setup-beam, caching, compile, fmt, xref, dialyzer, eunit...
# repeated in every repo, slowly drifting apart

# after:
uses: Taure/erlang-ci/.github/workflows/ci.yml@v1
with:
  otp-version: '28'

After compile, all enabled checks run in parallel — fmt, xref, dialyzer, eunit, CT, ex_doc, and audit. Most are on by default, optional ones (CT, coverage, ex_doc, audit) are opt-in.

There’s also built-in support for OTP version matrix testing, PostgreSQL service containers for database-backed tests, and auto-detection of .tool-versions/mise.toml.

It’s already in use across the Nova ecosystem — Nova, Kura, and a few rebar3 plugins. The configs there show real-world examples ranging from simple libraries to full apps with Postgres and CT.

Two usage modes:

Reusable workflow — drop-in complete pipeline

Composite action — just the setup + caching, bring your own jobs

Repo:

github.com

GitHub - Taure/erlang-ci: Standardized CI pipeline for Erlang/OTP projects

Standardized CI pipeline for Erlang/OTP projects

Feedback and PRs welcome — especially curious if there are common CI patterns in the community I’ve missed.

10 posts - 2 participants