mina 1.2.3 → 1.2.5
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.
- 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/lib/mina/backend/remote.rb
CHANGED
|
@@ -1,7 +1,10 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module Mina
|
|
2
4
|
module Backend
|
|
3
5
|
class Remote
|
|
4
6
|
attr_reader :commands
|
|
7
|
+
|
|
5
8
|
include Configuration::DSL
|
|
6
9
|
|
|
7
10
|
def initialize(commands)
|
|
@@ -31,7 +34,6 @@ module Mina
|
|
|
31
34
|
args += ' -tt'
|
|
32
35
|
"ssh #{args}"
|
|
33
36
|
end
|
|
34
|
-
|
|
35
37
|
end
|
|
36
38
|
end
|
|
37
39
|
end
|
data/lib/mina/commands.rb
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module Mina
|
|
2
4
|
class Commands
|
|
3
5
|
extend Forwardable
|
|
@@ -19,11 +21,11 @@ module Mina
|
|
|
19
21
|
end
|
|
20
22
|
|
|
21
23
|
def comment(code, indent: nil)
|
|
22
|
-
if indent
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
24
|
+
queue[stage] << if indent
|
|
25
|
+
indent(indent, %(echo "-----> #{code}"))
|
|
26
|
+
else
|
|
27
|
+
%(echo "-----> #{code}")
|
|
28
|
+
end
|
|
27
29
|
end
|
|
28
30
|
|
|
29
31
|
def delete(stage)
|
|
@@ -34,9 +36,9 @@ module Mina
|
|
|
34
36
|
queue[stage] = []
|
|
35
37
|
end
|
|
36
38
|
|
|
37
|
-
def process(path = nil)
|
|
39
|
+
def process(path = nil) # rubocop:disable Metrics/AbcSize
|
|
38
40
|
if path && !queue[stage].empty?
|
|
39
|
-
queue[stage].unshift(%
|
|
41
|
+
queue[stage].unshift(%(echo "$ cd #{path}")) if fetch(:verbose)
|
|
40
42
|
%{(cd #{path} && #{queue[stage].join(' && ')} && cd -)}
|
|
41
43
|
else
|
|
42
44
|
queue[stage].join("\n")
|
|
@@ -49,6 +51,7 @@ module Mina
|
|
|
49
51
|
|
|
50
52
|
def run(backend)
|
|
51
53
|
return if queue.empty?
|
|
54
|
+
|
|
52
55
|
report_time do
|
|
53
56
|
status = Mina::Runner.new(process, backend).run
|
|
54
57
|
error! 'Run Error' unless status
|
data/lib/mina/configuration.rb
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module Mina
|
|
2
4
|
class Configuration
|
|
3
5
|
include Singleton
|
|
@@ -6,7 +8,7 @@ module Mina
|
|
|
6
8
|
module DSL
|
|
7
9
|
def self.included(base)
|
|
8
10
|
[:set, :fetch, :remove, :set?, :ensure!, :reset!].each do |method|
|
|
9
|
-
base.send :define_method, method do |*args,
|
|
11
|
+
base.send :define_method, method do |*args, &block|
|
|
10
12
|
Configuration.instance.send(method, *args, &block)
|
|
11
13
|
end
|
|
12
14
|
end
|
|
@@ -16,7 +18,7 @@ module Mina
|
|
|
16
18
|
attr_reader :variables
|
|
17
19
|
|
|
18
20
|
def initialize
|
|
19
|
-
@variables
|
|
21
|
+
@variables = {}
|
|
20
22
|
end
|
|
21
23
|
|
|
22
24
|
def set(key, value = nil, &block)
|
|
@@ -33,11 +35,12 @@ module Mina
|
|
|
33
35
|
end
|
|
34
36
|
|
|
35
37
|
def set?(key)
|
|
36
|
-
ENV.
|
|
38
|
+
ENV.key?(key.to_s) || !variables.fetch(key, nil).nil?
|
|
37
39
|
end
|
|
38
40
|
|
|
39
41
|
def ensure!(key, message: nil)
|
|
40
42
|
return if set?(key)
|
|
43
|
+
|
|
41
44
|
message ||= "#{key} must be defined!"
|
|
42
45
|
error! message
|
|
43
46
|
end
|
data/lib/mina/dsl.rb
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module Mina
|
|
2
4
|
module Helpers
|
|
3
5
|
module Internal
|
|
@@ -5,10 +7,10 @@ module Mina
|
|
|
5
7
|
|
|
6
8
|
def deploy_script
|
|
7
9
|
yield
|
|
8
|
-
erb
|
|
10
|
+
erb fetch(:deploy_script)
|
|
9
11
|
end
|
|
10
12
|
|
|
11
|
-
def erb(file, b = binding)
|
|
13
|
+
def erb(file, b = binding) # rubocop:disable Naming/MethodParameterName
|
|
12
14
|
require 'erb'
|
|
13
15
|
erb = ERB.new(File.read(file))
|
|
14
16
|
erb.result b
|
|
@@ -16,7 +18,7 @@ module Mina
|
|
|
16
18
|
|
|
17
19
|
def echo_cmd(code, ignore_verbose = false)
|
|
18
20
|
if fetch(:verbose) && !ignore_verbose
|
|
19
|
-
"echo #{Shellwords.escape(
|
|
21
|
+
"echo #{Shellwords.escape("$ #{code}")} &&\n#{code}"
|
|
20
22
|
else
|
|
21
23
|
code
|
|
22
24
|
end
|
|
@@ -27,9 +29,7 @@ module Mina
|
|
|
27
29
|
end
|
|
28
30
|
|
|
29
31
|
def unindent(code)
|
|
30
|
-
if code =~ /^\n([ \t]+)/
|
|
31
|
-
code = code.gsub(/^#{$1}/, '')
|
|
32
|
-
end
|
|
32
|
+
code = code.gsub(/^#{Regexp.last_match(1)}/, '') if code =~ /^\n([ \t]+)/
|
|
33
33
|
|
|
34
34
|
code.strip
|
|
35
35
|
end
|
|
@@ -37,18 +37,18 @@ module Mina
|
|
|
37
37
|
def report_time
|
|
38
38
|
time_start = Time.now
|
|
39
39
|
output = yield
|
|
40
|
-
print_info
|
|
40
|
+
print_info format('Elapsed time: %.2f seconds', Time.now - time_start) unless fetch(:skip_report_time)
|
|
41
41
|
output
|
|
42
42
|
end
|
|
43
43
|
|
|
44
44
|
def next_version
|
|
45
45
|
case fetch(:version_scheme)
|
|
46
46
|
when :datetime
|
|
47
|
-
Time.now.utc.strftime(
|
|
47
|
+
Time.now.utc.strftime('%Y%m%d%H%M%S')
|
|
48
48
|
when :sequence
|
|
49
49
|
"$((`ls -1 #{fetch(:releases_path)} | sort -n | tail -n 1`+1))"
|
|
50
50
|
else
|
|
51
|
-
error! '
|
|
51
|
+
error! 'Unrecognized version scheme. Use :datetime or :sequence'
|
|
52
52
|
end
|
|
53
53
|
end
|
|
54
54
|
|
data/lib/mina/helpers/output.rb
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module Mina
|
|
2
4
|
module Helpers
|
|
3
5
|
module Output
|
|
4
6
|
def print_line(line)
|
|
5
7
|
case line
|
|
6
|
-
when
|
|
8
|
+
when /^-+> (.*?)$/
|
|
7
9
|
print_status Regexp.last_match[1]
|
|
8
10
|
when /^! (.*?)$/
|
|
9
11
|
print_error Regexp.last_match[1]
|
|
@@ -42,8 +44,8 @@ module Mina
|
|
|
42
44
|
puts " #{msg}"
|
|
43
45
|
end
|
|
44
46
|
|
|
45
|
-
def color(str,
|
|
46
|
-
ENV['NO_COLOR'] ? str : "\033[#{
|
|
47
|
+
def color(str, color)
|
|
48
|
+
ENV['NO_COLOR'] ? str : "\033[#{color}m#{str}\033[0m"
|
|
47
49
|
end
|
|
48
50
|
end
|
|
49
51
|
end
|
data/lib/mina/runner/exec.rb
CHANGED
data/lib/mina/runner/pretty.rb
CHANGED
|
@@ -1,45 +1,51 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module Mina
|
|
2
4
|
class Runner
|
|
3
5
|
class Pretty
|
|
4
6
|
include Mina::Helpers::Output
|
|
5
7
|
|
|
6
|
-
attr_reader :script
|
|
8
|
+
attr_reader :script
|
|
7
9
|
|
|
8
10
|
def initialize(script)
|
|
9
11
|
@script = Shellwords.shellsplit(script)
|
|
10
12
|
@coathooks = 0
|
|
11
13
|
end
|
|
12
14
|
|
|
13
|
-
def run
|
|
14
|
-
|
|
15
|
-
Open4.popen4(*script) do |pid, _stdin, stdout, stderr|
|
|
16
|
-
# Handle `^C`.
|
|
17
|
-
trap('INT') { handle_sigint(pid) }
|
|
15
|
+
def run # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
|
|
16
|
+
exit_status = nil
|
|
18
17
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
print_line(line)
|
|
22
|
-
end
|
|
23
|
-
end
|
|
18
|
+
Open3.popen3(*script) do |_stdin, stdout, stderr, wait_thr|
|
|
19
|
+
pid = wait_thr.pid
|
|
24
20
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
21
|
+
trap('INT') { handle_sigint(pid) }
|
|
22
|
+
|
|
23
|
+
stdout_thread = Thread.new do
|
|
24
|
+
while (line = stdout.gets)
|
|
25
|
+
print_line(line)
|
|
29
26
|
end
|
|
27
|
+
end
|
|
30
28
|
|
|
31
|
-
|
|
32
|
-
|
|
29
|
+
stderr_thread = Thread.new do
|
|
30
|
+
while (line = stderr.gets)
|
|
31
|
+
print_stderr(line)
|
|
32
|
+
end
|
|
33
33
|
end
|
|
34
34
|
|
|
35
|
-
|
|
35
|
+
stdout_thread.join
|
|
36
|
+
stderr_thread.join
|
|
37
|
+
|
|
38
|
+
exit_status = wait_thr.value
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
exit_status.success?
|
|
36
42
|
end
|
|
37
43
|
|
|
38
44
|
private
|
|
39
45
|
|
|
40
46
|
def handle_sigint(pid)
|
|
41
47
|
puts ''
|
|
42
|
-
if coathooks > 1
|
|
48
|
+
if @coathooks > 1
|
|
43
49
|
print_status 'Mina: SIGINT received again. Force quitting...'
|
|
44
50
|
Process.kill 'KILL', pid
|
|
45
51
|
else
|
data/lib/mina/runner/printer.rb
CHANGED
data/lib/mina/runner/system.rb
CHANGED
data/lib/mina/runner.rb
CHANGED
|
@@ -1,11 +1,14 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module Mina
|
|
2
4
|
class Runner
|
|
3
5
|
attr_reader :commands, :backend
|
|
6
|
+
|
|
4
7
|
include Configuration::DSL
|
|
5
8
|
|
|
6
9
|
def initialize(commands, backend)
|
|
7
10
|
fail 'You must specify execution mode' if execution_mode.nil?
|
|
8
|
-
|
|
11
|
+
|
|
9
12
|
@backend = backend
|
|
10
13
|
@commands = commands
|
|
11
14
|
end
|
|
@@ -16,11 +19,11 @@ module Mina
|
|
|
16
19
|
|
|
17
20
|
def execution_mode
|
|
18
21
|
@execution_mode ||=
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
22
|
+
if fetch(:simulate)
|
|
23
|
+
:printer
|
|
24
|
+
else
|
|
25
|
+
fetch(:execution_mode)
|
|
26
|
+
end
|
|
24
27
|
end
|
|
25
28
|
|
|
26
29
|
private
|
|
@@ -29,10 +32,6 @@ module Mina
|
|
|
29
32
|
Mina::Backend.const_get(class_name_for(backend)).new(commands).prepare
|
|
30
33
|
end
|
|
31
34
|
|
|
32
|
-
def unsuported_execution_mode?
|
|
33
|
-
execution_mode == :pretty && Gem::Platform.local.os == :windows
|
|
34
|
-
end
|
|
35
|
-
|
|
36
35
|
def class_name_for(symbol)
|
|
37
36
|
symbol.to_s.split('_').map(&:capitalize).join
|
|
38
37
|
end
|
data/lib/mina/version.rb
CHANGED
data/lib/mina/windows_patches.rb
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
|
-
#
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# if windows os
|
|
2
4
|
require 'rbconfig'
|
|
3
5
|
is_windows = (RbConfig::CONFIG['host_os'] =~ /mswin|mingw|cygwin/)
|
|
4
6
|
if is_windows
|
|
5
7
|
module Shellwords
|
|
6
8
|
def shellescape(str)
|
|
7
|
-
|
|
9
|
+
"\"#{str.gsub(/\\(?=\\*")/, '\\\\\\').gsub(/"/, '\\"').gsub(/\\$/, '\\\\\\').gsub('%', '%%')}\""
|
|
8
10
|
end
|
|
9
11
|
|
|
10
12
|
module_function :shellescape
|
data/lib/mina.rb
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
require 'rake'
|
|
2
4
|
Rake.application.options.trace = true
|
|
3
5
|
|
|
4
6
|
# require 'pry'
|
|
5
|
-
# require 'awesome_print'
|
|
6
7
|
|
|
7
8
|
require 'forwardable'
|
|
8
9
|
require 'shellwords'
|
|
9
10
|
require 'singleton'
|
|
10
|
-
require '
|
|
11
|
+
require 'open3'
|
|
11
12
|
|
|
12
13
|
require 'mina/version'
|
|
13
14
|
require 'mina/helpers/output'
|
|
@@ -27,6 +28,6 @@ require 'mina/application'
|
|
|
27
28
|
|
|
28
29
|
module Mina
|
|
29
30
|
def self.root_path(*args)
|
|
30
|
-
File.join File.expand_path('
|
|
31
|
+
File.join File.expand_path('..', __dir__), *args
|
|
31
32
|
end
|
|
32
33
|
end
|
data/mina.gemspec
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
|
-
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
lib = File.expand_path('lib', __dir__)
|
|
2
4
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
3
5
|
|
|
4
|
-
tasks = File.expand_path('
|
|
6
|
+
tasks = File.expand_path('tasks', __dir__)
|
|
5
7
|
$LOAD_PATH.unshift(tasks) unless $LOAD_PATH.include?(tasks)
|
|
6
8
|
|
|
7
9
|
require 'mina/version'
|
|
@@ -20,10 +22,9 @@ Gem::Specification.new do |spec|
|
|
|
20
22
|
spec.require_paths = ['lib', 'tasks']
|
|
21
23
|
|
|
22
24
|
spec.add_dependency 'rake'
|
|
23
|
-
spec.
|
|
24
|
-
spec.add_development_dependency 'rspec'
|
|
25
|
-
spec.add_development_dependency '
|
|
26
|
-
spec.add_development_dependency '
|
|
25
|
+
spec.add_development_dependency 'pry'
|
|
26
|
+
spec.add_development_dependency 'rspec'
|
|
27
|
+
spec.add_development_dependency 'rubocop'
|
|
28
|
+
spec.add_development_dependency 'rubocop-rspec'
|
|
27
29
|
spec.add_development_dependency 'simplecov'
|
|
28
|
-
spec.add_development_dependency 'codeclimate-test-reporter'
|
|
29
30
|
end
|
data/spec/configs/dsl.rb
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
task :reset_task do
|
|
4
|
+
command 'echo Hello there'
|
|
5
|
+
reset!
|
|
6
|
+
command 'echo New command'
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
task :one_run_inside_another do
|
|
10
|
+
run :local do
|
|
11
|
+
run :remote do
|
|
12
|
+
puts "I shouldn't execute"
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
task :local_run do
|
|
18
|
+
run :local do
|
|
19
|
+
comment 'I am a comment'
|
|
20
|
+
command 'echo Hello there'
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
task :remote_run do
|
|
25
|
+
run :remote do
|
|
26
|
+
comment 'I am a comment'
|
|
27
|
+
command 'echo Hello there'
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
task :nonexistent_run do
|
|
32
|
+
run :nonexistent do
|
|
33
|
+
comment "I shouldn't run"
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
task :on_stage_task do
|
|
38
|
+
deploy do
|
|
39
|
+
on :launch do
|
|
40
|
+
command 'echo Hello there'
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
task :in_path_task do
|
|
46
|
+
in_path '/path' do
|
|
47
|
+
command 'echo Hello there'
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
task :deploy_block_task do
|
|
52
|
+
deploy do
|
|
53
|
+
command 'echo Hello there'
|
|
54
|
+
end
|
|
55
|
+
end
|
data/spec/configs/e2e.rb
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'mina/git'
|
|
4
|
+
|
|
5
|
+
set :simulate, false
|
|
6
|
+
set :user, 'mina-ssh'
|
|
7
|
+
set :domain, '0.0.0.0'
|
|
8
|
+
set :port, 2222
|
|
9
|
+
set :deploy_to, '/app'
|
|
10
|
+
|
|
11
|
+
set :repository, 'https://github.com/mina-deploy/mina.git'
|
|
12
|
+
set :branch, 'master'
|
|
13
|
+
|
|
14
|
+
set :identity_file, 'spec/e2e/ssh'
|
|
15
|
+
|
|
16
|
+
set :ssh_options, '-o StrictHostKeyChecking=no'
|
|
17
|
+
|
|
18
|
+
desc 'Deploys to the server'
|
|
19
|
+
task :e2e_deploy do
|
|
20
|
+
deploy do
|
|
21
|
+
invoke :'git:clone'
|
|
22
|
+
invoke :'deploy:link_shared_paths'
|
|
23
|
+
invoke :'deploy:cleanup'
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
version: '3.8'
|
|
2
|
+
services:
|
|
3
|
+
mina-ssh:
|
|
4
|
+
image: ghcr.io/linuxserver/openssh-server
|
|
5
|
+
container_name: mina-ssh
|
|
6
|
+
hostname: mina-ssh
|
|
7
|
+
environment:
|
|
8
|
+
- PUID=1000
|
|
9
|
+
- PGID=1000
|
|
10
|
+
- TZ=UTC
|
|
11
|
+
- PUBLIC_KEY
|
|
12
|
+
- SUDO_ACCESS=true
|
|
13
|
+
- USER_NAME=mina-ssh
|
|
14
|
+
ports:
|
|
15
|
+
- 2222:2222
|
|
16
|
+
command: >
|
|
17
|
+
sh -c "
|
|
18
|
+
apk update && apk add git ruby && gem install bundler &&
|
|
19
|
+
touch /tmp/ready.txt &&
|
|
20
|
+
tail -f /dev/null
|
|
21
|
+
"
|
data/spec/e2e/e2e_run.sh
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
cd spec/e2e/
|
|
2
|
+
chmod 600 ssh
|
|
3
|
+
PUBLIC_KEY="$(cat ssh.pub)" docker-compose up -d mina-ssh \
|
|
4
|
+
&& docker exec mina-ssh sh -c "while [ ! -f /tmp/ready.txt ]; do sleep 2; done"
|
|
5
|
+
cd -
|
|
6
|
+
[[ -z "${CI}" ]] && ssh-keygen -R \[0.0.0.0\]:2222
|
|
7
|
+
bundle exec rspec --tag e2e --order defined
|
|
8
|
+
status=$?
|
|
9
|
+
cd spec/e2e
|
|
10
|
+
docker-compose down
|
|
11
|
+
exit $status
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'spec_helper'
|
|
4
|
+
|
|
5
|
+
# IMPORTANT: run only through e2e_run.sh script
|
|
6
|
+
describe 'E2E tests', :e2e, type: :rake do
|
|
7
|
+
before do
|
|
8
|
+
load_config 'e2e'
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
describe 'deploy without setup' do
|
|
12
|
+
it 'exits with an error message' do
|
|
13
|
+
expect do
|
|
14
|
+
rake.run(['e2e_deploy'])
|
|
15
|
+
end.to raise_error(SystemExit)
|
|
16
|
+
.and output(output_file('e2e_deploy_without_setup')).to_stdout
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
describe 'setup' do
|
|
21
|
+
it 'sets up directories' do
|
|
22
|
+
expect do
|
|
23
|
+
rake.run(['setup'])
|
|
24
|
+
end.to output(output_file('e2e_setup')).to_stdout
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
describe 'deploy after setup' do
|
|
29
|
+
it 'deploys the app' do
|
|
30
|
+
expect do
|
|
31
|
+
rake.run(['e2e_deploy'])
|
|
32
|
+
end.to output(output_file('e2e_deploy_after_setup')).to_stdout
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
data/spec/e2e/ssh
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
-----BEGIN OPENSSH PRIVATE KEY-----
|
|
2
|
+
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABFwAAAAdzc2gtcn
|
|
3
|
+
NhAAAAAwEAAQAAAQEAskzzKcHPV/0n84dIXUKO3q/s4MX8+R+ogsbbEr/XRo0e2BtEmD52
|
|
4
|
+
VLEJczYaxICqTOmlOvyx0oWOSPbim6Cpq6YskbxVaUqYSdzafdRXmc3+6BSXgGZH3dHWYc
|
|
5
|
+
2vQFx01PVRXdb4EwQBwmCLX7v7+/OxXVq5MHxxXNHblut2c//Udp53F5fVm3WgE3iTIpxL
|
|
6
|
+
0h/0H25kaE0HyZrFhFdPItAu/owkOhra6yX1PE8vcyQRs7d9uWwd3n+odCjwhTJ3431PFJ
|
|
7
|
+
SyCSTCKbDGMIB44E85e6Vr4EK9Xjrxb6Zrc8ayg4GEX9jqpltjup9vWKhdM7q4vrkEK2uC
|
|
8
|
+
lYGurnfEAwAAA8ilS5nwpUuZ8AAAAAdzc2gtcnNhAAABAQCyTPMpwc9X/Sfzh0hdQo7er+
|
|
9
|
+
zgxfz5H6iCxtsSv9dGjR7YG0SYPnZUsQlzNhrEgKpM6aU6/LHShY5I9uKboKmrpiyRvFVp
|
|
10
|
+
SphJ3Np91FeZzf7oFJeAZkfd0dZhza9AXHTU9VFd1vgTBAHCYItfu/v787FdWrkwfHFc0d
|
|
11
|
+
uW63Zz/9R2nncXl9WbdaATeJMinEvSH/QfbmRoTQfJmsWEV08i0C7+jCQ6GtrrJfU8Ty9z
|
|
12
|
+
JBGzt325bB3ef6h0KPCFMnfjfU8UlLIJJMIpsMYwgHjgTzl7pWvgQr1eOvFvpmtzxrKDgY
|
|
13
|
+
Rf2OqmW2O6n29YqF0zuri+uQQra4KVga6ud8QDAAAAAwEAAQAAAQA7oVyZlIXhqXrZCV98
|
|
14
|
+
QSxC8ZdJPS3zq1DSG+tcg+hdYgj0wXnZaNpuTJ8advfQzC8odeOarLRT8fK6GEeFQOA91d
|
|
15
|
+
+GBfSSuC3iVgiEmKWLfMdJmsloWcyjNPB72SxJXCJ+rmS9+40P3wEvntY9+EK36rJgxFy3
|
|
16
|
+
CIdpQY4tFSaSeGgEWvyhoUjad5OOZhW6zy1D5bOQX9mxCjTIJ+LqIKgUK50gv2zBt8lOTu
|
|
17
|
+
+g4aw4gQoFPoX7tOqD0GAt0Q2NdogugFyWfIumBv6RCeHvxpbwYhIrhucsACbCgjydnLNa
|
|
18
|
+
chcZfR+DNQeezq0l6vpIuCCqWxVXHYQLMizvW9MuIcQhAAAAgAxkO1gv7AiRjL0UJcIxQ9
|
|
19
|
+
Ec9okq+MXgyRJxLL1x1r/sVqkCUXzf95O9fB/uJEQx6V/Uok4NN2m9lhRhSbu2dfrwq3dI
|
|
20
|
+
Xxe0/l7pS0p67nIrvROPBcnQOGGcPVNxwvjD+fC3dBwiFjh08qXA47v8ddu4MujgIWkFaX
|
|
21
|
+
oGxXMr2ijcAAAAgQDbNTsd/YsldmSpRTlPd/tyu+VyZ8afRNpRqTZki3J+LcJ8CoET7DLA
|
|
22
|
+
EHPXqaNWyEuLRjrZx6CdlbVrZvoU4k4TftrRMq177DNP7WBCvha3eZhZg2EA4MVG2j2iP2
|
|
23
|
+
VtXtEjdWHNYwHUBMj6IXDxQuAQvXsQPTQ4h2kt7GG5/Wdw2QAAAIEA0DoKl7jfsQMSn1LR
|
|
24
|
+
csvP3tIfmj6KqboetjFABLloKnxVa/tlJRTJHiuWgUZQ9sCyI4rYAnSfZS2uppDBHvn/9f
|
|
25
|
+
uOV8XPu7N3Vm/jP5E97JUGaJUjnNZWiWHxUAf9VM2r7x2V4VvEn98xDKSObciSz9rosXlJ
|
|
26
|
+
POFxW7iCkxhNkjsAAAANbWluYS1lMmUtdGVzdAECAwQFBg==
|
|
27
|
+
-----END OPENSSH PRIVATE KEY-----
|
data/spec/e2e/ssh.pub
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCyTPMpwc9X/Sfzh0hdQo7er+zgxfz5H6iCxtsSv9dGjR7YG0SYPnZUsQlzNhrEgKpM6aU6/LHShY5I9uKboKmrpiyRvFVpSphJ3Np91FeZzf7oFJeAZkfd0dZhza9AXHTU9VFd1vgTBAHCYItfu/v787FdWrkwfHFc0duW63Zz/9R2nncXl9WbdaATeJMinEvSH/QfbmRoTQfJmsWEV08i0C7+jCQ6GtrrJfU8Ty9zJBGzt325bB3ef6h0KPCFMnfjfU8UlLIJJMIpsMYwgHjgTzl7pWvgQr1eOvFvpmtzxrKDgYRf2OqmW2O6n29YqF0zuri+uQQra4KVga6ud8QD mina-e2e-test
|