mina 0.2.0.pre2 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +1 -0
- data/HISTORY.md +25 -3
- data/Rakefile +11 -0
- data/bin/mina +6 -1
- data/data/deploy.rb +37 -13
- data/lib/mina/bundler.rb +30 -3
- data/lib/mina/default.rb +27 -2
- data/lib/mina/deploy.rb +50 -13
- data/lib/mina/deploy_helpers.rb +5 -2
- data/lib/mina/git.rb +19 -2
- data/lib/mina/helpers.rb +134 -81
- data/lib/mina/output_helpers.rb +20 -5
- data/lib/mina/rails.rb +83 -25
- data/lib/mina/rbenv.rb +46 -0
- data/lib/mina/rvm.rb +58 -0
- data/lib/mina/version.rb +1 -1
- data/lib/mina/whenever.rb +28 -0
- data/manual/index.md +15 -0
- data/manual/modules.md +2 -0
- data/spec/commands/verbose_spec.rb +2 -2
- data/test_env/config/deploy.rb +8 -0
- metadata +10 -5
data/.gitignore
CHANGED
data/HISTORY.md
CHANGED
@@ -1,5 +1,5 @@
|
|
1
|
-
v0.2.0
|
2
|
-
|
1
|
+
v0.2.0
|
2
|
+
------
|
3
3
|
|
4
4
|
This release had two pre releases:
|
5
5
|
|
@@ -7,6 +7,12 @@ This release had two pre releases:
|
|
7
7
|
* v0.1.3.pre1 (Jul 13, 2012)
|
8
8
|
|
9
9
|
### Fixed:
|
10
|
+
* Allow changing `:term_mode` in the setup task. (#51, @alfuken)
|
11
|
+
* Prevent `git log` from using a pager. (#42, @tmak)
|
12
|
+
* `deploy:cleanup` can now be called in a deploy script. (#50, @dariocravero)
|
13
|
+
* Don't invoke bash anymore (!), assume that bash is the shell for the user.
|
14
|
+
Fixes Ubuntu 12, and many other things.
|
15
|
+
* Fixed `ssh(cmd, return: true)` that used to exit. (#53 from @jpascal)
|
10
16
|
* [pre2] Call ssh with no double use `-t` parameter.
|
11
17
|
* [pre2] Fix Ruby 1.8 compatibility.
|
12
18
|
* [pre2] Fix the "undefined method > for Process::Status" error.
|
@@ -16,6 +22,13 @@ This release had two pre releases:
|
|
16
22
|
* [pre1] Doing `rails:assets_precompile` now properly skips asset compilation if not needed. (#25)
|
17
23
|
|
18
24
|
### Added:
|
25
|
+
* __Added the 'queue!' helper.__
|
26
|
+
* Add support for __Whenever__. (#47, @jpascal)
|
27
|
+
* Add a new `:environment` task that gets loaded on setup/deploy.
|
28
|
+
* __Add explicit support for rbenv/rvm.__ (#5, #39)
|
29
|
+
* Implement :'rvm:use[...]'. (#5, #39)
|
30
|
+
* Implement :'rbenv:load'. (#5, #39)
|
31
|
+
* Revert `rails:optimize_for_3.2` from the pre2 release. (#32)
|
19
32
|
* [pre2] __Optimize git:clone by caching the repository.__ This way, updates are
|
20
33
|
faster because not the entire repo is cloned everytime. (#10)
|
21
34
|
* [pre2] __Show elapsed time that a deploy takes.__
|
@@ -24,7 +37,7 @@ This release had two pre releases:
|
|
24
37
|
* [pre2] New `die` helper.
|
25
38
|
* [pre2] New `report_time` helper.
|
26
39
|
* [pre2] New `to_directory` helper. (#35)
|
27
|
-
* [pre2] Put optional optimizations for Rails 3.2 asset pipeline. (#32)
|
40
|
+
* [pre2] Put optional optimizations for Rails 3.2 asset pipeline. (#32) -- reverted
|
28
41
|
* Update sample deploy script:
|
29
42
|
- [pre2] Update default deploy.rb to note :branch.
|
30
43
|
- [pre2] Add `link_shared_paths` to the sample deploy script.
|
@@ -33,6 +46,15 @@ This release had two pre releases:
|
|
33
46
|
* [pre1] Make asset paths configurable using the `asset_paths` setting.
|
34
47
|
|
35
48
|
### Changed:
|
49
|
+
* Force removal of shared path destinations before linking with
|
50
|
+
`deploy:link_shared_paths`. Fixes symlinking of `log/` in Rails projects.
|
51
|
+
* __Rails: speed up default asset compilation a bit by invoking
|
52
|
+
`assets:precompile` with `RAILS_GROUPS=assets`.__
|
53
|
+
* Add helpful error message when there is a problem with
|
54
|
+
deploy.rb or a custom Rakefile. (#37, @sge-jesse-adams)
|
55
|
+
* Update the default deploy.rb to add notes about 'mina setup' customizations.
|
56
|
+
* Make `mina run`, `mina rake`, `mina console` use the new `:environment` task.
|
57
|
+
* Allow calling `die` without arguments.
|
36
58
|
* [pre2] __Improve output of `mina init`.__
|
37
59
|
* [pre2] Prettier output for `mina setup`. Also, show a better error message for it.
|
38
60
|
* [pre1] Refactor pretty printing to be simpler, cleaner, and extensible.
|
data/Rakefile
CHANGED
@@ -1,9 +1,20 @@
|
|
1
1
|
require 'bundler'
|
2
2
|
require 'bundler/gem_tasks'
|
3
3
|
|
4
|
+
github = ENV['github'] || 'nadarei/mina'
|
5
|
+
|
4
6
|
task :spec do
|
5
7
|
system "rm Gemfile.lock; sh -c 'rake=0.8 bundle exec rspec'"
|
6
8
|
system "rm Gemfile.lock; sh -c 'rake=0.9 bundle exec rspec'"
|
7
9
|
end
|
8
10
|
|
11
|
+
task :docs do
|
12
|
+
files = ['manual/index.md', 'manual/modules.md', 'HISTORY.md'] + Dir['lib/**/*.rb']
|
13
|
+
system "lidoc #{files.join ' '} -o docs --github #{github}"
|
14
|
+
end
|
15
|
+
|
16
|
+
task :'docs:deploy' => :docs do
|
17
|
+
system "git-update-ghpages #{github} -i docs -p docs"
|
18
|
+
end
|
19
|
+
|
9
20
|
task :default => :spec
|
data/bin/mina
CHANGED
@@ -42,7 +42,12 @@ Rake.application.instance_eval do
|
|
42
42
|
require 'mina/rake'
|
43
43
|
|
44
44
|
# Allow running without a Rakefile
|
45
|
-
|
45
|
+
begin
|
46
|
+
load_rakefile if have_rakefile || custom_rakefile
|
47
|
+
rescue Exception
|
48
|
+
puts "Error loading Rakefile!"
|
49
|
+
raise "There may be a problem with config/deploy.rb and/or Rakefile"
|
50
|
+
end
|
46
51
|
|
47
52
|
# Run tasks
|
48
53
|
top_level
|
data/data/deploy.rb
CHANGED
@@ -1,13 +1,8 @@
|
|
1
|
-
# For help in making your deploy script, see the Mina documentation:
|
2
|
-
#
|
3
|
-
# - http://nadarei.co/mina
|
4
|
-
# - http://nadarei.co/mina/tasks
|
5
|
-
# - http://nadarei.co/mina/settings
|
6
|
-
# - http://nadarei.co/mina/helpers
|
7
|
-
|
8
1
|
require 'mina/bundler'
|
9
2
|
require 'mina/rails'
|
10
3
|
require 'mina/git'
|
4
|
+
# require 'mina/rbenv' # for rbenv support. (http://rbenv.org)
|
5
|
+
# require 'mina/rvm' # for rvm support. (http://rvm.io)
|
11
6
|
|
12
7
|
# Basic settings:
|
13
8
|
# domain - The hostname to SSH to.
|
@@ -22,19 +17,40 @@ set :branch, 'master'
|
|
22
17
|
|
23
18
|
# Manually create these paths in shared/ (eg: shared/config/database.yml) in your server.
|
24
19
|
# They will be linked in the 'deploy:link_shared_paths' step.
|
25
|
-
set :shared_paths, ['config/database.yml']
|
20
|
+
set :shared_paths, ['config/database.yml', 'log']
|
26
21
|
|
27
22
|
# Optional settings:
|
28
23
|
# set :user, 'foobar' # Username in the server to SSH to.
|
29
24
|
# set :port, '30000' # SSH port number.
|
30
25
|
|
26
|
+
# This task is the environment that is loaded for most commands, such as
|
27
|
+
# `mina deploy` or `mina rake`.
|
28
|
+
task :environment do
|
29
|
+
# If you're using rbenv, use this to load the rbenv environment.
|
30
|
+
# Be sure to commit your .rbenv-version to your repository.
|
31
|
+
# invoke :'rbenv:load'
|
32
|
+
|
33
|
+
# For those using RVM, use this to load an RVM version@gemset.
|
34
|
+
# invoke :'rvm:use[ruby-1.9.3-p125@default]'
|
35
|
+
end
|
36
|
+
|
37
|
+
# Put any custom mkdir's in here for when `mina setup` is ran.
|
38
|
+
# For Rails apps, we'll make some of the shared paths that are shared between
|
39
|
+
# all releases.
|
40
|
+
task :setup => :environment do
|
41
|
+
queue! %[mkdir -p "#{deploy_to}/shared/log"]
|
42
|
+
queue! %[chmod g+rx,u+rwx "#{deploy_to}/shared/log"]
|
43
|
+
|
44
|
+
queue! %[mkdir -p "#{deploy_to}/shared/config"]
|
45
|
+
queue! %[chmod g+rx,u+rwx "#{deploy_to}/shared/config"]
|
46
|
+
|
47
|
+
queue! %[touch "#{deploy_to}/shared/config/database.yml"]
|
48
|
+
queue %[-----> Be sure to edit 'shared/config/database.yml'.]
|
49
|
+
end
|
50
|
+
|
31
51
|
desc "Deploys the current version to the server."
|
32
|
-
task :deploy do
|
52
|
+
task :deploy => :environment do
|
33
53
|
deploy do
|
34
|
-
# This makes asset compilation faster in Rails 3.2 -- remove this for other
|
35
|
-
# Rails versions.
|
36
|
-
invoke :'rails:optimize_for_3.2'
|
37
|
-
|
38
54
|
# Put things that will set up an empty directory into a fully set-up
|
39
55
|
# instance of your project.
|
40
56
|
invoke :'git:clone'
|
@@ -48,3 +64,11 @@ task :deploy do
|
|
48
64
|
end
|
49
65
|
end
|
50
66
|
end
|
67
|
+
|
68
|
+
# For help in making your deploy script, see the Mina documentation:
|
69
|
+
#
|
70
|
+
# - http://nadarei.co/mina
|
71
|
+
# - http://nadarei.co/mina/tasks
|
72
|
+
# - http://nadarei.co/mina/settings
|
73
|
+
# - http://nadarei.co/mina/helpers
|
74
|
+
|
data/lib/mina/bundler.rb
CHANGED
@@ -1,9 +1,36 @@
|
|
1
|
+
# # Modules: Bundler
|
2
|
+
# Adds settings and tasks for managing Ruby Bundler.
|
3
|
+
#
|
4
|
+
# require 'mina/bundler'
|
1
5
|
|
2
|
-
|
3
|
-
settings
|
4
|
-
|
6
|
+
# ## Settings
|
7
|
+
# Any and all of these settings can be overriden in your `deploy.rb`.
|
8
|
+
|
9
|
+
# ### bundle_bin
|
10
|
+
# Sets the bundle path.
|
11
|
+
|
12
|
+
set_default :bundle_bin, 'bundle'
|
13
|
+
|
14
|
+
# ### bundle_path
|
15
|
+
# Sets the path to where the gems are expected to be.
|
16
|
+
#
|
17
|
+
# This path will be symlinked to `./shared/bundle` so that the gems cache will
|
18
|
+
# be shared between all releases.
|
19
|
+
|
20
|
+
set_default :bundle_path, './vendor/bundle'
|
21
|
+
|
22
|
+
# ### bundle_options
|
23
|
+
# Sets the options for installing gems via Bundler.
|
24
|
+
|
25
|
+
set_default :bundle_options, lambda { %{--without development:test --path "#{bundle_path}" --binstubs bin/ --deployment} }
|
26
|
+
|
27
|
+
# ## Deploy tasks
|
28
|
+
# These tasks are meant to be invoked inside deploy scripts, not invoked on
|
29
|
+
# their own.
|
5
30
|
|
6
31
|
namespace :bundle do
|
32
|
+
# ### bundle:install
|
33
|
+
# Installs gems.
|
7
34
|
desc "Install gem dependencies using Bundler."
|
8
35
|
task :install do
|
9
36
|
queue %{
|
data/lib/mina/default.rb
CHANGED
@@ -1,8 +1,25 @@
|
|
1
|
+
# # Modules: Default
|
2
|
+
# This module is loaded when invoking `mina` with or without a project.
|
3
|
+
|
1
4
|
set_default :bash_options, '-i'
|
2
5
|
|
3
|
-
#
|
6
|
+
# ## Tasks
|
7
|
+
# Any and all of these settings can be overriden in your `deploy.rb`.
|
8
|
+
|
9
|
+
# ### environment
|
10
|
+
# Make the `:environment` task exist by default. This is meant to be overridden
|
11
|
+
# by users.
|
12
|
+
|
13
|
+
task :environment do
|
14
|
+
end
|
15
|
+
|
16
|
+
# ### init
|
17
|
+
# Initializes a new Mina project.
|
18
|
+
#
|
19
|
+
# $ mina init
|
20
|
+
|
4
21
|
desc "Creates a sample config file."
|
5
|
-
task :init do
|
22
|
+
task :init => :environment do
|
6
23
|
name = Rake.application.name
|
7
24
|
config_file = Rake.application.rakefile
|
8
25
|
|
@@ -63,6 +80,9 @@ end
|
|
63
80
|
|
64
81
|
extend HelpHelpers
|
65
82
|
|
83
|
+
# ### help
|
84
|
+
# Shows the help screen.
|
85
|
+
|
66
86
|
desc "Show help."
|
67
87
|
task :help do
|
68
88
|
name = Rake.application.name
|
@@ -93,6 +113,11 @@ task :help do
|
|
93
113
|
puts "for more information."
|
94
114
|
end
|
95
115
|
|
116
|
+
# ### tasks
|
117
|
+
# Display all tasks in a nice table.
|
118
|
+
#
|
119
|
+
# $ mina tasks
|
120
|
+
|
96
121
|
desc "Show all tasks."
|
97
122
|
task :tasks do
|
98
123
|
show_task_help :full => true
|
data/lib/mina/deploy.rb
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
# # Modules: Deployment
|
2
|
+
# This module is automatically loaded for all Mina projects.
|
3
|
+
|
4
|
+
# ## Settings
|
5
|
+
# Any and all of these settings can be overriden in your `deploy.rb`.
|
6
|
+
|
1
7
|
set_default :releases_path, "releases"
|
2
8
|
set_default :shared_path, "shared"
|
3
9
|
set_default :current_path, "current"
|
@@ -5,12 +11,26 @@ set_default :lock_file, "deploy.lock"
|
|
5
11
|
set_default :keep_releases, 5
|
6
12
|
|
7
13
|
namespace :deploy do
|
14
|
+
# ## Tasks
|
15
|
+
|
16
|
+
# ### deploy:force_unlock
|
17
|
+
# Forces a deploy unlock by deleting the lock file.
|
18
|
+
#
|
19
|
+
# $ mina deploy:force_unlock
|
20
|
+
#
|
21
|
+
# You can also combine that task with `deploy`:
|
22
|
+
#
|
23
|
+
# $ mina deploy:force_unlock deploy
|
24
|
+
|
8
25
|
desc "Forces a deploy unlock."
|
9
26
|
task :force_unlock do
|
10
27
|
queue %{echo "-----> Unlocking"}
|
11
28
|
queue echo_cmd %{rm -f "#{deploy_to}/#{lock_file}"}
|
12
29
|
end
|
13
30
|
|
31
|
+
# ### deploy:link_shared_paths
|
32
|
+
# Links the shared paths in the `shared_paths` setting.
|
33
|
+
|
14
34
|
desc "Links paths set in :shared_paths."
|
15
35
|
task :link_shared_paths do
|
16
36
|
dirs = settings.shared_paths!.map { |file| File.dirname("./#{file}") }.uniq
|
@@ -20,31 +40,43 @@ namespace :deploy do
|
|
20
40
|
end
|
21
41
|
|
22
42
|
cmds += shared_paths.map do |file|
|
23
|
-
|
43
|
+
[
|
44
|
+
echo_cmd(%{rm -rf "./#{file}"}),
|
45
|
+
echo_cmd(%{ln -s "#{deploy_to}/#{shared_path}/#{file}" "./#{file}"})
|
46
|
+
]
|
24
47
|
end
|
25
48
|
|
26
49
|
queue %{
|
27
50
|
echo "-----> Symlinking shared paths"
|
28
|
-
#{cmds.join(" &&\n")}
|
51
|
+
#{cmds.flatten.join(" &&\n")}
|
29
52
|
}
|
30
53
|
end
|
31
54
|
|
32
|
-
|
33
|
-
|
34
|
-
|
55
|
+
# ### deploy:cleanup
|
56
|
+
# Cleans up old releases.
|
57
|
+
#
|
58
|
+
# By default, the last 5 releases are kept on each server (though you can
|
59
|
+
# change this with the keep_releases setting). All other deployed revisions
|
60
|
+
# are removed from the servers."
|
61
|
+
|
62
|
+
desc "Clean up old releases."
|
35
63
|
task :cleanup do
|
36
|
-
queue %{
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
64
|
+
queue %{
|
65
|
+
echo "-----> Cleaning up old releases (keeping #{keep_releases!})"
|
66
|
+
#{echo_cmd %{cd "#{deploy_to!}/#{releases_path!}" || exit 15}}
|
67
|
+
#{echo_cmd %{count=`ls -1d [0-9]* | sort -rn | wc -l`}}
|
68
|
+
#{echo_cmd %{remove=$((count > 5 ? count - #{keep_releases} : 0))}}
|
69
|
+
#{echo_cmd %{ls -1d [0-9]* | sort -rn | tail -n $remove | xargs rm -rf {}}}
|
70
|
+
}
|
42
71
|
end
|
43
72
|
end
|
44
73
|
|
74
|
+
# ### setup
|
75
|
+
# Sets up a site's directory structure.
|
76
|
+
|
45
77
|
desc "Sets up a site."
|
46
78
|
task :setup do
|
47
|
-
|
79
|
+
set_default :term_mode, :pretty
|
48
80
|
|
49
81
|
settings.deploy_to!
|
50
82
|
|
@@ -73,8 +105,13 @@ task :setup do
|
|
73
105
|
}
|
74
106
|
end
|
75
107
|
|
108
|
+
# ### run[]
|
109
|
+
# Runs a command on a server.
|
110
|
+
#
|
111
|
+
# $ mina run[tail -f logs.txt]
|
112
|
+
|
76
113
|
desc "Runs a command in the server."
|
77
|
-
task :run, :command do |t, args|
|
114
|
+
task :run, [:command] => [:environment] do |t, args|
|
78
115
|
command = args[:command]
|
79
116
|
unless command
|
80
117
|
puts %[You need to provide a command. Try: mina "run[ls -la]"]
|
data/lib/mina/deploy_helpers.rb
CHANGED
@@ -1,7 +1,9 @@
|
|
1
|
+
# # Helpers: Deploy helpers
|
2
|
+
# Helpers for deployment.
|
1
3
|
module Mina
|
2
|
-
# Helpers for deployment
|
3
4
|
module DeployHelpers
|
4
|
-
#
|
5
|
+
# ### deploy
|
6
|
+
# Wraps the things inside it in a deploy script and queues it.
|
5
7
|
# This generates a script using deploy_script and queues it.
|
6
8
|
#
|
7
9
|
# Returns nothing.
|
@@ -10,6 +12,7 @@ module Mina
|
|
10
12
|
queue deploy_script(&blk)
|
11
13
|
end
|
12
14
|
|
15
|
+
# ### deploy_script
|
13
16
|
# Wraps the things inside it in a deploy script.
|
14
17
|
#
|
15
18
|
# script = deploy_script do
|
data/lib/mina/git.rb
CHANGED
@@ -1,6 +1,23 @@
|
|
1
|
-
|
1
|
+
# # Modules: Git
|
2
|
+
# Adds settings and tasks related to managing Git.
|
3
|
+
#
|
4
|
+
# require 'mina/git'
|
5
|
+
|
6
|
+
# ## Settings
|
7
|
+
# Any and all of these settings can be overriden in your `deploy.rb`.
|
8
|
+
|
9
|
+
# ### branch
|
10
|
+
# Sets the branch to be deployed.
|
11
|
+
|
12
|
+
set_default :branch, "master"
|
2
13
|
|
3
14
|
namespace :git do
|
15
|
+
# ## Deploy tasks
|
16
|
+
# These tasks are meant to be invoked inside deploy scripts, not invoked on
|
17
|
+
# their own.
|
18
|
+
|
19
|
+
# ### git:clone
|
20
|
+
# Clones the Git repository. Meant to be used inside a deploy script.
|
4
21
|
desc "Clones the Git repository to the release path."
|
5
22
|
task :clone do
|
6
23
|
if revision?
|
@@ -32,7 +49,7 @@ namespace :git do
|
|
32
49
|
status = %[
|
33
50
|
echo "-----> Using this git commit" &&
|
34
51
|
echo &&
|
35
|
-
#{echo_cmd %[git log --format="%aN (%h):%n> %s" -n 1]} &&
|
52
|
+
#{echo_cmd %[git --no-pager log --format="%aN (%h):%n> %s" -n 1]} &&
|
36
53
|
#{echo_cmd %[rm -rf .git]} &&
|
37
54
|
echo
|
38
55
|
]
|
data/lib/mina/helpers.rb
CHANGED
@@ -1,7 +1,8 @@
|
|
1
|
+
# # Helpers: Default helpers
|
1
2
|
module Mina
|
2
|
-
# Helpers
|
3
3
|
module Helpers
|
4
4
|
|
5
|
+
# ### invoke
|
5
6
|
# Invokes another Rake task.
|
6
7
|
#
|
7
8
|
# Invokes the task given in `task`. Returns nothing.
|
@@ -13,6 +14,7 @@ module Mina
|
|
13
14
|
Rake.application.invoke_task task
|
14
15
|
end
|
15
16
|
|
17
|
+
# ### erb
|
16
18
|
# Evaluates an ERB block in the current scope and returns a string.
|
17
19
|
#
|
18
20
|
# a = 1
|
@@ -31,6 +33,7 @@ module Mina
|
|
31
33
|
erb.result b
|
32
34
|
end
|
33
35
|
|
36
|
+
# ### run!
|
34
37
|
# SSHs into the host and runs the code that has been queued.
|
35
38
|
#
|
36
39
|
# This is already automatically invoked before Rake exits to run all
|
@@ -45,6 +48,7 @@ module Mina
|
|
45
48
|
report_time { ssh commands(:default) }
|
46
49
|
end
|
47
50
|
|
51
|
+
# ### report_time
|
48
52
|
# Report time elapsed in the block.
|
49
53
|
# Returns the output of the block.
|
50
54
|
def report_time(&blk)
|
@@ -53,6 +57,7 @@ module Mina
|
|
53
57
|
output
|
54
58
|
end
|
55
59
|
|
60
|
+
# ### measure
|
56
61
|
# Measures the time (in ms) a block takes.
|
57
62
|
# Returns a [time, output] tuple.
|
58
63
|
def measure(&blk)
|
@@ -61,14 +66,19 @@ module Mina
|
|
61
66
|
[(Time.now - t).to_i, output]
|
62
67
|
end
|
63
68
|
|
69
|
+
# ## SSH helpers
|
70
|
+
# You don't need to invoke these helpers, they're already invoked automatically.
|
71
|
+
|
72
|
+
# ### ssh
|
64
73
|
# Executes a command via SSH.
|
65
74
|
#
|
66
75
|
# Returns nothing usually, but if `{ return: true }` is given, returns the
|
67
76
|
# STDOUT output of the SSH session.
|
68
77
|
#
|
69
|
-
# options
|
70
|
-
#
|
71
|
-
#
|
78
|
+
# `options` is a hash of options:
|
79
|
+
#
|
80
|
+
# - `:pretty` - Prettify the output if true.
|
81
|
+
# - `:return` - If set to true, returns the output.
|
72
82
|
#
|
73
83
|
# Example
|
74
84
|
#
|
@@ -80,10 +90,10 @@ module Mina
|
|
80
90
|
require 'shellwords'
|
81
91
|
|
82
92
|
result = 0
|
83
|
-
script = Shellwords.escape(
|
93
|
+
script = Shellwords.escape(cmd)
|
84
94
|
|
85
95
|
if options[:return] == true
|
86
|
-
result = `#{ssh_command} --
|
96
|
+
result = `#{ssh_command} -- #{script}`
|
87
97
|
|
88
98
|
elsif simulate_mode?
|
89
99
|
str = "Executing the following via '#{ssh_command}':"
|
@@ -94,7 +104,7 @@ module Mina
|
|
94
104
|
puts cmd
|
95
105
|
|
96
106
|
else
|
97
|
-
code = "#{ssh_command} --
|
107
|
+
code = "#{ssh_command} -- #{script}"
|
98
108
|
if settings.term_mode == :pretty
|
99
109
|
result = pretty_system(code)
|
100
110
|
elsif settings.term_mode == :exec
|
@@ -105,24 +115,11 @@ module Mina
|
|
105
115
|
end
|
106
116
|
end
|
107
117
|
|
108
|
-
die result if result > 0
|
118
|
+
die result if result.is_a? Fixnum && result > 0
|
109
119
|
result
|
110
120
|
end
|
111
121
|
|
112
|
-
#
|
113
|
-
# Returns nothing.
|
114
|
-
#
|
115
|
-
# die 2
|
116
|
-
# die 2, "Tests failed"
|
117
|
-
#
|
118
|
-
def die(code, msg=null)
|
119
|
-
str = "Failed with status #{code}"
|
120
|
-
str += " (#{msg})" if msg
|
121
|
-
err = Failed.new(str)
|
122
|
-
err.exitstatus = code
|
123
|
-
raise err
|
124
|
-
end
|
125
|
-
|
122
|
+
# ### ssh_command
|
126
123
|
# Returns the SSH command to be executed.
|
127
124
|
#
|
128
125
|
# set :domain, 'foo.com'
|
@@ -140,6 +137,42 @@ module Mina
|
|
140
137
|
"ssh #{args}"
|
141
138
|
end
|
142
139
|
|
140
|
+
# ### mina_cleanup
|
141
|
+
# __Internal:__ Invoked when Rake exits.
|
142
|
+
#
|
143
|
+
# Returns nothing.
|
144
|
+
#
|
145
|
+
def mina_cleanup!
|
146
|
+
run! if commands.any?
|
147
|
+
end
|
148
|
+
|
149
|
+
# ## Errors
|
150
|
+
|
151
|
+
# ### die
|
152
|
+
# Exits with a nice looking message.
|
153
|
+
# Returns nothing.
|
154
|
+
#
|
155
|
+
# die 2
|
156
|
+
# die 2, "Tests failed"
|
157
|
+
#
|
158
|
+
def die(code=1, msg=null)
|
159
|
+
str = "Failed with status #{code}"
|
160
|
+
str += " (#{msg})" if msg
|
161
|
+
err = Failed.new(str)
|
162
|
+
err.exitstatus = code
|
163
|
+
raise err
|
164
|
+
end
|
165
|
+
|
166
|
+
# ### error
|
167
|
+
# __Internal:__ Prints to stdout.
|
168
|
+
# Consider using `print_error` instead.
|
169
|
+
def error(str)
|
170
|
+
$stderr.write "#{str}\n"
|
171
|
+
end
|
172
|
+
|
173
|
+
# ## Queueing
|
174
|
+
|
175
|
+
# ### queue
|
143
176
|
# Queues code to be ran.
|
144
177
|
#
|
145
178
|
# This queues code to be ran to the current code bucket (defaults to `:default`).
|
@@ -157,30 +190,35 @@ module Mina
|
|
157
190
|
commands(@to) << unindent(code)
|
158
191
|
end
|
159
192
|
|
160
|
-
#
|
193
|
+
# ### queue!
|
194
|
+
# Shortcut for `queue`ing a command that shows up in verbose mode.
|
195
|
+
|
196
|
+
def queue!(code)
|
197
|
+
queue echo_cmd(code)
|
198
|
+
end
|
199
|
+
|
200
|
+
# ### echo_cmd
|
201
|
+
# Converts a bash command to a command that echoes before execution.
|
202
|
+
# Used to show commands in verbose mode. This does nothing unless verbose mode is on.
|
161
203
|
#
|
162
|
-
# Returns the
|
204
|
+
# Returns a string of the compound bash command, typically in the format of
|
205
|
+
# `echo xx && xx`. However, if `verbose_mode?` is false, it returns the
|
206
|
+
# input string unharmed.
|
163
207
|
#
|
164
|
-
#
|
165
|
-
#
|
166
|
-
# There
|
167
|
-
# }
|
168
|
-
# # Output:
|
169
|
-
# # Hello
|
170
|
-
# # There
|
208
|
+
# echo_cmd("ln -nfs releases/2 current")
|
209
|
+
# #=> echo "$ ln -nfs releases/2 current" && ln -nfs releases/2 current
|
171
210
|
#
|
172
|
-
def
|
173
|
-
if
|
174
|
-
|
211
|
+
def echo_cmd(str)
|
212
|
+
if verbose_mode?
|
213
|
+
"echo #{Shellwords.escape("$ " + str)} &&\n#{str}"
|
214
|
+
else
|
215
|
+
str
|
175
216
|
end
|
176
|
-
|
177
|
-
code.strip
|
178
217
|
end
|
179
218
|
|
180
|
-
|
181
|
-
indent n, unindent(code)
|
182
|
-
end
|
219
|
+
# ## Commands
|
183
220
|
|
221
|
+
# ### commands
|
184
222
|
# Returns an array of queued code strings.
|
185
223
|
#
|
186
224
|
# You may give an optional `aspect`.
|
@@ -204,20 +242,21 @@ module Mina
|
|
204
242
|
end)[aspect]
|
205
243
|
end
|
206
244
|
|
207
|
-
#
|
245
|
+
# ### isolate
|
246
|
+
# Starts a new block where new `commands` are collected.
|
208
247
|
#
|
209
248
|
# Returns nothing.
|
210
249
|
#
|
211
|
-
#
|
212
|
-
#
|
213
|
-
#
|
250
|
+
# queue "sudo restart"
|
251
|
+
# queue "true"
|
252
|
+
# commands.should == ['sudo restart', 'true']
|
214
253
|
#
|
215
|
-
#
|
216
|
-
#
|
217
|
-
#
|
218
|
-
#
|
254
|
+
# isolate do
|
255
|
+
# queue "reload"
|
256
|
+
# commands.should == ['reload']
|
257
|
+
# end
|
219
258
|
#
|
220
|
-
#
|
259
|
+
# commands.should == ['sudo restart', 'true']
|
221
260
|
#
|
222
261
|
def isolate(&blk)
|
223
262
|
old, @commands = @commands, nil
|
@@ -226,6 +265,7 @@ module Mina
|
|
226
265
|
result
|
227
266
|
end
|
228
267
|
|
268
|
+
# ### in_directory
|
229
269
|
# Starts a new block where #commands are collected, to be executed inside `path`.
|
230
270
|
#
|
231
271
|
# Returns nothing.
|
@@ -263,6 +303,9 @@ module Mina
|
|
263
303
|
@to = old
|
264
304
|
end
|
265
305
|
|
306
|
+
# ## Settings helpers
|
307
|
+
|
308
|
+
# ### set
|
266
309
|
# Sets settings.
|
267
310
|
# Sets given symbol `key` to value in `value`.
|
268
311
|
#
|
@@ -274,6 +317,7 @@ module Mina
|
|
274
317
|
settings.send :"#{key}=", value
|
275
318
|
end
|
276
319
|
|
320
|
+
# ### set_default
|
277
321
|
# Sets default settings.
|
278
322
|
# Sets given symbol `key` to value in `value` only if the key isn't set yet.
|
279
323
|
#
|
@@ -291,9 +335,11 @@ module Mina
|
|
291
335
|
settings.send :"#{key}=", value unless settings.send(:"#{key}?")
|
292
336
|
end
|
293
337
|
|
338
|
+
# ### settings
|
294
339
|
# Accesses the settings hash.
|
295
340
|
#
|
296
341
|
# set :domain, 'kickflip.me'
|
342
|
+
#
|
297
343
|
# settings.domain #=> 'kickflip.me'
|
298
344
|
# domain #=> 'kickflip.me'
|
299
345
|
#
|
@@ -301,6 +347,7 @@ module Mina
|
|
301
347
|
@settings ||= Settings.new
|
302
348
|
end
|
303
349
|
|
350
|
+
# ### method_missing
|
304
351
|
# Hook to get settings.
|
305
352
|
# See #settings for an explanation.
|
306
353
|
#
|
@@ -310,40 +357,9 @@ module Mina
|
|
310
357
|
settings.send meth, *args
|
311
358
|
end
|
312
359
|
|
313
|
-
|
314
|
-
str.gsub(/^/, " "*count)
|
315
|
-
end
|
316
|
-
|
317
|
-
def error(str)
|
318
|
-
$stderr.write "#{str}\n"
|
319
|
-
end
|
320
|
-
|
321
|
-
# Converts a bash command to a command that echoes before execution.
|
322
|
-
# Used to show commands in verbose mode. This does nothing unless verbose mode is on.
|
323
|
-
#
|
324
|
-
# Returns a string of the compound bash command, typically in the format of
|
325
|
-
# `echo xx && xx`. However, if `verbose_mode?` is false, it returns the
|
326
|
-
# input string unharmed.
|
327
|
-
#
|
328
|
-
# echo_cmd("ln -nfs releases/2 current")
|
329
|
-
# #=> echo "$ ln -nfs releases/2 current" && ln -nfs releases/2 current
|
330
|
-
#
|
331
|
-
def echo_cmd(str)
|
332
|
-
if verbose_mode?
|
333
|
-
"echo #{("$ " + str).inspect} &&\n#{str}"
|
334
|
-
else
|
335
|
-
str
|
336
|
-
end
|
337
|
-
end
|
338
|
-
|
339
|
-
# Internal: Invoked when Rake exits.
|
340
|
-
#
|
341
|
-
# Returns nothing.
|
342
|
-
#
|
343
|
-
def mina_cleanup!
|
344
|
-
run! if commands.any?
|
345
|
-
end
|
360
|
+
# ## Command line mode helpers
|
346
361
|
|
362
|
+
# ### verbose_mode?
|
347
363
|
# Checks if Rake was invoked with --verbose.
|
348
364
|
#
|
349
365
|
# Returns true or false.
|
@@ -358,6 +374,7 @@ module Mina
|
|
358
374
|
end
|
359
375
|
end
|
360
376
|
|
377
|
+
# ### simulate_mode?
|
361
378
|
# Checks if Rake was invoked with --simulate.
|
362
379
|
#
|
363
380
|
# Returns true or false.
|
@@ -365,5 +382,41 @@ module Mina
|
|
365
382
|
def simulate_mode?
|
366
383
|
!! ENV['simulate']
|
367
384
|
end
|
385
|
+
|
386
|
+
# ## Internal helpers
|
387
|
+
|
388
|
+
# ### indent
|
389
|
+
# Indents a given code block with `count` spaces before it.
|
390
|
+
def indent(count, str)
|
391
|
+
str.gsub(/^/, " "*count)
|
392
|
+
end
|
393
|
+
|
394
|
+
# ### unindent
|
395
|
+
# __Internal:__ Normalizes indentation on a given string.
|
396
|
+
#
|
397
|
+
# Returns the normalized string without extraneous indentation.
|
398
|
+
#
|
399
|
+
# puts unindent %{
|
400
|
+
# Hello
|
401
|
+
# There
|
402
|
+
# }
|
403
|
+
# # Output:
|
404
|
+
# # Hello
|
405
|
+
# # There
|
406
|
+
#
|
407
|
+
def unindent(code)
|
408
|
+
if code =~ /^\n([ \t]+)/
|
409
|
+
code = code.gsub(/^#{$1}/, '')
|
410
|
+
end
|
411
|
+
|
412
|
+
code.strip
|
413
|
+
end
|
414
|
+
|
415
|
+
# ### reindent
|
416
|
+
# Resets the indentation on a given code block.
|
417
|
+
def reindent(n, code)
|
418
|
+
indent n, unindent(code)
|
419
|
+
end
|
420
|
+
|
368
421
|
end
|
369
422
|
end
|
data/lib/mina/output_helpers.rb
CHANGED
@@ -1,35 +1,49 @@
|
|
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.
|
1
4
|
module Mina
|
2
5
|
module OutputHelpers
|
3
|
-
|
4
|
-
#
|
6
|
+
|
7
|
+
# ### print_status
|
8
|
+
# Prints a status message. (`----->`)
|
5
9
|
def print_status(msg)
|
6
10
|
puts "" if verbose_mode?
|
7
11
|
puts "#{color('----->', 32)} #{msg}"
|
8
12
|
end
|
9
13
|
|
14
|
+
# ### print_error
|
15
|
+
# Prints an error message (header).
|
10
16
|
def print_error(msg)
|
11
17
|
puts " #{color("!", 33)} #{color(msg, 31)}"
|
12
18
|
end
|
13
19
|
|
20
|
+
# ### print_stderr
|
21
|
+
# Prints an error message (body), or prints stderr output.
|
14
22
|
def print_stderr(msg)
|
15
23
|
puts " #{color(msg, 31)}"
|
16
24
|
end
|
17
25
|
|
26
|
+
# ### print_command
|
27
|
+
# Prints a command.
|
18
28
|
def print_command(msg)
|
19
29
|
puts " #{color("$", 32)} #{color(msg, 32)}"
|
20
30
|
end
|
21
31
|
|
32
|
+
# ### print_stdout
|
33
|
+
# Prints a normal message.
|
22
34
|
def print_stdout(msg)
|
23
35
|
puts " #{msg}"
|
24
36
|
end
|
25
37
|
|
26
|
-
#
|
38
|
+
# ### color
|
39
|
+
# Colorizes a string.
|
27
40
|
# Returns the string `str` with the color `c`.
|
28
41
|
def color(str, c)
|
29
42
|
ENV['NO_COLOR'] ? str : "\033[#{c}m#{str}\033[0m"
|
30
43
|
end
|
31
44
|
|
32
|
-
#
|
45
|
+
# ### print_str
|
46
|
+
# Prints a string by delegating it to the proper output helper.
|
33
47
|
#
|
34
48
|
# It takes an input with text and prints them nicely. The text block can
|
35
49
|
# have statuses (prefixed with `-----> `), errors (prefixed with `! `),
|
@@ -55,7 +69,8 @@ module Mina
|
|
55
69
|
end
|
56
70
|
end
|
57
71
|
|
58
|
-
#
|
72
|
+
# ### pretty_system
|
73
|
+
# __Internal:__ Works like `system`, but indents and puts color.
|
59
74
|
#
|
60
75
|
# Returns the exit code in integer form.
|
61
76
|
#
|
data/lib/mina/rails.rb
CHANGED
@@ -1,33 +1,65 @@
|
|
1
|
+
# # Modules: Rails
|
2
|
+
# Adds settings and tasks for managing Rails projects.
|
3
|
+
#
|
4
|
+
# require 'mina/rails'
|
5
|
+
|
1
6
|
require 'mina/bundler'
|
2
7
|
|
3
|
-
|
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
|
+
set_default :rails_env, 'production'
|
17
|
+
|
18
|
+
# ### bundle_prefix
|
19
|
+
# Prefix for Bundler commands.
|
4
20
|
# TODO: This should be lambda
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
21
|
+
|
22
|
+
set_default :bundle_prefix, lambda { %{RAILS_ENV="#{rails_env}" #{bundle_bin} exec} }
|
23
|
+
|
24
|
+
# ### rake
|
25
|
+
# The prefix for `rake` commands. Use like so:
|
26
|
+
#
|
27
|
+
# queue "#{rake} db:migrate"
|
28
|
+
|
29
|
+
set_default :rake, lambda { %{#{bundle_prefix} rake} }
|
30
|
+
|
31
|
+
# ### rails
|
32
|
+
# The prefix for `rails` commands. Use like so:
|
33
|
+
#
|
34
|
+
# queue "#{rails} console"
|
35
|
+
|
36
|
+
set_default :rails, lambda { %{#{bundle_prefix} rails} }
|
37
|
+
|
38
|
+
# ### asset_paths
|
39
|
+
# The paths to be checked.
|
40
|
+
#
|
41
|
+
# Whenever assets are compiled, the asset files are checked if they have
|
42
|
+
# changed from the previous release.
|
43
|
+
#
|
44
|
+
# If they're unchanged, compiled assets will simply be copied over to the new
|
45
|
+
# release.
|
46
|
+
#
|
47
|
+
# Override this if you have custom asset paths declared in your Rails's
|
48
|
+
# `config.assets.paths` setting.
|
49
|
+
|
50
|
+
set_default :asset_paths, ['vendor/assets/', 'app/assets/']
|
51
|
+
|
52
|
+
# ### rake_assets_precompile
|
53
|
+
# The command to invoke when precompiling assets.
|
54
|
+
# Override me if you like.
|
55
|
+
|
56
|
+
settings.rake_assets_precompile ||= lambda { "#{rake} assets:precompile RAILS_GROUPS=assets" }
|
57
|
+
|
58
|
+
# ----
|
27
59
|
|
28
60
|
# Macro used later by :rails, :rake, etc
|
29
61
|
make_run_task = lambda { |name, sample_args|
|
30
|
-
task name, :arguments do |t, args|
|
62
|
+
task name, [:arguments] => :environment do |t, args|
|
31
63
|
arguments = args[:arguments]
|
32
64
|
command = send name
|
33
65
|
unless command
|
@@ -61,18 +93,41 @@ def check_for_changes_script(options={})
|
|
61
93
|
]
|
62
94
|
end
|
63
95
|
|
96
|
+
# ## Command-line tasks
|
97
|
+
# These tasks can be invoked in the command line.
|
98
|
+
|
99
|
+
# ### rails[]
|
100
|
+
# Invokes a rails command.
|
101
|
+
#
|
102
|
+
# $ mina rails[console]
|
103
|
+
|
64
104
|
desc "Execute a Rails command in the current deploy."
|
65
105
|
make_run_task[:rails, 'console']
|
66
106
|
|
107
|
+
# ### rake[]
|
108
|
+
# Invokes a rake command.
|
109
|
+
#
|
110
|
+
# $ mina rake db:cleanup
|
111
|
+
|
67
112
|
desc "Execute a Rake command in the current deploy."
|
68
113
|
make_run_task[:rake, 'db:migrate']
|
69
114
|
|
115
|
+
# ### console
|
116
|
+
# Opens the Ruby console for the currently-deployed version.
|
117
|
+
#
|
118
|
+
# $ mina console
|
119
|
+
|
70
120
|
desc "Starts an interactive console."
|
71
121
|
task :console do
|
72
|
-
queue echo_cmd %[cd "#{deploy_to!}/#{current_path!}" && #{rails} console]
|
122
|
+
queue echo_cmd %[cd "#{deploy_to!}/#{current_path!}" && #{rails} console && exit]
|
73
123
|
end
|
74
124
|
|
125
|
+
# ## Deploy tasks
|
126
|
+
# These tasks are meant to be invoked inside deploy scripts, not invoked on
|
127
|
+
# their own.
|
128
|
+
|
75
129
|
namespace :rails do
|
130
|
+
# ### rails:db_migrate
|
76
131
|
desc "Migrates the Rails database (skips if nothing has changed since the last release)."
|
77
132
|
task :db_migrate do
|
78
133
|
if ENV['force_migrate']
|
@@ -99,6 +154,7 @@ namespace :rails do
|
|
99
154
|
end
|
100
155
|
end
|
101
156
|
|
157
|
+
# ### rails:db_migrate:force
|
102
158
|
desc "Migrates the Rails database."
|
103
159
|
task :'db_migrate:force' do
|
104
160
|
queue %{
|
@@ -107,6 +163,7 @@ namespace :rails do
|
|
107
163
|
}
|
108
164
|
end
|
109
165
|
|
166
|
+
# ### rails:assets_precompile:force
|
110
167
|
desc "Precompiles assets."
|
111
168
|
task :'assets_precompile:force' do
|
112
169
|
queue %{
|
@@ -115,6 +172,7 @@ namespace :rails do
|
|
115
172
|
}
|
116
173
|
end
|
117
174
|
|
175
|
+
# ### rails:assets_precompile
|
118
176
|
desc "Precompiles assets (skips if nothing has changed since the last release)."
|
119
177
|
task :'assets_precompile' do
|
120
178
|
if ENV['force_assets']
|
data/lib/mina/rbenv.rb
ADDED
@@ -0,0 +1,46 @@
|
|
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 PATH="#{rbenv_path}/bin:$PATH"}}
|
37
|
+
|
38
|
+
if ! which -s rbenv >/dev/null; then
|
39
|
+
echo "! rbenv not found"
|
40
|
+
echo "! If rbenv is installed, check your :rbenv_path setting."
|
41
|
+
exit 1
|
42
|
+
fi
|
43
|
+
|
44
|
+
#{echo_cmd %{eval "$(rbenv init -)"}}
|
45
|
+
}
|
46
|
+
end
|
data/lib/mina/rvm.rb
ADDED
@@ -0,0 +1,58 @@
|
|
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]}"}} || exit 1
|
57
|
+
}
|
58
|
+
end
|
data/lib/mina/version.rb
CHANGED
@@ -0,0 +1,28 @@
|
|
1
|
+
# # Modules: Whenever
|
2
|
+
# Adds settings and tasks for managing projects with [whenever}.
|
3
|
+
#
|
4
|
+
# [whenever]: http://rubygems.org/gems/whenever
|
5
|
+
|
6
|
+
namespace :whenever do
|
7
|
+
desc "Clear crontab"
|
8
|
+
task :clear do
|
9
|
+
queue %{
|
10
|
+
echo "-----> Clear crontab for #{domain}"
|
11
|
+
#{echo_cmd %[cd #{deploy_to!}/#{current_path!} ; bundle exec whenever --clear-crontab #{domain} --set 'environment=production&path=#{deploy_to!}/#{current_path!}']}
|
12
|
+
}
|
13
|
+
end
|
14
|
+
desc "Update crontab"
|
15
|
+
task :update do
|
16
|
+
queue %{
|
17
|
+
echo "-----> Update crontab for #{domain}"
|
18
|
+
#{echo_cmd %[cd #{deploy_to!}/#{current_path!} ; bundle exec whenever --update-crontab #{domain} --set 'environment=production&path=#{deploy_to!}/#{current_path!}']}
|
19
|
+
}
|
20
|
+
end
|
21
|
+
desc "Write crontab"
|
22
|
+
task :write do
|
23
|
+
queue %{
|
24
|
+
echo "-----> Update crontab for #{domain}"
|
25
|
+
#{echo_cmd %[cd #{deploy_to!}/#{current_path!} ; bundle exec whenever --write-crontab #{domain} --set 'environment=production&path=#{deploy_to!}/#{current_path!}']}
|
26
|
+
}
|
27
|
+
end
|
28
|
+
end
|
data/manual/index.md
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
# Welcome to Mina
|
2
|
+
|
3
|
+
Really fast deployer and server automation tool.
|
4
|
+
|
5
|
+
Mina works really fast because it's a deploy Bash script generator. It
|
6
|
+
generates an entire procedure as a Bash script and runs it remotely in the
|
7
|
+
server.
|
8
|
+
|
9
|
+
Compare this to the likes of Vlad or Capistrano, where each command
|
10
|
+
is ran separately on their own SSH sessions. Mina only creates *one* SSH
|
11
|
+
session per deploy, minimizing the SSH connection overhead.
|
12
|
+
|
13
|
+
$ gem install mina
|
14
|
+
$ mina
|
15
|
+
|
data/manual/modules.md
ADDED
@@ -9,12 +9,12 @@ describe "Invoking the 'mina' command in a project" do
|
|
9
9
|
it 'should echo commands in verbose mode' do
|
10
10
|
mina 'deploy', '--verbose', '--simulate'
|
11
11
|
|
12
|
-
stdout.should include %[echo
|
12
|
+
stdout.should include %[echo #{Shellwords.escape('$ git')}]
|
13
13
|
end
|
14
14
|
|
15
15
|
it 'should not echo commands when not in verbose mode' do
|
16
16
|
mina 'deploy', '--simulate'
|
17
17
|
|
18
|
-
stdout.should_not include %[echo
|
18
|
+
stdout.should_not include %[echo #{Shellwords.escape('$ git')}]
|
19
19
|
end
|
20
20
|
end
|
data/test_env/config/deploy.rb
CHANGED
@@ -11,6 +11,8 @@
|
|
11
11
|
# In fact, let's make that folder right now.
|
12
12
|
require 'fileutils'
|
13
13
|
FileUtils.mkdir_p "#{Dir.pwd}/deploy"
|
14
|
+
FileUtils.mkdir_p "#{Dir.pwd}/deploy/config"
|
15
|
+
File.open("#{Dir.pwd}/deploy/config/database.yml", 'w') { |f| f.write "Hello" }
|
14
16
|
|
15
17
|
# -- Stubs end, deploy script begins! --------------
|
16
18
|
|
@@ -21,6 +23,11 @@ require 'mina/git'
|
|
21
23
|
set :domain, 'localhost'
|
22
24
|
set :deploy_to, "#{Dir.pwd}/deploy"
|
23
25
|
set :repository, "#{Mina.root_path}"
|
26
|
+
set :shared_paths, ['config/database.yml']
|
27
|
+
|
28
|
+
task :environment do
|
29
|
+
queue %[echo "-----> Loading env"]
|
30
|
+
end
|
24
31
|
|
25
32
|
desc "Deploys."
|
26
33
|
task :deploy do
|
@@ -29,6 +36,7 @@ task :deploy do
|
|
29
36
|
deploy do
|
30
37
|
queue %[ruby -e "\\$stderr.write \\\"This is stdout output\n\\\""]
|
31
38
|
invoke :'git:clone'
|
39
|
+
invoke :'deploy:link_shared_paths'
|
32
40
|
invoke :'bundle:install'
|
33
41
|
invoke :'rails:db_migrate'
|
34
42
|
|
metadata
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mina
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.0
|
5
|
-
prerelease:
|
4
|
+
version: 0.2.0
|
5
|
+
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Rico Sta. Cruz
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2012-08
|
13
|
+
date: 2012-09-08 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: rake
|
@@ -90,9 +90,14 @@ files:
|
|
90
90
|
- lib/mina/output_helpers.rb
|
91
91
|
- lib/mina/rails.rb
|
92
92
|
- lib/mina/rake.rb
|
93
|
+
- lib/mina/rbenv.rb
|
94
|
+
- lib/mina/rvm.rb
|
93
95
|
- lib/mina/settings.rb
|
94
96
|
- lib/mina/tools.rb
|
95
97
|
- lib/mina/version.rb
|
98
|
+
- lib/mina/whenever.rb
|
99
|
+
- manual/index.md
|
100
|
+
- manual/modules.md
|
96
101
|
- mina.gemspec
|
97
102
|
- spec/command_helper.rb
|
98
103
|
- spec/commands/command_spec.rb
|
@@ -124,9 +129,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
124
129
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
125
130
|
none: false
|
126
131
|
requirements:
|
127
|
-
- - ! '
|
132
|
+
- - ! '>='
|
128
133
|
- !ruby/object:Gem::Version
|
129
|
-
version:
|
134
|
+
version: '0'
|
130
135
|
requirements: []
|
131
136
|
rubyforge_project:
|
132
137
|
rubygems_version: 1.8.23
|