o2h 0.0.5 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/o2h.rb +3 -8
- data/lib/o2h/capistrano.rb +4 -0
- data/lib/o2h/capistrano/deploy/strategy/git.rb +32 -0
- data/lib/o2h/recipes.rb +12 -0
- data/lib/o2h/recipes/config.rb +3 -2
- data/lib/o2h/recipes/copycopter.rb +5 -0
- data/lib/o2h/recipes/deploy.rb +77 -1
- data/lib/o2h/recipes/git.rb +3 -2
- data/lib/o2h/recipes/host/unicorn.rb +16 -0
- data/lib/o2h/version.rb +1 -1
- data/spec/recipes/bluepill_spec.rb +0 -1
- data/spec/support/shared_contexts/capistrano.rb +3 -1
- metadata +8 -3
data/lib/o2h.rb
CHANGED
@@ -3,26 +3,21 @@ module O2h
|
|
3
3
|
|
4
4
|
autoload :VERSION, 'o2h/version'
|
5
5
|
|
6
|
-
|
7
6
|
def capistrano(required = :require)
|
8
7
|
defined?(Capistrano) and Capistrano::Configuration.instance(required)
|
9
8
|
end
|
10
9
|
|
11
10
|
def initialize!
|
12
|
-
|
11
|
+
# use app mode only when we are not in capistrano
|
12
|
+
unless capistrano(false)
|
13
13
|
app_mode
|
14
|
-
else
|
15
|
-
cap_mode
|
16
14
|
end
|
17
15
|
end
|
18
16
|
|
19
17
|
def app_mode
|
20
|
-
require 'o2h/recipes'
|
21
|
-
end
|
22
|
-
|
23
|
-
def cap_mode
|
24
18
|
require 'newrelic_rpm'
|
25
19
|
end
|
20
|
+
|
26
21
|
end
|
27
22
|
|
28
23
|
O2h.initialize!
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'capistrano/recipes/deploy/strategy/remote'
|
2
|
+
|
3
|
+
module Capistrano
|
4
|
+
module Deploy
|
5
|
+
module Strategy
|
6
|
+
|
7
|
+
# Implements the deployment strategy which does an SCM checkout on each
|
8
|
+
# target host. This is the default deployment strategy for Capistrano.
|
9
|
+
class Git < Remote
|
10
|
+
def clone!
|
11
|
+
scm_run clone
|
12
|
+
end
|
13
|
+
|
14
|
+
def deploy!
|
15
|
+
scm_run sync
|
16
|
+
end
|
17
|
+
|
18
|
+
protected
|
19
|
+
|
20
|
+
def clone
|
21
|
+
@clone ||= source.checkout(revision, configuration[:release_path])
|
22
|
+
end
|
23
|
+
|
24
|
+
# Returns the SCM's checkout command for the revision to deploy.
|
25
|
+
def sync
|
26
|
+
@sync ||= source.sync(revision, configuration[:release_path])
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
data/lib/o2h/recipes.rb
CHANGED
@@ -1,5 +1,17 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/version'
|
2
2
|
|
3
|
+
def rake_task(taskname)
|
4
|
+
rake = fetch(:rake, "rake")
|
5
|
+
rake_env = fetch(:rake_env, "")
|
6
|
+
in_rails_root("#{rake} #{rake_env} #{taskname}")
|
7
|
+
end
|
8
|
+
|
9
|
+
def in_rails_root(taskname)
|
10
|
+
rails_env = fetch(:rails_env, "production")
|
11
|
+
directory = current_release
|
12
|
+
run %{cd #{directory}; RAILS_ENV=#{rails_env} #{taskname}}
|
13
|
+
end
|
14
|
+
|
3
15
|
Dir[File.join(File.dirname(__FILE__), 'recipes', '*.rb')].each do |recipe|
|
4
16
|
O2h.capistrano.load recipe
|
5
17
|
end
|
data/lib/o2h/recipes/config.rb
CHANGED
@@ -1,11 +1,12 @@
|
|
1
1
|
set(:domain) { abort "You need to set the :domain variable, e.g set :domain 'www.example.com'" }
|
2
2
|
set(:application) { domain.split('.').first } # TODO - find proper 2nd level domain
|
3
3
|
|
4
|
+
set :user, 'deployer'
|
5
|
+
set :group, 'www'
|
4
6
|
set :use_sudo, false
|
5
7
|
set :sudo, 'sudo -n'
|
6
8
|
set :sudo_prompt, ''
|
7
9
|
set :password, ''
|
8
10
|
|
9
|
-
default_run_options[:pty] = true
|
10
|
-
|
11
11
|
ssh_options[:forward_agent] = true
|
12
|
+
|
data/lib/o2h/recipes/deploy.rb
CHANGED
@@ -1,7 +1,20 @@
|
|
1
|
+
set(:strategy) do
|
2
|
+
require 'o2h/capistrano/deploy/strategy/git'
|
3
|
+
Capistrano::Deploy::Strategy::Git.new(self)
|
4
|
+
end
|
5
|
+
|
1
6
|
set(:deploy_to) { "/var/www/#{domain}" }
|
2
7
|
set :group, :www
|
3
8
|
|
4
|
-
|
9
|
+
set(:latest_release) { fetch(:current_path) }
|
10
|
+
set(:release_path) { fetch(:current_path) }
|
11
|
+
set(:current_release) { fetch(:current_path) }
|
12
|
+
|
13
|
+
set(:current_revision) { capture("cd #{current_path}; git rev-parse --short HEAD").strip }
|
14
|
+
set(:latest_revision) { capture("cd #{current_path}; git rev-parse --short HEAD").strip }
|
15
|
+
set(:previous_revision) { capture("cd #{current_path}; git rev-parse --short HEAD@{1}").strip }
|
16
|
+
|
17
|
+
#after :'deploy:update_code', :'deploy:set_permissions', :roles => :web
|
5
18
|
|
6
19
|
namespace :deploy do
|
7
20
|
task :set_permissions do
|
@@ -9,4 +22,67 @@ namespace :deploy do
|
|
9
22
|
# deployment directory to webadmin and apache
|
10
23
|
try_sudo "chgrp -R #{group} #{deploy_to}"
|
11
24
|
end
|
25
|
+
|
26
|
+
desc find_task(:default).description
|
27
|
+
task :default do
|
28
|
+
update
|
29
|
+
restart
|
30
|
+
end
|
31
|
+
|
32
|
+
desc find_task(:setup).description
|
33
|
+
task :setup, :except => { :no_release => true } do
|
34
|
+
dirs = [deploy_to, shared_path]
|
35
|
+
dirs += shared_children.map { |d| File.join(shared_path, d) }
|
36
|
+
run "#{try_sudo} mkdir -p #{dirs.join(' ')} && #{try_sudo} chmod g+w #{dirs.join(' ')}"
|
37
|
+
strategy.clone!
|
38
|
+
end
|
39
|
+
|
40
|
+
desc find_task(:cold).description
|
41
|
+
task :cold do
|
42
|
+
update
|
43
|
+
migrate
|
44
|
+
start
|
45
|
+
end
|
46
|
+
|
47
|
+
desc "Resets to HEAD of branch"
|
48
|
+
task :update do
|
49
|
+
transaction do
|
50
|
+
update_code
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
desc find_task(:update_code).description
|
55
|
+
task :update_code, :except => { :no_release => true } do
|
56
|
+
strategy.deploy!
|
57
|
+
finalize_update
|
58
|
+
end
|
59
|
+
|
60
|
+
desc find_task(:migrations).description
|
61
|
+
task :migrations do
|
62
|
+
set :migrate_target, :latest
|
63
|
+
update
|
64
|
+
migrate
|
65
|
+
restart
|
66
|
+
end
|
67
|
+
|
68
|
+
task :celanup do
|
69
|
+
nil
|
70
|
+
end
|
71
|
+
|
72
|
+
task :symlink do
|
73
|
+
nil
|
74
|
+
end
|
75
|
+
|
76
|
+
namespace :rollback do
|
77
|
+
desc "Moves the repo back to the previous version of HEAD"
|
78
|
+
task :revision, :except => { :no_release => true } do
|
79
|
+
set :branch, "HEAD@{1}"
|
80
|
+
deploy.update_code
|
81
|
+
end
|
82
|
+
|
83
|
+
desc "Rewrite reflog so HEAD@{1} will continue to point to at the next previous release."
|
84
|
+
task :cleanup, :except => { :no_release => true } do
|
85
|
+
run "cd #{current_path}; git reflog delete --rewrite HEAD@{1}; git reflog delete --rewrite HEAD@{1}"
|
86
|
+
end
|
87
|
+
end
|
12
88
|
end
|
data/lib/o2h/recipes/git.rb
CHANGED
@@ -1,9 +1,10 @@
|
|
1
1
|
set :scm, :git
|
2
2
|
set :branch, :master
|
3
3
|
|
4
|
-
set :
|
4
|
+
set :migrate_target, :current
|
5
|
+
set :deploy_via, :remote_git
|
5
6
|
|
6
|
-
set :git_shallow_clone, true
|
7
|
+
#set :git_shallow_clone, true
|
7
8
|
set :git_enable_submodules, true
|
8
9
|
|
9
10
|
set(:repository) { "git.o2h.cz:#{fetch(:application)}" }
|
@@ -0,0 +1,16 @@
|
|
1
|
+
namespace :deploy do
|
2
|
+
desc "Zero-downtime restart of Unicorn"
|
3
|
+
task :restart, :except => { :no_release => true } do
|
4
|
+
run "kill -s USR2 `cat /tmp/unicorn.my_site.pid`"
|
5
|
+
end
|
6
|
+
|
7
|
+
desc "Start unicorn"
|
8
|
+
task :start, :except => { :no_release => true } do
|
9
|
+
run "cd #{current_path} ; bundle exec unicorn_rails -c config/unicorn.rb -D"
|
10
|
+
end
|
11
|
+
|
12
|
+
desc "Stop unicorn"
|
13
|
+
task :stop, :except => { :no_release => true } do
|
14
|
+
run "kill -s QUIT `cat /tmp/unicorn.my_site.pid`"
|
15
|
+
end
|
16
|
+
end
|
data/lib/o2h/version.rb
CHANGED
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: o2h
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.0
|
5
|
+
version: 0.1.0
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Michal Cichra
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2011-
|
13
|
+
date: 2011-12-05 00:00:00 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: newrelic_rpm
|
@@ -63,15 +63,19 @@ files:
|
|
63
63
|
- README.md
|
64
64
|
- Rakefile
|
65
65
|
- lib/o2h.rb
|
66
|
+
- lib/o2h/capistrano.rb
|
67
|
+
- lib/o2h/capistrano/deploy/strategy/git.rb
|
66
68
|
- lib/o2h/recipes.rb
|
67
69
|
- lib/o2h/recipes/bundler.rb
|
68
70
|
- lib/o2h/recipes/config.rb
|
71
|
+
- lib/o2h/recipes/copycopter.rb
|
69
72
|
- lib/o2h/recipes/database.rb
|
70
73
|
- lib/o2h/recipes/deploy.rb
|
71
74
|
- lib/o2h/recipes/git.rb
|
72
75
|
- lib/o2h/recipes/host/bluepill.rb
|
73
76
|
- lib/o2h/recipes/host/passenger.rb
|
74
77
|
- lib/o2h/recipes/host/static.rb
|
78
|
+
- lib/o2h/recipes/host/unicorn.rb
|
75
79
|
- lib/o2h/recipes/rvm.rb
|
76
80
|
- lib/o2h/version.rb
|
77
81
|
- o2h.gemspec
|
@@ -106,7 +110,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
106
110
|
requirements: []
|
107
111
|
|
108
112
|
rubyforge_project:
|
109
|
-
rubygems_version: 1.8.
|
113
|
+
rubygems_version: 1.8.11
|
110
114
|
signing_key:
|
111
115
|
specification_version: 3
|
112
116
|
summary: Collection of recipes and gem dependencies for o2h deployment
|
@@ -119,3 +123,4 @@ test_files:
|
|
119
123
|
- test/Capfile
|
120
124
|
- test/Gemfile
|
121
125
|
- test/config/deploy.rb
|
126
|
+
has_rdoc:
|