Dreadnot is a 'one click' deploy tool written in Node.js.
Dreadnot was heavily inspired by Etsy's Deployinator.
Dreadnot loads its configuration from a javascript file:
exports.config = { // The name of this Dreadnot instance, used for display name: 'Example Dreadnot', // Each Dreadnot instance supports one environment such as 'dev', 'staging' // or 'production' env: 'staging', // The data root Dreadnot will use data_root: '/var/dreadnot', // Base URL to access dreadnot (used in IRC, email) default_url: 'http://example.com', // Dreadnot uses an htpasswd file (with support for md5 and sha1) for auth htpasswd_file: '/etc/dreadnot/htpasswd', // Each stack represents a code base that should be deployed to one or more regions stacks: { // For a stack named 'webapp', there should be a 'webapp.js' file in the // stacks directory webapp: { // What branch to look in for the latest revision of the code base tip: 'master', // How long to cache the latest revision of the code base tip_ttl: 120 * 1000, // What regions this stack should be deployed to regions: ['ord1'], // Stacks should implement dryrun for testing dryrun: true } }, // The GitHub organization you provide is used to build URLs for your stacks github: { organization: 'racker' }, // Plugins provide optional functionality such as notifications. Any plugins // that are not configured won't be used. plugins: { // An IRC notification plugin irc: { nick: 'staging-dreadnot', channels: {'irc.freenode.net': ['#public-channel', '#private-channel pass']} }, // An email notification plugin email: { server: { user: 'staging-dreadnot@example.com', password: '', host: 'smtp.example.com', ssl: true }, to: 'systems@example.com', from: 'staging-dreadnot@example.com' } } };
Dreadnot looks in a directory (by default ./stacks, but this can be changed
from the command line) for "stack files". A stack file is simply a javascript
file that exports
- A
get_deployedRevisionfunction which takes an object containingenvironmentandregionfields, and a callback taking(err, deployed_revision). - A
targetshash that maps target names to lists of task names. Currently, the only supported target isdeploywhich defaults to['task_preDeploy', 'task_deploy', 'task_postDeploy']. - One or more "task functions" whose names are prefixed with
task_. Each task function takes:- A "stack" object. The most useful fields on the stack are
stackConfigwhich contains the config for this particular stack, andconfigwhich contains the global config. - A "baton" object. Each task executed during a run of a given target
receives the same baton object. By default, it contains a
logfield with methods such asdebug,info, anderrorthat can be used to log output to deployment log and web view. - An "args" hash with
dryrun,environment,region,revisionanduser, each of which is a string. - A "callback" function that should be called without arguments on completion, or with a single error object if an error occurs.
- A "stack" object. The most useful fields on the stack are
In the configuration used by Rackspace Cloud Monitoring, a deployment looks something like:
- Build: verify that the requested revision has been successfully built and that all tests pass.
- Prepare: remove the region being deployed from the load balancer rotation, redirecting all traffic to another region.
- Execute: use a chef search to locate all servers in the region, then ssh to each in parallel to upgrade the code.
- Validate: execute checks against each upgraded service to verify that it is functioning properly.
- Restore: restore the region to the load balancer rotation.
Imporantly, Dreadnot knows nothing about the hosts to which it is deploying - if it did, we would have to modify our Dreadnot configuration every time we added or removed a machine from our environment. Instead, we rely on chef (although anything that knows about your servers will work) to give us an up-to-date list of all hosts in a given region. In smaller deployments it might be suitable to hardcode a list of hosts.
Does Dreanot support SVN?
Dreanot supports Node.js - you can use any technology or topology that suits you, as long as you can find a library for it.
npm install dreadnot -g
Dreadnot takes a number of options on the command line. The defaults are:
dreadnot -c ./local_settings.js -s ./stacks -p 8000
This will start dreadnot with the specified config file and stack directories, listening on port 8000.