edploy 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +4 -0
- data/Gemfile +4 -0
- data/MIT-LICENSE +92 -0
- data/README.rdoc.fast_remote_cache +48 -0
- data/Rakefile +1 -0
- data/TODO.TXT +17 -0
- data/bin/dploy +15 -0
- data/bin/dploygen +39 -0
- data/bin/dployify +29 -0
- data/edploy.gemspec +21 -0
- data/lib/capistrano/ext/mailer.rb +90 -0
- data/lib/capistrano/ext/multistage.rb +59 -0
- data/lib/capistrano/ext/output_catcher.rb +97 -0
- data/lib/capistrano/ext/output_hooks.rb +54 -0
- data/lib/capistrano/recipes/deploy/strategy/fast_remote_cache.rb +44 -0
- data/lib/capistrano/recipes/deploy/strategy/utilities/copy.rb +53 -0
- data/lib/edploy/environment_capistrano.rb +19 -0
- data/lib/edploy/recipes/apache.rb +8 -0
- data/lib/edploy/recipes/bundle_install.rb +15 -0
- data/lib/edploy/recipes/fast_remote_cache.rb +43 -0
- data/lib/edploy/recipes/fast_remote_cache_extensions.rb +11 -0
- data/lib/edploy/recipes/hooks.rb +24 -0
- data/lib/edploy/recipes/production.rb +56 -0
- data/lib/edploy/recipes/rails.rb +5 -0
- data/lib/edploy/recipes/setup_project.rb +26 -0
- data/lib/edploy/recipes/smart_deploy.rb +47 -0
- data/lib/edploy/recipes/templates.rb +60 -0
- data/lib/edploy/recipes/web_disable_enable.rb +32 -0
- data/lib/edploy.rb +17 -0
- data/lib/edployify/configuration.rb +140 -0
- data/lib/edployify/preferences.rb +176 -0
- data/lib/edployify/project.rb +69 -0
- data/lib/edployify/template.rb +84 -0
- data/lib/edployify.rb +6 -0
- data/lib/edployscripts/archive.rb +27 -0
- data/lib/edployscripts/environment_scripts.rb +47 -0
- data/lib/edployscripts/file_handling.rb +28 -0
- data/lib/edployscripts/git.rb +27 -0
- data/lib/edployscripts.rb +6 -0
- data/templates/config/edploy/copy/extract/.gitkeep +0 -0
- data/templates/config/edploy/copy/init_scripts/.gitkeep +0 -0
- data/templates/config/edploy/copy/project_files/.gitkeep +0 -0
- data/templates/config/edploy/scripts/after_deploy_setup/.gitkeep +0 -0
- data/templates/config/edploy/scripts/after_deploy_symlink/passenger/clear_file_cache.erb +7 -0
- data/templates/config/edploy/scripts/after_deploy_update_code/make_symlinks.erb +74 -0
- data/templates/config/edploy/scripts/edploygen/01_bundle_install.erb +5 -0
- data/templates/config/edploy/scripts/edploygen/01_prepare_servers.post.erb +12 -0
- data/templates/config/edploy/scripts/edploygen/02_whenever_configs.erb +36 -0
- data/templates/config/edploy/templates/passenger/activate.rb.erb +2 -0
- data/templates/config/edploy/templates/passenger/after_config.rb.erb +2 -0
- data/templates/config/edploy/templates/passenger/apache_vhost.erb.erb +107 -0
- data/templates/config/edploy/templates/passenger/config.rb.erb +3 -0
- data/templates/config/edploy/templates/passenger/deactivate.rb.erb +1 -0
- data/templates/config/edploy/whenever/generic.rb.erb +12 -0
- metadata +113 -0
@@ -0,0 +1,176 @@
|
|
1
|
+
require 'highline'
|
2
|
+
require 'yaml'
|
3
|
+
require 'fileutils'
|
4
|
+
# work around problem where HighLine detects an eof on $stdin and raises an err
|
5
|
+
HighLine.track_eof = false
|
6
|
+
|
7
|
+
module Edployify
|
8
|
+
|
9
|
+
class Preferences
|
10
|
+
|
11
|
+
PREFERENCES_FILE = File.join(Dir.home, '.edployify.cfg')
|
12
|
+
|
13
|
+
class << self
|
14
|
+
|
15
|
+
def get
|
16
|
+
instance.get
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def instance
|
22
|
+
@@instance ||= self.new
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
def get
|
28
|
+
initial_configure if preferences.empty?
|
29
|
+
preferences
|
30
|
+
end
|
31
|
+
|
32
|
+
def configure
|
33
|
+
menu
|
34
|
+
end
|
35
|
+
|
36
|
+
def request_preset(action)
|
37
|
+
list_presets
|
38
|
+
ask_preset(action)
|
39
|
+
end
|
40
|
+
|
41
|
+
private
|
42
|
+
|
43
|
+
def initial_configure
|
44
|
+
puts "You don't have any git repository presets configured, let's do this first."
|
45
|
+
puts ""
|
46
|
+
add_preset
|
47
|
+
menu
|
48
|
+
end
|
49
|
+
|
50
|
+
def add_preset
|
51
|
+
puts ""
|
52
|
+
puts "Define a username, hostname and optionally a basepath for the preset."
|
53
|
+
puts "Note: A project name will be defined during the actual edployify run later on.\n"
|
54
|
+
puts "Structure: <USERNAME>@<HOSTNAME>:<BASEPATH>/{PROJECT}.git"
|
55
|
+
puts "Example: git@github.com:ewoutvonk/edploy.git"
|
56
|
+
puts "Example: gituser@my.server.com:myproject.git (if basepath is empty, there is no slash)"
|
57
|
+
preset_add(modify_preset)
|
58
|
+
end
|
59
|
+
|
60
|
+
def modify_preset(preset = nil)
|
61
|
+
satisfied = false
|
62
|
+
username = nil
|
63
|
+
hostname = nil
|
64
|
+
basepath = nil
|
65
|
+
if preset
|
66
|
+
username, hostname, basepath = preset.split(/[@:]|\/?\{PROJECT\}\.git/)
|
67
|
+
basepath = nil if basepath.nil? || basepath.empty?
|
68
|
+
end
|
69
|
+
until satisfied do
|
70
|
+
puts ""
|
71
|
+
username = highline.ask("Git repository username: ") { |q| q.default = username || 'git' }
|
72
|
+
hostname = highline.ask("Git repository hostname: ") { |q| q.default = hostname || 'github.com' }
|
73
|
+
basepath = highline.ask("Git repository basepath (optional): ") { |q| q.default = basepath if basepath }
|
74
|
+
preset = "#{username}@#{hostname}:#{basepath}#{basepath.empty? ? '' : '/'}{PROJECT}.git"
|
75
|
+
puts ""
|
76
|
+
highline.choose do |menu|
|
77
|
+
menu.prompt = "Current value: `#{preset}'. What do you want to do? "
|
78
|
+
menu.choice(:save) { satisfied = true }
|
79
|
+
menu.choice(:change) { }
|
80
|
+
menu.choice(:abort) { return } unless preferences.empty?
|
81
|
+
end
|
82
|
+
end
|
83
|
+
preset
|
84
|
+
end
|
85
|
+
|
86
|
+
def edit_preset
|
87
|
+
list_presets
|
88
|
+
old_preset = ask_preset(:edit)
|
89
|
+
new_preset = modify_preset(old_preset)
|
90
|
+
preset_update(old_preset, new_preset)
|
91
|
+
end
|
92
|
+
|
93
|
+
def delete_preset
|
94
|
+
list_presets
|
95
|
+
preset_delete(ask_preset(:delete))
|
96
|
+
end
|
97
|
+
|
98
|
+
def list_presets
|
99
|
+
puts "\nPresets:\n\n"
|
100
|
+
puts (presets_list.each_with_index.map { |entry, i| " #{i+1}. #{entry}" }.join("\n") + "\n")
|
101
|
+
end
|
102
|
+
|
103
|
+
def ask_preset(action)
|
104
|
+
preset = nil
|
105
|
+
begin
|
106
|
+
i = highline.ask("Preset to #{action}: ", Integer)
|
107
|
+
end until !(preset = preset_get(i-1)).nil?
|
108
|
+
preset
|
109
|
+
end
|
110
|
+
|
111
|
+
def menu
|
112
|
+
while true do
|
113
|
+
puts ""
|
114
|
+
highline.choose do |menu|
|
115
|
+
menu.prompt = "Main menu. Please make a choice. "
|
116
|
+
menu.choice(:list_presets) { list_presets }
|
117
|
+
menu.choice(:add_preset) { add_preset }
|
118
|
+
menu.choice(:edit_preset) { edit_preset }
|
119
|
+
menu.choice(:delete_preset) { delete_preset }
|
120
|
+
menu.choice(:quit) { return }
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
##
|
126
|
+
|
127
|
+
def presets_list
|
128
|
+
preferences[:presets]
|
129
|
+
end
|
130
|
+
|
131
|
+
def preset_add(preset)
|
132
|
+
preferences[:presets] << preset
|
133
|
+
write_file
|
134
|
+
end
|
135
|
+
|
136
|
+
def preset_update(old_preset, new_preset)
|
137
|
+
delete_preset(old_preset)
|
138
|
+
add_preset(new_preset)
|
139
|
+
end
|
140
|
+
|
141
|
+
def preset_delete(preset)
|
142
|
+
preferences[:presets].delete(preset)
|
143
|
+
write_file
|
144
|
+
end
|
145
|
+
|
146
|
+
def preset_get(i)
|
147
|
+
preferences[:presets][i]
|
148
|
+
end
|
149
|
+
|
150
|
+
def preferences
|
151
|
+
unless @preferences
|
152
|
+
FileUtils.touch PREFERENCES_FILE
|
153
|
+
$edployify_cfg = File.open(PREFERENCES_FILE, "r+")
|
154
|
+
at_exit do
|
155
|
+
$edployify_cfg.close unless $edployify_cfg.closed?
|
156
|
+
end
|
157
|
+
preferences_contents = $edployify_cfg.read
|
158
|
+
@preferences = preferences_contents.length == 0 ? {} : YAML::load(preferences_contents)
|
159
|
+
$edployify_cfg.rewind
|
160
|
+
end
|
161
|
+
@preferences
|
162
|
+
end
|
163
|
+
|
164
|
+
def write_file
|
165
|
+
$edployify_cfg.write YAML::dump(preferences)
|
166
|
+
$edployify_cfg.truncate $edployify_cfg.pos
|
167
|
+
$edployify_cfg.rewind
|
168
|
+
end
|
169
|
+
|
170
|
+
def highline
|
171
|
+
@highline ||= HighLine.new
|
172
|
+
end
|
173
|
+
|
174
|
+
end
|
175
|
+
|
176
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
require 'highline'
|
2
|
+
require 'fileutils'
|
3
|
+
# work around problem where HighLine detects an eof on $stdin and raises an err
|
4
|
+
HighLine.track_eof = false
|
5
|
+
|
6
|
+
module Edployify
|
7
|
+
|
8
|
+
class Project
|
9
|
+
|
10
|
+
class << self
|
11
|
+
|
12
|
+
def before_capify_clean
|
13
|
+
FileUtils.rm_f('Capfile')
|
14
|
+
end
|
15
|
+
|
16
|
+
def after_capify_clean
|
17
|
+
capfile = File.readlines('Capfile').map { |line| line =~ /load 'config\/deploy'/ ? [ "require 'edploy'\n", line ] : line }.flatten.join('')
|
18
|
+
File.open('Capfile', 'w') { |f| f.write capfile }
|
19
|
+
check_existing_dir(File.join('config', 'deploy'))
|
20
|
+
check_existing_file(File.join('config', 'deploy.rb'))
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def check_existing_file(file)
|
26
|
+
if File.exists?(file)
|
27
|
+
highline.choose do |menu|
|
28
|
+
menu.prompt = "File `#{file}' exists, what do you want to do? "
|
29
|
+
menu.choice(:ignore) do
|
30
|
+
end
|
31
|
+
menu.choice(:truncate) do
|
32
|
+
File.truncate(file, 0)
|
33
|
+
end
|
34
|
+
menu.choice(:comment) do
|
35
|
+
File.open(file, 'r+') { |f| c = f.readlines.map { |l| "# #{l}" } ; f.rewind ; f.write c.join() ; f.truncate f.pos }
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def check_existing_dir(dir)
|
42
|
+
if File.directory?(dir)
|
43
|
+
highline.choose do |menu|
|
44
|
+
menu.prompt = "Directory `#{dir}' exists, what do you want to do? "
|
45
|
+
menu.choice(:ignore) do
|
46
|
+
end
|
47
|
+
menu.choice(:remove) do
|
48
|
+
FileUtils.rm_rf(dir)
|
49
|
+
end
|
50
|
+
menu.choice(:move_stages_to_edploy_and_remove) do
|
51
|
+
FileUtils.mv Dir.glob("config/deploy/*.rb"), "config/edploy/stages/"
|
52
|
+
FileUtils.rm_rf(dir)
|
53
|
+
end
|
54
|
+
menu.choice(:rename_with_bak_extension) do
|
55
|
+
FileUtils.mv(dir, dir + ".bak")
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def highline
|
62
|
+
@@highline ||= HighLine.new
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
@@ -0,0 +1,84 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
require 'erb'
|
3
|
+
|
4
|
+
module Edployify
|
5
|
+
|
6
|
+
class Dir
|
7
|
+
def initialize(path, base_path)
|
8
|
+
@path = File.join(base_path, path)
|
9
|
+
end
|
10
|
+
|
11
|
+
def mkdir
|
12
|
+
FileUtils.mkdir_p(@path)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
class Template
|
17
|
+
|
18
|
+
TEMPLATES_DIR = File.expand_path('../../../templates', __FILE__)
|
19
|
+
|
20
|
+
def initialize(path, templates_base, project_base)
|
21
|
+
@template = File.join(templates_base, path)
|
22
|
+
@target = File.join(project_base, path.sub(/\.erb$/, ''))
|
23
|
+
end
|
24
|
+
|
25
|
+
def generate(local_binding)
|
26
|
+
content = ::ERB.new(IO.read(@template)).result(local_binding)
|
27
|
+
if File.exists?(@target)
|
28
|
+
warn "[skip] '#{@target}' already exists"
|
29
|
+
elsif File.exists?(@target.downcase)
|
30
|
+
warn "[skip] '#{@target.downcase}' exists, which could conflict with `#{@target}'"
|
31
|
+
else
|
32
|
+
unless File.exists?(File.dirname(@target))
|
33
|
+
puts "[add] making directory '#{File.dirname(@target)}'"
|
34
|
+
FileUtils.mkdir(File.dirname(@target))
|
35
|
+
end
|
36
|
+
puts "[add] writing '#{@target}'"
|
37
|
+
File.open(@target, "w") { |f| f.write(content) }
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
class << self
|
42
|
+
|
43
|
+
def templates
|
44
|
+
@@templates ||= init(:templates)
|
45
|
+
end
|
46
|
+
|
47
|
+
def dirs
|
48
|
+
@@dirs ||= init(:dirs)
|
49
|
+
end
|
50
|
+
|
51
|
+
def make_dirs
|
52
|
+
dirs.each do |dir|
|
53
|
+
dir.mkdir
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def generate_templates(local_binding)
|
58
|
+
templates.each do |template|
|
59
|
+
template.generate(local_binding)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
private
|
64
|
+
|
65
|
+
def init(type)
|
66
|
+
@@entries ||= { :templates => [], :dirs => [] }
|
67
|
+
if @@entries[:templates].empty? && @@entries[:dirs].empty?
|
68
|
+
::Dir["#{TEMPLATES_DIR}/config/edploy/**/*"].each do |fqpn|
|
69
|
+
entry = fqpn.sub(/^#{TEMPLATES_DIR}\//, '')
|
70
|
+
if File.directory?(fqpn)
|
71
|
+
@@entries[:dirs] << Edployify::Dir.new(entry, ::RAILS_ROOT)
|
72
|
+
elsif entry.end_with?('.erb')
|
73
|
+
@@entries[:templates] << Edployify::Template.new(entry, TEMPLATES_DIR, ::RAILS_ROOT)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
@@entries[type]
|
78
|
+
end
|
79
|
+
|
80
|
+
end
|
81
|
+
|
82
|
+
end
|
83
|
+
|
84
|
+
end
|
data/lib/edployify.rb
ADDED
@@ -0,0 +1,6 @@
|
|
1
|
+
# Copyright (c) 2009-2012 by Ewout Vonk. All rights reserved.
|
2
|
+
|
3
|
+
require File.expand_path('../edployify/configuration.rb', __FILE__)
|
4
|
+
require File.expand_path('../edployify/preferences.rb', __FILE__)
|
5
|
+
require File.expand_path('../edployify/project.rb', __FILE__)
|
6
|
+
require File.expand_path('../edployify/template.rb', __FILE__)
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Edploy
|
2
|
+
class Archive
|
3
|
+
|
4
|
+
class << self
|
5
|
+
|
6
|
+
def extract(archive, target_dir, options = {})
|
7
|
+
cmds = []
|
8
|
+
case archive_type(archive)
|
9
|
+
when :tgz then cmds << "tar -C #{target_dir} -z -x -f #{archive}"
|
10
|
+
when :tbz2 then cmds << "tar -C #{target_dir} -j -x -f #{archive}"
|
11
|
+
when :tar then cmds << "tar -C #{target_dir} -x -f #{archive}"
|
12
|
+
when :zip then cmds << "cd #{target_dir} ; unzip #{archive}"
|
13
|
+
end
|
14
|
+
cmds << "rm -f #{archive}" if options[:remove]
|
15
|
+
system cmds.join(' ; ')
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def archive_type(archive)
|
21
|
+
archive.sub(/\.tar\.gz$/, '.tgz').sub(/\.tar\.bz2$/, '.tbz2').gsub(/\./, '').downcase.to_sym
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
if defined?(REQUIRE_BUNDLE_EXEC) && REQUIRE_BUNDLE_EXEC && (ENV['BUNDLE_GEMFILE'].nil? || ENV['BUNDLE_BIN_PATH'].nil?)
|
2
|
+
abort "You should run this with bundle exec!"
|
3
|
+
elsif !File.exists?(File.join(Dir.getwd, 'Capfile'))
|
4
|
+
abort "You should run this from the rails root!"
|
5
|
+
end
|
6
|
+
|
7
|
+
RAILS_ROOT = Dir.getwd
|
8
|
+
|
9
|
+
require 'syck'
|
10
|
+
|
11
|
+
Syck.load_file(File.join(RAILS_ROOT, 'config', 'edploy', 'edploy.yml')).each do |key, value|
|
12
|
+
self.class.const_set(key.to_sym.upcase, value)
|
13
|
+
end
|
14
|
+
|
15
|
+
GEM_DIR = File.expand_path('../../../', __FILE__)
|
16
|
+
MY_HOSTNAME = `hostname`.strip
|
17
|
+
MY_HOSTNAME_WITHOUT_INDEX = `hostname | sed 's/[0-9]$//'`.strip
|
18
|
+
|
19
|
+
unless defined?(Capistrano::Configuration) # only execute when this file gets included from a normal script
|
20
|
+
PROJECT_PATH = ENV['PROJECT_PATH'] || File.expand_path('../../../../', __FILE__)
|
21
|
+
DEPLOY_USER = (ENV['DEPLOY_USER'].nil? || ENV['DEPLOY_USER'].empty?) ? `id -un`.strip : ENV['DEPLOY_USER']
|
22
|
+
DEPLOY_GROUP = (ENV['DEPLOY_GROUP'].nil? || ENV['DEPLOY_GROUP'].empty?) ? `id -gn`.strip : ENV['DEPLOY_GROUP']
|
23
|
+
|
24
|
+
if %w(staging test qa tryout).include?(MY_HOSTNAME)
|
25
|
+
RAILS_ENV = 'staging'
|
26
|
+
if MY_HOSTNAME == 'test'
|
27
|
+
STAGE = 'testmachine'
|
28
|
+
else
|
29
|
+
STAGE = MY_HOSTNAME
|
30
|
+
end
|
31
|
+
SHARED_PATH = "#{DEPLOY_TO}/shared"
|
32
|
+
CURRENT_PATH = "#{DEPLOY_TO}/current"
|
33
|
+
GLUSTERFS_PATH = "/mnt/glusterfs"
|
34
|
+
elsif %w(app db).include?(MY_HOSTNAME_WITHOUT_INDEX)
|
35
|
+
RAILS_ENV = 'production'
|
36
|
+
STAGE = 'production'
|
37
|
+
SHARED_PATH = "#{DEPLOY_TO}/shared"
|
38
|
+
CURRENT_PATH = "#{DEPLOY_TO}/current"
|
39
|
+
GLUSTERFS_PATH = "/mnt/glusterfs"
|
40
|
+
else
|
41
|
+
RAILS_ENV = 'development'
|
42
|
+
STAGE = nil
|
43
|
+
SHARED_PATH = File.expand_path('../../../../shared', __FILE__)
|
44
|
+
CURRENT_PATH = PROJECT_PATH
|
45
|
+
GLUSTERFS_PATH = File.expand_path('../../../../glusterfs', __FILE__)
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module Edploy
|
2
|
+
class FileHandling
|
3
|
+
|
4
|
+
class << self
|
5
|
+
|
6
|
+
def upload_file(file, tmp_path, &block)
|
7
|
+
if File.exists?(file)
|
8
|
+
random_string = "#{Time.now.to_i}"
|
9
|
+
tmp_file = "#{tmp_path}/#{random_string}-#{File.basename(file)}"
|
10
|
+
commands << "mkdir -p #{File.dirname(tmp_file)}"
|
11
|
+
put File.read(file), tmp_file, :mode => 0644
|
12
|
+
yield(tmp_file)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def iterate_dir_items(base_dir, &block)
|
17
|
+
Dir["#{base_dir}/**"].each do |fqpn|
|
18
|
+
entry = fqpn.sub(/^#{base_dir}\//, '')
|
19
|
+
dirname = File.dirname(entry)
|
20
|
+
filename = File.basename(entry)
|
21
|
+
yield(dirname, filename, relative_entry, fqpn)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Edploy
|
2
|
+
class Git
|
3
|
+
|
4
|
+
class << self
|
5
|
+
|
6
|
+
def git(*opts)
|
7
|
+
options = opts.last.is_a?(Hash) ? opts.pop : {}
|
8
|
+
opts << "--hard" if options[:hard]
|
9
|
+
if message = options.delete(:message)
|
10
|
+
opts << "-m '#{message}'"
|
11
|
+
end
|
12
|
+
opts << '2>/dev/null' if options[:silent]
|
13
|
+
cmd = "git #{opts.map(&:to_s).join(' ')}"
|
14
|
+
unless system(cmd)
|
15
|
+
return if options[:silent]
|
16
|
+
abort "error while running `#{cmd}'"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def method_missing(method, *args, &block)
|
21
|
+
git(*([method] + args))
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,6 @@
|
|
1
|
+
# Copyright (c) 2009-2012 by Ewout Vonk. All rights reserved.
|
2
|
+
|
3
|
+
require File.expand_path('../edployscripts/environment_scripts.rb', __FILE__)
|
4
|
+
require File.expand_path('../edployscripts/file_handling.rb', __FILE__)
|
5
|
+
require File.expand_path('../edployscripts/archive.rb', __FILE__)
|
6
|
+
require File.expand_path('../edployscripts/git.rb', __FILE__)
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
@@ -0,0 +1,74 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'edployscripts'
|
4
|
+
require 'fileutils'
|
5
|
+
|
6
|
+
FileUtils.mkdir_p(SHARED_PATH)
|
7
|
+
FileUtils.mkdir_p(GLUSTERFS_PATH)
|
8
|
+
|
9
|
+
sudo_mkdir_p = []
|
10
|
+
mkdir_p = []
|
11
|
+
sudo_chown = []
|
12
|
+
rm_rf = []
|
13
|
+
cp_a = {}
|
14
|
+
sudo_ln_nfs = {}
|
15
|
+
ln_nfs = {}
|
16
|
+
commands = []
|
17
|
+
|
18
|
+
SYMLINK_DURING_DEPLOY.each do |source_template, target_template|
|
19
|
+
is_dir_symlink = source_template.end_with?('/')
|
20
|
+
source = source_template.gsub(/:[^\/]+/) { |s| Kernel.const_get(s[1..-1].upcase.to_sym) }.gsub(/\/$/, '')
|
21
|
+
target = target_template.gsub(/:[^\/]+/) { |s| Kernel.const_get(s[1..-1].upcase.to_sym) }
|
22
|
+
|
23
|
+
target_is_inside_project = target.start_with?(DEPLOY_TO)
|
24
|
+
source_is_inside_project = source.start_with?(DEPLOY_TO)
|
25
|
+
if is_dir_symlink
|
26
|
+
unless File.exists?(source)
|
27
|
+
if source_is_inside_project
|
28
|
+
mkdir_p << source
|
29
|
+
else
|
30
|
+
sudo_mkdir_p << source
|
31
|
+
end
|
32
|
+
sudo_chown << source
|
33
|
+
end
|
34
|
+
rm_rf << target if File.exists?(target) && !File.symlink?(target) && is_inside_project
|
35
|
+
end
|
36
|
+
if target_is_inside_project
|
37
|
+
ln_nfs[source] = target
|
38
|
+
else
|
39
|
+
sudo_ln_nfs[source] = target
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
stage_host_files_dir = File.join(PROJECT_PATH, 'config', 'edploy', 'copy', 'project_files', STAGE, MY_HOSTNAME)
|
44
|
+
stage_role_files_dir = File.join(PROJECT_PATH, 'config', 'edploy', 'copy', 'project_files', STAGE, MY_HOSTNAME_WITHOUT_INDEX)
|
45
|
+
stage_files_dir = File.join(PROJECT_PATH, 'config', 'edploy', 'copy', 'project_files', STAGE)
|
46
|
+
stage_host_files_to_copy = Dir[File.join(stage_host_files_dir, '*')].map { |entry| entry.sub(/^#{stage_host_files_dir}\//, '') }
|
47
|
+
stage_role_files_to_copy = Dir[File.join(stage_role_files_dir, '*')].map { |entry| entry.sub(/^#{stage_role_files_dir}\//, '') }
|
48
|
+
stage_files_to_copy = Dir[File.join(stage_files_dir, '*')].reject { |entry| [ MY_HOSTNAME, MY_HOSTNAME_WITHOUT_INDEX ].include?(File.basename(entry)) }.map { |entry| entry.sub(/^#{stage_files_dir}\//, '') }
|
49
|
+
|
50
|
+
{
|
51
|
+
stage_host_files_dir => stage_host_files_to_copy,
|
52
|
+
stage_role_files_dir => stage_role_files_to_copy,
|
53
|
+
stage_files_dir => stage_files_to_copy
|
54
|
+
}.each do |base_source_dir, file_list|
|
55
|
+
file_list.each do |file|
|
56
|
+
mkdir_p << File.join(PROJECT_PATH, File.dirname(file))
|
57
|
+
cp_a[File.join(base_source_dir, file)] = File.join(PROJECT_PATH, File.dirname(file), '/')
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
commands = []
|
62
|
+
commands << "sudo mkdir -p #{sudo_mkdir_p.uniq.join(' ')}" unless sudo_mkdir_p.empty?
|
63
|
+
commands << "mkdir -p #{mkdir_p.uniq.join(' ')}" unless mkdir_p.empty?
|
64
|
+
commands << "sudo chown #{DEPLOY_USER}:#{DEPLOY_GROUP} #{sudo_chown.uniq.join(' ')}" unless sudo_chown.empty?
|
65
|
+
commands << "rm -rf #{rm_rf.uniq.join(' ')}" unless rm_rf.empty?
|
66
|
+
commands += cp_a.map { |source, target| "cp -a #{source} #{target}" }
|
67
|
+
commands += sudo_ln_nfs.map { |source, target| "sudo ln -nfs #{source} #{target}" }
|
68
|
+
commands += ln_nfs.map { |source, target| "ln -nfs #{source} #{target}" }
|
69
|
+
|
70
|
+
commands.each do |cmd|
|
71
|
+
puts cmd
|
72
|
+
end
|
73
|
+
|
74
|
+
system commands.join(' ; ') or abort "#{$0} failed"
|
@@ -0,0 +1,12 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
REQUIRE_BUNDLE_EXEC = true
|
4
|
+
require 'edployscripts'
|
5
|
+
|
6
|
+
location = File.join(::RAILS_ROOT, 'config', 'edploy', 'stages')
|
7
|
+
stages = Dir["#{location}/*.rb"].map { |f| File.basename(f, ".rb") }
|
8
|
+
|
9
|
+
stages.each do |stage|
|
10
|
+
system("cap #{stage} fast_remote_cache:setup")
|
11
|
+
system("cap #{stage} fast_remote_cache:prepare")
|
12
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
REQUIRE_BUNDLE_EXEC = true
|
4
|
+
require 'edployscripts'
|
5
|
+
require 'open3'
|
6
|
+
require 'fileutils'
|
7
|
+
|
8
|
+
def run_process(cmd, target_file)
|
9
|
+
puts "writing #{target_file}.."
|
10
|
+
Open3.popen3(cmd) { |stdin, stdout, stderr|
|
11
|
+
err_output = stderr.read
|
12
|
+
std_output = stdout.readlines.map { |line| line =~ /^## \[message\] / ? nil : line.strip }.compact.join("\n").strip + "\n"
|
13
|
+
if err_output.empty?
|
14
|
+
File.open(target_file, "w") { |f| f.write std_output.gsub(RAILS_ROOT, File.join(DEPLOY_TO, 'current')) }
|
15
|
+
else
|
16
|
+
abort "error while running: #{cmd}\n#{err_output}"
|
17
|
+
end
|
18
|
+
}
|
19
|
+
File.chmod(0755, target_file)
|
20
|
+
end
|
21
|
+
|
22
|
+
Dir["#{RAILS_ROOT}/config/edploy/whenever/*.rb"].entries.each do |crontab_def_file|
|
23
|
+
config_base_name = File.basename(crontab_def_file, ".rb")
|
24
|
+
next if config_base_name.to_sym == :generic
|
25
|
+
stage = File.readlines(crontab_def_file).grep(/^set :stage/).first.split(", ").last.strip[1..-2]
|
26
|
+
|
27
|
+
base_target_dir = File.join(RAILS_ROOT, 'config', 'edploy', 'copy', 'project_files', stage)
|
28
|
+
target_dir = config_base_name == stage ? base_target_dir : File.join(base_target_dir, "#{config_base_name}")
|
29
|
+
target_file = File.join(target_dir, 'config', "<%= application %>_cron")
|
30
|
+
|
31
|
+
FileUtils.mkdir_p(target_dir)
|
32
|
+
cmd = "whenever -f #{crontab_def_file}"
|
33
|
+
run_process(cmd, target_file)
|
34
|
+
end
|
35
|
+
|
36
|
+
system("git add #{RAILS_ROOT}/config/edploy/copy/project_files/production/*/config/*_cron #{RAILS_ROOT}/config/edploy/copy/project_files/{staging,testmachine,qa,tryout}/config/*_cron")
|