Skip to content

v1.0.0: zero-config monorepo CI

Choose a tag to compare

@MarkAlex1234 MarkAlex1234 released this 05 Oct 09:32
Immutable release. Only release title and notes can be modified.
13209d9

Build, test and deploy only the projects a change affects, with no config file needed.

dynamic-monorepo works from three things:

  • the git diff
  • the projects in your repository, found from package.json, go.mod, Cargo.toml, Dockerfile, pyproject.toml, pom.xml, Gradle, .csproj and Helm Chart.yaml
  • the dependencies between those projects, read from their manifests

From these it outputs JSON lists for strategy.matrix, and the job summary says why each project was picked.

- uses: actions/checkout@v4
- uses: Continuous-Actions/dynamic-monorepo@v1
  id: plan
# needs.plan.outputs.build  -> ["@acme/shared","@acme/api","@acme/web"]

Highlights

  • Zero config. It auto-detects Node, Go, Rust, Python, Java (Maven/Gradle), .NET, Docker and Helm projects. A dynamic-monorepo.config.json (with a JSON Schema) is only needed to override what was detected.
  • Follows dependencies. A change to a shared library selects everything that depends on it. Lockfiles only select the projects of their own ecosystem.
  • Matrix outputs: build, test, deploy and docker lists, plus paths and dockerfiles maps, has_* flags, and *_batches outputs for lists longer than 256 jobs.
  • Explains itself. The job summary gives a reason for every project, and the CLI previews the plan locally: npx github:Continuous-Actions/dynamic-monorepo --base origin/main.
  • Works with the default checkout. A shallow clone is enough: it fetches only the commits it needs. It handles pull requests, pushes, force pushes, merge queues and new branches. When it can't compare correctly, it selects everything and says why.
  • Safe to adopt:
    • It needs only contents: read, uses no secrets and makes no API calls.
    • Nothing from your repository is executed.
    • It ships as a single committed bundle of about 100 KB.
    • Releases are immutable.
    • The code went through adversarial security and correctness reviews.

Demo: https://github.com/Continuous-Actions/dynamic-monorepo-demo