capistranovelys 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +4 -0
- data/Gemfile +2 -0
- data/LICENCE +0 -0
- data/README.md +126 -0
- data/capistranovelys.gemspec +22 -0
- data/lib/capistrano/novelys.rb +21 -0
- data/lib/capistrano/novelys/airbrake.rb +18 -0
- data/lib/capistrano/novelys/core.rb +34 -0
- data/lib/capistrano/novelys/core_extensions.rb +15 -0
- data/lib/capistrano/novelys/database.rb +25 -0
- data/lib/capistrano/novelys/helpers.rb +22 -0
- data/lib/capistrano/novelys/logs.rb +7 -0
- data/lib/capistrano/novelys/mongoid.rb +21 -0
- data/lib/capistrano/novelys/production_chain.rb +26 -0
- data/lib/capistrano/novelys/puma.rb +1 -0
- data/lib/capistrano/novelys/rails.rb +34 -0
- data/lib/capistrano/novelys/rails2.rb +34 -0
- data/lib/capistrano/novelys/rbenv.rb +4 -0
- data/lib/capistrano/novelys/remote_commands.rb +16 -0
- data/lib/capistrano/novelys/s3.rb +15 -0
- data/lib/capistrano/novelys/sphinx.rb +47 -0
- data/lib/capistrano/novelys/stages.rb +52 -0
- data/lib/capistrano/novelys/sunspot.rb +15 -0
- data/lib/capistrano/novelys/unicorn.rb +38 -0
- data/lib/capistrano/novelys/version.rb +5 -0
- data/lib/capistrano/novelys/whenever.rb +5 -0
- metadata +97 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 628f0080583595564a2eb58cb92199f1a1f231f4
|
4
|
+
data.tar.gz: 70a58b456f97e0626142ee24cf082c1f6828f0a9
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: c0c5e93a2074a4f1d609ffd4daebb17d1646fbb6997d9ea74444a70ac4dfdcef762e332b7cc439c827622f392dbcdefa4d343f2a8a3e0288bb1fd341bcfe89bf
|
7
|
+
data.tar.gz: ac39207f4ee54fe9dcacf47da12932010af9d98050f02bf4cc19241d77f28ab437c13bcf4738ffbf32e2c7ccba0e68a9fe4256707f4957330871ae6a6f74023c
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENCE
ADDED
File without changes
|
data/README.md
ADDED
@@ -0,0 +1,126 @@
|
|
1
|
+
# Capistranovelys - Keeping our recipes DRY
|
2
|
+
|
3
|
+
This gem, once stable, should include every recipe/task that serves for more than one of our project.
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
`capistranovelys` has a dependency on recent versions of `capistrano`,
|
8
|
+
meaning you can remove `capistrano` and `capistrano-ext` from your Gemfile, and replace it with :
|
9
|
+
|
10
|
+
```ruby
|
11
|
+
gem "capistranovelys", :git => 'git@github.com:novelys/capistranovelys.git'
|
12
|
+
```
|
13
|
+
|
14
|
+
## Usage
|
15
|
+
|
16
|
+
In your deploy.rb :
|
17
|
+
|
18
|
+
* remove `require "production_chain/capistrano";
|
19
|
+
* add `require 'capistrano/novelys'` (loads the core recipes)
|
20
|
+
* load recipes you need, eg: `use_stack :database, :rails2, :rbenv, :whenever`. To be used **BEFORE** other loading of recipes such as `deploy/assets`, otherwise some hooks (such as the symlinks) will be executed too late.
|
21
|
+
* You can use `use_default_stack_and [arg, ...]`. It will load `airbrake`, `rbenv`, `unicorn`, `logs`, `stages`, `remote_commands, production_chain`, and the recipes supplied as arguments. Use `use_default_stack` if you don't want/need anything else.
|
22
|
+
* Make sure you don't have duplicates!
|
23
|
+
|
24
|
+
## Recipes available
|
25
|
+
|
26
|
+
### Core
|
27
|
+
|
28
|
+
Common setup and options is done here. I suggest reading the file to go through all the details.
|
29
|
+
|
30
|
+
Basically, using core means you're using git, you're using rails, and you'll keep 5 releases.
|
31
|
+
|
32
|
+
### SSH
|
33
|
+
|
34
|
+
This gem has a dependency on `sushi`. This allows you to do `capistrano [stage] ssh`.
|
35
|
+
|
36
|
+
### Rails (`rails`)
|
37
|
+
|
38
|
+
Rails 3 & 4 commands.
|
39
|
+
|
40
|
+
* `rails:console` : open a rails console
|
41
|
+
* `rails:secret_token:copy` : copy the secret_token from your local file to the shared path
|
42
|
+
* `rails:secret_token:symlink` : symlink the secret_token.rb file from the shared path to the current path. Hooked after `deploy:update_code`
|
43
|
+
|
44
|
+
### Rails 2 (`rails2`)
|
45
|
+
|
46
|
+
Rails 2 commands.
|
47
|
+
|
48
|
+
* `rails2:console` : open a rails console
|
49
|
+
* `rails2:secret_token:copy` : copy the session_store from your local file to the shared path
|
50
|
+
* `rails2:secret_token:symlink` : symlink the session_store.rb file from the shared path to the current path. Hooked after `deploy:update_code`
|
51
|
+
|
52
|
+
### Stages (`stages`)
|
53
|
+
|
54
|
+
Replacement with better defaults for stages:
|
55
|
+
|
56
|
+
* bundles two stages, `staging` and `production`, `staging` being the default`;
|
57
|
+
* those stages comes with default for `branch` and `rails_env`; staging can override `branch` at runtime (via `cap -S branch=value`);
|
58
|
+
* if no stages are specified, stages are defined and loaded by looking in `config/deploy/*.rb`
|
59
|
+
|
60
|
+
You should not require `capistrano/ext/multistage`.
|
61
|
+
|
62
|
+
### Database (`database`)
|
63
|
+
|
64
|
+
* `database:create` : create the database
|
65
|
+
* `database:seed` : seed the database
|
66
|
+
* `database:copy` : copy the database.yml from your local file to the shared path
|
67
|
+
* `database:symlink` : symlink the database.yml file from the shared path to the current path. Hooked after `deploy:update_code`
|
68
|
+
|
69
|
+
### Mongoid (`mongoid`)
|
70
|
+
|
71
|
+
* `mongoid:copy` : copy the mongoid.yml from your local file to the shared path
|
72
|
+
* `mongoid:symlink` : symlink the mongoid.yml file from the shared path to the current path. Hooked after `deploy:update_code`
|
73
|
+
* `mongoid:index` : create the indexes
|
74
|
+
|
75
|
+
### Logs (`logs`)
|
76
|
+
|
77
|
+
* `logs:tail` : tail the logs of the rails app
|
78
|
+
|
79
|
+
### Production chain (`production_chain`)
|
80
|
+
|
81
|
+
Recipes usings rake tasks from [novelys/production_chain](https://github.com/novelys/production_chain)
|
82
|
+
|
83
|
+
* `db:dump_and_restore`: restore the database from the server to your local env. Supply `FILE=mongoid` when using mongoid.
|
84
|
+
* `assets:dump_and_restore`: restore the assets from the public direction to your local env.
|
85
|
+
|
86
|
+
### Rbenv (`rbenv`)
|
87
|
+
|
88
|
+
Setup the `default_environment` with the correct path for rbenv
|
89
|
+
|
90
|
+
### Remote commands (`remote_commands`)
|
91
|
+
|
92
|
+
* `remote:rake` : Execute a rake task on the target (eg: `cap remote:rake "assets:precompile"`)
|
93
|
+
* `remote:command` : Execute a shell command on the target (eg: `cap remote:command ls`)
|
94
|
+
|
95
|
+
### S3 (`s3`)
|
96
|
+
|
97
|
+
* `s3:copy` : copy the amazon_s3.yml from your local file to the shared path
|
98
|
+
* `s3:symlink` : symlink the amazon_s3.yml file from the shared path to the current path. Hooked after `deploy:update_code`
|
99
|
+
|
100
|
+
### Unicorn (`unicorn`)
|
101
|
+
|
102
|
+
`deploy:start`, `deploy:stop`, `deploy:graceful_stop`, `deploy:reload`, `deploy:restart` tasks for unicorn
|
103
|
+
|
104
|
+
### Puma (`puma`)
|
105
|
+
|
106
|
+
`deploy:start`, `deploy:stop`, `deploy:graceful_stop`, `deploy:reload`, `deploy:restart` tasks for puma. Doesn't actually do anything except requiring "puma".
|
107
|
+
|
108
|
+
### Airbrake (`airbrake`)
|
109
|
+
|
110
|
+
* `airbrake:copy` : copy the airbrake.rb from your local file to the shared path
|
111
|
+
* `airbrake:symlink` : symlink the airbrake.rb file from the shared path to the current path. Hooked after `deploy:update_code`
|
112
|
+
|
113
|
+
### Sphinx (`sphinx`)
|
114
|
+
|
115
|
+
* `thinking_sphinx:copy` : copy the *.sphinx.conf from your local file to the shared path
|
116
|
+
* `thinking_sphinx:symlink` : symlink the *.sphinx.conf file from the shared path to the current path. Hooked after `deploy:update_code`
|
117
|
+
* Every task available under the namespace `thinking_sphinx` is also available under the namespace `ts`, eg. `ts:rebuild`
|
118
|
+
|
119
|
+
### Sunspot (`sunspot`)
|
120
|
+
|
121
|
+
* `sunspot:copy` : copy the sunspot.yml from your local file to the shared path
|
122
|
+
* `sunspot:symlink` : symlink the sunspot.yml file from the shared path to the current path. Hooked after `deploy:update_code`
|
123
|
+
|
124
|
+
### Whenever (`whenever`)
|
125
|
+
|
126
|
+
Setup options for the `whenever` gem
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
$:.unshift File.expand_path('../lib', __FILE__)
|
4
|
+
require 'capistrano/novelys/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = 'capistranovelys'
|
8
|
+
s.version = Capistrano::Novelys::VERSION
|
9
|
+
s.authors = ['Kevin Soltysiak']
|
10
|
+
s.email = 'kevin.soltysiak@novelys.com'
|
11
|
+
s.homepage = 'https://github.com/novelys/capistranovelys'
|
12
|
+
s.summary = 'Capistrano recipes for novelys'
|
13
|
+
s.description = 'Capistrano recipes in use at novelys'
|
14
|
+
s.license = 'MIT'
|
15
|
+
|
16
|
+
s.files = `git ls-files`.split("\n")
|
17
|
+
s.platform = Gem::Platform::RUBY
|
18
|
+
s.require_path = 'lib'
|
19
|
+
|
20
|
+
s.add_dependency 'capistrano', '~> 2.15.0'
|
21
|
+
s.add_dependency 'sushi', '~> 0.0.2'
|
22
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# This is our default stack
|
2
|
+
|
3
|
+
require "capistrano"
|
4
|
+
require "capistrano/novelys/core_extensions"
|
5
|
+
require "capistrano/novelys/version"
|
6
|
+
require "capistrano/novelys/helpers"
|
7
|
+
|
8
|
+
if Capistrano::Configuration.instance
|
9
|
+
Capistrano::Configuration.instance.load_paths << File.dirname(__FILE__)
|
10
|
+
Capistrano::Configuration.instance.load "novelys/core"
|
11
|
+
|
12
|
+
# Capistrano extensions bundled with this gem
|
13
|
+
require "sushi/ssh"
|
14
|
+
|
15
|
+
# Capistrano extensions expected to be present
|
16
|
+
begin
|
17
|
+
require "bundler/capistrano"
|
18
|
+
rescue LoadError
|
19
|
+
puts "It seems bundler is not there. This might be a problem."
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require './config/boot'
|
2
|
+
require 'airbrake/capistrano'
|
3
|
+
|
4
|
+
## Hooks
|
5
|
+
after 'deploy:update_code', 'airbrake:symlink'
|
6
|
+
|
7
|
+
## Tasks
|
8
|
+
namespace :airbrake do
|
9
|
+
desc "Copy airbrake API Key"
|
10
|
+
task :copy do
|
11
|
+
upload "config/initializers/airbrake.rb", "#{shared_path}/config/initializers/airbrake.rb", :via => :scp
|
12
|
+
end
|
13
|
+
|
14
|
+
desc "Link the config/initializers/airbrake.rb file in the release_path"
|
15
|
+
task :symlink do
|
16
|
+
run "test -f #{release_path}/config/initializers/airbrake.rb || ln -s #{shared_path}/config/initializers/airbrake.rb #{release_path}/config/initializers/airbrake.rb"
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
## Dependencies
|
2
|
+
depend :remote, :command, 'git'
|
3
|
+
|
4
|
+
## Default configuration
|
5
|
+
set(:scm) { :git }
|
6
|
+
set(:use_sudo) { false }
|
7
|
+
set(:deploy_via) { :remote_cache }
|
8
|
+
set(:repository_cache) { 'git_cache' }
|
9
|
+
set(:copy_exclude) { %w(.svn .DS_Store .git) }
|
10
|
+
set(:keep_releases) { 5 }
|
11
|
+
set(:public_children) { %w(images) }
|
12
|
+
set(:bundle_cmd) { 'bundle' }
|
13
|
+
|
14
|
+
## Default app configuration
|
15
|
+
set(:user) { application }
|
16
|
+
set(:deploy_to) { "/home/#{user}/www/" }
|
17
|
+
set(:github_account) { 'novelys' }
|
18
|
+
set(:repository) { "git@github.com:#{github_account}/#{application}" }
|
19
|
+
|
20
|
+
## SSH Options
|
21
|
+
ssh_options[:forward_agent] = true
|
22
|
+
default_run_options[:pty] = true
|
23
|
+
|
24
|
+
## Default hooks
|
25
|
+
after 'deploy:update', 'deploy:cleanup'
|
26
|
+
after 'deploy:setup', 'deploy:mkdir_config'
|
27
|
+
|
28
|
+
## Default tasks
|
29
|
+
namespace :deploy do
|
30
|
+
desc "Create directories required for correct symlinking"
|
31
|
+
task :mkdir_config do
|
32
|
+
run "mkdir -p #{shared_path}/config/initializers"
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Capistrano
|
2
|
+
class Configuration
|
3
|
+
# Sugar for loading given recipes
|
4
|
+
def use_stack(*args)
|
5
|
+
args.each { |recipes| load "novelys/#{recipes.to_s}" }
|
6
|
+
end
|
7
|
+
|
8
|
+
# Sugar for loading common recipes (+ supplied is present)
|
9
|
+
def use_default_stack(*args)
|
10
|
+
args = ([:airbrake, :logs, :production_chain, :rbenv, :remote_commands, :stages, :unicorn] + args).uniq
|
11
|
+
use_stack(*args)
|
12
|
+
end
|
13
|
+
alias :use_default_stack_and :use_default_stack
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
## Hooks
|
2
|
+
after 'deploy:update_code', 'database:symlink'
|
3
|
+
|
4
|
+
## Tasks
|
5
|
+
namespace :database do
|
6
|
+
desc "Database create"
|
7
|
+
task :create do
|
8
|
+
run "cd #{current_path} && #{bundle_cmd} exec rake db:create:all"
|
9
|
+
end
|
10
|
+
|
11
|
+
desc "Database seeds population"
|
12
|
+
task :seed do
|
13
|
+
run "cd #{current_path} && #{bundle_cmd} exec rake db:seed"
|
14
|
+
end
|
15
|
+
|
16
|
+
desc "Copy database config"
|
17
|
+
task :copy do
|
18
|
+
upload "config/database.yml", "#{shared_path}/config/database.yml", :via => :scp
|
19
|
+
end
|
20
|
+
|
21
|
+
desc "Link the config/database.yml file in the release_path"
|
22
|
+
task :symlink do
|
23
|
+
run "test -f #{release_path}/config/database.yml || ln -s #{shared_path}/config/database.yml #{release_path}/config/database.yml"
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Capistrano
|
2
|
+
module Novelys
|
3
|
+
module Helpers
|
4
|
+
# Run rake on the server.
|
5
|
+
# To be used in tasks.
|
6
|
+
def run_remote_rake(cap, rake_cmd)
|
7
|
+
rake_args = ENV['RAKE_ARGS'].to_s.split(',')
|
8
|
+
release = cap.fetch(:latest_release)
|
9
|
+
rake = cap.fetch(:rake, 'rake')
|
10
|
+
env = cap.fetch(:rails_env, 'production')
|
11
|
+
|
12
|
+
cmd = "cd #{release} && #{rake} RAILS_ENV=#{env} #{rake_cmd}"
|
13
|
+
cmd += "['#{rake_args.join("','")}']" unless rake_args.empty?
|
14
|
+
|
15
|
+
cap.run cmd
|
16
|
+
|
17
|
+
cap.set :rakefile, nil if cap.exists?(:rakefile)
|
18
|
+
end
|
19
|
+
module_function :run_remote_rake
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
## Hooks
|
2
|
+
after 'deploy:update_code', 'mongoid:symlink'
|
3
|
+
|
4
|
+
## Tasks
|
5
|
+
namespace :mongoid do
|
6
|
+
desc "Copy mongoid config"
|
7
|
+
task :copy do
|
8
|
+
upload "config/mongoid.yml", "#{shared_path}/config/mongoid.yml", :via => :scp
|
9
|
+
end
|
10
|
+
|
11
|
+
desc "Link the mongoid config in the release_path"
|
12
|
+
task :symlink do
|
13
|
+
run "test -f #{release_path}/config/mongoid.yml || ln -s #{shared_path}/config/mongoid.yml #{release_path}/config/mongoid.yml"
|
14
|
+
end
|
15
|
+
|
16
|
+
desc "Create MongoDB indexes"
|
17
|
+
task :index do
|
18
|
+
run "cd #{current_path} && #{bundle_cmd} exec rake db:mongoid:create_indexes", :once => true
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
@@ -0,0 +1,26 @@
|
|
1
|
+
namespace :db do
|
2
|
+
# this recipe needs the "mysql tasks" plugin
|
3
|
+
desc "Make a dump on the remote production box and restore on the local dev box"
|
4
|
+
task :dump_and_restore, :roles => :db, :only => {:primary => true} do
|
5
|
+
rake = fetch(:rake, "rake")
|
6
|
+
rails_env = fetch(:rails_env, "production")
|
7
|
+
file_env = ENV['FILE'] || "database"
|
8
|
+
run "cd #{current_release} && RAILS_ENV=#{rails_env} FILE=#{file_env} #{rake} db:backup"
|
9
|
+
get "#{current_release}/db/dump.tar.gz", "db/dump.tar.gz"
|
10
|
+
cmd = "RAILS_ENV=#{ ENV['RAILS_ENV'] || "development" } FILE=#{file_env} #{rake} db:restore"
|
11
|
+
puts cmd
|
12
|
+
system(cmd) && puts('finished')
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
namespace :assets do
|
17
|
+
desc "Make a dump on the remote production box and restore on the local dev box"
|
18
|
+
task :dump_and_restore, :roles => :db, :only => {:primary => true} do
|
19
|
+
assets_backup_path = "#{current_path}/system.tar.gz"
|
20
|
+
run "cd #{current_path}/ && tar czfh #{assets_backup_path} public/system/"
|
21
|
+
get "#{assets_backup_path}", "system.tar.gz"
|
22
|
+
run "cd #{current_path}/ && rm #{assets_backup_path}"
|
23
|
+
`rm -rf public/system/*`
|
24
|
+
`tar xvzf system.tar.gz`
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'puma/capistrano'
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'readline'
|
2
|
+
|
3
|
+
## Hooks
|
4
|
+
after 'deploy:update_code', 'rails:secret_token:symlink'
|
5
|
+
|
6
|
+
## Tasks
|
7
|
+
namespace :rails do
|
8
|
+
namespace :secret_token do
|
9
|
+
desc "Copy the secret token file to the server"
|
10
|
+
task :copy do
|
11
|
+
upload "config/initializers/secret_token.rb", "#{shared_path}/config/initializes/secret_token.rb", :via => :scp
|
12
|
+
end
|
13
|
+
|
14
|
+
desc "Symlink the secret token file in the current release"
|
15
|
+
task :symlink do
|
16
|
+
run "test -f #{release_path}/config/initializers/secret_token.rb || ln -s #{shared_path}/config/initializers/secret_token.rb #{release_path}/config/initializers/secret_token.rb"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
desc "Open a Rails console"
|
21
|
+
task :console do
|
22
|
+
run_interactively "bundle exec rails console #{rails_env}"
|
23
|
+
end
|
24
|
+
|
25
|
+
desc "Open a DBConsole"
|
26
|
+
task :dbconsole do
|
27
|
+
run_interactively "bundle exec rails dbconsole #{rails_env}"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def run_interactively(command, server = nil)
|
32
|
+
server ||= find_servers_for_task(current_task).first
|
33
|
+
exec %Q(ssh #{user}@#{server.host} -t 'cd #{current_path} && #{command}')
|
34
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'readline'
|
2
|
+
|
3
|
+
## Hooks
|
4
|
+
after 'deploy:update_code', 'rails2:secret_token:symlink'
|
5
|
+
|
6
|
+
## Tasks
|
7
|
+
namespace :rails2 do
|
8
|
+
namespace :secret_token do
|
9
|
+
desc "Copy the secret token file to the server"
|
10
|
+
task :copy do
|
11
|
+
upload "config/initializers/session_store.rb", "#{shared_path}/config/initializes/session_store.rb", :via => :scp
|
12
|
+
end
|
13
|
+
|
14
|
+
desc "Symlink the secret token file in the current release"
|
15
|
+
task :symlink do
|
16
|
+
run "test -f #{release_path}/initializers/session_store.rb || ln -s #{shared_path}/initializers/session_store.rb #{release_path}/initializers/session_store.rb"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
desc "Open a Rails console"
|
21
|
+
task :console do
|
22
|
+
run_interactively "bundle exec script/console #{rails_env}"
|
23
|
+
end
|
24
|
+
|
25
|
+
desc "Open a DBConsole"
|
26
|
+
task :dbconsole do
|
27
|
+
run_interactively "bundle exec script/dbconsole #{rails_env}"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def run_interactively(command, server = nil)
|
32
|
+
server ||= find_servers_for_task(current_task).first
|
33
|
+
exec %Q(ssh #{user}@#{server.host} -t 'cd #{current_path} && #{command}')
|
34
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
namespace :remote do
|
2
|
+
desc 'Run remote rake task'
|
3
|
+
task :rake do
|
4
|
+
ARGV.values_at(Range.new(ARGV.index('remote:rake')+1,-1)).each do |task|
|
5
|
+
run "cd #{current_path}; RAILS_ENV=#{rails_env} bundle exec rake #{task}"
|
6
|
+
end
|
7
|
+
exit(0)
|
8
|
+
end
|
9
|
+
|
10
|
+
desc 'Run remote command'
|
11
|
+
task :command do
|
12
|
+
command = ARGV.values_at(Range.new(ARGV.index('remote:command')+1,-1))
|
13
|
+
run "cd #{current_path}; RAILS_ENV=#{rails_env} #{command*' '}"
|
14
|
+
exit(0)
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
## Hooks
|
2
|
+
after 'deploy:update_code', 's3:symlink'
|
3
|
+
|
4
|
+
## Tasks
|
5
|
+
namespace :s3 do
|
6
|
+
desc "Copy amazon S3 config"
|
7
|
+
task :copy do
|
8
|
+
upload "config/amazon_s3.yml", "#{shared_path}/config/amazon_s3.yml", :via => :scp
|
9
|
+
end
|
10
|
+
|
11
|
+
desc "Link the config/amazon_s3.yml file in the release_path"
|
12
|
+
task :symlink do
|
13
|
+
run "test -f #{release_path}/config/amazon_s3.yml || ln -s #{shared_path}/config/amazon_s3.yml #{release_path}/config/amazon_s3.yml"
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
## Hooks
|
3
|
+
after 'deploy:update_code', 'thinking_sphinx:symlink'
|
4
|
+
|
5
|
+
## Tasks
|
6
|
+
namespace :thinking_sphinx do
|
7
|
+
desc "Copy local sphinx config"
|
8
|
+
task :copy do
|
9
|
+
upload "config/development.sphinx.conf", "#{shared_path}/config/#{rails_env}.sphinx.conf", :via => :scp
|
10
|
+
end
|
11
|
+
|
12
|
+
desc "Link the config/*.sphinx.conf file in the release_path"
|
13
|
+
task :symlink do
|
14
|
+
run "test -f #{release_path}/config/#{rails_env}.sphinx.conf || ln -s #{shared_path}/config/#{rails_env}.sphinx.conf #{release_path}/config/#{rails_env}.sphinx.conf"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
## Alias for thinking_sphinx namespace
|
19
|
+
namespace :ts do
|
20
|
+
desc "Generate the Sphinx configuration file"
|
21
|
+
task(:configure) { thinking_sphinx.configure }
|
22
|
+
|
23
|
+
desc "Index data"
|
24
|
+
task(:index) { thinking_sphinx.index }
|
25
|
+
|
26
|
+
desc "Stop, re-index and then start the Sphinx daemon"
|
27
|
+
task(:rebuild) { thinking_sphinx.rebuild }
|
28
|
+
|
29
|
+
desc "Stop and then start the Sphinx daemon"
|
30
|
+
task(:restart) { thinking_sphinx.restart }
|
31
|
+
|
32
|
+
desc "Add the shared folder for sphinx files for the production environment"
|
33
|
+
task(:shared_sphinx_folder) { thinking_sphinx.shared_sphinx_folder }
|
34
|
+
|
35
|
+
desc "Start the Sphinx daemon"
|
36
|
+
task(:start) { thinking_sphinx.start }
|
37
|
+
|
38
|
+
desc "Stop the Sphinx daemon"
|
39
|
+
task(:stop) { thinking_sphinx.stop }
|
40
|
+
|
41
|
+
desc "Copy local sphinx config"
|
42
|
+
task(:copy) { thinking_sphinx.copy }
|
43
|
+
|
44
|
+
desc "Link the config/*.sphinx.conf file in the release_path"
|
45
|
+
task(:symlink) { thinking_sphinx.symlink }
|
46
|
+
end
|
47
|
+
|
@@ -0,0 +1,52 @@
|
|
1
|
+
# Inspired by https://github.com/TechnoGate/capistrano-exts
|
2
|
+
|
3
|
+
set(:default_stage) { :staging }
|
4
|
+
|
5
|
+
default_stages = [default_stage, :production]
|
6
|
+
location = fetch(:stage_dir, 'config/deploy')
|
7
|
+
|
8
|
+
# Load stages from per-stage deploy file if not defined
|
9
|
+
unless exists?(:stages)
|
10
|
+
set :stages, Dir["#{location}/*.rb"].map { |f| File.basename(f, ".rb") }
|
11
|
+
end
|
12
|
+
|
13
|
+
# Force symbols
|
14
|
+
set :stages, stages.map(&:to_sym)
|
15
|
+
|
16
|
+
desc "Set the target stage to `staging'."
|
17
|
+
task :staging do
|
18
|
+
set :stage, :staging
|
19
|
+
set :branch, fetch(:branch, :staging)
|
20
|
+
set :rails_env, :staging
|
21
|
+
|
22
|
+
load "#{location}/#{stage}" if File.exists?("#{location}/#{stage}.rb")
|
23
|
+
end
|
24
|
+
|
25
|
+
desc "Set the target stage to `production'."
|
26
|
+
task :production do
|
27
|
+
set :stage, :production
|
28
|
+
set :branch, :production
|
29
|
+
set :rails_env, :production
|
30
|
+
|
31
|
+
load "#{location}/#{stage}"
|
32
|
+
end
|
33
|
+
|
34
|
+
(stages - default_stages).each do |name|
|
35
|
+
desc "Set the target stage to `#{name}'."
|
36
|
+
task(name) do
|
37
|
+
set(:stage) { name }
|
38
|
+
load "#{location}/#{stage}"
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
namespace :multistage do
|
43
|
+
desc "[internal] Ensure that a stage has been selected."
|
44
|
+
task :ensure do
|
45
|
+
if !exists?(:stage)
|
46
|
+
logger.important "Defaulting to `#{default_stage}'"
|
47
|
+
find_and_execute_task(default_stage)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
on :start, "multistage:ensure", :except => default_stages + stages
|
@@ -0,0 +1,15 @@
|
|
1
|
+
## Hooks
|
2
|
+
after 'deploy:update_code', 'sunspot:symlink'
|
3
|
+
|
4
|
+
## Tasks
|
5
|
+
namespace :sunspot do
|
6
|
+
desc "Copy sunspot config"
|
7
|
+
task :copy do
|
8
|
+
upload "config/sunspot.yml", "#{shared_path}/config/sunspot.yml", :via => :scp
|
9
|
+
end
|
10
|
+
|
11
|
+
desc "Link the config/sunspot.yml file in the release_path"
|
12
|
+
task :symlink do
|
13
|
+
run "test -f #{release_path}/config/sunspot.yml || ln -s #{shared_path}/config/sunspot.yml #{release_path}/config/sunspot.yml"
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
## Unicorn Config
|
2
|
+
set(:unicorn_binary) { 'bundle exec unicorn_rails' }
|
3
|
+
set(:unicorn_config) { "#{shared_path}/config/unicorn.rb" }
|
4
|
+
set(:unicorn_pid) { "#{current_path}/tmp/pids/unicorn.pid" }
|
5
|
+
|
6
|
+
## Tasks
|
7
|
+
namespace :deploy do
|
8
|
+
common_options = {
|
9
|
+
:roles => :app,
|
10
|
+
:except => { :no_release => true }
|
11
|
+
}
|
12
|
+
|
13
|
+
desc "Start unicorn"
|
14
|
+
task :start, common_options do
|
15
|
+
run "cd #{current_path} && #{try_sudo} #{unicorn_binary} -c #{unicorn_config} -E #{rails_env} -D"
|
16
|
+
end
|
17
|
+
|
18
|
+
desc "Stop unicorn"
|
19
|
+
task :stop, common_options do
|
20
|
+
run "#{try_sudo} kill `cat #{unicorn_pid}`"
|
21
|
+
end
|
22
|
+
|
23
|
+
desc "Graceful stop of unicorn"
|
24
|
+
task :graceful_stop, common_options do
|
25
|
+
run "#{try_sudo} kill -s QUIT `cat #{unicorn_pid}`"
|
26
|
+
end
|
27
|
+
|
28
|
+
desc "Reload unicorn config"
|
29
|
+
task :reload, common_options do
|
30
|
+
run "#{try_sudo} kill -s USR2 `cat #{unicorn_pid}`"
|
31
|
+
end
|
32
|
+
|
33
|
+
desc "Restart unicorn"
|
34
|
+
task :restart, common_options do
|
35
|
+
stop
|
36
|
+
start
|
37
|
+
end
|
38
|
+
end
|
metadata
ADDED
@@ -0,0 +1,97 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: capistranovelys
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Kevin Soltysiak
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-01-09 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: capistrano
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 2.15.0
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 2.15.0
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: sushi
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 0.0.2
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 0.0.2
|
41
|
+
description: Capistrano recipes in use at novelys
|
42
|
+
email: kevin.soltysiak@novelys.com
|
43
|
+
executables: []
|
44
|
+
extensions: []
|
45
|
+
extra_rdoc_files: []
|
46
|
+
files:
|
47
|
+
- ".gitignore"
|
48
|
+
- Gemfile
|
49
|
+
- LICENCE
|
50
|
+
- README.md
|
51
|
+
- capistranovelys.gemspec
|
52
|
+
- lib/capistrano/novelys.rb
|
53
|
+
- lib/capistrano/novelys/airbrake.rb
|
54
|
+
- lib/capistrano/novelys/core.rb
|
55
|
+
- lib/capistrano/novelys/core_extensions.rb
|
56
|
+
- lib/capistrano/novelys/database.rb
|
57
|
+
- lib/capistrano/novelys/helpers.rb
|
58
|
+
- lib/capistrano/novelys/logs.rb
|
59
|
+
- lib/capistrano/novelys/mongoid.rb
|
60
|
+
- lib/capistrano/novelys/production_chain.rb
|
61
|
+
- lib/capistrano/novelys/puma.rb
|
62
|
+
- lib/capistrano/novelys/rails.rb
|
63
|
+
- lib/capistrano/novelys/rails2.rb
|
64
|
+
- lib/capistrano/novelys/rbenv.rb
|
65
|
+
- lib/capistrano/novelys/remote_commands.rb
|
66
|
+
- lib/capistrano/novelys/s3.rb
|
67
|
+
- lib/capistrano/novelys/sphinx.rb
|
68
|
+
- lib/capistrano/novelys/stages.rb
|
69
|
+
- lib/capistrano/novelys/sunspot.rb
|
70
|
+
- lib/capistrano/novelys/unicorn.rb
|
71
|
+
- lib/capistrano/novelys/version.rb
|
72
|
+
- lib/capistrano/novelys/whenever.rb
|
73
|
+
homepage: https://github.com/novelys/capistranovelys
|
74
|
+
licenses:
|
75
|
+
- MIT
|
76
|
+
metadata: {}
|
77
|
+
post_install_message:
|
78
|
+
rdoc_options: []
|
79
|
+
require_paths:
|
80
|
+
- lib
|
81
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
82
|
+
requirements:
|
83
|
+
- - ">="
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: '0'
|
86
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
87
|
+
requirements:
|
88
|
+
- - ">="
|
89
|
+
- !ruby/object:Gem::Version
|
90
|
+
version: '0'
|
91
|
+
requirements: []
|
92
|
+
rubyforge_project:
|
93
|
+
rubygems_version: 2.2.0
|
94
|
+
signing_key:
|
95
|
+
specification_version: 4
|
96
|
+
summary: Capistrano recipes for novelys
|
97
|
+
test_files: []
|