mina-traackr 0.3.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/.gitignore +10 -0
- data/.rspec +1 -0
- data/.travis.yml +12 -0
- data/CONTRIBUTING.md +124 -0
- data/Gemfile +10 -0
- data/HISTORY.md +304 -0
- data/LICENSE +23 -0
- data/Makefile +29 -0
- data/Notes.md +72 -0
- data/Rakefile +20 -0
- data/Readme.md +1009 -0
- data/bin/mina +65 -0
- data/data/deploy.rb +74 -0
- data/data/deploy.sh.erb +120 -0
- data/lib/mina.rb +23 -0
- data/lib/mina/bundler.rb +44 -0
- data/lib/mina/chruby.rb +49 -0
- data/lib/mina/default.rb +144 -0
- data/lib/mina/deploy.rb +138 -0
- data/lib/mina/deploy_helpers.rb +34 -0
- data/lib/mina/exec_helpers.rb +104 -0
- data/lib/mina/foreman.rb +78 -0
- data/lib/mina/git.rb +62 -0
- data/lib/mina/helpers.rb +383 -0
- data/lib/mina/output_helpers.rb +92 -0
- data/lib/mina/rails.rb +206 -0
- data/lib/mina/rake.rb +9 -0
- data/lib/mina/rbenv.rb +47 -0
- data/lib/mina/rvm.rb +88 -0
- data/lib/mina/settings.rb +32 -0
- data/lib/mina/ssh_helpers.rb +122 -0
- data/lib/mina/tools.rb +20 -0
- data/lib/mina/version.rb +5 -0
- data/lib/mina/whenever.rb +27 -0
- data/manual/index.md +15 -0
- data/manual/modules.md +2 -0
- data/mina.gemspec +17 -0
- data/spec/command_helper.rb +52 -0
- data/spec/commands/cleanup_spec.rb +16 -0
- data/spec/commands/command_spec.rb +71 -0
- data/spec/commands/custom_config_spec.rb +20 -0
- data/spec/commands/deploy_spec.rb +40 -0
- data/spec/commands/outside_project_spec.rb +35 -0
- data/spec/commands/real_deploy_spec.rb +54 -0
- data/spec/commands/ssh_spec.rb +14 -0
- data/spec/commands/verbose_spec.rb +21 -0
- data/spec/dsl/invoke_spec.rb +33 -0
- data/spec/dsl/queue_spec.rb +49 -0
- data/spec/dsl/settings_in_rake_spec.rb +39 -0
- data/spec/dsl/settings_spec.rb +55 -0
- data/spec/dsl/to_spec.rb +20 -0
- data/spec/fixtures/custom_file_env/custom_deploy.rb +15 -0
- data/spec/fixtures/empty_env/config/deploy.rb +15 -0
- data/spec/helpers/output_helper_spec.rb +38 -0
- data/spec/spec_helper.rb +21 -0
- data/support/Readme-footer.md +32 -0
- data/support/Readme-header.md +17 -0
- data/support/guide.md +297 -0
- data/support/index.html +53 -0
- data/support/to_md.rb +11 -0
- data/test_env/config/deploy.rb +72 -0
- metadata +157 -0
@@ -0,0 +1,92 @@
|
|
1
|
+
# # Helpers: Output helpers
|
2
|
+
# Protip! make a module that overrides these settings, then use `extend YourModule`
|
3
|
+
# to make your own pretty printing thing.
|
4
|
+
module Mina
|
5
|
+
module OutputHelpers
|
6
|
+
|
7
|
+
# ### print_str
|
8
|
+
# Prints a string by delegating it to the proper output helper.
|
9
|
+
#
|
10
|
+
# It takes an input with text and prints them nicely. The text block can
|
11
|
+
# have statuses (prefixed with `-----> `), errors (prefixed with `! `),
|
12
|
+
# commands (prefixed with `$ `) or anything else. Depending on the type of
|
13
|
+
# the message, they will be delegated to the proper print_* helper.
|
14
|
+
#
|
15
|
+
# -----> Unlocking
|
16
|
+
# $ unlock foo
|
17
|
+
# Unlocked.
|
18
|
+
# ! ERROR: Failed
|
19
|
+
#
|
20
|
+
# Returns nothing.
|
21
|
+
#
|
22
|
+
def print_str(line)
|
23
|
+
if line =~ /^\-+> (.*?)$/
|
24
|
+
print_status $1
|
25
|
+
elsif line =~ /^! (.*?)$/
|
26
|
+
print_error $1
|
27
|
+
elsif line =~ /^\$ (.*?)$/
|
28
|
+
print_command $1
|
29
|
+
else
|
30
|
+
print_stdout line
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
# ### print_char
|
35
|
+
# Prints a single character.
|
36
|
+
def print_char(ch)
|
37
|
+
$last ||= ''
|
38
|
+
|
39
|
+
if ch == "\n"
|
40
|
+
print_clear
|
41
|
+
print_str $last
|
42
|
+
$last = ''
|
43
|
+
else
|
44
|
+
print ' ' if $last == ''
|
45
|
+
print ch
|
46
|
+
$last += ch
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def print_clear
|
51
|
+
print "\033[1K\r"
|
52
|
+
end
|
53
|
+
|
54
|
+
# ### print_status
|
55
|
+
# Prints a status message. (`----->`)
|
56
|
+
def print_status(msg)
|
57
|
+
puts "" if verbose_mode?
|
58
|
+
puts "#{color('----->', 32)} #{msg}"
|
59
|
+
end
|
60
|
+
|
61
|
+
# ### print_error
|
62
|
+
# Prints an error message (header).
|
63
|
+
def print_error(msg)
|
64
|
+
puts " #{color("!", 33)} #{color(msg, 31)}"
|
65
|
+
end
|
66
|
+
|
67
|
+
# ### print_stderr
|
68
|
+
# Prints an error message (body), or prints stderr output.
|
69
|
+
def print_stderr(msg)
|
70
|
+
puts " #{color(msg, 31)}"
|
71
|
+
end
|
72
|
+
|
73
|
+
# ### print_command
|
74
|
+
# Prints a command.
|
75
|
+
def print_command(msg)
|
76
|
+
puts " #{color("$", 32)} #{color(msg, 32)}"
|
77
|
+
end
|
78
|
+
|
79
|
+
# ### print_stdout
|
80
|
+
# Prints a normal message.
|
81
|
+
def print_stdout(msg)
|
82
|
+
puts " #{msg}"
|
83
|
+
end
|
84
|
+
|
85
|
+
# ### color
|
86
|
+
# Colorizes a string.
|
87
|
+
# Returns the string `str` with the color `c`.
|
88
|
+
def color(str, c)
|
89
|
+
ENV['NO_COLOR'] ? str : "\033[#{c}m#{str}\033[0m"
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
data/lib/mina/rails.rb
ADDED
@@ -0,0 +1,206 @@
|
|
1
|
+
# # Modules: Rails
|
2
|
+
# Adds settings and tasks for managing Rails projects.
|
3
|
+
#
|
4
|
+
# require 'mina/rails'
|
5
|
+
|
6
|
+
require 'mina/bundler'
|
7
|
+
|
8
|
+
# ## Settings
|
9
|
+
# Any and all of these settings can be overriden in your `deploy.rb`.
|
10
|
+
|
11
|
+
# ### rails_env
|
12
|
+
# Sets the Rails environment for `rake` and `rails` commands.
|
13
|
+
#
|
14
|
+
# Note that changing this will NOT change the environment that your application
|
15
|
+
# is ran in.
|
16
|
+
|
17
|
+
set_default :rails_env, 'production'
|
18
|
+
|
19
|
+
# ### bundle_prefix
|
20
|
+
# Prefix for Bundler commands. Often to something like `RAILS_ENV=production
|
21
|
+
# bundle exec`.
|
22
|
+
#
|
23
|
+
# queue! "#{bundle_prefix} annotate -r"
|
24
|
+
|
25
|
+
set_default :bundle_prefix, lambda { %{RAILS_ENV="#{rails_env}" #{bundle_bin} exec} }
|
26
|
+
|
27
|
+
# ### rake
|
28
|
+
# The prefix for `rake` commands. Use like so:
|
29
|
+
#
|
30
|
+
# queue! "#{rake} db:migrate"
|
31
|
+
|
32
|
+
set_default :rake, lambda { %{#{bundle_prefix} rake} }
|
33
|
+
|
34
|
+
# ### rails
|
35
|
+
# The prefix for `rails` commands. Use like so:
|
36
|
+
#
|
37
|
+
# queue! "#{rails} console"
|
38
|
+
|
39
|
+
set_default :rails, lambda { %{#{bundle_prefix} rails} }
|
40
|
+
|
41
|
+
# ### asset_paths
|
42
|
+
# The paths to be checked.
|
43
|
+
#
|
44
|
+
# Whenever assets are compiled, the asset files are checked if they have
|
45
|
+
# changed from the previous release.
|
46
|
+
#
|
47
|
+
# If they're unchanged, compiled assets will simply be copied over to the new
|
48
|
+
# release.
|
49
|
+
#
|
50
|
+
# Override this if you have custom asset paths declared in your Rails's
|
51
|
+
# `config.assets.paths` setting.
|
52
|
+
|
53
|
+
set_default :asset_paths, ['vendor/assets/', 'app/assets/']
|
54
|
+
|
55
|
+
# ### rake_assets_precompile
|
56
|
+
# The command to invoke when precompiling assets.
|
57
|
+
# Override me if you like.
|
58
|
+
|
59
|
+
settings.rake_assets_precompile ||= lambda { "#{rake} assets:precompile RAILS_GROUPS=assets" }
|
60
|
+
|
61
|
+
# ----
|
62
|
+
|
63
|
+
# Macro used later by :rails, :rake, etc
|
64
|
+
make_run_task = lambda { |name, sample_args|
|
65
|
+
task name, [:arguments] => :environment do |t, args|
|
66
|
+
arguments = args[:arguments]
|
67
|
+
command = send name
|
68
|
+
unless arguments
|
69
|
+
puts %{You need to provide arguments. Try: mina "#{name}[#{sample_args}]"}
|
70
|
+
exit 1
|
71
|
+
end
|
72
|
+
queue echo_cmd %[cd "#{deploy_to!}/#{current_path!}" && #{command} #{arguments}]
|
73
|
+
end
|
74
|
+
}
|
75
|
+
|
76
|
+
def check_for_changes_script(options={})
|
77
|
+
diffs = options[:at].map { |path|
|
78
|
+
%[diff -r "#{deploy_to}/#{current_path}/#{path}" "./#{path}" 2>/dev/null]
|
79
|
+
}.join("\n")
|
80
|
+
|
81
|
+
unindent %[
|
82
|
+
if [ -e "#{deploy_to}/#{current_path}/#{options[:check]}" ]; then
|
83
|
+
count=`(
|
84
|
+
#{reindent 4, diffs}
|
85
|
+
) | wc -l`
|
86
|
+
|
87
|
+
if [ "$((count))" = "0" ]; then
|
88
|
+
#{reindent 4, options[:skip]} &&
|
89
|
+
exit
|
90
|
+
else
|
91
|
+
#{reindent 4, options[:changed]}
|
92
|
+
fi
|
93
|
+
else
|
94
|
+
#{reindent 2, options[:default]}
|
95
|
+
fi
|
96
|
+
]
|
97
|
+
end
|
98
|
+
|
99
|
+
# ## Command-line tasks
|
100
|
+
# These tasks can be invoked in the command line.
|
101
|
+
|
102
|
+
# ### rails[]
|
103
|
+
# Invokes a rails command.
|
104
|
+
#
|
105
|
+
# $ mina rails[console]
|
106
|
+
|
107
|
+
desc "Execute a Rails command in the current deploy."
|
108
|
+
make_run_task[:rails, 'console']
|
109
|
+
|
110
|
+
# ### rake[]
|
111
|
+
# Invokes a rake command.
|
112
|
+
#
|
113
|
+
# $ mina rake db:cleanup
|
114
|
+
|
115
|
+
desc "Execute a Rake command in the current deploy."
|
116
|
+
make_run_task[:rake, 'db:migrate']
|
117
|
+
|
118
|
+
# ### console
|
119
|
+
# Opens the Ruby console for the currently-deployed version.
|
120
|
+
#
|
121
|
+
# $ mina console
|
122
|
+
|
123
|
+
desc "Starts an interactive console."
|
124
|
+
task :console do
|
125
|
+
queue echo_cmd %[cd "#{deploy_to!}/#{current_path!}" && #{rails} console && exit]
|
126
|
+
end
|
127
|
+
|
128
|
+
# ## Deploy tasks
|
129
|
+
# These tasks are meant to be invoked inside deploy scripts, not invoked on
|
130
|
+
# their own.
|
131
|
+
|
132
|
+
namespace :rails do
|
133
|
+
# ### rails:db_migrate
|
134
|
+
desc "Migrates the Rails database (skips if nothing has changed since the last release)."
|
135
|
+
task :db_migrate do
|
136
|
+
if ENV['force_migrate']
|
137
|
+
invoke :'rails:db_migrate:force'
|
138
|
+
else
|
139
|
+
message = verbose_mode? ?
|
140
|
+
'$((count)) changes found, migrating database' :
|
141
|
+
'Migrating database'
|
142
|
+
|
143
|
+
queue check_for_changes_script \
|
144
|
+
:check => 'db/schema.rb',
|
145
|
+
:at => ['db/schema.rb'],
|
146
|
+
:skip => %[
|
147
|
+
echo "-----> DB schema unchanged; skipping DB migration"
|
148
|
+
],
|
149
|
+
:changed => %[
|
150
|
+
echo "-----> #{message}"
|
151
|
+
#{echo_cmd %[#{rake} db:migrate]}
|
152
|
+
],
|
153
|
+
:default => %[
|
154
|
+
echo "-----> Migrating database"
|
155
|
+
#{echo_cmd %[#{rake} db:migrate]}
|
156
|
+
]
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
# ### rails:db_migrate:force
|
161
|
+
desc "Migrates the Rails database."
|
162
|
+
task :'db_migrate:force' do
|
163
|
+
queue %{
|
164
|
+
echo "-----> Migrating database"
|
165
|
+
#{echo_cmd %[#{rake} db:migrate]}
|
166
|
+
}
|
167
|
+
end
|
168
|
+
|
169
|
+
# ### rails:assets_precompile:force
|
170
|
+
desc "Precompiles assets."
|
171
|
+
task :'assets_precompile:force' do
|
172
|
+
queue %{
|
173
|
+
echo "-----> Precompiling asset files"
|
174
|
+
#{echo_cmd %[#{rake_assets_precompile}]}
|
175
|
+
}
|
176
|
+
end
|
177
|
+
|
178
|
+
# ### rails:assets_precompile
|
179
|
+
desc "Precompiles assets (skips if nothing has changed since the last release)."
|
180
|
+
task :'assets_precompile' do
|
181
|
+
if ENV['force_assets']
|
182
|
+
invoke :'rails:assets_precompile:force'
|
183
|
+
else
|
184
|
+
message = verbose_mode? ?
|
185
|
+
'$((count)) changes found, precompiling asset files' :
|
186
|
+
'Precompiling asset files'
|
187
|
+
|
188
|
+
queue check_for_changes_script \
|
189
|
+
:check => 'public/assets/',
|
190
|
+
:at => [*asset_paths],
|
191
|
+
:skip => %[
|
192
|
+
echo "-----> Skipping asset precompilation"
|
193
|
+
#{echo_cmd %[cp -R "#{deploy_to}/#{current_path}/public/assets" "./public/assets"]}
|
194
|
+
],
|
195
|
+
:changed => %[
|
196
|
+
echo "-----> #{message}"
|
197
|
+
#{echo_cmd %[#{rake_assets_precompile}]}
|
198
|
+
],
|
199
|
+
:default => %[
|
200
|
+
echo "-----> Precompiling asset files"
|
201
|
+
#{echo_cmd %[#{rake_assets_precompile}]}
|
202
|
+
]
|
203
|
+
end
|
204
|
+
end
|
205
|
+
|
206
|
+
end
|
data/lib/mina/rake.rb
ADDED
data/lib/mina/rbenv.rb
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
# # Modules: rbenv
|
2
|
+
# Adds settings and tasks for managing [rbenv] installations.
|
3
|
+
#
|
4
|
+
# [rbenv]: https://github.com/sstephenson/rbenv
|
5
|
+
#
|
6
|
+
# require 'mina/rbenv'
|
7
|
+
#
|
8
|
+
# ## Common usage
|
9
|
+
#
|
10
|
+
# task :environment do
|
11
|
+
# invoke :'rbenv:load'
|
12
|
+
# end
|
13
|
+
#
|
14
|
+
# task :deploy => :environment do
|
15
|
+
# ...
|
16
|
+
# end
|
17
|
+
|
18
|
+
# ## Settings
|
19
|
+
# Any and all of these settings can be overriden in your `deploy.rb`.
|
20
|
+
|
21
|
+
# ### rbenv_path
|
22
|
+
# Sets the path where *rbenv* is installed.
|
23
|
+
#
|
24
|
+
# You may override this if rbenv is placed elsewhere in your setup.
|
25
|
+
|
26
|
+
set_default :rbenv_path, "$HOME/.rbenv"
|
27
|
+
|
28
|
+
# ## Tasks
|
29
|
+
|
30
|
+
# ### rbenv:load
|
31
|
+
# Loads the *rbenv* runtime.
|
32
|
+
|
33
|
+
task :'rbenv:load' do
|
34
|
+
queue %{
|
35
|
+
echo "-----> Loading rbenv"
|
36
|
+
#{echo_cmd %{export RBENV_ROOT="#{rbenv_path}"}}
|
37
|
+
#{echo_cmd %{export PATH="#{rbenv_path}/bin:$PATH"}}
|
38
|
+
|
39
|
+
if ! which rbenv >/dev/null; then
|
40
|
+
echo "! rbenv not found"
|
41
|
+
echo "! If rbenv is installed, check your :rbenv_path setting."
|
42
|
+
exit 1
|
43
|
+
fi
|
44
|
+
|
45
|
+
#{echo_cmd %{eval "$(rbenv init -)"}}
|
46
|
+
}
|
47
|
+
end
|
data/lib/mina/rvm.rb
ADDED
@@ -0,0 +1,88 @@
|
|
1
|
+
# # Modules: RVM
|
2
|
+
# Adds settings and tasks for managing [RVM] installations.
|
3
|
+
#
|
4
|
+
# [rvm]: http://rvm.io
|
5
|
+
#
|
6
|
+
# require 'mina/rvm'
|
7
|
+
#
|
8
|
+
# ## Common usage
|
9
|
+
#
|
10
|
+
# task :environment do
|
11
|
+
# invoke :'rvm:use[ruby-1.9.3-p125@gemset_name]'
|
12
|
+
# end
|
13
|
+
#
|
14
|
+
# task :deploy => :environment do
|
15
|
+
# ...
|
16
|
+
# end
|
17
|
+
|
18
|
+
# ## Settings
|
19
|
+
# Any and all of these settings can be overriden in your `deploy.rb`.
|
20
|
+
|
21
|
+
# ### rvm_path
|
22
|
+
# Sets the path to RVM.
|
23
|
+
#
|
24
|
+
# You can override this in your projects if RVM is installed in a different
|
25
|
+
# path, say, if you have a system-wide RVM install.
|
26
|
+
|
27
|
+
set_default :rvm_path, "$HOME/.rvm/scripts/rvm"
|
28
|
+
|
29
|
+
# ## Tasks
|
30
|
+
|
31
|
+
# ### rvm:use[]
|
32
|
+
# Uses a given RVM environment provided as an argument.
|
33
|
+
#
|
34
|
+
# This is usually placed in the `:environment` task.
|
35
|
+
#
|
36
|
+
# task :environment do
|
37
|
+
# invoke :'rvm:use[ruby-1.9.3-p125@gemset_name]'
|
38
|
+
# end
|
39
|
+
#
|
40
|
+
task :'rvm:use', :env do |t, args|
|
41
|
+
unless args[:env]
|
42
|
+
print_error "Task 'rvm:use' needs an RVM environment name as an argument."
|
43
|
+
print_error "Example: invoke :'rvm:use[ruby-1.9.2@default]'"
|
44
|
+
die
|
45
|
+
end
|
46
|
+
|
47
|
+
queue %{
|
48
|
+
echo "-----> Using RVM environment '#{args[:env]}'"
|
49
|
+
if [[ ! -s "#{rvm_path}" ]]; then
|
50
|
+
echo "! Ruby Version Manager not found"
|
51
|
+
echo "! If RVM is installed, check your :rvm_path setting."
|
52
|
+
exit 1
|
53
|
+
fi
|
54
|
+
|
55
|
+
source #{rvm_path}
|
56
|
+
#{echo_cmd %{rvm use "#{args[:env]}" --create}} || exit 1
|
57
|
+
}
|
58
|
+
end
|
59
|
+
|
60
|
+
# ### rvm:wrapper[]
|
61
|
+
# Creates a rvm wrapper for a given executable.
|
62
|
+
#
|
63
|
+
# This is usually placed in the `:setup` task.
|
64
|
+
#
|
65
|
+
# task ::setup => :environment do
|
66
|
+
# ...
|
67
|
+
# invoke :'rvm:wrapper[ruby-1.9.3-p125@gemset_name,wrapper_name,binary_name]'
|
68
|
+
# end
|
69
|
+
#
|
70
|
+
task :'rvm:wrapper', :env, :name, :bin do |t,args|
|
71
|
+
unless args[:env] && args[:name] && args[:bin]
|
72
|
+
print_error "Task 'rvm:wrapper' needs an RVM environment name, an wrapper name and the binary name as arguments"
|
73
|
+
print_error "Example: invoke :'rvm:wrapper[ruby-1.9.2@myapp,myapp,unicorn_rails]'"
|
74
|
+
die
|
75
|
+
end
|
76
|
+
|
77
|
+
queue %{
|
78
|
+
echo "-----> creating RVM wrapper '#{args[:name]}_#{args[:bin]}' using '#{args[:env]}'"
|
79
|
+
if [[ ! -s "#{rvm_path}" ]]; then
|
80
|
+
echo "! Ruby Version Manager not found"
|
81
|
+
echo "! If RVM is installed, check your :rvm_path setting."
|
82
|
+
exit 1
|
83
|
+
fi
|
84
|
+
|
85
|
+
source #{rvm_path}
|
86
|
+
#{echo_cmd %{rvm wrapper #{args[:env]} #{args[:name]} #{args[:bin]} }} || exit 1
|
87
|
+
}
|
88
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module Mina
|
2
|
+
class Settings < Hash
|
3
|
+
def method_missing(meth, *args, &blk)
|
4
|
+
name = meth.to_s
|
5
|
+
|
6
|
+
return evaluate(self[meth]) if name.size == 1
|
7
|
+
|
8
|
+
# Ruby 1.8.7 doesn't let you do string[-1]
|
9
|
+
key, suffix = name[0..-2].to_sym, name[-1..-1]
|
10
|
+
|
11
|
+
case suffix
|
12
|
+
when '='
|
13
|
+
self[key] = args.first
|
14
|
+
when '?'
|
15
|
+
include? key
|
16
|
+
when '!'
|
17
|
+
raise Error, "Setting :#{key} is not set" unless include?(key)
|
18
|
+
evaluate self[key]
|
19
|
+
else
|
20
|
+
evaluate self[meth]
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def evaluate(value)
|
25
|
+
if value.is_a?(Proc)
|
26
|
+
value.call
|
27
|
+
else
|
28
|
+
value
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|