atech_cloud 1.0.1 → 1.0.2
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/atech_cloud/deploy.rb +33 -14
- data/lib/atech_cloud/unicorn.rb +52 -0
- metadata +5 -4
data/lib/atech_cloud/deploy.rb
CHANGED
@@ -4,6 +4,11 @@ Capistrano::Configuration.instance(:must_exist).load do
|
|
4
4
|
set :user, `whoami`.chomp
|
5
5
|
set :ssh_options, {:forward_agent => true, :port => 22}
|
6
6
|
|
7
|
+
## Return the deployment path
|
8
|
+
def deploy_to
|
9
|
+
fetch(:deploy_to, nil) || "/opt/apps/#{fetch(:application)}"
|
10
|
+
end
|
11
|
+
|
7
12
|
## Deployment namespace
|
8
13
|
namespace :deploy do
|
9
14
|
desc 'Deploy the latest revision of the application'
|
@@ -19,34 +24,37 @@ Capistrano::Configuration.instance(:must_exist).load do
|
|
19
24
|
end
|
20
25
|
|
21
26
|
task :update_code, :roles => :app do
|
22
|
-
path = fetch(:deploy_to)
|
23
27
|
## Create a branch for previous (pre-deployment)
|
24
|
-
run "cd #{
|
28
|
+
run "cd #{deploy_to} && git branch -d rollback && git branch rollback"
|
25
29
|
## Update remote repository and merge deploy branch into current branch
|
26
|
-
run "cd #{
|
30
|
+
run "cd #{deploy_to} && git fetch origin && git reset --hard origin/#{fetch(:branch)}"
|
27
31
|
finalise
|
28
32
|
end
|
29
33
|
|
30
34
|
task :finalise, :roles => :app do
|
31
35
|
execute = Array.new
|
32
|
-
execute << "cd #{
|
36
|
+
execute << "cd #{deploy_to}"
|
33
37
|
execute << "git submodule init"
|
34
38
|
execute << "git submodule sync"
|
35
39
|
execute << "git submodule update --recursive"
|
36
40
|
run execute.join(' && ')
|
37
41
|
|
38
|
-
run "cd #{
|
42
|
+
run "cd #{deploy_to} && bundle --deployment --quiet"
|
39
43
|
migrate if fetch(:run_migrations, false)
|
40
44
|
end
|
41
45
|
|
42
46
|
desc 'Setup the repository on the remote server for the first time'
|
43
47
|
task :setup, :roles => :app do
|
44
|
-
|
45
|
-
run "git
|
46
|
-
|
47
|
-
run "sed 's/socket: \\\/tmp\\\/mysql.sock/host: db-a.cloud.atechmedia.net/' #{path}/config/database.yml.example > #{path}/config/database.yml ; true"
|
48
|
+
run "git clone -n #{fetch(:repository)} #{deploy_to} --branch #{fetch(:branch)}"
|
49
|
+
run "cd #{deploy_to} && git branch rollback && git checkout -b deploy && git branch -d #{fetch(:branch)}"
|
50
|
+
upload_db_config
|
48
51
|
update_code
|
49
52
|
end
|
53
|
+
|
54
|
+
desc 'Upload the database configuration file'
|
55
|
+
task :upload_db_config, :roles => :app do
|
56
|
+
put "[production]\n adapter: mysql2\n encoding: utf8\n reconnect: false\n database: #{fetch(:application, 'databasename')}\n pool: 5\n username: #{fetch(:application, 'dbusernmae')}\n password: #{ENV['DBPASS'] || 'xxxx'}\n host: #{fetch(:database_host, 'db-a.cloud.atechmedia.net')}\n", File.join(deploy_to, 'config', 'database.yml')
|
57
|
+
end
|
50
58
|
end
|
51
59
|
|
52
60
|
## ==================================================================
|
@@ -54,7 +62,7 @@ Capistrano::Configuration.instance(:must_exist).load do
|
|
54
62
|
## ==================================================================
|
55
63
|
desc 'Run database migrations on the remote'
|
56
64
|
task :migrate, :roles => :app, :only => {:database_ops => true} do
|
57
|
-
run "cd #{
|
65
|
+
run "cd #{deploy_to} && RAILS_ENV=#{fetch(:environment)} bundle exec rake db:migrate"
|
58
66
|
end
|
59
67
|
|
60
68
|
## ==================================================================
|
@@ -62,7 +70,7 @@ Capistrano::Configuration.instance(:must_exist).load do
|
|
62
70
|
## ==================================================================
|
63
71
|
desc 'Rollback to the previous deployment'
|
64
72
|
task :rollback, :roles => :app do
|
65
|
-
run "cd #{
|
73
|
+
run "cd #{deploy_to} && git reset --hard rollback"
|
66
74
|
deploy.finalise
|
67
75
|
deploy.restart
|
68
76
|
end
|
@@ -101,15 +109,26 @@ Capistrano::Configuration.instance(:must_exist).load do
|
|
101
109
|
## ==================================================================
|
102
110
|
namespace :unicorn do
|
103
111
|
task :start, :roles => :app do
|
104
|
-
|
112
|
+
upload_config
|
113
|
+
run "sudo -u app sh -c \"cd #{deploy_to} && bundle exec unicorn_rails -E #{fetch(:environment)} -c #{deploy_to}/config/unicorn.rb -D\""
|
105
114
|
end
|
106
115
|
|
107
116
|
task :stop, :roles => :app do
|
108
|
-
run "sudo -u app sh -c \"kill `cat #{
|
117
|
+
run "sudo -u app sh -c \"kill `cat #{deploy_to}/tmp/pids/unicorn.pid`\""
|
109
118
|
end
|
110
119
|
|
111
120
|
task :restart, :roles => :app do
|
112
|
-
|
121
|
+
upload_config
|
122
|
+
run "sudo -u app sh -c \"kill -USR2 `cat #{deploy_to}/tmp/pids/unicorn.pid`\""
|
123
|
+
end
|
124
|
+
|
125
|
+
task :upload_config, :roles => :app do
|
126
|
+
unless fetch(:skip_unicorn_config, false)
|
127
|
+
template_config = File.read(File.expand_path('../unicorn.rb', __FILE__))
|
128
|
+
template_config.gsub!('$WORKER_PROCESSES', fetch(:unicorn_workers, 4).to_s)
|
129
|
+
template_config.gsub!('$TIMEOUT', fetch(:unicorn_timeout, 30).to_s)
|
130
|
+
put template_config, File.join(deploy_to, 'config', 'unicorn.rb')
|
131
|
+
end
|
113
132
|
end
|
114
133
|
end
|
115
134
|
|
@@ -0,0 +1,52 @@
|
|
1
|
+
## Directory to use for stuff
|
2
|
+
rails_root = File.expand_path('../../', __FILE__)
|
3
|
+
FileUtils.mkdir_p(File.join(rails_root, 'tmp', 'sockets'))
|
4
|
+
FileUtils.mkdir_p(File.join(rails_root, 'tmp', 'pids'))
|
5
|
+
FileUtils.mkdir_p(File.join(rails_root, 'log'))
|
6
|
+
|
7
|
+
## Set the number of worker processes which can be spawned
|
8
|
+
worker_processes $WORKER_PROCESSES
|
9
|
+
|
10
|
+
## Preload the application into master for fast worker spawn
|
11
|
+
## times.
|
12
|
+
preload_app true
|
13
|
+
|
14
|
+
## Restart any workers which haven't responded for 30 seconds.
|
15
|
+
timeout $TIMEOUT
|
16
|
+
|
17
|
+
## Store the pid file safely away in the pids folder
|
18
|
+
logger Logger.new(File.join(rails_root, 'log', 'unicorn.log'))
|
19
|
+
pid File.join(rails_root, 'tmp', 'pids', 'unicorn.pid')
|
20
|
+
|
21
|
+
## Listen on a unix data socket
|
22
|
+
listen File.join(rails_root, 'tmp', 'sockets', 'unicorn.sock')
|
23
|
+
|
24
|
+
before_fork do |server, worker|
|
25
|
+
# When sent a USR2, Unicorn will suffix its pidfile with .oldbin and
|
26
|
+
# immediately start loading up a new version of itself (loaded with a new
|
27
|
+
# version of our app). When this new Unicorn is completely loaded
|
28
|
+
# it will begin spawning workers. The first worker spawned will check to
|
29
|
+
# see if an .oldbin pidfile exists. If so, this means we've just booted up
|
30
|
+
# a new Unicorn and need to tell the old one that it can now die. To do so
|
31
|
+
# we send it a QUIT.
|
32
|
+
#
|
33
|
+
# Using this method we get 0 downtime deploys.
|
34
|
+
|
35
|
+
old_pid = File.join(rails_root, 'tmp', 'pids', 'unicorn.pid.oldbin')
|
36
|
+
if File.exists?(old_pid) && server.pid != old_pid
|
37
|
+
begin
|
38
|
+
Process.kill("QUIT", File.read(old_pid).to_i)
|
39
|
+
rescue Errno::ENOENT, Errno::ESRCH
|
40
|
+
# someone else did our job for us
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
after_fork do |server, worker|
|
46
|
+
# Unicorn master loads the app then forks off workers - because of the way
|
47
|
+
# Unix forking works, we need to make sure we aren't using any of the parent's
|
48
|
+
# sockets, e.g. db connection
|
49
|
+
ActiveRecord::Base.establish_connection
|
50
|
+
srand
|
51
|
+
end
|
52
|
+
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: atech_cloud
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 19
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 1
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 1.0.
|
9
|
+
- 2
|
10
|
+
version: 1.0.2
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Adam Cooke
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-
|
18
|
+
date: 2011-04-06 00:00:00 +01:00
|
19
19
|
default_executable:
|
20
20
|
dependencies: []
|
21
21
|
|
@@ -29,6 +29,7 @@ extra_rdoc_files: []
|
|
29
29
|
|
30
30
|
files:
|
31
31
|
- lib/atech_cloud/deploy.rb
|
32
|
+
- lib/atech_cloud/unicorn.rb
|
32
33
|
- lib/atech_cloud.rb
|
33
34
|
has_rdoc: true
|
34
35
|
homepage: http://atechmedia.com
|