capistrano-technogate 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/..gemspec +20 -0
- data/.gitignore +4 -0
- data/Gemfile +4 -0
- data/Rakefile +1 -0
- data/capistrano-technogate.gemspec +22 -0
- data/lib/capistrano/technogate/base.rb +95 -0
- data/lib/capistrano/technogate/configurations.rb +31 -0
- data/lib/capistrano/technogate/contao.rb +191 -0
- data/lib/capistrano/technogate/god.rb +30 -0
- data/lib/capistrano/technogate/mysql.rb +132 -0
- data/lib/capistrano/technogate/rails.rb +40 -0
- data/lib/capistrano/technogate/unicorn.rb +27 -0
- data/lib/capistrano/technogate/version.rb +11 -0
- metadata +71 -0
data/..gemspec
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "./version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "."
|
7
|
+
s.version = .::VERSION
|
8
|
+
s.authors = ["Wael Nasreddine"]
|
9
|
+
s.email = ["wael.nasreddine@gmail.com"]
|
10
|
+
s.homepage = ""
|
11
|
+
s.summary = %q{TODO: Write a gem summary}
|
12
|
+
s.description = %q{TODO: Write a gem description}
|
13
|
+
|
14
|
+
s.rubyforge_project = "."
|
15
|
+
|
16
|
+
s.files = `git ls-files`.split("\n")
|
17
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
18
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
19
|
+
s.require_paths = ["lib"]
|
20
|
+
end
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'bundler/gem_tasks'
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "capistrano/technogate/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "capistrano-technogate"
|
7
|
+
s.version = Capistrano::Technogate::Version::STRING.dup
|
8
|
+
s.authors = ["Wael Nasreddine"]
|
9
|
+
s.email = ["wael.nasreddine@gmail.com"]
|
10
|
+
s.homepage = "https://github.com/TechnoGate/capistrano-technogate"
|
11
|
+
s.summary = %q{This gem provides some receipts for helping me in my every-day development}
|
12
|
+
s.description = s.summary
|
13
|
+
|
14
|
+
s.rubyforge_project = "capistrano-technogate"
|
15
|
+
|
16
|
+
s.files = `git ls-files`.split("\n")
|
17
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
18
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
19
|
+
s.require_paths = ["lib"]
|
20
|
+
|
21
|
+
s.add_dependency('capistrano', '>=1.0.0')
|
22
|
+
end
|
@@ -0,0 +1,95 @@
|
|
1
|
+
require 'capistrano'
|
2
|
+
require 'highline'
|
3
|
+
|
4
|
+
# Verify that Capistrano is version 2
|
5
|
+
unless Capistrano::Configuration.respond_to?(:instance)
|
6
|
+
abort "This extension requires Capistrano 2"
|
7
|
+
end
|
8
|
+
|
9
|
+
Capistrano::Configuration.instance(:must_exist).load do
|
10
|
+
# Taken from Stackoverflow
|
11
|
+
# http://stackoverflow.com/questions/1661586/how-can-you-check-to-see-if-a-file-exists-on-the-remote-server-in-capistrano
|
12
|
+
def remote_file_exists?(full_path)
|
13
|
+
'true' == capture("if [ -e #{full_path} ]; then echo 'true'; fi").strip
|
14
|
+
end
|
15
|
+
|
16
|
+
def link_file(source_file, destination_file)
|
17
|
+
if remote_file_exists?(source_file)
|
18
|
+
run "#{try_sudo} ln -nsf #{source_file} #{destination_file}"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def link_config_file(config_file, config_path = nil)
|
23
|
+
config_path ||= "#{File.join release_path, 'config'}"
|
24
|
+
link_file("#{File.join shared_path, 'config', config_file}", "#{File.join config_path, config_file}")
|
25
|
+
end
|
26
|
+
|
27
|
+
def blank?(var)
|
28
|
+
var.nil? or var == false or var.empty?
|
29
|
+
end
|
30
|
+
|
31
|
+
def ask(what)
|
32
|
+
ui = HighLine.new
|
33
|
+
ui.ask("#{what}? ") do |q|
|
34
|
+
q.overwrite = false
|
35
|
+
q.default = 'No'
|
36
|
+
q.validate = /(y(es)?)|(no?)|(a(bort)?|\n)/i
|
37
|
+
q.responses[:not_valid] = what
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
namespace :deploy do
|
42
|
+
if defined?(skip_deploy_restart) and skip_deploy_restart
|
43
|
+
task :restart do
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
if defined?(finalize_update) and finalize_update
|
48
|
+
task :finalize_update do
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
desc "Check if the branch is ready"
|
53
|
+
task :check_if_branch_is_ready, :roles => :web do
|
54
|
+
unless `git rev-parse #{branch}` == `git rev-parse origin/#{branch}`
|
55
|
+
puts "ERROR: #{branch} is not the same as origin/#{branch}"
|
56
|
+
puts "Run `git push` to sync changes."
|
57
|
+
exit
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
desc "Check if this revision has already been deployed."
|
62
|
+
task :check_revision, :roles => :web do
|
63
|
+
if remote_file_exists?("#{deploy_to}/current/REVISION")
|
64
|
+
if `git rev-parse #{branch}`.strip == capture("cat #{deploy_to}/current/REVISION").strip
|
65
|
+
response = ask("The verison you are trying to deploy is already deployed, should I continue (Yes, [No], Abort)")
|
66
|
+
if response =~ /(no?)|(a(bort)?|\n)/i
|
67
|
+
exit
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
desc "Check if the remote is ready, should we run cap deploy:setup?"
|
74
|
+
task :check_if_remote_ready, :roles => :web do
|
75
|
+
unless remote_file_exists?("#{shared_path}")
|
76
|
+
puts "ERROR: The project is not ready for deployment."
|
77
|
+
puts "please run `cap deploy:setup"
|
78
|
+
exit
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
namespace :bundle do
|
84
|
+
if :skip_bundle_install
|
85
|
+
task :install do
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
# Dependencies
|
91
|
+
before "deploy", "deploy:check_if_remote_ready"
|
92
|
+
after "deploy:check_if_remote_ready", "deploy:check_if_branch_is_ready"
|
93
|
+
after "deploy:check_if_branch_is_ready", "deploy:check_revision"
|
94
|
+
after "deploy", "deploy:cleanup" # keeps only last 5 releases
|
95
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'capistrano'
|
2
|
+
|
3
|
+
# Verify that Capistrano is version 2
|
4
|
+
unless Capistrano::Configuration.respond_to?(:instance)
|
5
|
+
abort "This extension requires Capistrano 2"
|
6
|
+
end
|
7
|
+
|
8
|
+
Capistrano::Configuration.instance(:must_exist).load do
|
9
|
+
unless ENV['DEPLOY'].nil? or ENV['DEPLOY'].empty?
|
10
|
+
# Set the operation were doing
|
11
|
+
set :deploying, ENV['DEPLOY'].to_sym
|
12
|
+
|
13
|
+
if configurations[deploying].nil?
|
14
|
+
puts "ERROR: #{ENV['DEPLOY']} has not been configured yet, please open up 'config/deploy.rb' and configure it"
|
15
|
+
exit
|
16
|
+
end
|
17
|
+
|
18
|
+
# Parse configurations
|
19
|
+
configurations[deploying].each { |config, value| set config, value }
|
20
|
+
|
21
|
+
# Set the current path
|
22
|
+
set :current_path, "#{File.join deploy_to, 'current'}"
|
23
|
+
end
|
24
|
+
|
25
|
+
# Some helpers
|
26
|
+
if defined?(skip_bundle_install) and skip_bundle_install
|
27
|
+
set :try_bundle_exec, ""
|
28
|
+
else
|
29
|
+
set :try_bundle_exec, "bundle exec"
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,191 @@
|
|
1
|
+
require 'capistrano'
|
2
|
+
|
3
|
+
# Verify that Capistrano is version 2
|
4
|
+
unless Capistrano::Configuration.respond_to?(:instance)
|
5
|
+
abort "This extension requires Capistrano 2"
|
6
|
+
end
|
7
|
+
|
8
|
+
Capistrano::Configuration.instance(:must_exist).load do
|
9
|
+
|
10
|
+
namespace :contao do
|
11
|
+
task :setup, :roles => :web do
|
12
|
+
run <<-CMD
|
13
|
+
#{try_sudo} mkdir -p #{shared_path}/log &&
|
14
|
+
#{try_sudo} mkdir -p #{shared_path}/contenu &&
|
15
|
+
#{try_sudo} mkdir -p #{shared_path}/contenu/images &&
|
16
|
+
#{try_sudo} mkdir -p #{shared_path}/contenu/videos &&
|
17
|
+
#{try_sudo} mkdir -p #{shared_path}/contenu/son &&
|
18
|
+
#{try_sudo} mkdir -p #{shared_path}/contenu/pdfs
|
19
|
+
CMD
|
20
|
+
end
|
21
|
+
|
22
|
+
task :setup_localconfig, :roles => :web do
|
23
|
+
mysql_credentials = TechnoGate::Contao.instance.mysql_credentials
|
24
|
+
mysql_db_name = TechnoGate::Contao.instance.mysql_database_name
|
25
|
+
localconfig = File.read("public/system/config/localconfig.php.sample")
|
26
|
+
|
27
|
+
# Add MySQL credentials
|
28
|
+
unless blank?(localconfig) or blank?(mysql_credentials)
|
29
|
+
localconfig.gsub!(/#DB_USER#/, mysql_credentials[:user])
|
30
|
+
localconfig.gsub!(/#DB_PASS#/, mysql_credentials[:pass])
|
31
|
+
localconfig.gsub!(/#DB_NAME#/, mysql_db_name)
|
32
|
+
end
|
33
|
+
|
34
|
+
# localconfig
|
35
|
+
if blank?(mysql_credentials)
|
36
|
+
puts "WARNING: The mysql credential file can't be found, localconfig has just been copied from the sample file"
|
37
|
+
end
|
38
|
+
|
39
|
+
put localconfig, "#{shared_path}/localconfig.php"
|
40
|
+
end
|
41
|
+
|
42
|
+
task :setup_db, :roles => :db do
|
43
|
+
mysql_credentials = TechnoGate::Contao.instance.mysql_credentials
|
44
|
+
mysql_db_name = TechnoGate::Contao.instance.mysql_database_name
|
45
|
+
|
46
|
+
unless blank?(mysql_credentials)
|
47
|
+
begin
|
48
|
+
run <<-CMD
|
49
|
+
mysqladmin --user='#{mysql_credentials[:user]}' --password='#{mysql_credentials[:pass]}' create '#{mysql_db_name}'
|
50
|
+
CMD
|
51
|
+
rescue
|
52
|
+
puts "WARNING: The database already exists, it hasn't been modified, drop it manually if necessary."
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
task :fix_links, :roles => :web do
|
58
|
+
run <<-CMD
|
59
|
+
#{try_sudo} rm -rf #{latest_release}/public/tl_files/durable/contenu &&
|
60
|
+
#{try_sudo} rm -rf #{latest_release}/log &&
|
61
|
+
#{try_sudo} ln -nsf #{shared_path}/contenu #{latest_release}/public/tl_files/durable/contenu &&
|
62
|
+
#{try_sudo} ln -nsf #{shared_path}/htaccess.txt #{latest_release}/public/.htaccess &&
|
63
|
+
#{try_sudo} ln -nsf #{shared_path}/localconfig.php #{latest_release}/public/system/config/localconfig.php &&
|
64
|
+
#{try_sudo} ln -nsf #{shared_path}/log #{latest_release}/log
|
65
|
+
CMD
|
66
|
+
end
|
67
|
+
|
68
|
+
task :fix_permissions, :roles => :web do
|
69
|
+
run <<-CMD
|
70
|
+
#{try_sudo} chown -R www-data:www-data #{deploy_to} &&
|
71
|
+
#{try_sudo} chmod -R g+w #{latest_release}
|
72
|
+
CMD
|
73
|
+
end
|
74
|
+
|
75
|
+
desc "Copy master database to staging"
|
76
|
+
task :replicate_master_database, :roles => :web do
|
77
|
+
mysql_credentials = TechnoGate::Contao.instance.mysql_credentials
|
78
|
+
mysql_master_db_name = TechnoGate::Contao.instance.mysql_database_name("master")
|
79
|
+
mysql_staging_db_name = TechnoGate::Contao.instance.mysql_database_name("staging")
|
80
|
+
|
81
|
+
mysql_staging_db_backup_path = "#{configurations[:staging][:deploy_to]}/backups/#{mysql_staging_db_name}_#{Time.now.strftime('%d-%m-%Y_%H-%M-%S')}.sql"
|
82
|
+
|
83
|
+
begin
|
84
|
+
run <<-CMD
|
85
|
+
mysqldump \
|
86
|
+
--user='#{mysql_credentials[:user]}' \
|
87
|
+
--password='#{mysql_credentials[:pass]}' \
|
88
|
+
--default-character-set=utf8 \
|
89
|
+
'#{mysql_staging_db_name}' > \
|
90
|
+
'#{mysql_staging_db_backup_path}'
|
91
|
+
CMD
|
92
|
+
|
93
|
+
run <<-CMD
|
94
|
+
bzip2 -9 '#{mysql_staging_db_backup_path}'
|
95
|
+
CMD
|
96
|
+
|
97
|
+
run <<-CMD
|
98
|
+
mysqladmin --user='#{mysql_credentials[:user]}' --password='#{mysql_credentials[:pass]}' drop --force '#{mysql_staging_db_name}'
|
99
|
+
CMD
|
100
|
+
rescue
|
101
|
+
puts "NOTICE: #{application}'s staging database does not exist, continuing under this assumption."
|
102
|
+
end
|
103
|
+
|
104
|
+
run <<-CMD
|
105
|
+
mysqladmin --user='#{mysql_credentials[:user]}' --password='#{mysql_credentials[:pass]}' create '#{mysql_staging_db_name}'
|
106
|
+
CMD
|
107
|
+
|
108
|
+
run <<-CMD
|
109
|
+
mysqldump \
|
110
|
+
--user='#{mysql_credentials[:user]}' \
|
111
|
+
--password='#{mysql_credentials[:pass]}' \
|
112
|
+
--default-character-set=utf8 \
|
113
|
+
'#{mysql_master_db_name}' > \
|
114
|
+
'/tmp/#{mysql_master_db_name}.sql'
|
115
|
+
CMD
|
116
|
+
|
117
|
+
run <<-CMD
|
118
|
+
mysql \
|
119
|
+
--user='#{mysql_credentials[:user]}' \
|
120
|
+
--password='#{mysql_credentials[:pass]}' \
|
121
|
+
--default-character-set=utf8 \
|
122
|
+
'#{mysql_staging_db_name}' < \
|
123
|
+
/tmp/#{mysql_master_db_name}.sql
|
124
|
+
CMD
|
125
|
+
|
126
|
+
run <<-CMD
|
127
|
+
rm -f '/tmp/#{mysql_master_db_name}.sql'
|
128
|
+
CMD
|
129
|
+
end
|
130
|
+
|
131
|
+
desc "Copy master contents to staging"
|
132
|
+
task :replicate_master_contents, :roles => :web do
|
133
|
+
run <<-CMD
|
134
|
+
cp -R #{configurations[:development][:deploy_to]}/shared/contenu #{configurations[:staging][:deploy_to]}/shared/
|
135
|
+
CMD
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
# This module serve as a placeholder for mysql credentials
|
140
|
+
# and other stuff that would go around in contao.
|
141
|
+
module TechnoGate
|
142
|
+
class Contao
|
143
|
+
|
144
|
+
attr_accessor :config
|
145
|
+
|
146
|
+
def self.instance(deploy_to = nil)
|
147
|
+
@@instance ||= Contao.new
|
148
|
+
|
149
|
+
@@instance
|
150
|
+
end
|
151
|
+
|
152
|
+
def mysql_credentials
|
153
|
+
return @mysql_credentials unless @mysql_credentials.nil?
|
154
|
+
|
155
|
+
begin
|
156
|
+
mysql_credentials_file = @config.capture "cat #{@config.deploy_to}/.mysql_password"
|
157
|
+
rescue
|
158
|
+
return false
|
159
|
+
end
|
160
|
+
|
161
|
+
unless mysql_credentials_file.nil? or mysql_credentials_file.empty?
|
162
|
+
@mysql_credentials = {
|
163
|
+
:user => mysql_credentials_file.match(/username: (.*)$/o)[1].chomp,
|
164
|
+
:pass => mysql_credentials_file.match(/password: (.*)$/o)[1].chomp,
|
165
|
+
}
|
166
|
+
end
|
167
|
+
|
168
|
+
@mysql_credentials
|
169
|
+
end
|
170
|
+
|
171
|
+
def mysql_database_name(branch = nil)
|
172
|
+
branch ||= @config.branch
|
173
|
+
"#{@config.application}_co_#{branch}"
|
174
|
+
end
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
178
|
+
# Dependencies
|
179
|
+
after "deploy:setup", "contao:setup"
|
180
|
+
after "contao:setup", "contao:setup_localconfig"
|
181
|
+
after "contao:setup_localconfig", "contao:setup_db"
|
182
|
+
after "deploy:finalize_update", "contao:fix_links"
|
183
|
+
after "contao:fix_links", "deploy:cleanup"
|
184
|
+
|
185
|
+
if branch == 'staging'
|
186
|
+
before "deploy:restart", "contao:replicate_master_database"
|
187
|
+
after "contao:replicate_master_database", "contao:replicate_master_contents"
|
188
|
+
end
|
189
|
+
|
190
|
+
after "deploy:restart", "contao:fix_permissions"
|
191
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'capistrano'
|
2
|
+
|
3
|
+
# Verify that Capistrano is version 2
|
4
|
+
unless Capistrano::Configuration.respond_to?(:instance)
|
5
|
+
abort "This extension requires Capistrano 2"
|
6
|
+
end
|
7
|
+
|
8
|
+
Capistrano::Configuration.instance(:must_exist).load do
|
9
|
+
namespace :god do
|
10
|
+
desc "start god, this starts up unicorn server"
|
11
|
+
task :start, :roles => :app, :except => {:no_release => true} do
|
12
|
+
run "cd #{current_path} && #{god_binary} -c #{god_config} --log /var/log/god.log --no-syslog --log-level warn"
|
13
|
+
end
|
14
|
+
|
15
|
+
desc "stop god, this shutdowns unicorn server"
|
16
|
+
task :stop, :roles => :app, :except => {:no_release => true} do
|
17
|
+
run "cd #{current_path} && #{god_binary} terminate"
|
18
|
+
end
|
19
|
+
|
20
|
+
desc "restart god, this restarts the unicorn server"
|
21
|
+
task :restart, :roles => :app, :except => {:no_release => true} do
|
22
|
+
run "cd #{current_path} && #{god_binary} restart"
|
23
|
+
end
|
24
|
+
|
25
|
+
desc "check if god is already running"
|
26
|
+
task :check_if_running, :roles => :app, :except => {:no_release => true} do
|
27
|
+
'true' == capture("if #{god_binary} status; then echo 'true'; fi").strip
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,132 @@
|
|
1
|
+
require 'capistrano'
|
2
|
+
|
3
|
+
# Verify that Capistrano is version 2
|
4
|
+
unless Capistrano::Configuration.respond_to?(:instance)
|
5
|
+
abort "This extension requires Capistrano 2"
|
6
|
+
end
|
7
|
+
|
8
|
+
Capistrano::Configuration.instance(:must_exist).load do
|
9
|
+
namespace :mysql do
|
10
|
+
desc "Backup database"
|
11
|
+
task :backup_db do
|
12
|
+
mysql_credentials = TechnoGate::Contao.instance.mysql_credentials
|
13
|
+
mysql_db_name = TechnoGate::Contao.instance.mysql_database_name
|
14
|
+
MYSQL_DB_BACKUP_PATH = "#{deploy_to}/backups/#{mysql_db_name}_#{Time.now.strftime('%d-%m-%Y_%H-%M-%S')}.sql"
|
15
|
+
|
16
|
+
unless blank?(mysql_credentials)
|
17
|
+
begin
|
18
|
+
run <<-CMD
|
19
|
+
mysqldump \
|
20
|
+
--user='#{mysql_credentials[:user]}' \
|
21
|
+
--password='#{mysql_credentials[:pass]}' \
|
22
|
+
--default-character-set=utf8 \
|
23
|
+
'#{mysql_db_name}' > \
|
24
|
+
'#{MYSQL_DB_BACKUP_PATH}'
|
25
|
+
CMD
|
26
|
+
|
27
|
+
run <<-CMD
|
28
|
+
bzip2 -9 '#{MYSQL_DB_BACKUP_PATH}'
|
29
|
+
CMD
|
30
|
+
rescue
|
31
|
+
puts "WARNING: The database doesn't exist."
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
desc "drop database"
|
37
|
+
task :drop_db do
|
38
|
+
mysql_credentials = TechnoGate::Contao.instance.mysql_credentials
|
39
|
+
mysql_db_name = TechnoGate::Contao.instance.mysql_database_name
|
40
|
+
|
41
|
+
begin
|
42
|
+
run <<-CMD
|
43
|
+
mysqladmin --user='#{mysql_credentials[:user]}' --password='#{mysql_credentials[:pass]}' drop --force '#{mysql_db_name}'
|
44
|
+
CMD
|
45
|
+
rescue
|
46
|
+
puts "WARNING: The database doesn't exist."
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
desc "create database"
|
51
|
+
task :create_db do
|
52
|
+
mysql_credentials = TechnoGate::Contao.instance.mysql_credentials
|
53
|
+
mysql_db_name = TechnoGate::Contao.instance.mysql_database_name
|
54
|
+
|
55
|
+
begin
|
56
|
+
run <<-CMD
|
57
|
+
mysqladmin --user='#{mysql_credentials[:user]}' --password='#{mysql_credentials[:pass]}' create '#{mysql_db_name}'
|
58
|
+
CMD
|
59
|
+
rescue
|
60
|
+
puts "WARNING: The database doesn't exist."
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
desc "Import a database dump"
|
65
|
+
task :import_db_dump do
|
66
|
+
mysql_credentials = TechnoGate::Contao.instance.mysql_credentials
|
67
|
+
mysql_db_name = TechnoGate::Contao.instance.mysql_database_name
|
68
|
+
|
69
|
+
unless ARGV.size >=2 and File.exists?(ARGV[1])
|
70
|
+
puts "ERROR: please run 'cap mysql:import_db_dump <sql dump>'"
|
71
|
+
exit 1
|
72
|
+
else
|
73
|
+
# The database dump name
|
74
|
+
dump_sql_file = ARGV.delete_at(1)
|
75
|
+
|
76
|
+
unless blank?(mysql_credentials)
|
77
|
+
drop_db
|
78
|
+
create_db
|
79
|
+
put File.read(dump_sql_file), "/tmp/#{mysql_db_name}_dump.sql"
|
80
|
+
|
81
|
+
run <<-CMD
|
82
|
+
mysql \
|
83
|
+
--user='#{mysql_credentials[:user]}' \
|
84
|
+
--password='#{mysql_credentials[:pass]}' \
|
85
|
+
--default-character-set=utf8 \
|
86
|
+
'#{mysql_db_name}' < \
|
87
|
+
/tmp/#{mysql_db_name}_dump.sql
|
88
|
+
CMD
|
89
|
+
|
90
|
+
run <<-CMD
|
91
|
+
rm -f '/tmp/#{mysql_db_name}_dump.sql'
|
92
|
+
CMD
|
93
|
+
|
94
|
+
exit 0
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
desc "Export a database dump"
|
100
|
+
task :export_db_dump do
|
101
|
+
mysql_credentials = TechnoGate::Contao.instance.mysql_credentials
|
102
|
+
mysql_db_name = TechnoGate::Contao.instance.mysql_database_name
|
103
|
+
|
104
|
+
unless ARGV.size >=2 or File.exists?(ARGV[1])
|
105
|
+
puts "ERROR: please run 'cap mysql:import_db_dump <sql dump>'"
|
106
|
+
puts " <sql dump> should not exist"
|
107
|
+
exit 1
|
108
|
+
else
|
109
|
+
# The database dump name
|
110
|
+
dump_sql_file = ARGV.delete_at(1)
|
111
|
+
|
112
|
+
unless blank?(mysql_credentials)
|
113
|
+
run <<-CMD
|
114
|
+
cp #{MYSQL_DB_BACKUP_PATH}.bz2 /tmp &&
|
115
|
+
bunzip2 /tmp/#{File.basename MYSQL_DB_BACKUP_PATH}.bz2
|
116
|
+
CMD
|
117
|
+
|
118
|
+
get "/tmp/#{File.basename MYSQL_DB_BACKUP_PATH}", dump_sql_file
|
119
|
+
|
120
|
+
run <<-CMD
|
121
|
+
rm -f /tmp/#{File.basename MYSQL_DB_BACKUP_PATH}
|
122
|
+
CMD
|
123
|
+
|
124
|
+
exit 0
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
before "mysql:import_db_dump", "mysql:backup_db"
|
131
|
+
before "mysql:export_db_dump", "mysql:backup_db"
|
132
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'capistrano'
|
2
|
+
|
3
|
+
# Verify that Capistrano is version 2
|
4
|
+
unless Capistrano::Configuration.respond_to?(:instance)
|
5
|
+
abort "This extension requires Capistrano 2"
|
6
|
+
end
|
7
|
+
|
8
|
+
Capistrano::Configuration.instance(:must_exist).load do
|
9
|
+
|
10
|
+
namespace :rails do
|
11
|
+
desc "Install configuration files"
|
12
|
+
task :install_configuration_files, :roles => :app do
|
13
|
+
unless blank?(configuration_files)
|
14
|
+
configuration_files.each { |configuration_file| link_config_file(configuration_file) }
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
desc "Install rvm config file"
|
19
|
+
task :install_rvmrc_file, :roles => :app do
|
20
|
+
link_file(File.join(shared_path, 'rvmrc'), File.join(release_path, '.rvmrc'))
|
21
|
+
end
|
22
|
+
|
23
|
+
desc "Fix permissions"
|
24
|
+
task :fix_permissions, :roles => :app do
|
25
|
+
unless blank?(app_owner) or blank?(app_group)
|
26
|
+
run "#{try_sudo} chown -R #{app_owner}:#{app_group} #{deploy_to}"
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
namespace :deploy do
|
32
|
+
task :restart, :roles => :app, :except => { :no_release => true } do
|
33
|
+
run "#{try_sudo} touch #{File.join(current_path, 'tmp', 'restart.txt')}"
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
after "deploy:finalize_update", "rails:install_configuration_files"
|
38
|
+
after "rails:install_configuration_files", "rails:install_rvmrc_file"
|
39
|
+
after "deploy:restart", "rails:fix_permissions"
|
40
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
namespace :unicorn do
|
2
|
+
desc "start unicorn"
|
3
|
+
task :start, :roles => :app, :except => {:no_release => true} do
|
4
|
+
run "cd #{current_path} && #{unicorn_binary} -c #{unicorn_config} -E #{rails_env} -D"
|
5
|
+
end
|
6
|
+
|
7
|
+
desc "stop unicorn"
|
8
|
+
task :stop, :roles => :app, :except => {:no_release => true} do
|
9
|
+
run "#{try_sudo} kill `cat #{unicorn_pid}`"
|
10
|
+
end
|
11
|
+
|
12
|
+
desc "unicorn reload"
|
13
|
+
task :reload, :roles => :app, :except => {:no_release => true} do
|
14
|
+
run "#{try_sudo} kill -s USR2 `cat #{unicorn_pid}`"
|
15
|
+
end
|
16
|
+
|
17
|
+
desc "graceful stop unicorn"
|
18
|
+
task :graceful_stop, :roles => :app, :except => {:no_release => true} do
|
19
|
+
run "#{try_sudo} kill -s QUIT `cat #{unicorn_pid}`"
|
20
|
+
end
|
21
|
+
|
22
|
+
desc "restart unicorn"
|
23
|
+
task :restart, :roles => :app, :except => {:no_release => true} do
|
24
|
+
stop
|
25
|
+
start
|
26
|
+
end
|
27
|
+
end
|
metadata
ADDED
@@ -0,0 +1,71 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: capistrano-technogate
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Wael Nasreddine
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2011-08-31 00:00:00.000000000 +02:00
|
13
|
+
default_executable:
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: capistrano
|
17
|
+
requirement: &2152070100 !ruby/object:Gem::Requirement
|
18
|
+
none: false
|
19
|
+
requirements:
|
20
|
+
- - ! '>='
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 1.0.0
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: *2152070100
|
26
|
+
description: This gem provides some receipts for helping me in my every-day development
|
27
|
+
email:
|
28
|
+
- wael.nasreddine@gmail.com
|
29
|
+
executables: []
|
30
|
+
extensions: []
|
31
|
+
extra_rdoc_files: []
|
32
|
+
files:
|
33
|
+
- ..gemspec
|
34
|
+
- .gitignore
|
35
|
+
- Gemfile
|
36
|
+
- Rakefile
|
37
|
+
- capistrano-technogate.gemspec
|
38
|
+
- lib/capistrano/technogate/base.rb
|
39
|
+
- lib/capistrano/technogate/configurations.rb
|
40
|
+
- lib/capistrano/technogate/contao.rb
|
41
|
+
- lib/capistrano/technogate/god.rb
|
42
|
+
- lib/capistrano/technogate/mysql.rb
|
43
|
+
- lib/capistrano/technogate/rails.rb
|
44
|
+
- lib/capistrano/technogate/unicorn.rb
|
45
|
+
- lib/capistrano/technogate/version.rb
|
46
|
+
has_rdoc: true
|
47
|
+
homepage: https://github.com/TechnoGate/capistrano-technogate
|
48
|
+
licenses: []
|
49
|
+
post_install_message:
|
50
|
+
rdoc_options: []
|
51
|
+
require_paths:
|
52
|
+
- lib
|
53
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
54
|
+
none: false
|
55
|
+
requirements:
|
56
|
+
- - ! '>='
|
57
|
+
- !ruby/object:Gem::Version
|
58
|
+
version: '0'
|
59
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
60
|
+
none: false
|
61
|
+
requirements:
|
62
|
+
- - ! '>='
|
63
|
+
- !ruby/object:Gem::Version
|
64
|
+
version: '0'
|
65
|
+
requirements: []
|
66
|
+
rubyforge_project: capistrano-technogate
|
67
|
+
rubygems_version: 1.6.2
|
68
|
+
signing_key:
|
69
|
+
specification_version: 3
|
70
|
+
summary: This gem provides some receipts for helping me in my every-day development
|
71
|
+
test_files: []
|