Dynamic Tasks

Mint supports generating tasks dynamically. This is helpful if you want to use repository contents to determine which tasks to run, like running one task per package in a monorepo project.

Mechanics

To generate dynamic tasks, write *.yaml files to the $MINT_DYNAMIC_TASKS directory. The yaml file needs to contain an array of task definitions. The file names are arbitrary and are not used for anything. You can generate more than one file in the directory if you'd like; there isn't a practical difference between generating one file with many tasks in the array versus generating multiple files.

Basic Example

Here's an example using a bash script to generate a dynamic task. Using tee isn't necessary; we're only using it here so that the logs from generate-dynamic-task will display the contents of the file that was generated. We could have written this as cat << EOF > $MINT_DYNAMIC_TASKS/tasks.yaml instead.

tasks:
  - key: generate-dynamic-task
    run: |
      cat << EOF | tee $MINT_DYNAMIC_TASKS/tasks.yaml
        - key: dynamic-task
          run: echo this is a dynamically generated task
      EOF

Multiple Tasks

These two examples are effectively equivalent.

Multiple tasks in the array:

tasks:
  - key: generate-dynamic-task
    run: |
      cat << EOF | tee $MINT_DYNAMIC_TASKS/tasks.yaml
        - key: dynamic-task-1
          run: echo this is the first dynamic task
        - key: dynamic-task-2
          run: echo this is the second dynamic task
      EOF

Multiple dynamic task files:

tasks:
  - key: generate-dynamic-task
    run: |
      cat << EOF | tee $MINT_DYNAMIC_TASKS/task-1.yaml
        - key: dynamic-task-1
          run: echo this is the first dynamic task
      EOF
      cat << EOF | tee $MINT_DYNAMIC_TASKS/task-2.yaml
        - key: dynamic-task-2
          run: echo this is the second dynamic task
      EOF

Ruby Example

In practice, you'll most likely generate dyanmic tasks using a scripting language rather than bash. Here's an example that uses Ruby to generate dynamic tasks.

tasks:
  - key: ruby
    call: mint/install-ruby 1.1.3
    with:
      ruby-version: 3.3.4

  - key: generate-dynamic-tasks
    use: [ruby]
    run: |
      ruby -e '
        require "yaml"
        tasks = [
          {
            "key" => "dynamic-task",
            "run" => "echo this task was generated from ruby"
          }
        ]
        puts YAML.dump(tasks)
      ' | tee $MINT_DYNAMIC_TASKS/tasks.yaml

This is how you'd implement this Ruby script inline with the task definition, but it's more common to check the script in as a separate file, such as .mint/generate-tasks.rb and then call ruby .mint/generate-tasks.rb > $MINT_DYNAMIC_TASKS/tasks.yaml in your Mint task definition.