soprano 0.3

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,26 @@
1
+ ## MAC OS
2
+ .DS_Store
3
+
4
+ ## TEXTMATE
5
+ *.tmproj
6
+ tmtags
7
+
8
+ ## EMACS
9
+ *~
10
+ \#*
11
+ .\#*
12
+
13
+ ## VIM
14
+ *.swp
15
+
16
+ ## PROJECT::GENERAL
17
+ coverage
18
+ rdoc
19
+ pkg
20
+ *.gem
21
+ .bundle
22
+ Gemfile.lock
23
+ pkg/*
24
+
25
+ ## PROJECT::SPECIFIC
26
+ .rvmrc
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in soprano.gemspec
4
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,19 @@
1
+ Copyright (C) 2011 by Dmitriy Kiriyenko
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ of this software and associated documentation files (the "Software"), to deal
5
+ in the Software without restriction, including without limitation the rights
6
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ copies of the Software, and to permit persons to whom the Software is
8
+ furnished to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in
11
+ all copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,47 @@
1
+ # Soprano
2
+
3
+ [![The Sopranos](http://i.minus.com/idGXKU.jpeg)](http://www.imdb.com/title/tt0141842/)
4
+
5
+ Soprano is the set of Capistrano recipes that help me to deploy my
6
+ applications.
7
+
8
+ Soprano by default uses Mongrel cluster (or Passenger) as an application
9
+ server, nginx as a web server, MySQL as a database server and git as a SCM.
10
+
11
+ The latest version of Soprano was inspired by Rubaidh's
12
+ [Rubaidhstrano](http://github.com/rubaidh/rubaidhstrano) and some code has
13
+ been borrowed from its sources.
14
+
15
+ ## Installation
16
+
17
+ For Rails 3 add to your `Gemfile`:
18
+
19
+ gem 'soprano', :require => false
20
+
21
+ ## Example usage
22
+
23
+ To start using Soprano you just need to add `require "soprano"` to your
24
+ `config/deploy.rb` file and set some variables:
25
+
26
+ require "soprano"
27
+
28
+ set :application, "set your application name here"
29
+ set :repository, "set your repository location here"
30
+ set :host, "set your host here"
31
+
32
+ # See soprano/recipes/defaults.rb for defaults
33
+
34
+ ## Features
35
+
36
+ Readme about features in process...
37
+
38
+ ## Thanks
39
+
40
+ - Jamis Buck for [Capistrano](https://github.com/halorgium/capistrano),
41
+ - Rubaidh Ltd for their awesome
42
+ [Rubaidhstrano](http://github.com/rubaidh/rubaidhstrano),
43
+ - Denis Barushev for [Capone](https://github.com/denis/capone).
44
+
45
+ ## Copyright
46
+
47
+ Copyright (c) 2011 Dmitriy Kiriyenko. See LICENSE for details.
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ require 'bundler'
2
+ Bundler::GemHelper.install_tasks
@@ -0,0 +1,3 @@
1
+ module Capone
2
+ VERSION = "0.3"
3
+ end
data/lib/soprano.rb ADDED
@@ -0,0 +1,9 @@
1
+ unless Capistrano::Configuration.respond_to?(:instance)
2
+ abort "Soprano requires Capistrano 2"
3
+ end
4
+
5
+ Capistrano::Configuration.instance.load do
6
+ Dir["#{File.dirname(__FILE__)}/../recipes/*.rb"].each do |recipe|
7
+ load(recipe)
8
+ end
9
+ end
@@ -0,0 +1,6 @@
1
+ require "mongrel_cluster/recipes"
2
+
3
+ set :mongrel_conf, "#{deploy_to}/current/config/mongrel_cluster.yml"
4
+
5
+ depend :remote, :gem, "mongrel", ">=1.1.5"
6
+ depend :remote, :gem, "mongrel_cluster", ">=1.0.5"
@@ -0,0 +1,17 @@
1
+ namespace :deploy do
2
+ desc "Start application."
3
+ task :start, :roles => :app do
4
+ run "touch #{current_release}/tmp/restart.txt"
5
+ end
6
+
7
+ desc "Stop application."
8
+ task :stop, :roles => :app do
9
+ end
10
+
11
+ desc "Restart application."
12
+ task :restart, :roles => :app do
13
+ run "touch #{current_release}/tmp/restart.txt"
14
+ end
15
+ end
16
+
17
+ depend :remote, :gem, "passenger", ">=2.2.2"
@@ -0,0 +1,7 @@
1
+ on :load do
2
+ strategy = fetch(:daemon_strategy, :passenger)
3
+
4
+ if [:passenger, :mongrel_cluster].include? strategy
5
+ load File.join(File.dirname(__FILE__), "daemon_strategies", "#{strategy}.rb")
6
+ end
7
+ end
data/recipes/db.rb ADDED
@@ -0,0 +1,97 @@
1
+ namespace :soprano do
2
+ namespace :db do
3
+ desc <<-DESC
4
+ Create MySQL user and database using data from config/database.yml.
5
+ DESC
6
+ task :setup, :roles => :db, :only => { :primary => true } do
7
+ config = YAML::load(File.open("config/database.yml"))[rails_env]
8
+ root_password = Capistrano::CLI.password_prompt(prompt="Enter a root password for MySQL: ")
9
+
10
+ run "mysql --user='root' --password='#{root_password}' -e \"CREATE DATABASE IF NOT EXISTS #{config["database"]} DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; GRANT ALL PRIVILEGES ON #{config["database"]}.* TO '#{config["username"]}'@'localhost' IDENTIFIED BY '#{config["password"]}' WITH GRANT OPTION;\""
11
+ end
12
+
13
+ desc <<-DESC
14
+ Load fixtures from db/fixtures to the database.
15
+ DESC
16
+ task :load_fixtures, :roles => :db, :only => { :primary => true } do
17
+ run "rake db:fixtures:load FIXTURES_PATH=db/fixtures RAILS_ENV=#{rails_env} -f #{release_path}/Rakefile"
18
+ end
19
+
20
+ desc <<-DESC
21
+ Dumps the database for the current environment into db/env-data.sql.bz2.
22
+ Any existing backup will be overwritten.
23
+ DESC
24
+ task :backup, :roles => :db, :only => { :primary => true } do
25
+ config = YAML::load(File.open("config/database.yml"))[rails_env]
26
+ case config["adapter"]
27
+ when "mysql", "mysql2"
28
+ cmd = ["mysqldump"]
29
+ cmd << "--host='#{config['host']}'" unless config["host"].nil?
30
+ cmd << "--user='#{config['username'].nil? ? 'root' : config['username']}'"
31
+ cmd << "--password='#{config['password']}'" unless config["password"].nil?
32
+ cmd << config["database"]
33
+ cmd << "| bzip2 > #{current_path}/db/#{rails_env}-data.sql.bz2"
34
+ run cmd.join(" ")
35
+ else
36
+ puts "Task not supported by '#{config['adapter']}'."
37
+ end
38
+ end
39
+
40
+ desc <<-DESC
41
+ Dump the database for the current environment and take a local copy.
42
+ DESC
43
+ task :download_backup, :roles => :db, :only => { :primary => true } do
44
+ backup
45
+ get "#{current_path}/db/#{rails_env}-data.sql.bz2", "db/#{rails_env}-data.sql.bz2"
46
+ end
47
+
48
+ desc <<-DESC
49
+ Load an existing database dump into the development environment's database.
50
+ DESC
51
+ task :load_backup do
52
+ run_locally "rake db:drop"
53
+ run_locally "rake db:create"
54
+
55
+ config = YAML::load(File.open("config/database.yml"))["development"]
56
+ case config["adapter"]
57
+ when "mysql", "mysql2"
58
+ cmd = ["bzcat db/#{rails_env}-data.sql.bz2 | mysql"]
59
+ cmd << "--host='#{config['host']}'" unless config["host"].nil?
60
+ cmd << "--user='#{config['username'].nil? ? 'root' : config['username']}'"
61
+ cmd << "--password='#{config['password']}'" unless config["password"].nil?
62
+ cmd << config["database"]
63
+ run_locally cmd.join(" ")
64
+ else
65
+ puts "Task not supported by '#{config['adapter']}'."
66
+ end
67
+ end
68
+
69
+ task :replicate do
70
+ download_backup
71
+ load_backup
72
+ end
73
+ end
74
+ end
75
+
76
+ on :load do
77
+ if fetch(:setup_database_after_deploy_setup, true)
78
+ after "deploy:setup", "soprano:db:setup"
79
+ end
80
+
81
+ if fetch(:load_fixtures_to_database_after_deploy_cold, false)
82
+ after "deploy:cold", "soprano:db:load_fixtures"
83
+ end
84
+
85
+ if fetch(:backup_database_before_migrations, false)
86
+ before "deploy:migrate", "soprano:db:backup"
87
+ end
88
+
89
+ if fetch(:disable_web_during_migrations, false)
90
+ before "deploy:migrations", "deploy:web:disable"
91
+ after "deploy:migrations", "deploy:web:enable"
92
+ end
93
+ end
94
+
95
+ depend :remote, :command, "mysql"
96
+ depend :remote, :command, "mysqldump"
97
+ depend :remote, :command, "bzip2"
@@ -0,0 +1,33 @@
1
+ set :scm, :git
2
+ set :deploy_via, :remote_cache
3
+
4
+ set :rails_env, "production"
5
+
6
+ set(:deploy_to) { "/var/www/apps/#{application}" }
7
+
8
+ role(:app) { host }
9
+ role(:web) { host }
10
+ role(:db, :primary => true) { host }
11
+
12
+ set :use_sudo, false
13
+
14
+ # Needed for proper password prompts
15
+ default_run_options[:pty] = true
16
+
17
+ # SSH options
18
+ ssh_options[:forward_agent] = true
19
+
20
+ # You can redefine these variables in your config/deploy.rb
21
+
22
+ # set :daemon_strategy, :mongrel_cluster
23
+ # set :web_server, :nginx
24
+
25
+ # set :install_gems, true
26
+
27
+ # set :backup_database_before_migrations, false
28
+ # set :disable_web_during_migrations, false
29
+ # set :setup_database_after_deploy_setup, true
30
+ # set :load_fixtures_to_database_after_deploy_cold, false
31
+
32
+ # set :whenever, false
33
+ # set :delayed_job, false
@@ -0,0 +1,7 @@
1
+ on :load do
2
+ if fetch(:delayed_job, false)
3
+ after "deploy:stop", "delayed_job:stop"
4
+ after "deploy:start", "delayed_job:start"
5
+ after "deploy:restart", "delayed_job:restart"
6
+ end
7
+ end
data/recipes/nginx.rb ADDED
@@ -0,0 +1,34 @@
1
+ namespace :soprano do
2
+ namespace :nginx do
3
+ desc <<-DESC
4
+ Enable virtual host.
5
+ DESC
6
+ task :enable_vhost, :roles => :web do
7
+ sudo "ln -fs #{current_path}/config/nginx.conf /etc/nginx/sites-enabled/#{application}"
8
+ sudo "/etc/init.d/nginx reload"
9
+ end
10
+
11
+ desc <<-DESC
12
+ Disable virtual host.
13
+ DESC
14
+ task :disable_vhost, :roles => :web do
15
+ sudo "rm /etc/nginx/sites-enabled/#{application}"
16
+ sudo "/etc/init.d/nginx reload"
17
+ end
18
+
19
+ desc <<-DESC
20
+ Reload nginx configuration if the application nginx virtual host config file was changed.
21
+ DESC
22
+ task :reload_if_config_file_changed, :roles => :web do
23
+ run "bash -c \"if ! cmp #{previous_release}/config/nginx.conf #{current_path}/config/nginx.conf; then #{sudo} /etc/init.d/nginx reload; fi\""
24
+ end
25
+ end
26
+ end
27
+
28
+ on :load do
29
+ if fetch(:web_server, :nginx) == :nginx
30
+ before "deploy:start", "soprano:nginx:enable_vhost"
31
+ after "deploy:stop", "soprano:nginx:disable_vhost"
32
+ after "deploy:restart", "soprano:nginx:reload_if_config_file_changed"
33
+ end
34
+ end
@@ -0,0 +1,3 @@
1
+ task :replicate do
2
+ soprano.db.replicate
3
+ end
data/soprano.gemspec ADDED
@@ -0,0 +1,22 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "soprano/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "soprano"
7
+ s.version = Capone::VERSION
8
+ s.platform = Gem::Platform::RUBY
9
+ s.authors = ["Dmitriy Kiriyenko"]
10
+ s.email = ["dmitriy.kiriyenko@gmail.com"]
11
+ s.homepage = "https://github.com/dmitriy-kiriyenko/soprano"
12
+ s.summary = %q{Soprano is the set of rake tasks and capistrano recipes.}
13
+ s.description = %q{Soprano is the set of rake tasks and capistrano recipes.
14
+ Use it to avoid writing typical scenarios and maintaining them
15
+ in favour of configuring your builds and deploys declaratively.}
16
+
17
+ s.files = `git ls-files`.split("\n")
18
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
19
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
20
+ s.require_paths = ["lib"]
21
+ s.add_dependency "capistrano", ">= 2.5.0"
22
+ end
metadata ADDED
@@ -0,0 +1,98 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: soprano
3
+ version: !ruby/object:Gem::Version
4
+ hash: 13
5
+ prerelease:
6
+ segments:
7
+ - 0
8
+ - 3
9
+ version: "0.3"
10
+ platform: ruby
11
+ authors:
12
+ - Dmitriy Kiriyenko
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2011-11-04 00:00:00 Z
18
+ dependencies:
19
+ - !ruby/object:Gem::Dependency
20
+ name: capistrano
21
+ prerelease: false
22
+ requirement: &id001 !ruby/object:Gem::Requirement
23
+ none: false
24
+ requirements:
25
+ - - ">="
26
+ - !ruby/object:Gem::Version
27
+ hash: 27
28
+ segments:
29
+ - 2
30
+ - 5
31
+ - 0
32
+ version: 2.5.0
33
+ type: :runtime
34
+ version_requirements: *id001
35
+ description: |-
36
+ Soprano is the set of rake tasks and capistrano recipes.
37
+ Use it to avoid writing typical scenarios and maintaining them
38
+ in favour of configuring your builds and deploys declaratively.
39
+ email:
40
+ - dmitriy.kiriyenko@gmail.com
41
+ executables: []
42
+
43
+ extensions: []
44
+
45
+ extra_rdoc_files: []
46
+
47
+ files:
48
+ - .gitignore
49
+ - Gemfile
50
+ - LICENSE
51
+ - README.md
52
+ - Rakefile
53
+ - lib/soprano.rb
54
+ - lib/soprano/version.rb
55
+ - recipes/daemon_strategies/mongrel_cluster.rb
56
+ - recipes/daemon_strategies/passenger.rb
57
+ - recipes/daemon_strategy.rb
58
+ - recipes/db.rb
59
+ - recipes/defaults.rb
60
+ - recipes/delayed_job.rb
61
+ - recipes/nginx.rb
62
+ - recipes/replicate.rb
63
+ - soprano.gemspec
64
+ homepage: https://github.com/dmitriy-kiriyenko/soprano
65
+ licenses: []
66
+
67
+ post_install_message:
68
+ rdoc_options: []
69
+
70
+ require_paths:
71
+ - lib
72
+ required_ruby_version: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ">="
76
+ - !ruby/object:Gem::Version
77
+ hash: 3
78
+ segments:
79
+ - 0
80
+ version: "0"
81
+ required_rubygems_version: !ruby/object:Gem::Requirement
82
+ none: false
83
+ requirements:
84
+ - - ">="
85
+ - !ruby/object:Gem::Version
86
+ hash: 3
87
+ segments:
88
+ - 0
89
+ version: "0"
90
+ requirements: []
91
+
92
+ rubyforge_project:
93
+ rubygems_version: 1.8.7
94
+ signing_key:
95
+ specification_version: 3
96
+ summary: Soprano is the set of rake tasks and capistrano recipes.
97
+ test_files: []
98
+