This repository has been archived on 2024-04-08. You can view files and clone it, but cannot push or open issues or pull requests.
dagger/docs/core-concepts/1202-plan.md
Gerhard Lazu bda88621b6
Add the dagger.#Plan core concept to Europa Docs
This is the entry point for all other core concepts.

Signed-off-by: Gerhard Lazu <gerhard@lazu.co.uk>
2022-03-04 13:47:32 +00:00

2.3 KiB

slug displayed_sidebar
/1202/plan europa

It all starts with a plan

A CI/CD pipeline declared in Dagger starts with a plan, specifically dagger.#Plan

This plan is the entrypoint for everything that runs within a pipeline.

The simplest plan will have at least one input - the source code - and a few actions, usually build, test & deploy. This is our Getting Started example app plan structure:

dagger.#Plan & {
  inputs: {
    directories: app: path: "./"
    // ...
  }
  actions: {
    build: yarn.#Build & {
      // ...
    }
    test: yarn.#Run & {
      // ...
    }
    // ...
  }
}

When the above plan gets executed via dagger up, it produces the following output:

dagger up dev.cue
[] inputs.directories.app                                        0.1s
[] actions.build                                                 0.6s
[] actions.test                                                  0.6s

Since these actions have run before, they are cached and take less than 1 second to complete.

While the names used for the actions above - build, test - are short & descriptive, any other names would have worked. Put differently, action naming does not affect plan execution.

In the example above, the build action is an instance of the yarn package build definition. This is written as build: yarn.#Build

Default definition configuration can be modified via curly brackets, e.g.

  actions: {
    build: yarn.#Build & {
      // ...
    }

We can build complex pipelines efficiently by referencing any definition, from any package in our actions. This is one of the fundamental concepts that makes Dagger a powerful devkit for CI/CD. Before we can use a package in a plan, we need to declare it at the top of the pipeline configuration, like this:

import (
  "universe.dagger.io/yarn"
)

Since we are using the plan definition from the dagger package - dagger.#Plan - we also need to declare it at the top of the pipeline configuration:

import (
  "dagger.io/dagger"
  "universe.dagger.io/yarn"
)

Now that we understand the basics of a Dagger plan, we are ready to learn more about inputs and how to configure them. This will enable us to configure plans just-in-time, which is something that typically happanes on every CI run.