Skip to content

Instantly share code, notes, and snippets.

@nthomson
Last active August 29, 2015 14:00
Show Gist options
  • Save nthomson/e0601a18a62a253464ca to your computer and use it in GitHub Desktop.
Save nthomson/e0601a18a62a253464ca to your computer and use it in GitHub Desktop.

Problem

It takes us too long to spin up a new project.

Solution

A tool that will allow us to create a new project with varying components from scratch with minimal configuration.

Requirements

  • Each piece of the system can be independently run if the paramaters for that piece are already known.
  • Each piece of the system can be replaced by pre-configuring that piece's output
  • Each project will have differently-configured stacks.
  • The system should automate everything we do in the first ~2 days that can be reasonably automated
  • Each piece of the system should be replaceable by another piece of the same type (I can swap in a Linode component for an EC2 component without major hullabaloo)
  • The system should be written in such a way that new steps are easily added or removed.
  • A user can interface with the system through either the command-line or ruby

Example Projects

Keep in mind that this isn't a spec for what the configuration must look like. These are examples of projects that should be easily generated with whatever system we create. I am simply using the config style used by the existing opsworks code to demonstrate the point.

# Generates a project named 'easyreader'
# Generates 4 different repos: A Rails API, an AngularjS app served by NodeJS, an iOS app, an Android app.
# Creates a development environment for each repo
# Spins up a staging environment for a rails API using postgresql and an angularjs app served by nodejs
{
  :app_name => 'easyreader',
  :domain_name => 'easyreader.com',
  :github_access_token => 'XXXXXXX',
  :github_account => 'cloudspace',
  :private_repo => false,
  :is_organization => true,
  :aws_key => 'XXXXXXX',
  :aws_secret => 'XXXXXXXXXXXXXX',
  :data_store => 'postgresql',
  :back_end => 'rails',
  :front_end => ['angularjs', 'ios', 'android']
}
# Generates a project named 'Onager'
# Generates 1 repo: A Rails app
# Creates a development environment for each repo
# Spins up a staging environment for a rails app using postgresql
{
  :app_name => 'Onager',
  :domain_name => 'onager.cloudspace.com',
  :github_access_token => 'XXXXXXX',
  :github_account => 'cloudspace',
  :private_repo => false,
  :is_organization => true,
  :aws_key => 'XXXXXXX',
  :aws_secret => 'XXXXXXXXXXXXXX',
  :data_store => 'postgresql',
  :back_end => 'rails',
  :front_end => 'rails'
}
# Generates a project named 'crunchinator'
# Generates 2 different repos: A Rails API, an AngularJS app served by NodeJS
# Creates a development environment for each repo
# Spins up a staging environment for a rails API using postgresql and an angularjs app running on nodejs
{
  :app_name => 'easyreader',
  :domain_name => 'easyreader.com',
  :github_access_token => 'XXXXXXX',
  :github_account => 'cloudspace',
  :private_repo => false,
  :is_organization => true,
  :aws_key => 'XXXXXXX',
  :aws_secret => 'XXXXXXXXXXXXXX',
  :data_store => 'postgresql',
  :back_end => 'rails',
  :front_end => ['angularjs']
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment