xendeploy 0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/README.textile +24 -0
- data/bin/xenify +97 -0
- data/docs/empty +0 -0
- data/lib/recipes/xen.rb +7 -0
- data/lib/recipes/xen/build.rb +3 -0
- data/lib/recipes/xen/deploy.rb +32 -0
- data/lib/recipes/xen/server.rb +57 -0
- data/lib/xendeploy.rb +5 -0
- metadata +83 -0
data/README.textile
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
h1. XEN:Deploy
|
2
|
+
|
3
|
+
A collection of recipes, tasks, and strategies for managing non-rails applications specifically WordPress, WP-MU and BuddyPress.
|
4
|
+
|
5
|
+
<hr />
|
6
|
+
|
7
|
+
h2. Install
|
8
|
+
|
9
|
+
*Dependencies*
|
10
|
+
|
11
|
+
*railsless-deploy*
|
12
|
+
For making the default tasks a bit more app agnostic.
|
13
|
+
<code>gem install railsless-deploy -s http://gemcutter.org</code>
|
14
|
+
|
15
|
+
*capistrano-ext*
|
16
|
+
For doing multistage configurations
|
17
|
+
|
18
|
+
h3. Use
|
19
|
+
|
20
|
+
XEN:Deploy ships with its own capify script. This script should be run from the root of your application. It will create a standard enough Capfile, but put the deploy.rb script in "_assets/" instead of config.
|
21
|
+
|
22
|
+
h4. Configuration
|
23
|
+
|
24
|
+
Configure your deployment in deploy.rb, setting the values of the symbols there-in.
|
data/bin/xenify
ADDED
@@ -0,0 +1,97 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'optparse'
|
4
|
+
require 'fileutils'
|
5
|
+
|
6
|
+
OptionParser.new do |opts|
|
7
|
+
opts.banner = "Usage: #{File.basename($0)} [path]"
|
8
|
+
|
9
|
+
opts.on("-h", "--help", "Displays this help info") do
|
10
|
+
puts opts
|
11
|
+
exit 0
|
12
|
+
end
|
13
|
+
|
14
|
+
begin
|
15
|
+
opts.parse!(ARGV)
|
16
|
+
rescue OptionParser::ParseError => e
|
17
|
+
warn e.message
|
18
|
+
puts opts
|
19
|
+
exit 1
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
if ARGV.empty?
|
24
|
+
abort "Please specify the directory to xenify, e.g. `#{File.basename($0)} .'"
|
25
|
+
elsif !File.exists?(ARGV.first)
|
26
|
+
abort "`#{ARGV.first}' does not exist."
|
27
|
+
elsif !File.directory?(ARGV.first)
|
28
|
+
abort "`#{ARGV.first}' is not a directory."
|
29
|
+
elsif ARGV.length > 1
|
30
|
+
abort "Too many arguments; please specify only the directory to xenify."
|
31
|
+
end
|
32
|
+
|
33
|
+
def unindent(string)
|
34
|
+
indentation = string[/\A\s*/]
|
35
|
+
string.strip.gsub(/^#{indentation}/, "")
|
36
|
+
end
|
37
|
+
|
38
|
+
def writefile(file,content)
|
39
|
+
puts "[add] writing `#{file}'"
|
40
|
+
File.open(file, "w") { |f| f.write(content) }
|
41
|
+
end
|
42
|
+
|
43
|
+
files = {
|
44
|
+
"Capfile" => unindent(<<-FILE),
|
45
|
+
load 'deploy' if respond_to?(:namespace) # cap2 differentiator
|
46
|
+
load '_assets/deploy'
|
47
|
+
require 'rubygems'
|
48
|
+
require 'railsless-deploy'
|
49
|
+
|
50
|
+
FILE
|
51
|
+
|
52
|
+
"_assets/deploy/prod.rb" => unindent(<<-FILE),
|
53
|
+
set :application, ""
|
54
|
+
set :homeuser, ""
|
55
|
+
set :location, "/home/\#{homeuser}/www/\#{application}"
|
56
|
+
set :deploy_to, "\#{location}/.deploy"
|
57
|
+
|
58
|
+
set :repository, ""
|
59
|
+
set :scm, :subversion
|
60
|
+
set :scm_verbose, true
|
61
|
+
|
62
|
+
# uncomment these lines if you have a multi-tier set up
|
63
|
+
# role :app, "your app-server here"
|
64
|
+
# role :web, "your web-server here"
|
65
|
+
# role :db, "your db-server here", :primary => true
|
66
|
+
|
67
|
+
# if everything's on one server, then it will use the application value
|
68
|
+
server application, :app, :web, :db, :primary => true
|
69
|
+
|
70
|
+
# set your db credentials for dumping and restoring sql files
|
71
|
+
set :dbname, ""
|
72
|
+
set :dbuser, ""
|
73
|
+
|
74
|
+
# this should make it a bit easier to use your public key on all your servers
|
75
|
+
set :ssh_options, { :forward_agent => true }
|
76
|
+
ssh_options[:keys] = [File.join(ENV["HOME"], ".ssh", "id_rsa")]
|
77
|
+
|
78
|
+
FILE
|
79
|
+
}
|
80
|
+
|
81
|
+
base = ARGV.shift
|
82
|
+
files.each do |file, content|
|
83
|
+
file = File.join(base, file)
|
84
|
+
if File.exists?(file)
|
85
|
+
warn "[skip] `#{file}' already exists"
|
86
|
+
elsif File.exists?(file.downcase)
|
87
|
+
warn "[skip] `#{file.downcase}' exists, which could conflict with `#{file}'"
|
88
|
+
elsif !File.exists?(File.dirname(file))
|
89
|
+
FileUtils.mkdir(File.dirname(file))
|
90
|
+
warn "[add] directory `#{File.dirname(file)}' did not exist. created."
|
91
|
+
writefile(file,content)
|
92
|
+
else
|
93
|
+
writefile(file,content)
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
puts "[done] xenified!"
|
data/docs/empty
ADDED
File without changes
|
data/lib/recipes/xen.rb
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
# require 'capistrano'
|
2
|
+
#
|
3
|
+
# unless Capistrano::Configuration.respond_to?(:instance)
|
4
|
+
# abort "xen:deploy requires Capistrano 2"
|
5
|
+
# end
|
6
|
+
|
7
|
+
namespace :xen do
|
8
|
+
namepace :deploy do
|
9
|
+
|
10
|
+
task :default do
|
11
|
+
update
|
12
|
+
update_code
|
13
|
+
strategy.deploy!
|
14
|
+
finalize_update
|
15
|
+
symlink
|
16
|
+
restart
|
17
|
+
end
|
18
|
+
|
19
|
+
desc "Symlinks the current release to the public directory"
|
20
|
+
task :makepublic, :roles => :app do
|
21
|
+
run "rm -f #{location}/public && ln -nfs #{deploy_to}/current #{location}/public"
|
22
|
+
end
|
23
|
+
|
24
|
+
namespace :wordpress do
|
25
|
+
desc "Symlink the uploads folder"
|
26
|
+
task :uploads, :roles => :app do
|
27
|
+
run "ln -nfs #{deploy_to}/#{shared_dir}/uploads #{deploy_to}/current/wp-content/uploads"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
# require 'capistrano'
|
2
|
+
#
|
3
|
+
# unless Capistrano::Configuration.respond_to?(:instance)
|
4
|
+
# abort "xen:deploy requires Capistrano 2"
|
5
|
+
# end
|
6
|
+
#
|
7
|
+
# namespace :xen do
|
8
|
+
# namespace :server do
|
9
|
+
#
|
10
|
+
# namespace :apache do
|
11
|
+
# task :restart, :roles => :web do
|
12
|
+
# sudo "/etc/init.d/apache restart"
|
13
|
+
# end
|
14
|
+
# end
|
15
|
+
#
|
16
|
+
# namespace :nginx do
|
17
|
+
# task :restart, :roles => :web do
|
18
|
+
# sudo "/etc/init.d/nginx restart"
|
19
|
+
# end
|
20
|
+
# end
|
21
|
+
#
|
22
|
+
# namespace :php do
|
23
|
+
# task :restart, :roles => :cache do
|
24
|
+
# sudo "/etc/init.d/php-fcgi restart"
|
25
|
+
# end
|
26
|
+
# end
|
27
|
+
#
|
28
|
+
# namespace :cache do
|
29
|
+
# namespace :squid do
|
30
|
+
# task :restart, :roles => :cache do
|
31
|
+
# sudo "/etc/init.d/squid restart"
|
32
|
+
# end
|
33
|
+
# end
|
34
|
+
#
|
35
|
+
# namespace :memcached do
|
36
|
+
# task :restart, :roles => :cache do
|
37
|
+
# sudo "/etc/init.d/memcached restart"
|
38
|
+
# end
|
39
|
+
# end
|
40
|
+
# end
|
41
|
+
#
|
42
|
+
# namespace :mysql do
|
43
|
+
# task :restart, :roles => db do
|
44
|
+
# sudo "/etc/init.d/mysql restart"
|
45
|
+
# end
|
46
|
+
#
|
47
|
+
# task :backup, :roles => db do
|
48
|
+
# run "mysqldump --add-drop-database #{dbname} > #{shared_path}/sql/#{dbname}-#{release_name}.sql"
|
49
|
+
# end
|
50
|
+
#
|
51
|
+
# task :restore, :roles =>db do
|
52
|
+
# run "mysql -u #{dbuser} -p < #{shared_path}/sql/#{dbname}-#{release_name}.sql"
|
53
|
+
# end
|
54
|
+
# end
|
55
|
+
#
|
56
|
+
# end
|
57
|
+
# end
|
data/lib/xendeploy.rb
ADDED
metadata
ADDED
@@ -0,0 +1,83 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: xendeploy
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: "0.1"
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Eric Marden
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2010-02-02 00:00:00 -06:00
|
13
|
+
default_executable: xenify
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: capistrano
|
17
|
+
type: :runtime
|
18
|
+
version_requirement:
|
19
|
+
version_requirements: !ruby/object:Gem::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">"
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: 2.5.0
|
24
|
+
version:
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: deprec
|
27
|
+
type: :runtime
|
28
|
+
version_requirement:
|
29
|
+
version_requirements: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 2.1.5
|
34
|
+
version:
|
35
|
+
description: |
|
36
|
+
Building on the backs of Capistrano and Deprec, this is a collection of Recipes and other customizations for managing non-rails applications, specifically WordPress, WordPress-MU, and BuddyPress.
|
37
|
+
|
38
|
+
email: ruby@xentek.net
|
39
|
+
executables:
|
40
|
+
- xenify
|
41
|
+
extensions: []
|
42
|
+
|
43
|
+
extra_rdoc_files: []
|
44
|
+
|
45
|
+
files:
|
46
|
+
- bin/xenify
|
47
|
+
- docs/empty
|
48
|
+
- lib/recipes/xen/build.rb
|
49
|
+
- lib/recipes/xen/deploy.rb
|
50
|
+
- lib/recipes/xen/server.rb
|
51
|
+
- lib/recipes/xen.rb
|
52
|
+
- lib/xendeploy.rb
|
53
|
+
- README.textile
|
54
|
+
has_rdoc: true
|
55
|
+
homepage: http://xentek.net/
|
56
|
+
licenses: []
|
57
|
+
|
58
|
+
post_install_message:
|
59
|
+
rdoc_options: []
|
60
|
+
|
61
|
+
require_paths:
|
62
|
+
- lib
|
63
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - ">="
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: "0"
|
68
|
+
version:
|
69
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
70
|
+
requirements:
|
71
|
+
- - ">="
|
72
|
+
- !ruby/object:Gem::Version
|
73
|
+
version: "0"
|
74
|
+
version:
|
75
|
+
requirements: []
|
76
|
+
|
77
|
+
rubyforge_project:
|
78
|
+
rubygems_version: 1.3.5
|
79
|
+
signing_key:
|
80
|
+
specification_version: 3
|
81
|
+
summary: custom recipes for capistrano+deprec
|
82
|
+
test_files: []
|
83
|
+
|