deprec 0.0.1 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/deprec +35 -0
- data/bin/deprec_dotfiles +6 -0
- data/docs/building_edge_capistrano.txt +9 -0
- data/lib/deprec/generators/deprec/USAGE +11 -0
- data/lib/deprec/generators/deprec/deprec_generator.rb +24 -0
- data/lib/deprec/generators/deprec/templates/deploy.rb +71 -0
- data/lib/deprec/generators/loader.rb +20 -0
- data/lib/deprec/recipes.rb +227 -0
- data/lib/deprec/recipes/slicehost.rb +18 -0
- data/lib/deprec/recipes/ssh.rb +13 -0
- data/lib/deprec/recipes/svn.rb +18 -0
- data/lib/deprec/recipes/templates/test_template.rhtml +1 -0
- data/lib/deprec/recipes/ubuntu.rb +38 -0
- data/lib/deprec/third_party/THIRD_PARTY_README +12 -0
- data/lib/deprec/third_party/mongrel_cluster/LICENSE +506 -0
- data/lib/deprec/third_party/mongrel_cluster/recipes.rb +95 -0
- data/lib/deprec/third_party/mongrel_cluster/resources/mongrel_cluster +41 -0
- data/lib/deprec/third_party/railsmachine/LICENSE +506 -0
- data/lib/deprec/third_party/railsmachine/recipes/apache.rb +84 -0
- data/lib/deprec/third_party/railsmachine/recipes/mysql.rb +58 -0
- data/lib/deprec/third_party/railsmachine/recipes/svn.rb +42 -0
- data/lib/deprec/third_party/railsmachine/recipes/templates/httpd-ssl.conf +74 -0
- data/lib/deprec/third_party/railsmachine/recipes/templates/httpd.conf +63 -0
- data/lib/deprec/third_party/vmbuilder/LICENSE +506 -0
- data/lib/deprec/third_party/vmbuilder/plugins.rb +8 -0
- data/lib/deprec/third_party/vmbuilder/plugins/apt.rb +144 -0
- data/lib/deprec/third_party/vmbuilder/plugins/gem.rb +97 -0
- data/lib/deprec/third_party/vmbuilder/plugins/std.rb +153 -0
- data/resources/capistrano_include_dotfiles.patch +17 -0
- metadata +58 -6
- data/lib/deprec.rb +0 -9
data/bin/deprec
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
begin
|
4
|
+
require 'rubygems'
|
5
|
+
rescue LoadError
|
6
|
+
# no rubygems to load, so we fail silently
|
7
|
+
end
|
8
|
+
|
9
|
+
require 'optparse'
|
10
|
+
|
11
|
+
@options = {}
|
12
|
+
OptionParser.new do |opts|
|
13
|
+
opts.banner = "Usage: #{$0} [options] [args]"
|
14
|
+
|
15
|
+
opts.on("-A", "--apply-to DIRECTORY",
|
16
|
+
"Create a minimal set of scripts and recipes",
|
17
|
+
"for use with capistrano to configure servers."
|
18
|
+
) { |value| @options[:apply_to] = value }
|
19
|
+
opts.on("-n", "--name APPLICATION_NAME",
|
20
|
+
"Name of application."
|
21
|
+
) { |value| @options[:application] = value }
|
22
|
+
opts.on("-d", "--domain DOMAIN_NAME",
|
23
|
+
"Domain name for application."
|
24
|
+
) { |value| @options[:domain] = value }
|
25
|
+
|
26
|
+
if ARGV.empty?
|
27
|
+
puts opts
|
28
|
+
exit
|
29
|
+
else
|
30
|
+
opts.parse!(ARGV)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
require 'deprec/generators/loader'
|
35
|
+
Deprec::Generators::RailsLoader.load! @options
|
data/bin/deprec_dotfiles
ADDED
@@ -0,0 +1,6 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
patch_target=File.dirname(`gemwhich capistrano`) + '/capistrano/cli.rb'
|
3
|
+
patch_file = File.join(File.dirname(__FILE__), '..', 'resources','capistrano_include_dotfiles.patch')
|
4
|
+
system "sudo patch -p0 #{patch_target} < #{patch_file}"
|
5
|
+
req_statement = "require 'deprec/recipes'"
|
6
|
+
system "grep '#{req_statement}' ~/.caprc > /dev/null 2>&1 || echo \"#{req_statement}\" >> ~/.caprc"
|
@@ -0,0 +1,9 @@
|
|
1
|
+
You can build an edge gem by cd'ing to that directory and doing:
|
2
|
+
|
3
|
+
1. svn info. Find the line that says "Revision:" and mark the revision number.
|
4
|
+
|
5
|
+
2. rake PKG_BUILD=<rev> gem. Replace <rev> with the revision number.
|
6
|
+
|
7
|
+
3. Look in the pkg subdirectory. Install that gem file via "gem install pkg/<gem file>"
|
8
|
+
|
9
|
+
- Jamis
|
@@ -0,0 +1,11 @@
|
|
1
|
+
NAME
|
2
|
+
deprec - creates configuration and Capistrano tasks for server configuration.
|
3
|
+
|
4
|
+
SYNOPSIS
|
5
|
+
deprec --apply-to /path/to/app --name application_name --domain domain_name
|
6
|
+
|
7
|
+
DESCRIPTION
|
8
|
+
This generator creates deployment recipes.
|
9
|
+
|
10
|
+
EXAMPLE
|
11
|
+
deprec --apply-to . --name bailey --domain www.bailey.net.au
|
@@ -0,0 +1,24 @@
|
|
1
|
+
class DeprecGenerator < Rails::Generator::NamedBase
|
2
|
+
attr_reader :application_name
|
3
|
+
attr_reader :domain_name
|
4
|
+
|
5
|
+
def initialize(runtime_args, runtime_options = {})
|
6
|
+
super
|
7
|
+
@application_name = self.file_name
|
8
|
+
@domain_name = @args[0]
|
9
|
+
end
|
10
|
+
|
11
|
+
def manifest
|
12
|
+
record do |m|
|
13
|
+
m.directory "config"
|
14
|
+
m.template "deploy.rb", File.join("config", "deploy.rb")
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
protected
|
19
|
+
|
20
|
+
# Override with your own usage banner.
|
21
|
+
def banner
|
22
|
+
"Usage: #{$0} --apply-to /path/to/app --name ApplicationName --domain DomainName"
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
require 'deprec/recipes'
|
2
|
+
|
3
|
+
# =============================================================================
|
4
|
+
# ROLES
|
5
|
+
# =============================================================================
|
6
|
+
# You can define any number of roles, each of which contains any number of
|
7
|
+
# machines. Roles might include such things as :web, or :app, or :db, defining
|
8
|
+
# what the purpose of each machine is. You can also specify options that can
|
9
|
+
# be used to single out a specific subset of boxes in a particular role, like
|
10
|
+
# :primary => true.
|
11
|
+
|
12
|
+
set :domain, "<%= domain_name %>"
|
13
|
+
role :web, domain
|
14
|
+
role :app, domain
|
15
|
+
role :db, domain, :primary => true
|
16
|
+
|
17
|
+
# =============================================================================
|
18
|
+
# REQUIRED VARIABLES
|
19
|
+
# =============================================================================
|
20
|
+
# You must always specify the application and repository for every recipe. The
|
21
|
+
# repository must be the URL of the repository you want this recipe to
|
22
|
+
# correspond to. The deploy_to path must be the path on each machine that will
|
23
|
+
# form the root of the application path.
|
24
|
+
|
25
|
+
set :application, "<%= singular_name %>"
|
26
|
+
set :deploy_to, "/var/www/apps/#{application}"
|
27
|
+
|
28
|
+
set :user, ENV['USER']
|
29
|
+
set :repository, "svn+ssh://#{user}@#{domain}#{deploy_to}/repos/trunk"
|
30
|
+
set :rails_env, "production"
|
31
|
+
|
32
|
+
# Automatically symlink these directories from current/public to shared/public.
|
33
|
+
# set :app_symlinks, %w{photo, document, asset}
|
34
|
+
|
35
|
+
# =============================================================================
|
36
|
+
# APACHE OPTIONS
|
37
|
+
# =============================================================================
|
38
|
+
set :apache_server_name, domain
|
39
|
+
# set :apache_server_aliases, %w{alias1 alias2}
|
40
|
+
# set :apache_default_vhost, true # force use of apache_default_vhost_config
|
41
|
+
# set :apache_default_vhost_conf, "/etc/httpd/conf/default.conf"
|
42
|
+
# set :apache_conf, "/etc/httpd/conf/apps/#{application}.conf"
|
43
|
+
# set :apache_ctl, "/etc/init.d/httpd"
|
44
|
+
# set :apache_proxy_port, 8000
|
45
|
+
# set :apache_proxy_servers, 2
|
46
|
+
# set :apache_proxy_address, "127.0.0.1"
|
47
|
+
# set :apache_ssl_enabled, false
|
48
|
+
# set :apache_ssl_ip, "127.0.0.1"
|
49
|
+
# set :apache_ssl_forward_all, false
|
50
|
+
|
51
|
+
# =============================================================================
|
52
|
+
# MONGREL OPTIONS
|
53
|
+
# =============================================================================
|
54
|
+
# set :mongrel_servers, apache_proxy_servers
|
55
|
+
# set :mongrel_port, apache_proxy_port
|
56
|
+
set :mongrel_address, apache_proxy_address
|
57
|
+
# set :mongrel_environment, "production"
|
58
|
+
# set :mongrel_config, "/etc/mongrel_cluster/#{application}.conf"
|
59
|
+
# set :mongrel_user, user
|
60
|
+
# set :mongrel_group, group
|
61
|
+
|
62
|
+
# =============================================================================
|
63
|
+
# MYSQL OPTIONS
|
64
|
+
# =============================================================================
|
65
|
+
|
66
|
+
|
67
|
+
# =============================================================================
|
68
|
+
# SSH OPTIONS
|
69
|
+
# =============================================================================
|
70
|
+
# ssh_options[:keys] = %w(/path/to/my/key /path/to/another/key)
|
71
|
+
# ssh_options[:port] = 25
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Deprec
|
2
|
+
module Generators
|
3
|
+
class RailsLoader
|
4
|
+
def self.load!(options)
|
5
|
+
require "#{options[:apply_to]}/config/environment"
|
6
|
+
require "rails_generator"
|
7
|
+
require "rails_generator/scripts/generate"
|
8
|
+
|
9
|
+
Rails::Generator::Base.sources << Rails::Generator::PathSource.new(
|
10
|
+
:deprec, File.dirname(__FILE__))
|
11
|
+
|
12
|
+
args = ["deprec"]
|
13
|
+
args << (options[:application] || "Application")
|
14
|
+
args << (options[:domain] || "www.mynewsite.com")
|
15
|
+
|
16
|
+
Rails::Generator::Scripts::Generate.new.run(args)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,227 @@
|
|
1
|
+
require 'deprec/recipes/ssh'
|
2
|
+
require 'deprec/recipes/svn'
|
3
|
+
require 'deprec/recipes/ubuntu'
|
4
|
+
require 'deprec/third_party/mongrel_cluster/recipes'
|
5
|
+
require 'deprec/third_party/vmbuilder/plugins'
|
6
|
+
require 'deprec/third_party/railsmachine/recipes/svn'
|
7
|
+
require 'deprec/third_party/railsmachine/recipes/apache'
|
8
|
+
require 'deprec/third_party/railsmachine/recipes/mysql'
|
9
|
+
|
10
|
+
Capistrano.configuration(:must_exist).load do
|
11
|
+
set :user, (defined?(user) ? user : ENV['USER']) # user who is deploying
|
12
|
+
set :group, 'deploy' # deployment group
|
13
|
+
set :src_dir, (defined?(src_dir) ? src_dir : '/usr/local/src') # 3rd party src on servers
|
14
|
+
set :app_symlinks, nil
|
15
|
+
|
16
|
+
desc <<-DESC
|
17
|
+
setup_rails_host takes a stock standard ubuntu 'dapper' 6.06.1 server
|
18
|
+
and installs everything needed to be a rails machine
|
19
|
+
DESC
|
20
|
+
task :install_rails_stack do
|
21
|
+
setup_user_perms
|
22
|
+
enable_universe # we'll need some packages from the 'universe' repository
|
23
|
+
disable_cdrom_install # we don't want to have to insert cdrom
|
24
|
+
install_packages_for_rails # install packages that come with distribution
|
25
|
+
install_rubygems
|
26
|
+
install_gems
|
27
|
+
install_apache
|
28
|
+
end
|
29
|
+
|
30
|
+
desc "Set up the expected application directory structure on all boxes"
|
31
|
+
task :setup, :except => { :no_release => true } do
|
32
|
+
setup_paths
|
33
|
+
run <<-CMD
|
34
|
+
mkdir -p -m 775 #{releases_path} #{shared_path}/system &&
|
35
|
+
mkdir -p -m 777 #{shared_path}/log &&
|
36
|
+
mkdir -p -m 777 #{shared_path}/pids
|
37
|
+
CMD
|
38
|
+
setup_servers
|
39
|
+
end
|
40
|
+
|
41
|
+
desc "setup and configure servers"
|
42
|
+
task :setup_servers do
|
43
|
+
setup_web
|
44
|
+
setup_paths
|
45
|
+
setup_app
|
46
|
+
setup_symlinks
|
47
|
+
setup_db
|
48
|
+
end
|
49
|
+
|
50
|
+
desc "Setup web server."
|
51
|
+
task :setup_web, :roles => :web do
|
52
|
+
set :apache_server_name, domain unless apache_server_name
|
53
|
+
setup_apache
|
54
|
+
configure_apache
|
55
|
+
end
|
56
|
+
|
57
|
+
desc "Setup application server."
|
58
|
+
task :setup_app, :roles => :app do
|
59
|
+
set :mongrel_environment, rails_env
|
60
|
+
set :mongrel_port, apache_proxy_port
|
61
|
+
set :mongrel_servers, apache_proxy_servers
|
62
|
+
install_mongrel_start_script
|
63
|
+
setup_mongrel_cluster_path
|
64
|
+
configure_mongrel_cluster
|
65
|
+
end
|
66
|
+
|
67
|
+
desc "Restart application server."
|
68
|
+
task :restart_app, :roles => :app do
|
69
|
+
restart_mongrel_cluster
|
70
|
+
end
|
71
|
+
|
72
|
+
desc "Start application server."
|
73
|
+
task :start_app, :roles => :app do
|
74
|
+
start_mongrel_cluster
|
75
|
+
end
|
76
|
+
|
77
|
+
desc "Start the processes on the application server by calling start_app."
|
78
|
+
task :spinner, :roles => :app do
|
79
|
+
start_app
|
80
|
+
end
|
81
|
+
|
82
|
+
desc "Setup public symlink directories"
|
83
|
+
task :setup_symlinks, :roles => [:app, :web] do
|
84
|
+
if app_symlinks
|
85
|
+
app_symlinks.each { |link| run "mkdir -p #{shared_path}/public/#{link}" }
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
desc "Setup database server."
|
90
|
+
task :setup_db, :roles => :db, :only => { :primary => true } do
|
91
|
+
setup_mysql
|
92
|
+
end
|
93
|
+
|
94
|
+
desc "Setup source control server."
|
95
|
+
task :setup_scm, :roles => :scm do
|
96
|
+
setup_svn
|
97
|
+
import_svn
|
98
|
+
end
|
99
|
+
|
100
|
+
desc "setup extra paths required for deployment"
|
101
|
+
task :setup_paths, :roles => :app do
|
102
|
+
# XXX make a function to create a group writable dir
|
103
|
+
sudo "test -d #{shared_path}/config || sudo mkdir -p #{shared_path}/config"
|
104
|
+
sudo "chgrp -R #{group} #{deploy_to}"
|
105
|
+
sudo "chmod -R g+w #{deploy_to}"
|
106
|
+
end
|
107
|
+
|
108
|
+
task :create_user do
|
109
|
+
newuser=user
|
110
|
+
user='root'
|
111
|
+
# run "useradd -m #{newuser}"
|
112
|
+
run "ls"
|
113
|
+
user=newuser
|
114
|
+
end
|
115
|
+
|
116
|
+
task :install_gems do
|
117
|
+
gem.install 'rails' # gem lib makes installing gems fun
|
118
|
+
gem.select 'mongrel' # mongrel requires we select a version
|
119
|
+
gem.install 'mongrel_cluster'
|
120
|
+
end
|
121
|
+
|
122
|
+
desc "create deployment group and add current user to it"
|
123
|
+
task :setup_user_perms do
|
124
|
+
sudo "grep #{group} /etc/group || sudo groupadd #{group}"
|
125
|
+
sudo "groups #{user} | grep #{group} || sudo usermod --groups #{group} -a #{user}"
|
126
|
+
end
|
127
|
+
|
128
|
+
task :install_rubygems do
|
129
|
+
# ??? is this an OK way to pass values around to the functions?
|
130
|
+
version = 'rubygems-0.9.0'
|
131
|
+
set :file_to_get, {
|
132
|
+
:file => version + '.tgz',
|
133
|
+
:dir => version,
|
134
|
+
:url => "http://rubyforge.org/frs/download.php/11289/#{version}.tgz",
|
135
|
+
:unpack => "tar zxf #{version}.tgz;",
|
136
|
+
:configure => nil,
|
137
|
+
:make => nil,
|
138
|
+
:install => '/usr/bin/ruby1.8 setup.rb;'
|
139
|
+
}
|
140
|
+
download_src
|
141
|
+
install_from_src
|
142
|
+
gem.update_system
|
143
|
+
end
|
144
|
+
|
145
|
+
task :install_apache do
|
146
|
+
# ??? is this an OK way to pass values around to the functions?
|
147
|
+
version = 'httpd-2.2.3'
|
148
|
+
set :file_to_get, {
|
149
|
+
:file => version + '.tar.gz',
|
150
|
+
:dir => version,
|
151
|
+
:url => "http://www.apache.org/dist/httpd/#{version}.tar.gz",
|
152
|
+
:unpack => "tar zxf #{version}.tar.gz;",
|
153
|
+
:configure => './configure --enable-proxy --enable-proxy-balancer --enable-proxy-http --enable-rewrite --enable-cache --enable-headers --enable-ssl --enable-deflate;',
|
154
|
+
:make => 'make;',
|
155
|
+
:install => 'make install;',
|
156
|
+
:post_install => 'cp support/apachectl /etc/init.d/httpd && chmod 0777 /etc/init.d/httpd;'
|
157
|
+
}
|
158
|
+
download_src
|
159
|
+
install_from_src
|
160
|
+
end
|
161
|
+
|
162
|
+
# XXX move into cap extensions
|
163
|
+
desc "install package from source"
|
164
|
+
task :install_from_src do
|
165
|
+
package_dir = File.join(src_dir, file_to_get[:dir])
|
166
|
+
unpack_src
|
167
|
+
# XXX we need run_sh and sudo_sh functions to make 'cd' cmd work
|
168
|
+
sudo <<-SUDO
|
169
|
+
sh -c '
|
170
|
+
cd #{package_dir};
|
171
|
+
#{file_to_get[:configure]}
|
172
|
+
#{file_to_get[:make]}
|
173
|
+
#{file_to_get[:install]}
|
174
|
+
#{file_to_get[:post_install]}
|
175
|
+
'
|
176
|
+
SUDO
|
177
|
+
end
|
178
|
+
|
179
|
+
desc "unpack src and make it writable by the group"
|
180
|
+
task :unpack_src do
|
181
|
+
package_dir = File.join(src_dir, file_to_get[:dir])
|
182
|
+
sudo <<-SUDO
|
183
|
+
sh -c '
|
184
|
+
cd #{src_dir};
|
185
|
+
test -d #{package_dir}.old && rm -fr #{package_dir}.old;
|
186
|
+
test -d #{package_dir} && mv #{package_dir} #{package_dir}.old;
|
187
|
+
#{file_to_get[:unpack]}
|
188
|
+
chgrp -R #{group} #{package_dir};
|
189
|
+
chmod -R g+w #{package_dir};
|
190
|
+
'
|
191
|
+
SUDO
|
192
|
+
end
|
193
|
+
|
194
|
+
desc "Setup public symlink directories"
|
195
|
+
task :setup_symlinks, :roles => [:app, :web] do
|
196
|
+
if app_symlinks
|
197
|
+
app_symlinks.each { |link| run "mkdir -p #{shared_path}/public/#{link}" }
|
198
|
+
end
|
199
|
+
end
|
200
|
+
|
201
|
+
desc "Link up any public directories."
|
202
|
+
task :symlink_public, :roles => [:app, :web] do
|
203
|
+
if app_symlinks
|
204
|
+
app_symlinks.each { |link| run "ln -nfs #{shared_path}/public/#{link} #{current_path}/public/#{link}" }
|
205
|
+
end
|
206
|
+
end
|
207
|
+
|
208
|
+
# something for later...
|
209
|
+
# desc "render a template"
|
210
|
+
# task :z_template do
|
211
|
+
# file = File.join(File.dirname(__FILE__), 'recipes', 'templates', 'test_goo.rhtml')
|
212
|
+
# msg = render :template => File.read(file), :foo => 'good', :bar => 'night'
|
213
|
+
# run "echo #{msg}"
|
214
|
+
# end
|
215
|
+
|
216
|
+
"will be moved to capistrano extension"
|
217
|
+
task :download_src do
|
218
|
+
# move this into cap extension
|
219
|
+
# XXX should make this group writable
|
220
|
+
# XXX so we don't need to sudo to compile
|
221
|
+
sudo "test -d #{src_dir} || sudo mkdir #{src_dir}"
|
222
|
+
sudo "chgrp -R #{group} #{src_dir}"
|
223
|
+
sudo "chmod -R g+w #{src_dir}"
|
224
|
+
sudo "sh -c 'cd #{src_dir} && test -f #{file_to_get[:file]} || wget #{file_to_get[:url]}'"
|
225
|
+
end
|
226
|
+
|
227
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
|
2
|
+
Capistrano.configuration(:must_exist).load do
|
3
|
+
|
4
|
+
task :install_rails_stack_slicehost do
|
5
|
+
# create user account
|
6
|
+
|
7
|
+
end
|
8
|
+
|
9
|
+
end
|
10
|
+
#
|
11
|
+
# # set editor to vim
|
12
|
+
#
|
13
|
+
# # create user account
|
14
|
+
# mkdir -m mbailey
|
15
|
+
# # set password for user
|
16
|
+
# passwd mbailey
|
17
|
+
# # setup sudo
|
18
|
+
# echo "mbailey ALL=(ALL) ALL" >> /etc/sudoers
|
@@ -0,0 +1,13 @@
|
|
1
|
+
Capistrano.configuration(:must_exist).load do
|
2
|
+
|
3
|
+
# set :user, (defined?(user) ? user : ENV['USER'])
|
4
|
+
desc "Copies contents of ssh public keys into authorized_keys file"
|
5
|
+
task :setup_ssh_keys do
|
6
|
+
sudo "test -d ~/.ssh || mkdir ~/.ssh"
|
7
|
+
sudo "chmod 0700 ~/.ssh"
|
8
|
+
put(ssh_options[:keys].collect{|key| File.read(key+'.pub')}.join("\n"),
|
9
|
+
File.join('/home', user, '.ssh/authorized_keys'),
|
10
|
+
:mode => 0600 )
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|