Concepts


📖 iapetus is like a recipe book for automating command-line tasks. Here are the core concepts:

  • Workflow 🗂️: A workflow is a collection of tasks, their dependencies, and global configuration. Think of it as a recipe that describes the order and logic of your automation.

    name: my-workflow
    steps:
      - name: build
        command: make
        args: [build]
      - name: test
        command: make
        args: [test]
        depends: [build]
    
  • Task 🏃: A single command or step in your workflow. Each task can have its own command, arguments, environment, timeout, assertions, and dependencies.

    task := iapetus.NewTask("hello", 5*time.Second, nil).
        AddCommand("echo").
        AddArgs("Hello, world!")
    
  • Backend 🖥️: The environment where a task runs. Built-in backends include Bash (local shell) and Docker (container). You can add your own (e.g., Kubernetes, SSH).

    backend: docker
    steps:
      - name: run-in-container
        image: alpine:3.18
        command: echo
        args: ["hello from docker"]
    
  • Assertion ✅: A check to validate task results, such as output, exit code, or JSON. Assertions help ensure your workflow behaves as expected.

    raw_asserts:
      - output_contains: success
      - exit_code: 0
    
  • Plugin 🔌: Extend iapetus by adding new backends or assertion types. Plugins are Go code that implement the Backend interface and are registered at startup.

    type MyBackend struct{}
    func (b *MyBackend) RunTask(task *iapetus.Task) error { /* ... */ }
    func (b *MyBackend) ValidateTask(task *iapetus.Task) error { return nil }
    iapetus.RegisterBackend("my-backend", &MyBackend{})
    
  • Hook 🪝: Custom logic that runs on task events (start, success, failure, complete). Use hooks for logging, metrics, or notifications.

    workflow.AddOnTaskSuccessHook(func(t *iapetus.Task) {
        fmt.Println("Task succeeded:", t.Name)
    })
    

See also: API Reference, YAML Reference