Ruby on Rails custom Capistrano tasks
Writing and using custom Capistrano tasks is very easy and automating your deployment process may save you a lot of time and troubles. Here is a brief description of the creation process with a simple example at the end.
Define your custom Capistrano tasks
The best place to store your custom tasks is the default lib/capistrano/tasks/ directory where each task should have its own file. Task filename doesn't matter because by default Capistrano loads all files from the lib/capistrano/tasks/ directory.
Loading custom tasks should be handled by the default
Capfilein the last line:
Dir.glob("lib/capistrano/tasks/*.rake").each { |r| import r }
As you may noticed the task files should have a .rake extension (not .rb).
Use your custom task in deployment process
After defining the task you may use it as a standalone Capistrano command e.g.
run from console
cap staging git:pushor add it to the deployment flow e.g.
config/deploy.rb
before :deploy, 'git:push'If you want to extend your deployment flow you should check the official Capistrano docs about the Flow where you can find detailed description of available hooks. Each hook may be used with before or after keyword.
Example Capistrano custom task: git push
This will be an example of a custom Capistrano task which will push your latest commits to the remote Git repository before the Capistrano deployment. In order to make it work properly, you should setup the git remote origin (which you probably have if you use the Capistrano).
Create the task file
As I mentioned earlier it might be named as you wish, but I would suggest giving meaningful names to ease the maintenance. A filename which is the same as the namespace seems to be a fine idea.
lib/capistrano/tasks/git.rake
namespace :git do
  desc 'Pushing new commits to the remote repository'
  task :push do
    on roles(:all) do
      run_locally do
        execute "git push"
      end
    end
  end
endInstructions used in this example:
- namespace - will be used for referencing the task (:gitis probably not the best choice as it may collide with some existing namespace)
- desc - is the task description which will be displayed after executing cap -T
- task - name of the task
- roles - used for limiting the execution only to the given roles (check the role filtering)
- run_locally - forces local execution, without that block the command defined after execute will be executed remotely on the deployment server
- execute - execute given command "from the console"
Add task to your deployment flow
Append the following line to your config/deploy.rb file:
run from console
before :deploy, 'git:push'Test the custom Capistrano task
In order to test your task, you may execute new command directly from the console. In this case it would be:
run from console
cap staging git:pushWhere staging is your environment name, which of course doesn't matter in that example, but may be important for other tasks e.g. if the task restarts your app.
Finally try to start your deployment process with a regular command.
run from console
cap staging deployYou should see the following message at the beginning of your deploy log output:
Which means that your remote git repository was updated before starting any other Capistrano deployment related operations (which is generally a useful feature).
For more info check the Official Capistrano docs.