README.md in capistrano-multiproject-0.0.2 vs README.md in capistrano-multiproject-0.0.3
- old
+ new
@@ -1,19 +1,181 @@
-# capistrano-multiproject
+capistrano-multiproject
+=======================
-## Description
+Author: Olek Poplavsky
+
+Introduction
+------------
+
Capistrano extension that allows to deploy multiple projects from one location.
-Everybody knows/uses original multistage extension written by Jamis Buck. It works great while you have only one project/app to deploy.
-It is not quite enough if you have multiple projects to deploy (SOA would be one big use case here). Capistrano-multiproject solves this problem by allowing splitting up deploy.rb into multiple project-specific recipe files.
+Everybody knows/uses original multistage extension written by Jamis Buck. It works great while you
+have only one project/app to deploy. It is not quite enough if you have multiple projects to deploy
+(SOA would be one big use case here). Capistrano-multiproject solves this problem by allowing
+splitting up deploy.rb into multiple project-specific recipe files.
-## Usage
+Installation
+------------
+
Install gem
$ gem install capistrano-multiproject
+Setup
+-----
+
+You are expected to create separate project, whole purpose of which is to deploy other projects.
+That may be just a directory in your source repository, or a separate repository, it is up to you.
+
+**Typical directory structure of 'deploy' project**
+
+ config/
+ deploy/
+ projects/
+ project1.rb
+ project2.rb
+ stages/
+ testing.rb
+ qa.rb
+ demo.rb
+ production.rb
+ deploy.rb
+ recipes/
+ recipe1.rb
+ recipe2.rb
+ Capfile
+ Gemfile
+
+
+Usage
+-----
+
+If your run 'cap -T' you will see that only tasks that are loaded by default are projects, stages,
+and strange '?' task. That last one is actually a replacement for '-T' option, that is customized
+for the multiproject setup.
+
+'cap ?' outputs list of stages.
+
+'cap stage1 ?' outputs list of projects.
+
+'cap stage1 project1 ?' outputs list of capistrano tasks available in a given project.
+
+'cap stage1 project1 task1' executes capistrano task for some project in a context of given stage.
+
+
+Configuration
+-------------
+
+Add to `Gemfile`
+
+ gem 'capistrano'
+ gem 'capistrano-multiproject'
+
Add to `Capfile`
require 'capistrano/multiproject'
+ load 'config/deploy'
+
+Create file config/deploy.rb. Put you common settings/recipes there, those will be shared by all
+projects. Settings like 'scm', 'repository', 'use_sudo', 'ssh_options' are good candidates to put
+here.
+Require common shared recipes like this:
+
+ load 'recipes/recipe1.rb'
+
+Create directories deploy/projects and deploy/stages.
+
+Stages directory contains .rb files that describe settings particular to specific stage. Usually all
+that is done here is setting branch (or repository) and bunch of server roles.
+
+Example of stage file config/deploy/stages/stage1.rb:
+
+ role :app, 'app1.foo.com', 'app2.foo.com'
+ role :redis, 'misc.foo.com'
+ role :shpinx, 'misc.foo.com'
+ role :db, 'masterdb.foo.com', :primary => true, :master => true
+ role :db, 'slavedb.foo.com', :no_release => true, :master => false
+ set :branch, 'master'
+
+Projects directory contains .rb files that contains recipes specifit to particular project.
+
+Example config/deploy/projects/foo.rb:
+
+ load 'recipes/recipe1.rb'
+
+ set :shared_children, %w(log pids)
+
+ namespace :deploy do
+ desc "Stops foo service"
+ task :stop do
+ run "#{sudo} /etc/init.d/foo stop"
+ end
+
+ desc "Starts foo service"
+ task :start do
+ run "#{sudo} /etc/init.d/foo start"
+ end
+
+ desc "Restarts foo service"
+ task :restart do
+ run "#{sudo} /etc/init.d/foo restart"
+ end
+ end
+
+By default, only roles that are named the same as project file, are loaded (that is, for project
+'foo.rb', only role 'foo' will be loaded, roles 'db', 'redis' etc will not make it to capistrano.
+When this needs to be customized, it is easy to do that my setting property project_roles like this:
+
+ set :project_roles, ['role1', 'role2']
+
+In addition to roles defined in stage file, project's recipes have access to one special/synthetic 'any_server' role.
+That role contains all the servers that were defined in the stage file, combined. It is very useful
+to implement some administration recipes, like 'reboot all servers', 'update ubuntu software on all
+servers', or 'run chef-client on all servers'.
+
+Example config/deploy/projects/admin.rb:
+
+ set :project_roles, %w(any_server)
+ namespace :servers do
+ namespace :reboot do
+ desc "Reboot all servers"
+ task :all do
+ run "#{sudo} shutdown -r +1" # reboot in 1 minute
+ end
+ end
+ end
+
+
+Compatibility
+-------------
+
+So far it was tested to work under ruby 1.9.
+
+There is no good reason why it would not work with ruby 1.8, if you find problem with that, come
+back to me and we will fix it together :)
+
+
+License
+-------
+
+capistrano-multiproject is released under the [MIT][license] license.
+
+[license]: http://www.opensource.org/licenses/MIT
+
+
+Credits
+-------
+
+**Jamis Buck**
+
+ [capistrano-multistage][multistage] started it all
+
+**Andriy Yanko**
+
+ [caphub][caphub] and [capistrano-multiconfig][multiconfig] were the inspiration for this project
+
+[multistage]: http://weblog.jamisbuck.org/2007/7/23/capistrano-multistage
+[caphub]: https://github.com/railsware/caphub
+[multiconfig]: https://github.com/railsware/capistrano-multiconfig