moon v0.22 - New pipeline, hashing, and caching, with Turborepo migration
It's the first release of the year, and with this release, we're landing some quality of life infrastructure and workflow improvements!
New action pipeline
When running targets, we generate a graph of actions to execute in order within the action runner. An action is one of "setup toolchain", "install dependencies", "run target", so on and so forth. Our action runner would then spawn threads for every action using the Tokio runtime. While this worked great, concurrency was entirely abstracted away from us.
To mitigate this problem, we've implemented a new system for executing actions known as the action
pipeline (or simply pipeline), which implements a dynamically scaling thread pool on top of Tokio.
This provides us with more control over concurrency, starting with the new --concurrency
option,
which restricts the number of threads (or CPU cores).
$ moon run :build --concurrency 2
Expanded hashing functionality
When we run targets in the pipeline, we hash a collection of inputs to calculate whether to continue running or to exit early. This functionality has been extremely beneficial for optimizing the pipeline, and so, we've expanded the hasher for other use cases. To start, the following 2 workflows now utilize the hasher:
- When determining to auto-install dependencies (
npm install
, etc), we now hash all production, development, and peer dependencies from applicable manifests (package.json
). This has resulted in more accurate installs, as we're no longer inadvertently installing when a non-dependency field is modified in a manifest. On top of this, will still take into account lockfile modified timestamps. - When generating the project graph, we now hash all sources, aliases, and configuration files, to determine whether to load the project graph from the local cache.
Project graph is now cached
Because of the hashing improvements above, we're now able to cache the entirety of the project graph
into local cache. Depending on how many projects are in your workspace, you may see performance
improvements on subsequent runs as we're no longer re-building the project graph over and over
everytime the moon
binary is ran.
Migrate from Turborepo
Turborepo is a popular task runner for Node.js based monorepos, but doesn't support all the
functionality that moon does. If you're looking to prototype moon, or migrate from Turborepo to moon
holistically, we now support a new command
moon migrate from-turborepo
.
This command will migrate the turbo.json
file to moon applicable configuration files!
$ moon migrate from-turborepo
Breaking changes
Renamed events
Because of the runner -> pipeline changes above, the runner.*
webhook
events were renamed to pipeline.*
.
Updated CLI options
Renamed the --upstream
option to --remote
, to better align with Git terminology, and removed the
--report
option from moon check
and moon run
commands. Reports are now always created.
Other changes
View the official release for a full list of changes.
- Added Bun as a tier 1 language (doesn't do much at the moment).
- Added a
versionConstraint
setting in.moon/workspace.yml
that enforces a requirement on the running moon binary. - Updated the
project
fields inmoon.yml
to be optional, excludingdescription
. - Internal improvements to remote caching and artifact uploading.
What's next?
Expect the following in the v0.23 release!
- Improved task inheritance workflow.
- Glob support in task
outputs
. - Project-level environment variables.