metastrano 0.2.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/.document +5 -0
- data/.gitignore +21 -0
- data/LICENSE +20 -0
- data/README.rdoc +18 -0
- data/Rakefile +63 -0
- data/lib/metastrano.rb +8 -0
- data/lib/recipes/apache.rb +40 -0
- data/lib/recipes/db.rb +106 -0
- data/lib/recipes/deploy.rb +24 -0
- data/lib/recipes/git.rb +14 -0
- data/lib/recipes/rake.rb +20 -0
- data/lib/recipes/symlink.rb +52 -0
- data/test/helper.rb +10 -0
- data/test/test_metastrano.rb +7 -0
- metadata +99 -0
data/.document
ADDED
data/.gitignore
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2009 John Paul Narowski
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.rdoc
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
= metastrano
|
2
|
+
|
3
|
+
Description goes here.
|
4
|
+
|
5
|
+
== Note on Patches/Pull Requests
|
6
|
+
|
7
|
+
* Fork the project.
|
8
|
+
* Make your feature addition or bug fix.
|
9
|
+
* Add tests for it. This is important so I don't break it in a
|
10
|
+
future version unintentionally.
|
11
|
+
* Commit, do not mess with rakefile, version, or history.
|
12
|
+
(if you want to have your own version, that is fine but
|
13
|
+
bump version in a commit by itself I can ignore when I pull)
|
14
|
+
* Send me a pull request. Bonus points for topic branches.
|
15
|
+
|
16
|
+
== Copyright
|
17
|
+
|
18
|
+
Copyright (c) 2009 John Paul Narowski. See LICENSE for details.
|
data/Rakefile
ADDED
@@ -0,0 +1,63 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake'
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'jeweler'
|
6
|
+
Jeweler::Tasks.new do |gem|
|
7
|
+
gem.name = "metastrano"
|
8
|
+
gem.summary = %Q{Capistrno recipes for Passenger, MySQL Etc}
|
9
|
+
gem.description = %Q{This is a gem that is suppose to help you automate all of your server deployment and project maintenance tasks}
|
10
|
+
gem.email = "jnarowski@gmail.com"
|
11
|
+
gem.files = [
|
12
|
+
".document",
|
13
|
+
".gitignore",
|
14
|
+
"LICENSE",
|
15
|
+
"README.rdoc",
|
16
|
+
"Rakefile",
|
17
|
+
Dir["{spec,lib}/**/*"],
|
18
|
+
"test/helper.rb",
|
19
|
+
"test/test_metastrano.rb"
|
20
|
+
]
|
21
|
+
gem.homepage = "http://github.com/jnarowski/metastrano"
|
22
|
+
gem.authors = ["John Paul Narowski"]
|
23
|
+
gem.add_development_dependency "rspec", ">= 1.2.9"
|
24
|
+
gem.add_development_dependency "capistrano", ">= 2.3.0"
|
25
|
+
gem.add_development_dependency "erb"
|
26
|
+
end
|
27
|
+
rescue LoadError
|
28
|
+
puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
|
29
|
+
end
|
30
|
+
|
31
|
+
require 'rake/testtask'
|
32
|
+
Rake::TestTask.new(:test) do |test|
|
33
|
+
test.libs << 'lib' << 'test'
|
34
|
+
test.pattern = 'test/**/test_*.rb'
|
35
|
+
test.verbose = true
|
36
|
+
end
|
37
|
+
|
38
|
+
begin
|
39
|
+
require 'rcov/rcovtask'
|
40
|
+
Rcov::RcovTask.new do |test|
|
41
|
+
test.libs << 'test'
|
42
|
+
test.pattern = 'test/**/test_*.rb'
|
43
|
+
test.verbose = true
|
44
|
+
end
|
45
|
+
rescue LoadError
|
46
|
+
task :rcov do
|
47
|
+
abort "RCov is not available. In order to run rcov, you must: sudo gem install spicycode-rcov"
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
task :test => :check_dependencies
|
52
|
+
|
53
|
+
task :default => :test
|
54
|
+
|
55
|
+
require 'rake/rdoctask'
|
56
|
+
Rake::RDocTask.new do |rdoc|
|
57
|
+
version = File.exist?('VERSION') ? File.read('VERSION') : ""
|
58
|
+
|
59
|
+
rdoc.rdoc_dir = 'rdoc'
|
60
|
+
rdoc.title = "metastrano #{version}"
|
61
|
+
rdoc.rdoc_files.include('README*')
|
62
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
63
|
+
end
|
data/lib/metastrano.rb
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
Capistrano::Configuration.instance(:must_exist).load do
|
2
|
+
|
3
|
+
#----------------------------------------------------------------
|
4
|
+
# Apache Strategy
|
5
|
+
#----------------------------------------------------------------
|
6
|
+
|
7
|
+
namespace :apache do
|
8
|
+
|
9
|
+
desc "Restarts Apache - sudo service httpd restart"
|
10
|
+
task :restart, :roles => :app do
|
11
|
+
run "#{sudo} service httpd restart"
|
12
|
+
end
|
13
|
+
|
14
|
+
desc "Creates the .conf file in the shared config directory, and creates a symlink to /etc/httpd/conf.d/application.conf"
|
15
|
+
task :create_vhost do
|
16
|
+
set(:server_name) { Capistrano::CLI.ui.ask "Enter ServerName" } unless exists?(:server_name)
|
17
|
+
|
18
|
+
vhost = ERB.new <<-EOF
|
19
|
+
<VirtualHost *:80>
|
20
|
+
ServerName #{server_name}
|
21
|
+
DocumentRoot #{current_path}/public
|
22
|
+
|
23
|
+
CustomLog #{shared_path}/log/access.log combined
|
24
|
+
ErrorLog #{shared_path}/log/error.log
|
25
|
+
</VirtualHost>
|
26
|
+
EOF
|
27
|
+
|
28
|
+
# uploads the above vhost file onto the server
|
29
|
+
put vhost.result, "#{shared_path}/config/#{application}.conf"
|
30
|
+
|
31
|
+
# removes any existing apache conf files
|
32
|
+
sudo "rm -f /etc/httpd/conf.d/#{application}.conf"
|
33
|
+
# move the application.conf file into your apache folder
|
34
|
+
sudo "mv #{shared_path}/config/#{application}.conf /etc/httpd/conf.d/#{application}.conf"
|
35
|
+
# make a symbolic link back to the shared config directory
|
36
|
+
sudo "ln -nfs /etc/httpd/conf.d/#{application}.conf #{shared_path}/config/#{application}.conf"
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
data/lib/recipes/db.rb
ADDED
@@ -0,0 +1,106 @@
|
|
1
|
+
require 'erb'
|
2
|
+
|
3
|
+
Capistrano::Configuration.instance(:must_exist).load do
|
4
|
+
namespace :db do
|
5
|
+
|
6
|
+
desc "Runs rake db:seed to load in default seed data"
|
7
|
+
task :seed, :roles => :db do
|
8
|
+
run "cd #{current_path} && #{sudo} rake RAILS_ENV=production db:seed"
|
9
|
+
end
|
10
|
+
|
11
|
+
#----------------------------------------------------------------
|
12
|
+
# MySQL Specific
|
13
|
+
#----------------------------------------------------------------
|
14
|
+
|
15
|
+
namespace :mysql do
|
16
|
+
|
17
|
+
desc "Create MySQL database and user for this environment using prompted or preset values"
|
18
|
+
task :setup, :roles => :db, :only => { :primary => true } do
|
19
|
+
prepare_for_db_command # sets up the usernames and passwords
|
20
|
+
create_db # creates the production database
|
21
|
+
# create a test db if requested
|
22
|
+
if Capistrano::CLI.ui.agree("Do you want to also create a test database? - #{application}_test - (Y/N)")
|
23
|
+
set :db_name, "#{application}_test"
|
24
|
+
create_db
|
25
|
+
end
|
26
|
+
create_yaml
|
27
|
+
end
|
28
|
+
|
29
|
+
desc "Creates a MySQL database and grants the user permission"
|
30
|
+
task :create_db do
|
31
|
+
sql = <<-SQL
|
32
|
+
CREATE DATABASE IF NOT EXISTS #{db_name};
|
33
|
+
GRANT ALL PRIVILEGES ON #{db_name}.* TO #{db_user}@localhost IDENTIFIED BY '#{db_pass}';
|
34
|
+
SQL
|
35
|
+
|
36
|
+
run "mysql --user=#{db_admin_user} -p --execute=\"#{sql}\"" do |channel, stream, data|
|
37
|
+
if data =~ /^Enter password:/
|
38
|
+
pass = Capistrano::CLI.password_prompt "Enter database password for '#{db_admin_user}':"
|
39
|
+
channel.send_data "#{pass}\n"
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
desc "Create database.yml in shared path with settings for current stage and test env"
|
45
|
+
task :create_yaml do
|
46
|
+
set(:db_user) { Capistrano::CLI.ui.ask "Enter #{environment} database username:" } unless exists?(:db_user)
|
47
|
+
set(:db_pass) { Capistrano::CLI.password_prompt "Enter #{environment} database password:" } unless exists?(:db_pass)
|
48
|
+
|
49
|
+
db_config = ERB.new <<-EOF
|
50
|
+
base: &base
|
51
|
+
adapter: mysql
|
52
|
+
username: #{db_user}
|
53
|
+
password: #{db_pass}
|
54
|
+
|
55
|
+
#{environment}:
|
56
|
+
database: #{application}_#{environment}
|
57
|
+
<<: *base
|
58
|
+
|
59
|
+
test:
|
60
|
+
database: #{application}_test
|
61
|
+
<<: *base
|
62
|
+
EOF
|
63
|
+
run "mkdir -p #{shared_path}/config"
|
64
|
+
put db_config.result, "#{shared_path}/config/database.yml"
|
65
|
+
end
|
66
|
+
|
67
|
+
desc "Updates the symlink for database.yml file to the just deployed release."
|
68
|
+
task :symlink, :except => { :no_release => true } do
|
69
|
+
run "rm -f #{release_path}/config/database.yml"
|
70
|
+
run "ln -nfs #{shared_path}/config/database.yml #{release_path}/config/database.yml"
|
71
|
+
end
|
72
|
+
|
73
|
+
desc "Loads remote production data into development database. Uses your local database.yml file for development and production passwords"
|
74
|
+
task :load_remote_data, :roles => :db, :only => { :primary => true } do
|
75
|
+
require 'yaml'
|
76
|
+
|
77
|
+
# First lets get the remote database config file so that we can read in the database settings
|
78
|
+
get("#{shared_path}/config/database.yml", "tmp/database.yml")
|
79
|
+
|
80
|
+
# load the production settings within the database file
|
81
|
+
remote_settings = YAML::load_file("tmp/database.yml")["production"]
|
82
|
+
|
83
|
+
# we also need the local settings so that we can import the fresh database properly
|
84
|
+
local_settings = YAML::load_file("config/database.yml")["development"]
|
85
|
+
|
86
|
+
filename = "dump.#{Time.now.strftime '%Y-%m-%d_%H:%M:%S'}.sql.gz"
|
87
|
+
on_rollback { delete "/tmp/#{filename}" }
|
88
|
+
|
89
|
+
run "mysqldump -u #{remote_settings['username']} --password=#{remote_settings['password']} #{remote_settings['database']} | gzip > /tmp/#{filename}" do |channel, stream, data|
|
90
|
+
puts data
|
91
|
+
end
|
92
|
+
|
93
|
+
get "/tmp/#{filename}", "/tmp/#{filename}"
|
94
|
+
run_locally "gunzip -c /tmp/#{filename} | mysql -u #{local_settings['username']} #{local_settings['password']} #{local_settings['database']} && rm -f gunzip #{filename} && rm -f tmp/database.yml"
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
def prepare_for_db_command
|
99
|
+
set :db_name, "#{application}_#{environment}" unless exists?(:db_name)
|
100
|
+
set(:db_admin_user) { Capistrano::CLI.ui.ask "Username with priviledged database access (to create db):" } unless exists?(:db_admin_user)
|
101
|
+
set(:db_user) { Capistrano::CLI.ui.ask "Enter #{environment} database username:" } unless exists?(:db_user)
|
102
|
+
set(:db_pass) { Capistrano::CLI.password_prompt "Enter #{environment} database password:" } unless exists?(:db_pass)
|
103
|
+
end
|
104
|
+
|
105
|
+
end
|
106
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
Capistrano::Configuration.instance(:must_exist).load do
|
2
|
+
|
3
|
+
#----------------------------------------------------------------
|
4
|
+
# Deploy Strategy
|
5
|
+
# - this assumes you are using passanger
|
6
|
+
#----------------------------------------------------------------
|
7
|
+
|
8
|
+
namespace :deploy do
|
9
|
+
desc "Restarting mod_rails with restart.txt"
|
10
|
+
task :restart, :roles => :app, :except => { :no_release => true } do
|
11
|
+
apache.restart
|
12
|
+
end
|
13
|
+
|
14
|
+
desc "Update the crontab file if you are using the whenever GEM"
|
15
|
+
task :update_crontab, :roles => :db do
|
16
|
+
run "cd #{release_path} && #{sudo} whenever --update-crontab #{application}"
|
17
|
+
end
|
18
|
+
|
19
|
+
[:start, :stop].each do |t|
|
20
|
+
desc "#{t} task is a no-op with mod_rails"
|
21
|
+
task t, :roles => :app do ; end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
data/lib/recipes/git.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
Capistrano::Configuration.instance(:must_exist).load do
|
2
|
+
|
3
|
+
#----------------------------------------------------------------
|
4
|
+
# git
|
5
|
+
#----------------------------------------------------------------
|
6
|
+
|
7
|
+
namespace :git do
|
8
|
+
desc "Creates a remote git repo"
|
9
|
+
task :create_repo, :roles => :app, :except => { :no_release => true } do
|
10
|
+
sudo "mkdir /home/git/#{application}.git && cd /home/git/#{application}.git && git --bare init"
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
data/lib/recipes/rake.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Capistrano::Configuration.instance(:must_exist).load do
|
2
|
+
|
3
|
+
#----------------------------------------------------------------
|
4
|
+
# Rake Tasks
|
5
|
+
#----------------------------------------------------------------
|
6
|
+
|
7
|
+
namespace :rake do
|
8
|
+
|
9
|
+
desc "Builds the most recent javascript and css files by running 'rake asset:packager:destroy_all' then 'rake asset:packager:build_all'"
|
10
|
+
task :rebuild_assets, :roles => :db do
|
11
|
+
run "cd #{current_path}; #{sudo} rake asset:packager:delete_all; #{sudo} rake asset:packager:build_all"
|
12
|
+
end
|
13
|
+
|
14
|
+
desc "Install gems for your rails app -- rake gems:install"
|
15
|
+
task :gems_install, :roles => :app do
|
16
|
+
run "cd #{current_path} && #{sudo} rake RAILS_ENV=production gems:install"
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
Capistrano::Configuration.instance(:must_exist).load do
|
2
|
+
|
3
|
+
#----------------------------------------------------------------
|
4
|
+
# Symlink Strategy
|
5
|
+
#----------------------------------------------------------------
|
6
|
+
|
7
|
+
namespace :symlink do
|
8
|
+
desc <<-DESC
|
9
|
+
Create shared directories. Specify which directories are shared via:
|
10
|
+
set :shared_dirs, %w(avatars videos)
|
11
|
+
DESC
|
12
|
+
task :create_shared_dirs, :roles => :app do
|
13
|
+
shared_dirs.each { |link| run "mkdir -p #{shared_path}/#{link}" } if shared_dirs
|
14
|
+
end
|
15
|
+
|
16
|
+
desc <<-DESC
|
17
|
+
Create links to shared directories from current deployment's public directory.
|
18
|
+
Specify which directories are shared via:
|
19
|
+
set :shared_dirs, %w(avatars videos)
|
20
|
+
DESC
|
21
|
+
task :shared_directories, :roles => :app do
|
22
|
+
shared_dirs.each do |link|
|
23
|
+
run "rm -rf #{release_path}/public/#{link}"
|
24
|
+
run "ln -nfs #{shared_path}/#{link} #{release_path}/public/#{link}"
|
25
|
+
end if shared_dirs
|
26
|
+
end
|
27
|
+
|
28
|
+
desc <<-DESC
|
29
|
+
Create links to config files stored in shared config directory.
|
30
|
+
Specify which config files to link using the following:
|
31
|
+
set :config_files, 'database.yml'
|
32
|
+
DESC
|
33
|
+
task :shared_config_files, :roles => :app do
|
34
|
+
config_files.each do |file_path|
|
35
|
+
begin
|
36
|
+
run "#{sudo} rm #{config_path}#{file_path}"
|
37
|
+
run "#{sudo} ln -nfs #{shared_config_path}#{file_path} #{config_path}#{file_path}"
|
38
|
+
rescue
|
39
|
+
puts "Problem linking to #{file_path}. Be sure file already exists in #{shared_config_path}."
|
40
|
+
end
|
41
|
+
end if config_files
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def config_path
|
46
|
+
"#{current_release}/config/"
|
47
|
+
end
|
48
|
+
|
49
|
+
def shared_config_path
|
50
|
+
"#{shared_path}/config/"
|
51
|
+
end
|
52
|
+
end
|
data/test/helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,99 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: metastrano
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.2.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- John Paul Narowski
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-11-19 00:00:00 -05:00
|
13
|
+
default_executable:
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: rspec
|
17
|
+
type: :development
|
18
|
+
version_requirement:
|
19
|
+
version_requirements: !ruby/object:Gem::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">="
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: 1.2.9
|
24
|
+
version:
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: capistrano
|
27
|
+
type: :development
|
28
|
+
version_requirement:
|
29
|
+
version_requirements: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 2.3.0
|
34
|
+
version:
|
35
|
+
- !ruby/object:Gem::Dependency
|
36
|
+
name: erb
|
37
|
+
type: :development
|
38
|
+
version_requirement:
|
39
|
+
version_requirements: !ruby/object:Gem::Requirement
|
40
|
+
requirements:
|
41
|
+
- - ">="
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: "0"
|
44
|
+
version:
|
45
|
+
description: This is a gem that is suppose to help you automate all of your server deployment and project maintenance tasks
|
46
|
+
email: jnarowski@gmail.com
|
47
|
+
executables: []
|
48
|
+
|
49
|
+
extensions: []
|
50
|
+
|
51
|
+
extra_rdoc_files:
|
52
|
+
- LICENSE
|
53
|
+
- README.rdoc
|
54
|
+
files:
|
55
|
+
- .document
|
56
|
+
- .gitignore
|
57
|
+
- LICENSE
|
58
|
+
- README.rdoc
|
59
|
+
- Rakefile
|
60
|
+
- lib/metastrano.rb
|
61
|
+
- lib/recipes/apache.rb
|
62
|
+
- lib/recipes/db.rb
|
63
|
+
- lib/recipes/deploy.rb
|
64
|
+
- lib/recipes/git.rb
|
65
|
+
- lib/recipes/rake.rb
|
66
|
+
- lib/recipes/symlink.rb
|
67
|
+
- test/helper.rb
|
68
|
+
- test/test_metastrano.rb
|
69
|
+
has_rdoc: true
|
70
|
+
homepage: http://github.com/jnarowski/metastrano
|
71
|
+
licenses: []
|
72
|
+
|
73
|
+
post_install_message:
|
74
|
+
rdoc_options:
|
75
|
+
- --charset=UTF-8
|
76
|
+
require_paths:
|
77
|
+
- lib
|
78
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: "0"
|
83
|
+
version:
|
84
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
85
|
+
requirements:
|
86
|
+
- - ">="
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: "0"
|
89
|
+
version:
|
90
|
+
requirements: []
|
91
|
+
|
92
|
+
rubyforge_project:
|
93
|
+
rubygems_version: 1.3.5
|
94
|
+
signing_key:
|
95
|
+
specification_version: 3
|
96
|
+
summary: Capistrno recipes for Passenger, MySQL Etc
|
97
|
+
test_files:
|
98
|
+
- test/helper.rb
|
99
|
+
- test/test_metastrano.rb
|