Back to Moon

moon v1.6 - Persistent tasks and task extending RFC

website/blog/2023-05-15_moon-v1.6.mdx

2.2.45.0 KB
Original Source

import Button from '@site/src/ui/Button';

In this release, we're introducing a new feature called persistent tasks, and an RFC for extending tasks.

<!--truncate-->

RFC: Task extending/variants

Before we dive into this release, we want to briefly talk about a new RFC that we're looking for feedback on, task extending/variants. This is a feature that has been top-of-mind since moon's inception, but we haven't had the foundation in place to support it, nor what the API should look like.

The gist of the RFC is that we want to support tasks that extend other tasks with additional arguments. This is a common workflow with npm scripts:

json
{
  "scripts": {
    "lint": "eslint .",
    "lint:fix": "npm run lint --fix"
  }
}

As consumers of moon, we'd appreciate any feedback on the RFC before we move forward!

<div class="flex justify-center"> <Button label="View RFC" href="https://github.com/moonrepo/moon/issues/849" size="lg" /> </div>

Persistent tasks

Tasks that never complete, like servers and watchers, are known as persistent tasks. Historically we had support for these kinds of tasks through the local setting in moon.yml. This setting would modify the task for continuous execution by disabling caching, streaming output, and not running in CI.

While this worked for the most part, there was one scenario that was still problematic, and that was running multiple persistent tasks in parallel. Depending on the task dependency chain, sometimes these tasks would not run in parallel, some may never start (blocked on another tasks), or the order of nodes in the graph is non-ideal. A great example of this can be found in this discussion thread.

To mitigate this problem, we're introducing a new task option, persistent (which is also enabled by the local setting). When a task is marked as persistent, it will always run last and in parallel within the dependency graph, after all dependencies (from all other persistent tasks) have completed.

yaml
tasks:
  dev:
    command: 'next dev'
    local: true
    # OR
    options:
      persistent: true

This is a perfect solution to running multiple development servers and tools in watch mode:

yaml
tasks:
  dev:
    command: 'noop'
    deps:
      - 'frontend:dev'
      - 'backend:dev'
      - 'database:start'
      - 'tailwind:watch'

Logging migration

This is more of a heads up than anything, but we've started an internal Rust migration from the old log crate to the new tracing crate. Tracing provides is with far more information, metrics, and instrumentation, which we hope to take advantage of in the future.

This will be an ongoing migration that will last for many releases, and during this time while we support both log and tracing in unison, the logs will be a bit noisy. We'll be working to clean up the logs as we gradually convert the codebase.

And lastly, the move to tracing has also caused the log output to change. For example, in the log excerpt below, all messages with "log" after the date are the old log crate, while the others with distinct module names are the new tracing crate.

log
[DEBUG 14:44:19] moon_process::command_inspector  Running command git status --porcelain --untracked-files -z  env_vars={} working_dir="~/Projects/moon"
[DEBUG 14:44:19] log  Filtering based on touched status "all"  log.target="moon:query:touched-files" log.module_path="moon_cli::queries::touched_files" log.file="crates/cli/src/queries/touched_files.rs" log.line=85
[DEBUG 14:44:19] log  Creating dependency graph  log.target="moon:dep-graph" log.module_path="moon_dep_graph::dep_builder" log.file="crates/core/dep-graph/src/dep_builder.rs" log.line=35
[DEBUG 14:44:19] log  Running 32 actions across 5 batches  log.target="moon:action-pipeline" log.module_path="moon_action_pipeline::pipeline" log.file="crates/core/action-pipeline/src/pipeline.rs" log.line=93
[DEBUG 14:44:19] log  Setting up Node.js 20.0.0 toolchain  log.target="moon:action:setup-tool" log.module_path="moon_action_pipeline::actions::setup_tool" log.file="crates/core/action-pipeline/src/actions/setup_tool.rs" log.line=26
[DEBUG 14:44:19] proto_node::resolve  Resolving a semantic version for "20.0.0"
[DEBUG 14:44:19] proto_core::resolver:load_versions_manifest  Loading versions manifest from local cache  cache_file=~/.proto/temp/3d16d1693e83828f98bae178f181d5a01103b7f222db27cdeaec9b4950e951d7.json

Other changes

View the official release for a full list of changes.

  • Updated long running processes to log a checkpoint indicating it's still running.
  • Reworked file groups to use workspace relative paths, instead of project relative.
  • Reworked processes to better handle command line arguments, shells, and piped stdin input.