mina 1.2.3 → 1.2.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.github/workflows/ci.yml +26 -0
- data/.gitignore +0 -1
- data/.rspec +1 -1
- data/.rubocop.yml +28 -1126
- data/CHANGELOG.md +126 -3
- data/Gemfile +2 -0
- data/Gemfile.lock +73 -0
- data/Rakefile +2 -0
- data/Readme.md +8 -12
- data/bin/mina +2 -0
- data/data/deploy.rb +10 -6
- data/docs/3rd_party_plugins.md +3 -0
- data/docs/assets/images/mina.png +0 -0
- data/docs/cookbook.md +1 -1
- data/docs/default_plugins.md +5 -5
- data/docs/how_mina_works.md +3 -3
- data/lib/Minafile +1 -0
- data/lib/mina/application.rb +45 -35
- data/lib/mina/backend/local.rb +2 -0
- data/lib/mina/backend/remote.rb +3 -1
- data/lib/mina/commands.rb +10 -7
- data/lib/mina/configuration.rb +6 -3
- data/lib/mina/dsl.rb +2 -2
- data/lib/mina/helpers/internal.rb +9 -9
- data/lib/mina/helpers/output.rb +5 -3
- data/lib/mina/runner/exec.rb +2 -0
- data/lib/mina/runner/pretty.rb +25 -19
- data/lib/mina/runner/printer.rb +2 -0
- data/lib/mina/runner/system.rb +2 -0
- data/lib/mina/runner.rb +9 -10
- data/lib/mina/version.rb +3 -1
- data/lib/mina/windows_patches.rb +4 -2
- data/lib/mina.rb +4 -3
- data/mina.gemspec +8 -7
- data/spec/configs/default.rb +8 -0
- data/spec/configs/dsl.rb +55 -0
- data/spec/configs/e2e.rb +25 -0
- data/spec/e2e/docker-compose.yml +21 -0
- data/spec/e2e/e2e_run.sh +11 -0
- data/spec/e2e/e2e_spec.rb +35 -0
- data/spec/e2e/ssh +27 -0
- data/spec/e2e/ssh.pub +1 -0
- data/spec/lib/mina/application_spec.rb +94 -35
- data/spec/lib/mina/backend/local_spec.rb +5 -2
- data/spec/lib/mina/backend/remote_spec.rb +5 -3
- data/spec/lib/mina/commands_spec.rb +7 -7
- data/spec/lib/mina/configuration_spec.rb +63 -3
- data/spec/lib/mina/dsl_spec.rb +94 -0
- data/spec/lib/mina/helpers/internal_spec.rb +89 -11
- data/spec/lib/mina/helpers/output_spec.rb +13 -10
- data/spec/lib/mina/runner/exec_spec.rb +19 -0
- data/spec/lib/mina/runner/pretty_spec.rb +17 -0
- data/spec/lib/mina/runner/printer_spec.rb +19 -0
- data/spec/lib/mina/runner/system_spec.rb +19 -0
- data/spec/lib/mina/runner_spec.rb +6 -10
- data/spec/spec_helper.rb +33 -14
- data/spec/support/outputs/bundle_clean.txt +2 -2
- data/spec/support/outputs/chruby_with_env.txt +7 -0
- data/spec/support/outputs/chruby_without_env.txt +2 -0
- data/spec/support/outputs/debug_configuration_variables.txt +11 -0
- data/spec/support/outputs/dsl_deploy.txt +4 -0
- data/spec/support/outputs/dsl_in_path.txt +1 -0
- data/spec/support/outputs/dsl_local_run.txt +5 -0
- data/spec/support/outputs/dsl_on.txt +6 -0
- data/spec/support/outputs/dsl_remote_run.txt +5 -0
- data/spec/support/outputs/dsl_reset.txt +2 -0
- data/spec/support/outputs/e2e_deploy_after_setup.txt +1 -0
- data/spec/support/outputs/e2e_deploy_without_setup.txt +1 -0
- data/spec/support/outputs/e2e_setup.txt +1 -0
- data/spec/support/outputs/environment.txt +1 -0
- data/spec/support/outputs/git_clone.txt +1 -1
- data/spec/support/outputs/git_clone_commit.txt +1 -1
- data/spec/support/outputs/git_ensure_pushed.txt +15 -0
- data/spec/support/outputs/rails_assets_precompile_force_precompile.txt +2 -0
- data/spec/support/outputs/rails_assets_precompile_outside_deploy_block.txt +1 -0
- data/spec/support/outputs/rails_assets_precompile_with_diff.txt +7 -0
- data/spec/support/outputs/rails_console.txt +1 -0
- data/spec/support/outputs/rails_db_migrate_force_migrate.txt +2 -0
- data/spec/support/outputs/rails_db_migrate_outside_deploy_block.txt +1 -0
- data/spec/support/outputs/rails_db_migrate_with_diff.txt +7 -0
- data/spec/support/outputs/rails_log.txt +1 -0
- data/spec/support/outputs/rails_with_arguments.txt +1 -0
- data/spec/support/outputs/rails_without_arguments.txt +1 -0
- data/spec/support/outputs/rake_with_arguments.txt +1 -0
- data/spec/support/outputs/rake_without_arguments.txt +1 -0
- data/spec/support/outputs/rbenv_load.txt +9 -1
- data/spec/support/outputs/rvm_use_with_env.txt +8 -0
- data/spec/support/outputs/rvm_use_without_env.txt +2 -0
- data/spec/support/outputs/rvm_wrapper_with_arguments.txt +8 -0
- data/spec/support/outputs/rvm_wrapper_without_arguments.txt +2 -0
- data/spec/support/outputs/ry_with_env.txt +13 -0
- data/spec/support/outputs/ry_without_env.txt +13 -0
- data/spec/support/outputs/ssh.txt +1 -0
- data/spec/support/outputs/ssh_keyscan_domain.txt +3 -0
- data/spec/support/rake_example_group.rb +23 -19
- data/spec/tasks/bundler_spec.rb +6 -0
- data/spec/tasks/chruby_spec.rb +29 -0
- data/spec/tasks/default_spec.rb +79 -7
- data/spec/tasks/deploy_spec.rb +6 -0
- data/spec/tasks/git_spec.rb +12 -0
- data/spec/tasks/init_spec.rb +13 -4
- data/spec/tasks/rails_spec.rb +126 -15
- data/spec/tasks/rbenv_spec.rb +15 -0
- data/spec/tasks/rvm_spec.rb +51 -0
- data/spec/tasks/ry_spec.rb +43 -0
- data/tasks/mina/bundler.rb +7 -5
- data/tasks/mina/chruby.rb +7 -5
- data/tasks/mina/default.rb +19 -12
- data/tasks/mina/deploy.rb +27 -25
- data/tasks/mina/git.rb +28 -15
- data/tasks/mina/install.rb +9 -0
- data/tasks/mina/rails.rb +29 -27
- data/tasks/mina/rbenv.rb +8 -6
- data/tasks/mina/rvm.rb +13 -11
- data/tasks/mina/ry.rb +11 -11
- data/test_env/config/deploy.rb +9 -8
- metadata +69 -37
- data/spec/support/outputs/chruby.txt +0 -9
- data/spec/support/outputs/console.txt +0 -1
- data/spec/support/outputs/log.txt +0 -1
- data/spec/support/outputs/rails_db_migrate.txt +0 -1
- data/spec/support/outputs/rvm_use.txt +0 -1
- data/spec/support/outputs/ry.txt +0 -15
- data/spec/tasks/ruby_managers_spec.rb +0 -33
data/spec/tasks/rails_spec.rb
CHANGED
@@ -1,23 +1,63 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'spec_helper'
|
2
4
|
|
3
5
|
RSpec.describe 'rails', type: :rake do
|
6
|
+
before do
|
7
|
+
load_default_config
|
8
|
+
end
|
9
|
+
|
4
10
|
describe 'console' do
|
5
11
|
it 'starts console' do
|
6
|
-
expect { invoke_all }.to output(output_file('
|
12
|
+
expect { invoke_all }.to output(output_file('rails_console')).to_stdout
|
7
13
|
end
|
8
14
|
end
|
9
15
|
|
10
16
|
describe 'log' do
|
11
17
|
it 'tails log' do
|
12
|
-
expect { invoke_all }.to output(output_file('
|
18
|
+
expect { invoke_all }.to output(output_file('rails_log')).to_stdout
|
13
19
|
end
|
14
20
|
end
|
15
21
|
|
16
22
|
describe 'rails:db_migrate' do
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
23
|
+
let(:task_name) { 'rails:db_migrate' }
|
24
|
+
|
25
|
+
context 'when outside deploy block' do
|
26
|
+
before do
|
27
|
+
Mina::Configuration.instance.remove(:deploy_block)
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'exits with an error message' do
|
31
|
+
expect do
|
32
|
+
invoke_all
|
33
|
+
end.to raise_error(SystemExit)
|
34
|
+
.and output(output_file('rails_db_migrate_outside_deploy_block')).to_stdout
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
context 'with force_migrate flag' do
|
39
|
+
before do
|
40
|
+
Mina::Configuration.instance.set(:force_migrate, true)
|
41
|
+
Mina::Configuration.instance.set(:deploy_block, true)
|
42
|
+
end
|
43
|
+
|
44
|
+
it 'runs rails db:migrate' do
|
45
|
+
expect do
|
46
|
+
invoke_all
|
47
|
+
end.to output(output_file('rails_db_migrate_force_migrate')).to_stdout
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
context 'without force_migrate flag' do
|
52
|
+
before do
|
53
|
+
Mina::Configuration.instance.set(:deploy_block, true)
|
54
|
+
end
|
55
|
+
|
56
|
+
it 'runs rails db:migrate but checks for changes first' do
|
57
|
+
expect do
|
58
|
+
invoke_all
|
59
|
+
end.to output(output_file('rails_db_migrate_with_diff')).to_stdout
|
60
|
+
end
|
21
61
|
end
|
22
62
|
end
|
23
63
|
|
@@ -34,10 +74,44 @@ RSpec.describe 'rails', type: :rake do
|
|
34
74
|
end
|
35
75
|
|
36
76
|
describe 'rails:assets_precompile' do
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
77
|
+
let(:task_name) { 'rails:assets_precompile' }
|
78
|
+
|
79
|
+
context 'when outside deploy block' do
|
80
|
+
before do
|
81
|
+
Mina::Configuration.instance.remove(:deploy_block)
|
82
|
+
end
|
83
|
+
|
84
|
+
it 'exits with an error message' do
|
85
|
+
expect do
|
86
|
+
invoke_all
|
87
|
+
end.to raise_error(SystemExit)
|
88
|
+
.and output(output_file('rails_assets_precompile_outside_deploy_block')).to_stdout
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
context 'with force_asset_precompile flag' do
|
93
|
+
before do
|
94
|
+
Mina::Configuration.instance.set(:force_asset_precompile, true)
|
95
|
+
Mina::Configuration.instance.set(:deploy_block, true)
|
96
|
+
end
|
97
|
+
|
98
|
+
it 'runs rails assets:precompile' do
|
99
|
+
expect do
|
100
|
+
invoke_all
|
101
|
+
end.to output(output_file('rails_assets_precompile_force_precompile')).to_stdout
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
context 'without force_asset_precompile flag' do
|
106
|
+
before do
|
107
|
+
Mina::Configuration.instance.set(:deploy_block, true)
|
108
|
+
end
|
109
|
+
|
110
|
+
it 'runs rails assets:precompile but checks for changes first' do
|
111
|
+
expect do
|
112
|
+
invoke_all
|
113
|
+
end.to output(output_file('rails_assets_precompile_with_diff')).to_stdout
|
114
|
+
end
|
41
115
|
end
|
42
116
|
end
|
43
117
|
|
@@ -52,9 +126,46 @@ RSpec.describe 'rails', type: :rake do
|
|
52
126
|
expect { invoke_all }.to output(output_file('rails_db_schema_load')).to_stdout
|
53
127
|
end
|
54
128
|
end
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
129
|
+
|
130
|
+
describe 'rails' do
|
131
|
+
let(:task_name) { 'rails' }
|
132
|
+
|
133
|
+
context 'without arguments' do
|
134
|
+
it 'exits with an error message' do
|
135
|
+
expect do
|
136
|
+
invoke_all
|
137
|
+
end.to raise_error(SystemExit)
|
138
|
+
.and output(output_file('rails_without_arguments')).to_stdout
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
context 'with arguments' do
|
143
|
+
it 'executes the arguments' do
|
144
|
+
expect do
|
145
|
+
invoke_all('db:rollback STEP=2')
|
146
|
+
end.to output(output_file('rails_with_arguments')).to_stdout
|
147
|
+
end
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
describe 'rake' do
|
152
|
+
let(:task_name) { 'rake' }
|
153
|
+
|
154
|
+
context 'without arguments' do
|
155
|
+
it 'exits with an error message' do
|
156
|
+
expect do
|
157
|
+
invoke_all
|
158
|
+
end.to raise_error(SystemExit)
|
159
|
+
.and output(output_file('rake_without_arguments')).to_stdout
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
context 'with arguments' do
|
164
|
+
it 'executes the arguments' do
|
165
|
+
expect do
|
166
|
+
invoke_all('db:primary:migrate')
|
167
|
+
end.to output(output_file('rake_with_arguments')).to_stdout
|
168
|
+
end
|
169
|
+
end
|
170
|
+
end
|
60
171
|
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
RSpec.describe 'rbenv', type: :rake do
|
6
|
+
before do
|
7
|
+
load_default_config
|
8
|
+
end
|
9
|
+
|
10
|
+
describe 'rbenv:load' do
|
11
|
+
it 'loads rbenv' do
|
12
|
+
expect { invoke_all }.to output(output_file('rbenv_load')).to_stdout
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
RSpec.describe 'rvm', type: :rake do
|
6
|
+
before do
|
7
|
+
load_default_config
|
8
|
+
end
|
9
|
+
|
10
|
+
describe 'rvm:use' do
|
11
|
+
let(:task_name) { 'rvm:use' }
|
12
|
+
|
13
|
+
context 'without an argument' do
|
14
|
+
it 'exits with an error message' do
|
15
|
+
expect do
|
16
|
+
invoke_all
|
17
|
+
end.to raise_error(SystemExit)
|
18
|
+
.and output(output_file('rvm_use_without_env')).to_stdout
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
context 'with an argument' do
|
23
|
+
it 'sets ruby version' do
|
24
|
+
expect do
|
25
|
+
invoke_all('3.0.0')
|
26
|
+
end.to output(output_file('rvm_use_with_env')).to_stdout
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe 'rvm:wrapper' do
|
32
|
+
let(:task_name) { 'rvm:wrapper' }
|
33
|
+
|
34
|
+
context 'without all arguments' do
|
35
|
+
it 'exits with an error message' do
|
36
|
+
expect do
|
37
|
+
invoke_all('ruby-3.0.0')
|
38
|
+
end.to raise_error(SystemExit)
|
39
|
+
.and output(output_file('rvm_wrapper_without_arguments')).to_stdout
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
context 'with all arguments' do
|
44
|
+
it 'calls rvm wrapper' do
|
45
|
+
expect do
|
46
|
+
invoke_all('3.0.0', 'myapp', 'unicorn')
|
47
|
+
end.to output(output_file('rvm_wrapper_with_arguments')).to_stdout
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
RSpec.describe 'ry', type: :rake do
|
6
|
+
before do
|
7
|
+
load_default_config
|
8
|
+
end
|
9
|
+
|
10
|
+
describe 'ry' do
|
11
|
+
let(:task_name) { 'ry' }
|
12
|
+
|
13
|
+
let(:default_version_warning) { /Task 'ry' without argument will use default Ruby version\./ }
|
14
|
+
|
15
|
+
context 'without an argument' do
|
16
|
+
it 'prints a warning' do
|
17
|
+
expect do
|
18
|
+
invoke_all
|
19
|
+
end.to output(default_version_warning).to_stdout
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'sets ruby version' do
|
23
|
+
expect do
|
24
|
+
invoke_all
|
25
|
+
end.to output(output_file('ry_without_env')).to_stdout
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
context 'with an argument' do
|
30
|
+
it "doesn't print a warning" do
|
31
|
+
expect do
|
32
|
+
invoke_all('3.0.0')
|
33
|
+
end.not_to output(default_version_warning).to_stdout
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'sets ruby version' do
|
38
|
+
expect do
|
39
|
+
invoke_all('3.0.0')
|
40
|
+
end.to output(output_file('ry_with_env')).to_stdout
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
data/tasks/mina/bundler.rb
CHANGED
@@ -1,21 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'mina/default'
|
2
4
|
|
3
5
|
set :bundle_bin, 'bundle'
|
4
6
|
set :bundle_path, 'vendor/bundle'
|
5
7
|
set :bundle_withouts, 'development test'
|
6
|
-
set :bundle_options, -> { %
|
8
|
+
set :bundle_options, -> { %(--without #{fetch(:bundle_withouts)} --path "#{fetch(:bundle_path)}" --deployment) }
|
7
9
|
set :shared_dirs, fetch(:shared_dirs, []).push(fetch(:bundle_path))
|
8
10
|
|
9
11
|
namespace :bundle do
|
10
12
|
desc 'Install gem dependencies using Bundler.'
|
11
13
|
task :install do
|
12
|
-
comment %
|
13
|
-
command %
|
14
|
+
comment %(Installing gem dependencies using Bundler)
|
15
|
+
command %(#{fetch(:bundle_bin)} install #{fetch(:bundle_options)})
|
14
16
|
end
|
15
17
|
|
16
18
|
desc 'Cleans up unused gems in your bundler directory'
|
17
19
|
task :clean do
|
18
|
-
comment %
|
19
|
-
command %
|
20
|
+
comment %(Cleaning up unused gems)
|
21
|
+
command %(#{fetch(:bundle_bin)} clean)
|
20
22
|
end
|
21
23
|
end
|
data/tasks/mina/chruby.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
set :chruby_path, '/etc/profile.d/chruby.sh'
|
2
4
|
|
3
5
|
task :chruby, :env do |_, args|
|
@@ -7,13 +9,13 @@ task :chruby, :env do |_, args|
|
|
7
9
|
exit 1
|
8
10
|
end
|
9
11
|
|
10
|
-
comment %
|
11
|
-
command %
|
12
|
+
comment %(chruby to version: \\"#{args[:env]}\\")
|
13
|
+
command %(
|
12
14
|
if [[ ! -s "#{fetch(:chruby_path)}" ]]; then
|
13
15
|
echo "! chruby.sh init file not found"
|
14
16
|
exit 1
|
15
17
|
fi
|
16
|
-
|
17
|
-
command %
|
18
|
-
command %
|
18
|
+
)
|
19
|
+
command %(source #{fetch(:chruby_path)})
|
20
|
+
command %(chruby "#{args[:env]}" || exit 1)
|
19
21
|
end
|
data/tasks/mina/default.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'mina/install'
|
2
4
|
|
3
5
|
set :port, 22
|
@@ -32,27 +34,28 @@ end
|
|
32
34
|
|
33
35
|
task :debug_configuration_variables do
|
34
36
|
if fetch(:debug_configuration_variables)
|
35
|
-
puts
|
36
|
-
|
37
|
-
|
38
|
-
puts "#{key.inspect} => #{value.inspect}"
|
37
|
+
puts '========== Configuration variables =========='
|
38
|
+
configuration.variables.each_key do |key|
|
39
|
+
puts "#{key.inspect} => #{fetch(key).inspect}"
|
39
40
|
end
|
41
|
+
puts '========== Configuration variables =========='
|
42
|
+
puts
|
40
43
|
end
|
41
44
|
end
|
42
45
|
|
43
46
|
desc 'Adds repo host to the known hosts'
|
44
47
|
task :ssh_keyscan_repo do
|
45
48
|
ensure!(:repository)
|
46
|
-
repo_host = fetch(:repository).split(%r{@|://}).last.split(%r{
|
49
|
+
repo_host = fetch(:repository).split(%r{@|://}).last.split(%r{:|/}).first
|
47
50
|
repo_port = /:([0-9]+)/.match(fetch(:repository)) && /:([0-9]+)/.match(fetch(:repository))[1] || '22'
|
48
51
|
|
49
|
-
next if repo_host ==
|
52
|
+
next if repo_host == ''
|
50
53
|
|
51
|
-
command %
|
54
|
+
command %(
|
52
55
|
if ! ssh-keygen -H -F #{repo_host} &>/dev/null; then
|
53
56
|
ssh-keyscan -t rsa -p #{repo_port} -H #{repo_host} >> ~/.ssh/known_hosts
|
54
57
|
fi
|
55
|
-
|
58
|
+
)
|
56
59
|
end
|
57
60
|
|
58
61
|
desc 'Adds domain to the known hosts'
|
@@ -60,11 +63,11 @@ task :ssh_keyscan_domain do
|
|
60
63
|
ensure!(:domain)
|
61
64
|
ensure!(:port)
|
62
65
|
run :local do
|
63
|
-
command %
|
66
|
+
command %(
|
64
67
|
if ! ssh-keygen -H -F #{fetch(:domain)} &>/dev/null; then
|
65
68
|
ssh-keyscan -p #{fetch(:port)} #{fetch(:domain)} >> ~/.ssh/known_hosts
|
66
69
|
fi
|
67
|
-
|
70
|
+
)
|
68
71
|
end
|
69
72
|
end
|
70
73
|
|
@@ -83,7 +86,11 @@ task :run, [:command] do |_, args|
|
|
83
86
|
end
|
84
87
|
end
|
85
88
|
|
86
|
-
desc 'Open an
|
89
|
+
desc 'Open an SSH connection and position to :deploy_to folder'
|
87
90
|
task :ssh do
|
88
|
-
|
91
|
+
ensure!(:deploy_to)
|
92
|
+
|
93
|
+
set :execution_mode, :exec
|
94
|
+
|
95
|
+
command "cd #{fetch(:deploy_to)} && exec $SHELL"
|
89
96
|
end
|
data/tasks/mina/deploy.rb
CHANGED
@@ -1,10 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'mina/default'
|
2
4
|
|
3
5
|
set :releases_path, -> { "#{fetch(:deploy_to)}/releases" }
|
4
6
|
set :shared_path, -> { "#{fetch(:deploy_to)}/shared" }
|
5
7
|
set :current_path, -> { "#{fetch(:deploy_to)}/current" }
|
6
8
|
set :lock_file, 'deploy.lock'
|
7
|
-
set :deploy_script, 'data/deploy.sh.erb'
|
9
|
+
set :deploy_script, Mina.root_path('data/deploy.sh.erb')
|
8
10
|
set :keep_releases, 5
|
9
11
|
set :version_scheme, :sequence
|
10
12
|
set :execution_mode, :pretty
|
@@ -12,30 +14,30 @@ set :execution_mode, :pretty
|
|
12
14
|
namespace :deploy do
|
13
15
|
desc 'Forces a deploy unlock.'
|
14
16
|
task :force_unlock do
|
15
|
-
comment %
|
16
|
-
command %
|
17
|
+
comment %(Unlocking)
|
18
|
+
command %(rm -f "#{fetch(:deploy_to)}/#{fetch(:lock_file)}")
|
17
19
|
end
|
18
20
|
|
19
21
|
desc 'Links paths set in :shared_dirs and :shared_files.'
|
20
22
|
task :link_shared_paths do
|
21
|
-
comment %
|
23
|
+
comment %(Symlinking shared paths)
|
22
24
|
|
23
25
|
fetch(:shared_dirs, []).each do |linked_dir|
|
24
|
-
command %
|
26
|
+
command %(
|
25
27
|
if [ ! -d "#{fetch(:shared_path)}/#{linked_dir}" ]; then
|
26
28
|
echo "! ERROR: not set up."
|
27
29
|
echo "The directory '#{fetch(:shared_path)}/#{linked_dir}' does not exist on the server"
|
28
30
|
echo "You may need to run 'mina setup' first"
|
29
31
|
exit 18
|
30
32
|
fi
|
31
|
-
|
32
|
-
command %
|
33
|
-
command %
|
34
|
-
command %
|
33
|
+
)
|
34
|
+
command %(mkdir -p #{File.dirname("./#{linked_dir}")})
|
35
|
+
command %(rm -rf "./#{linked_dir}")
|
36
|
+
command %(ln -s "#{fetch(:shared_path)}/#{linked_dir}" "./#{linked_dir}")
|
35
37
|
end
|
36
38
|
|
37
39
|
fetch(:shared_files, []).each do |linked_path|
|
38
|
-
command %
|
40
|
+
command %(ln -sf "#{fetch(:shared_path)}/#{linked_path}" "./#{linked_path}")
|
39
41
|
end
|
40
42
|
end
|
41
43
|
|
@@ -45,26 +47,26 @@ namespace :deploy do
|
|
45
47
|
ensure!(:deploy_to)
|
46
48
|
|
47
49
|
comment %{Cleaning up old releases (keeping #{fetch(:keep_releases)})}
|
48
|
-
in_path
|
50
|
+
in_path fetch(:releases_path) do
|
49
51
|
command %{count=$(ls -A1 | sort -rn | wc -l)}
|
50
52
|
command %{remove=$((count > #{fetch(:keep_releases)} ? count - #{fetch(:keep_releases)} : 0))}
|
51
|
-
command %
|
53
|
+
command %(ls -A1 | sort -rn | tail -n $remove | xargs rm -rf {})
|
52
54
|
end
|
53
55
|
end
|
54
56
|
end
|
55
57
|
|
56
58
|
desc 'Rollbacks the latest release'
|
57
59
|
task :rollback do
|
58
|
-
comment %
|
60
|
+
comment %(Rolling back to previous release)
|
59
61
|
|
60
|
-
in_path
|
62
|
+
in_path fetch(:releases_path) do
|
61
63
|
# TODO: add check if there are more than 1 release
|
62
64
|
command %{rollback_release=$(ls -1A | sort -n | tail -n 2 | head -n 1)}
|
63
|
-
comment %
|
64
|
-
command %
|
65
|
+
comment %(Rollbacking to release: $rollback_release)
|
66
|
+
command %(ln -nfs #{fetch(:releases_path)}/$rollback_release #{fetch(:current_path)})
|
65
67
|
command %{current_release=$(ls -1A | sort -n | tail -n 1)}
|
66
|
-
comment %
|
67
|
-
command %
|
68
|
+
comment %(Deleting current release: $current_release)
|
69
|
+
command %(rm -rf #{fetch(:releases_path)}/$current_release)
|
68
70
|
end
|
69
71
|
end
|
70
72
|
|
@@ -72,17 +74,17 @@ desc 'Sets up a site.'
|
|
72
74
|
task :setup do
|
73
75
|
ensure!(:deploy_to)
|
74
76
|
|
75
|
-
comment %
|
76
|
-
command %
|
77
|
-
command %
|
78
|
-
command %
|
77
|
+
comment %(Setting up #{fetch(:deploy_to)})
|
78
|
+
command %(mkdir -p "#{fetch(:deploy_to)}")
|
79
|
+
command %(mkdir -p "#{fetch(:releases_path)}")
|
80
|
+
command %(mkdir -p "#{fetch(:shared_path)}")
|
79
81
|
|
80
|
-
in_path
|
82
|
+
in_path fetch(:shared_path) do
|
81
83
|
fetch(:shared_dirs, []).each do |linked_dir|
|
82
|
-
command %
|
84
|
+
command %(mkdir -p "#{linked_dir}")
|
83
85
|
end
|
84
86
|
fetch(:shared_files, []).each do |linked_path|
|
85
|
-
command %
|
87
|
+
command %(mkdir -p "#{File.dirname(linked_path)}")
|
86
88
|
end
|
87
89
|
end
|
88
90
|
|
data/tasks/mina/git.rb
CHANGED
@@ -1,9 +1,13 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'mina/default'
|
2
4
|
|
3
5
|
set :branch, 'master'
|
4
6
|
set :remove_git_dir, true
|
5
7
|
set :remote, 'origin'
|
6
8
|
set :git_not_pushed_message, -> { "Your branch #{fetch(:branch)} needs to be pushed to #{fetch(:remote)} before deploying" }
|
9
|
+
set :git_local_branch_missing_message, -> { "Branch #{fetch(:branch)} doesn't exist" }
|
10
|
+
set :git_remote_branch_missing_message, -> { "Branch #{fetch(:remote)}/#{fetch(:branch)} doesn't exist" }
|
7
11
|
|
8
12
|
namespace :git do
|
9
13
|
desc 'Clones the Git repository to the current path.'
|
@@ -11,42 +15,51 @@ namespace :git do
|
|
11
15
|
ensure!(:repository)
|
12
16
|
ensure!(:deploy_to)
|
13
17
|
if set?(:commit)
|
14
|
-
comment %
|
15
|
-
command %
|
16
|
-
command %
|
18
|
+
comment %(Using git commit \\"#{fetch(:commit)}\\")
|
19
|
+
command %(git clone "#{fetch(:repository)}" . --recursive)
|
20
|
+
command %(git checkout -b current_release "#{fetch(:commit)}" --force)
|
17
21
|
else
|
18
|
-
command %
|
22
|
+
command %(
|
19
23
|
if [ ! -d "#{fetch(:deploy_to)}/scm/objects" ]; then
|
20
24
|
echo "-----> Cloning the Git repository"
|
21
|
-
#{echo_cmd %
|
25
|
+
#{echo_cmd %(git clone "#{fetch(:repository)}" "#{fetch(:deploy_to)}/scm" --bare)}
|
22
26
|
else
|
23
27
|
echo "-----> Fetching new git commits"
|
24
28
|
#{echo_cmd %[(cd "#{fetch(:deploy_to)}/scm" && git fetch "#{fetch(:repository)}" "#{fetch(:branch)}:#{fetch(:branch)}" --force)]}
|
25
29
|
fi &&
|
26
30
|
echo "-----> Using git branch '#{fetch(:branch)}'" &&
|
27
|
-
#{echo_cmd %
|
28
|
-
|
31
|
+
#{echo_cmd %(git clone "#{fetch(:deploy_to)}/scm" . --recursive --branch "#{fetch(:branch)}")}
|
32
|
+
), quiet: true
|
29
33
|
end
|
30
|
-
|
31
|
-
|
32
|
-
|
34
|
+
comment %(Updating submodules)
|
35
|
+
command %(git submodule update)
|
36
|
+
comment %(Using this git commit)
|
37
|
+
command %(git rev-parse HEAD > .mina_git_revision)
|
33
38
|
command %{git --no-pager log --format="%aN (%h):%n> %s" -n 1}
|
34
|
-
if fetch(:remove_git_dir)
|
35
|
-
command %{rm -rf .git}
|
36
|
-
end
|
39
|
+
command %(rm -rf .git) if fetch(:remove_git_dir)
|
37
40
|
end
|
38
41
|
|
39
42
|
desc 'Prints out current revision'
|
40
43
|
task :revision do
|
41
44
|
ensure!(:deploy_to)
|
42
|
-
command %
|
45
|
+
command %(cat #{fetch(:current_path)}/.mina_git_revision)
|
43
46
|
end
|
44
47
|
|
45
48
|
desc 'Ensures local repository is pushed to remote'
|
46
49
|
task :ensure_pushed do
|
47
50
|
run :local do
|
48
|
-
comment %
|
51
|
+
comment %(Ensuring everything is pushed to git)
|
49
52
|
command %{
|
53
|
+
if [ $(git branch --list #{fetch(:branch)} | wc -l) -eq 0 ]; then
|
54
|
+
echo "! #{fetch(:git_local_branch_missing_message)}"
|
55
|
+
exit 1
|
56
|
+
fi
|
57
|
+
|
58
|
+
if [ $(git branch -r --list #{fetch(:remote)}/#{fetch(:branch)} | wc -l) -eq 0 ]; then
|
59
|
+
echo "! #{fetch(:git_remote_branch_missing_message)}"
|
60
|
+
exit 1
|
61
|
+
fi
|
62
|
+
|
50
63
|
if [ $(git log #{fetch(:remote)}/#{fetch(:branch)}..#{fetch(:branch)} | wc -l) -ne 0 ]; then
|
51
64
|
echo "! #{fetch(:git_not_pushed_message)}"
|
52
65
|
exit 1
|
data/tasks/mina/install.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
desc 'Creates a sample config file.'
|
2
4
|
task :init do
|
3
5
|
name = Rake.application.name
|
@@ -9,6 +11,13 @@ task :init do
|
|
9
11
|
end
|
10
12
|
|
11
13
|
outfile = './config/deploy.rb'
|
14
|
+
|
15
|
+
if File.exist?(outfile)
|
16
|
+
print 'deploy.rb already exists, do you want to overwrite it? (y/n) '
|
17
|
+
|
18
|
+
exit(8) if $stdin.readline.chomp.downcase != 'y'
|
19
|
+
end
|
20
|
+
|
12
21
|
require 'fileutils'
|
13
22
|
FileUtils.mkdir_p './config'
|
14
23
|
FileUtils.cp Mina.root_path('data/deploy.rb'), outfile
|