DEV Community

Patrick Organ
Patrick Organ

Posted on

Introducing StackUp - A Single Application to Spin Up Your Entire Dev Stack

Introducing StackUp - A Single Application to Spin Up Your Entire Dev Stack

StackUp Logo

As developers, we often find ourselves working with complex development environments that require a series of steps to set up and tear down. This process can be time-consuming and prone to errors, especially when working in a team where consistency is key. Enter StackUp, a tool that automates the process of spinning up and shutting down your entire development stack.

What is StackUp?

StackUp is a tool designed to simplify the process of setting up and tearing down complex development environments. It allows you to define a series of steps that execute in order on startup and shutdown, as well as a list of server processes that should be started. Additionally, StackUp runs an event loop while the server processes are running, allowing you to run tasks on a cron schedule.

One of the key features of StackUp is its ability to automate routine tasks. With a simple configuration, you can define a sequence of tasks that your project requires, such as starting containers, running database migrations, or seeding data. This automation not only saves you time but also ensures consistency across your development environment.

StackUp also includes a robust precondition system. Before doing anything, checks can be performed to ensure everything is set up correctly. This feature helps prevent common issues that occur when the environment is not properly configured.

Running StackUp

To run StackUp, simply run the binary in a directory containing a stackup.yaml configuration file:

stackup
Enter fullscreen mode Exit fullscreen mode

Or, specify a configuration filename:

stackup --config stackup.dev.yaml
Enter fullscreen mode Exit fullscreen mode

Configuration

The application is configured using a YAML file named stackup.yaml containing five sections: preconditions, tasks, startup, shutdown, and scheduler.

Preconditions

The preconditions section of the configuration file is used to specify a list of conditions that must be met before the tasks and servers can run. Each precondition is defined by a name and a check. The name is a human-readable description of the precondition, and the check is a javascript expression that returns a boolean value indicating whether the precondition is met.

Tasks

The tasks section of the configuration file is used to specify all tasks that can be run during startup, shutdown, as a server, or as a scheduled task.

Startup & Shutdown

The startup and shutdown sections of the configuration define the tasks that should be run synchronously during either startup or shutdown. The values listed must match a defined task id.

Servers

The servers section of the configuration file is used to specify a list of tasks that the application should start as server processes. The values listed must match a defined task id.

Scheduler

The scheduler section of the configuration file is used to specify a list of tasks that the application should run on a schedule. Each entry should contain a task id and a cron expression. The task value must be equal to the id of a task that has been defined.

Example Configurations

StackUp provides several example configurations to get you started.

Let's take a look at an example configuration for a Laravel project:

name: my stack
description: laravel application stack
version: 1.0.0

preconditions:
    - name: dependencies are installed
      check: binaryExists("php")

    - name: project is a laravel application
      check: exists(getCwd() + "/artisan")

startup:
  - task: start-containers
  - task: run-migrations-fresh
  - task: run-migrations-no-seed

shutdown:
  - task: stop-containers

servers:
  - task: horizon-queue
  - task: httpd

scheduler:
    - task: artisan-scheduler
      cron: '* * * * *'

tasks:
  - name: spin up containers
    id: start-containers
    if: exists(getCwd() + "/docker-compose.yml")
    command: docker-compose up -d
    silent: true

  - name: run migrations (rebuild db)
    id: run-migrations-fresh
    if: hasFlag("seed")
    command: php artisan migrate:fresh --seed

  - name: run migrations (no seeding)
    id: run-migrations-no-seed
    if: '!hasFlag("seed")'
    command: php artisan migrate

  - name: stop containers
    id: stop-containers
    if: exists(getCwd() + "/docker-compose.yml")
    command: docker-compose down
    silent: true

  - name: run artisan scheduler
    id: artisan-scheduler
    command: php artisan schedule:run

  - name: horizon queue
    id: horizon-queue
    command: php artisan horizon
    platforms: ['linux', 'darwin']

  - name: httpd
    id: httpd
    command: php artisan serve
Enter fullscreen mode Exit fullscreen mode

Available Functions

Many of the configuration fields can be defined using a javascript expression syntax. To specify an expression to be evaluated, wrap the content in double braces: {{ env("HOME") }}.

Conclusion

StackUp is a powerful tool that can significantly simplify the process of setting up and tearing down complex development environments. By automating routine tasks and ensuring consistency across your development environment, StackUp can save you time and help you avoid common setup errors. Give it a try on your next project!

For more information, please see the StackUp GitHub repository.

Top comments (0)