geordi 2.10.1 → 3.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.ruby-version +1 -1
- data/.travis.yml +8 -2
- data/CHANGELOG.md +46 -0
- data/Gemfile +2 -5
- data/Gemfile.lock +10 -10
- data/README.md +11 -6
- data/Rakefile +6 -10
- data/{bin → exe}/b +0 -0
- data/{bin → exe}/cap-all +0 -0
- data/{bin → exe}/console-for +0 -0
- data/{bin → exe}/cuc +0 -0
- data/{bin → exe}/cuc-show +0 -0
- data/{bin → exe}/cuc-vnc-setup +0 -0
- data/{bin → exe}/deploy-to-production +0 -0
- data/{bin → exe}/dump-for +0 -0
- data/{bin → exe}/dumple +0 -0
- data/{bin → exe}/geordi +0 -0
- data/{bin → exe}/gitpt +0 -0
- data/{bin → exe}/launchy_browser +0 -0
- data/{bin → exe}/load-dump +0 -0
- data/{bin → exe}/migrate-all +0 -0
- data/{bin → exe}/rs +0 -0
- data/{bin → exe}/run_tests +0 -0
- data/{bin → exe}/shell-for +0 -0
- data/{bin → exe}/tests +0 -0
- data/geordi.gemspec +23 -20
- data/lib/geordi/COMMAND_TEMPLATE +4 -6
- data/lib/geordi/capistrano_config.rb +20 -17
- data/lib/geordi/chromedriver_updater.rb +9 -10
- data/lib/geordi/cli.rb +5 -2
- data/lib/geordi/commands/_setup_vnc.rb +23 -23
- data/lib/geordi/commands/apache_site.rb +3 -3
- data/lib/geordi/commands/bundle_install.rb +3 -3
- data/lib/geordi/commands/capistrano.rb +5 -6
- data/lib/geordi/commands/chromedriver_update.rb +0 -9
- data/lib/geordi/commands/clean.rb +5 -6
- data/lib/geordi/commands/commit.rb +0 -1
- data/lib/geordi/commands/console.rb +4 -4
- data/lib/geordi/commands/create_database_yml.rb +4 -4
- data/lib/geordi/commands/create_databases.rb +3 -3
- data/lib/geordi/commands/cucumber.rb +25 -25
- data/lib/geordi/commands/delete_dumps.rb +12 -12
- data/lib/geordi/commands/deploy.rb +27 -28
- data/lib/geordi/commands/drop_databases.rb +13 -15
- data/lib/geordi/commands/dump.rb +12 -13
- data/lib/geordi/commands/eurest.rb +2 -2
- data/lib/geordi/commands/firefox.rb +4 -4
- data/lib/geordi/commands/migrate.rb +3 -3
- data/lib/geordi/commands/png_optimize.rb +15 -14
- data/lib/geordi/commands/rake.rb +3 -3
- data/lib/geordi/commands/remove_executable_flags.rb +3 -3
- data/lib/geordi/commands/rspec.rb +11 -11
- data/lib/geordi/commands/security_update.rb +25 -25
- data/lib/geordi/commands/server.rb +6 -6
- data/lib/geordi/commands/setup.rb +8 -8
- data/lib/geordi/commands/shell.rb +3 -3
- data/lib/geordi/commands/tests.rb +1 -1
- data/lib/geordi/commands/unit.rb +3 -3
- data/lib/geordi/commands/update.rb +7 -7
- data/lib/geordi/commands/vnc.rb +1 -1
- data/lib/geordi/commands/with_rake.rb +3 -3
- data/lib/geordi/commands/yarn_install.rb +3 -3
- data/lib/geordi/cucumber.rb +35 -36
- data/lib/geordi/db_cleaner.rb +40 -41
- data/lib/geordi/dump_loader.rb +6 -5
- data/lib/geordi/firefox_for_selenium.rb +26 -29
- data/lib/geordi/gitpt.rb +14 -15
- data/lib/geordi/interaction.rb +2 -6
- data/lib/geordi/remote.rb +9 -10
- data/lib/geordi/util.rb +28 -25
- data/lib/geordi/version.rb +1 -1
- metadata +27 -39
- data/features/commit.feature +0 -17
- data/features/console.feature +0 -7
- data/features/cucumber.feature +0 -261
- data/features/deploy.feature +0 -66
- data/features/dump.feature +0 -34
- data/features/firefox.feature +0 -44
- data/features/server.feature +0 -31
- data/features/setup.feature +0 -11
- data/features/shell.feature +0 -78
- data/features/support/env.rb +0 -8
- data/features/support/step_definitions/aruba_backport_steps.rb +0 -5
- data/features/support/step_definitions/miscellaneous_steps.rb +0 -11
data/lib/geordi/cli.rb
CHANGED
@@ -5,10 +5,13 @@ require 'geordi/util'
|
|
5
5
|
|
6
6
|
module Geordi
|
7
7
|
class CLI < Thor
|
8
|
-
|
8
|
+
|
9
|
+
def self.exit_on_failure?
|
10
|
+
true
|
11
|
+
end
|
9
12
|
|
10
13
|
# load all tasks defined in lib/geordi/commands
|
11
|
-
Dir[File.expand_path '
|
14
|
+
Dir[File.expand_path 'commands/*.rb', __dir__].each do |file|
|
12
15
|
class_eval File.read(file), file
|
13
16
|
end
|
14
17
|
|
@@ -1,34 +1,34 @@
|
|
1
|
-
desc '-setup-vnc', 'Setup VNC for running Selenium tests there', :
|
1
|
+
desc '-setup-vnc', 'Setup VNC for running Selenium tests there', hide: true
|
2
2
|
def _setup_vnc
|
3
3
|
`clear`
|
4
4
|
|
5
|
-
note 'This script will help you install a VNC server and a VNC viewer.'
|
5
|
+
Interaction.note 'This script will help you install a VNC server and a VNC viewer.'
|
6
6
|
puts
|
7
|
-
puts strip_heredoc <<-TEXT
|
7
|
+
puts Util.strip_heredoc <<-TEXT
|
8
8
|
With those you will be able to use our cucumber script without being
|
9
9
|
disturbed by focus-stealing Selenium windows. Instead, they will open
|
10
10
|
inside a VNC session.
|
11
11
|
|
12
12
|
You can still inspect everything with:
|
13
13
|
TEXT
|
14
|
-
note_cmd 'geordi vnc'
|
14
|
+
Interaction.note_cmd 'geordi vnc'
|
15
15
|
puts
|
16
|
-
note 'Please open a second shell to execute instructions.'
|
17
|
-
prompt 'Continue ...'
|
16
|
+
Interaction.note 'Please open a second shell to execute instructions.'
|
17
|
+
Interaction.prompt 'Continue ...'
|
18
18
|
|
19
|
-
announce 'Setup VNC server'
|
19
|
+
Interaction.announce 'Setup VNC server'
|
20
20
|
|
21
21
|
vnc_server_installed = system('which vncserver > /dev/null 2>&1')
|
22
22
|
if vnc_server_installed
|
23
|
-
success 'It appears you already have a VNC server installed. Good job!'
|
23
|
+
Interaction.success 'It appears you already have a VNC server installed. Good job!'
|
24
24
|
else
|
25
25
|
puts 'Please run:'
|
26
|
-
note_cmd 'sudo apt-get install vnc4server'
|
27
|
-
prompt 'Continue ...'
|
26
|
+
Interaction.note_cmd 'sudo apt-get install vnc4server'
|
27
|
+
Interaction.prompt 'Continue ...'
|
28
28
|
|
29
29
|
puts
|
30
|
-
note 'We will now set a password for your VNC server.'
|
31
|
-
puts strip_heredoc <<-TEXT
|
30
|
+
Interaction.note 'We will now set a password for your VNC server.'
|
31
|
+
puts Util.strip_heredoc <<-TEXT
|
32
32
|
When running our cucumber script, you will not actually need this
|
33
33
|
password, and there is no security risk. However, if you start a vncserver
|
34
34
|
without our cucumber script, a user with your password can connect to
|
@@ -36,31 +36,31 @@ def _setup_vnc
|
|
36
36
|
|
37
37
|
TEXT
|
38
38
|
puts 'Please run:'
|
39
|
-
note_cmd 'vncserver :20'
|
40
|
-
warn 'Enter a secure password!'
|
41
|
-
prompt 'Continue ...'
|
39
|
+
Interaction.note_cmd 'vncserver :20'
|
40
|
+
Interaction.warn 'Enter a secure password!'
|
41
|
+
Interaction.prompt 'Continue ...'
|
42
42
|
|
43
43
|
puts 'Now stop the server again. Please run:'
|
44
|
-
note_cmd 'vncserver -kill :20'
|
45
|
-
prompt 'Continue ...'
|
44
|
+
Interaction.note_cmd 'vncserver -kill :20'
|
45
|
+
Interaction.prompt 'Continue ...'
|
46
46
|
end
|
47
47
|
|
48
|
-
announce 'Setup VNC viewer'
|
48
|
+
Interaction.announce 'Setup VNC viewer'
|
49
49
|
|
50
50
|
vnc_viewer_installed = system('which vncviewer > /dev/null 2>&1')
|
51
51
|
if vnc_viewer_installed
|
52
|
-
success 'It appears you already have a VNC viewer installed. Good job!'
|
52
|
+
Interaction.success 'It appears you already have a VNC viewer installed. Good job!'
|
53
53
|
else
|
54
54
|
puts 'Please run:'
|
55
|
-
note_cmd 'sudo apt-get install xtightvncviewer'
|
56
|
-
prompt 'Continue ...'
|
55
|
+
Interaction.note_cmd 'sudo apt-get install xtightvncviewer'
|
56
|
+
Interaction.prompt 'Continue ...'
|
57
57
|
end
|
58
58
|
|
59
59
|
puts
|
60
|
-
puts strip_heredoc <<-TEXT
|
60
|
+
puts Util.strip_heredoc <<-TEXT
|
61
61
|
All done. Our cucumber script will now automatically run Selenium features
|
62
62
|
in VNC.
|
63
63
|
TEXT
|
64
64
|
|
65
|
-
success 'Happy cuking!'
|
65
|
+
Interaction.success 'Happy cuking!'
|
66
66
|
end
|
@@ -10,13 +10,13 @@ def apache_site(*args)
|
|
10
10
|
puts 'Please call: apache-site my-site'
|
11
11
|
puts
|
12
12
|
puts 'Available sites:'
|
13
|
-
Dir.new(
|
13
|
+
Dir.new('.').each do |file|
|
14
14
|
puts "- #{file}" if file != '.' && file != '..'
|
15
15
|
end
|
16
16
|
exit
|
17
17
|
end
|
18
18
|
|
19
|
-
has_default = File.
|
20
|
-
exec "sudo a2dissite \*; sudo a2ensite #{
|
19
|
+
has_default = File.exist?('default')
|
20
|
+
exec "sudo a2dissite \*; sudo a2ensite #{'default ' if has_default}#{site} && sudo apache2ctl restart"
|
21
21
|
Dir.chdir old_cwd
|
22
22
|
end
|
@@ -1,7 +1,7 @@
|
|
1
|
-
desc 'bundle-install', 'Run bundle install if required', :
|
1
|
+
desc 'bundle-install', 'Run bundle install if required', hide: true
|
2
2
|
def bundle_install
|
3
|
-
if File.
|
4
|
-
announce 'Bundling'
|
3
|
+
if File.exist?('Gemfile') && !system('bundle check > /dev/null 2>&1')
|
4
|
+
Interaction.announce 'Bundling'
|
5
5
|
Util.system! 'bundle install'
|
6
6
|
end
|
7
7
|
end
|
@@ -6,18 +6,17 @@ LONGDESC
|
|
6
6
|
def capistrano(*args)
|
7
7
|
targets = Dir['config/deploy/*.rb'].map { |file| File.basename(file, '.rb') }.sort
|
8
8
|
|
9
|
-
note 'Found the following deploy targets:'
|
9
|
+
Interaction.note 'Found the following deploy targets:'
|
10
10
|
puts targets
|
11
|
-
prompt('Continue?', 'n', /y|yes/)
|
11
|
+
Interaction.prompt('Continue?', 'n', /y|yes/) || Interaction.fail('Cancelled.')
|
12
12
|
|
13
13
|
targets << nil if targets.empty? # default target
|
14
14
|
targets.each do |stage|
|
15
|
-
announce 'Target: ' + (stage || '(default)')
|
15
|
+
Interaction.announce 'Target: ' + (stage || '(default)')
|
16
16
|
|
17
17
|
command = "bundle exec cap #{stage} " + args.join(' ')
|
18
|
-
note_cmd command
|
18
|
+
Interaction.note_cmd command
|
19
19
|
|
20
|
-
Util.system!(command, :
|
20
|
+
Util.system!(command, fail_message: 'Capistrano failed. Have a look!')
|
21
21
|
end
|
22
|
-
|
23
22
|
end
|
@@ -9,14 +9,5 @@ LONGDESC
|
|
9
9
|
def chromedriver_update
|
10
10
|
require 'geordi/chromedriver_updater'
|
11
11
|
|
12
|
-
# Ruby 1.9.3 introduces #capture3 in open3
|
13
|
-
supported_ruby_version = '1.9.2'
|
14
|
-
|
15
|
-
# We do not want to backport this command to Ruby 1.8.7, a user can just use a newer Ruby version to run it. For all
|
16
|
-
# other commands it still is necessary to have a proper Ruby 1.8.7 support.
|
17
|
-
if Gem::Version.new(RUBY_VERSION) < Gem::Version.new(supported_ruby_version)
|
18
|
-
raise("Unsupported ruby version #{RUBY_VERSION}, please use at least #{supported_ruby_version} to run this command!")
|
19
|
-
end
|
20
|
-
|
21
12
|
ChromedriverUpdater.new.run
|
22
13
|
end
|
@@ -1,16 +1,15 @@
|
|
1
1
|
desc 'clean', 'Remove unneeded files from the current directory'
|
2
2
|
def clean
|
3
3
|
|
4
|
-
announce 'Removing tempfiles'
|
4
|
+
Interaction.announce 'Removing tempfiles'
|
5
5
|
for pattern in %w[ webrat-* capybara-* tmp/webrat-* tmp/capybara-* tmp/rtex/* log/*.log ]
|
6
|
-
note pattern
|
6
|
+
Interaction.note pattern
|
7
7
|
puts `rm -vfR #{pattern}`
|
8
8
|
end
|
9
9
|
|
10
|
-
announce 'Finding recursively and removing backup files'
|
11
|
-
|
12
|
-
note pattern
|
10
|
+
Interaction.announce 'Finding recursively and removing backup files'
|
11
|
+
%w[*~].each do |pattern|
|
12
|
+
Interaction.note pattern
|
13
13
|
`find . -name #{pattern} -exec rm {} ';'`
|
14
14
|
end
|
15
|
-
|
16
15
|
end
|
@@ -6,19 +6,19 @@ Open a Rails console on `staging`: `geordi console staging`
|
|
6
6
|
LONGDESC
|
7
7
|
|
8
8
|
|
9
|
-
option :select_server, :
|
9
|
+
option :select_server, default: false, type: :boolean, aliases: '-s'
|
10
10
|
|
11
|
-
def console(target = 'development', *
|
11
|
+
def console(target = 'development', *_args)
|
12
12
|
require 'geordi/remote'
|
13
13
|
|
14
14
|
if target == 'development'
|
15
15
|
invoke_cmd 'yarn_install'
|
16
16
|
|
17
|
-
announce 'Opening a local Rails console'
|
17
|
+
Interaction.announce 'Opening a local Rails console'
|
18
18
|
|
19
19
|
Util.system! Util.console_command(target)
|
20
20
|
else
|
21
|
-
announce 'Opening a Rails console on ' + target
|
21
|
+
Interaction.announce 'Opening a Rails console on ' + target
|
22
22
|
|
23
23
|
Geordi::Remote.new(target).console(options)
|
24
24
|
end
|
@@ -1,10 +1,10 @@
|
|
1
|
-
desc 'create-database-yml', '[sic]', :
|
1
|
+
desc 'create-database-yml', '[sic]', hide: true
|
2
2
|
def create_database_yml
|
3
3
|
real_yml = 'config/database.yml'
|
4
4
|
sample_yml = 'config/database.sample.yml'
|
5
5
|
|
6
|
-
if File.
|
7
|
-
announce 'Creating ' + real_yml
|
6
|
+
if File.exist?(sample_yml) && !File.exist?(real_yml)
|
7
|
+
Interaction.announce 'Creating ' + real_yml
|
8
8
|
|
9
9
|
sample = File.read(sample_yml)
|
10
10
|
adapter = sample.match(/adapter: (\w+)\n/).captures.first
|
@@ -15,6 +15,6 @@ def create_database_yml
|
|
15
15
|
real = sample.gsub(/password:.*$/, "password: #{db_password}")
|
16
16
|
File.open(real_yml, 'w') { |f| f.write(real) }
|
17
17
|
|
18
|
-
note "Created #{real_yml}."
|
18
|
+
Interaction.note "Created #{real_yml}."
|
19
19
|
end
|
20
20
|
end
|
@@ -1,11 +1,11 @@
|
|
1
|
-
desc 'create-databases', 'Create all databases', :
|
1
|
+
desc 'create-databases', 'Create all databases', hide: true
|
2
2
|
def create_databases
|
3
3
|
invoke_cmd 'create_database_yml'
|
4
4
|
invoke_cmd 'bundle_install'
|
5
5
|
|
6
|
-
announce 'Creating databases'
|
6
|
+
Interaction.announce 'Creating databases'
|
7
7
|
|
8
|
-
if File.
|
8
|
+
if File.exist?('config/database.yml')
|
9
9
|
command = 'bundle exec rake db:create:all'
|
10
10
|
command << ' parallel:create' if Util.file_containing?('Gemfile', /parallel_tests/)
|
11
11
|
|
@@ -17,30 +17,30 @@ or `-d`.
|
|
17
17
|
e.g. `--format pretty`.
|
18
18
|
LONGDESC
|
19
19
|
|
20
|
-
option :modified, :
|
21
|
-
:
|
22
|
-
option :containing, :
|
23
|
-
:
|
24
|
-
option :verbose, :
|
25
|
-
:
|
26
|
-
option :debug, :
|
27
|
-
:
|
28
|
-
option :rerun, :
|
29
|
-
:
|
20
|
+
option :modified, aliases: '-m', type: :boolean,
|
21
|
+
desc: 'Run all modified features'
|
22
|
+
option :containing, aliases: '-c', banner: 'STRING',
|
23
|
+
desc: 'Run all features that contain STRING'
|
24
|
+
option :verbose, aliases: '-v', type: :boolean,
|
25
|
+
desc: 'Print the testrun command'
|
26
|
+
option :debug, aliases: '-d', type: :boolean,
|
27
|
+
desc: 'Run with `-f pretty -b` which helps hunting down bugs'
|
28
|
+
option :rerun, aliases: '-r', type: :numeric, default: 0,
|
29
|
+
desc: 'Rerun features up to N times while failing'
|
30
30
|
|
31
31
|
def cucumber(*args)
|
32
32
|
if args.empty?
|
33
33
|
# This is not testable as there is no way to stub `git` :(
|
34
34
|
if options.modified?
|
35
|
-
modified_features = `git status --short`.split(
|
35
|
+
modified_features = `git status --short`.split($INPUT_RECORD_SEPARATOR).map do |line|
|
36
36
|
indicators = line.slice!(0..2) # Remove leading indicators
|
37
|
-
line if line.include?('.feature')
|
37
|
+
line if line.include?('.feature') && !indicators.include?('D')
|
38
38
|
end.compact
|
39
39
|
args = modified_features
|
40
40
|
end
|
41
41
|
|
42
42
|
if options.containing
|
43
|
-
matching_features = `grep -lri '#{options.containing}' --include=*.feature features/`.split(
|
43
|
+
matching_features = `grep -lri '#{options.containing}' --include=*.feature features/`.split($INPUT_RECORD_SEPARATOR)
|
44
44
|
args = matching_features.uniq
|
45
45
|
end
|
46
46
|
end
|
@@ -56,7 +56,7 @@ def cucumber(*args)
|
|
56
56
|
|
57
57
|
# Serial run of @solo scenarios ############################################
|
58
58
|
if files.any? { |f| f.include? ':' }
|
59
|
-
note '@solo run skipped when called with line numbers' if options.verbose
|
59
|
+
Interaction.note '@solo run skipped when called with line numbers' if options.verbose
|
60
60
|
else
|
61
61
|
solo_files = if files.empty?
|
62
62
|
'features' # Proper grepping
|
@@ -64,37 +64,37 @@ def cucumber(*args)
|
|
64
64
|
files.join(' ')
|
65
65
|
end
|
66
66
|
|
67
|
-
solo_tag_usages = `grep -r '@solo' #{
|
67
|
+
solo_tag_usages = `grep -r '@solo' #{solo_files}`.split("\n")
|
68
68
|
|
69
69
|
if solo_tag_usages.any?
|
70
70
|
solo_cmd_opts = cmd_opts.dup
|
71
71
|
solo_cmd_opts << '--tags' << '@solo'
|
72
72
|
|
73
|
-
announce 'Running @solo features'
|
74
|
-
solo_success = Geordi::Cucumber.new.run files, solo_cmd_opts, :
|
75
|
-
solo_success
|
73
|
+
Interaction.announce 'Running @solo features'
|
74
|
+
solo_success = Geordi::Cucumber.new.run files, solo_cmd_opts, verbose: options.verbose, parallel: false
|
75
|
+
solo_success || Interaction.fail('Features failed.')
|
76
76
|
end
|
77
77
|
end
|
78
78
|
|
79
79
|
# Parallel run of all given features + reruns ##############################
|
80
|
-
announce 'Running features'
|
81
|
-
normal_run_successful = Geordi::Cucumber.new.run(files, cmd_opts, :
|
80
|
+
Interaction.announce 'Running features'
|
81
|
+
normal_run_successful = Geordi::Cucumber.new.run(files, cmd_opts, verbose: options.verbose)
|
82
82
|
|
83
83
|
unless normal_run_successful
|
84
84
|
cmd_opts << '--profile' << 'rerun'
|
85
85
|
|
86
86
|
# Reruns
|
87
87
|
(options.rerun + 1).times do |i|
|
88
|
-
fail 'Features failed.' if
|
88
|
+
Interaction.fail 'Features failed.' if i == options.rerun # All reruns done?
|
89
89
|
|
90
|
-
announce "Rerun ##{
|
91
|
-
break if Geordi::Cucumber.new.run([], cmd_opts, :
|
90
|
+
Interaction.announce "Rerun ##{i + 1} of #{options.rerun}"
|
91
|
+
break if Geordi::Cucumber.new.run([], cmd_opts, verbose: options.verbose, parallel: false)
|
92
92
|
end
|
93
93
|
end
|
94
94
|
|
95
|
-
success 'Features green.'
|
95
|
+
Interaction.success 'Features green.'
|
96
96
|
|
97
97
|
else
|
98
|
-
note 'Cucumber not employed.'
|
98
|
+
Interaction.note 'Cucumber not employed.'
|
99
99
|
end
|
100
100
|
end
|
@@ -12,32 +12,32 @@ LONGDESC
|
|
12
12
|
|
13
13
|
def delete_dumps(dump_directory = nil)
|
14
14
|
deletable_dumps = []
|
15
|
-
if dump_directory.nil?
|
16
|
-
|
15
|
+
dump_directories = if dump_directory.nil?
|
16
|
+
[
|
17
17
|
File.join(Dir.home, 'dumps'),
|
18
|
-
Dir.pwd
|
18
|
+
Dir.pwd,
|
19
19
|
]
|
20
20
|
else
|
21
|
-
|
21
|
+
[dump_directory]
|
22
22
|
end
|
23
|
-
announce 'Looking for *.dump in ' << dump_directories.join(',')
|
23
|
+
Interaction.announce 'Looking for *.dump in ' << dump_directories.join(',')
|
24
24
|
dump_directories.each do |d|
|
25
|
-
|
26
|
-
unless File.directory? File.realdirpath(
|
27
|
-
warn "Directory #{
|
25
|
+
d_2 = File.expand_path(d)
|
26
|
+
unless File.directory? File.realdirpath(d_2)
|
27
|
+
Interaction.warn "Directory #{d_2} does not exist"
|
28
28
|
next
|
29
29
|
end
|
30
|
-
deletable_dumps.concat(Dir.glob("#{
|
30
|
+
deletable_dumps.concat(Dir.glob("#{d_2}/**/*.dump"))
|
31
31
|
end
|
32
32
|
if deletable_dumps.empty?
|
33
|
-
success 'No dumps to delete' if deletable_dumps.empty?
|
33
|
+
Interaction.success 'No dumps to delete' if deletable_dumps.empty?
|
34
34
|
exit 0
|
35
35
|
end
|
36
36
|
deletable_dumps.uniq!.sort!
|
37
|
-
note 'The following dumps can be deleted:'
|
37
|
+
Interaction.note 'The following dumps can be deleted:'
|
38
38
|
puts
|
39
39
|
puts deletable_dumps
|
40
|
-
prompt
|
40
|
+
Interaction.prompt('Delete those dumps', 'n', /y|yes/) || raise('Cancelled.')
|
41
41
|
deletable_dumps.each do |dump|
|
42
42
|
File.delete dump unless File.directory? dump
|
43
43
|
end
|
@@ -30,25 +30,25 @@ instead of `cap deploy:migrations`. You can force using `deploy` by passing the
|
|
30
30
|
-M option: `geordi deploy -M staging`.
|
31
31
|
LONGDESC
|
32
32
|
|
33
|
-
option :no_migrations, :
|
34
|
-
:
|
35
|
-
option :current_branch, :
|
36
|
-
:
|
33
|
+
option :no_migrations, aliases: '-M', type: :boolean,
|
34
|
+
desc: 'Run cap deploy instead of cap deploy:migrations'
|
35
|
+
option :current_branch, aliases: '-c', type: :boolean,
|
36
|
+
desc: 'Set DEPLOY_BRANCH to the current branch during deploy'
|
37
37
|
|
38
38
|
def deploy(target_stage = nil)
|
39
39
|
# Set/Infer default values
|
40
|
-
branch_stage_map = { 'master' => 'staging', 'production' => 'production'}
|
41
|
-
if target_stage
|
40
|
+
branch_stage_map = { 'master' => 'staging', 'production' => 'production' }
|
41
|
+
if target_stage && !Util.deploy_targets.include?(target_stage)
|
42
42
|
# Target stage autocompletion from available stages
|
43
43
|
target_stage = Util.deploy_targets.find { |t| t.start_with? target_stage }
|
44
|
-
target_stage || warn('Given deployment stage not found')
|
44
|
+
target_stage || Interaction.warn('Given deployment stage not found')
|
45
45
|
end
|
46
46
|
|
47
47
|
# Ask for required information
|
48
|
-
target_stage ||= prompt 'Deployment stage:', branch_stage_map.fetch(Util.current_branch, 'staging')
|
48
|
+
target_stage ||= Interaction.prompt 'Deployment stage:', branch_stage_map.fetch(Util.current_branch, 'staging')
|
49
49
|
if options.current_branch
|
50
50
|
stage_file = "config/deploy/#{target_stage}.rb"
|
51
|
-
Util.file_containing?
|
51
|
+
Util.file_containing?(stage_file, 'DEPLOY_BRANCH') || Interaction.fail(<<-ERROR)
|
52
52
|
To deploy from the current branch, configure #{stage_file} to respect the
|
53
53
|
environment variable DEPLOY_BRANCH. Example:
|
54
54
|
|
@@ -57,38 +57,38 @@ set :branch, ENV['DEPLOY_BRANCH'] || 'master'
|
|
57
57
|
|
58
58
|
source_branch = target_branch = Util.current_branch
|
59
59
|
else
|
60
|
-
source_branch = prompt 'Source branch:', Util.current_branch
|
61
|
-
target_branch = prompt 'Deploy branch:', branch_stage_map.invert.fetch(target_stage, 'master')
|
60
|
+
source_branch = Interaction.prompt 'Source branch:', Util.current_branch
|
61
|
+
target_branch = Interaction.prompt 'Deploy branch:', branch_stage_map.invert.fetch(target_stage, 'master')
|
62
62
|
end
|
63
63
|
|
64
64
|
merge_needed = (source_branch != target_branch)
|
65
65
|
push_needed = merge_needed || `git cherry -v | wc -l`.strip.to_i > 0
|
66
66
|
push_needed = false if Util.testing? # Hard to test
|
67
67
|
|
68
|
-
announce "Checking whether your #{source_branch} branch is ready" ############
|
68
|
+
Interaction.announce "Checking whether your #{source_branch} branch is ready" ############
|
69
69
|
Util.system! "git checkout #{source_branch}"
|
70
|
-
if `git status -s | wc -l`.strip != '0'
|
71
|
-
warn "Your #{source_branch} branch holds uncommitted changes."
|
72
|
-
prompt('Continue anyway?', 'n', /y|yes/)
|
70
|
+
if (`git status -s | wc -l`.strip != '0') && !Util.testing?
|
71
|
+
Interaction.warn "Your #{source_branch} branch holds uncommitted changes."
|
72
|
+
Interaction.prompt('Continue anyway?', 'n', /y|yes/) || raise('Cancelled.')
|
73
73
|
else
|
74
|
-
note 'All good.'
|
74
|
+
Interaction.note 'All good.'
|
75
75
|
end
|
76
76
|
|
77
77
|
if merge_needed
|
78
|
-
announce "Checking what's in your #{target_branch} branch right now" #######
|
78
|
+
Interaction.announce "Checking what's in your #{target_branch} branch right now" #######
|
79
79
|
Util.system! "git checkout #{target_branch} && git pull"
|
80
80
|
end
|
81
81
|
|
82
|
-
announce 'You are about to:' #################################################
|
83
|
-
note "Merge branch #{source_branch} into #{target_branch}" if merge_needed
|
82
|
+
Interaction.announce 'You are about to:' #################################################
|
83
|
+
Interaction.note "Merge branch #{source_branch} into #{target_branch}" if merge_needed
|
84
84
|
if push_needed
|
85
|
-
note 'Push these commits:' if push_needed
|
85
|
+
Interaction.note 'Push these commits:' if push_needed
|
86
86
|
Util.system! "git --no-pager log origin/#{target_branch}..#{source_branch} --oneline"
|
87
87
|
end
|
88
|
-
note "Deploy to #{target_stage}"
|
89
|
-
note "From current branch #{source_branch}" if options.current_branch
|
88
|
+
Interaction.note "Deploy to #{target_stage}"
|
89
|
+
Interaction.note "From current branch #{source_branch}" if options.current_branch
|
90
90
|
|
91
|
-
if prompt('Go ahead with the deployment?', 'n', /y|yes/)
|
91
|
+
if Interaction.prompt('Go ahead with the deployment?', 'n', /y|yes/)
|
92
92
|
puts
|
93
93
|
git_call = []
|
94
94
|
git_call << "git merge #{source_branch}" if merge_needed
|
@@ -100,17 +100,16 @@ set :branch, ENV['DEPLOY_BRANCH'] || 'master'
|
|
100
100
|
capistrano_call = "DEPLOY_BRANCH=#{source_branch} #{capistrano_call}" if options.current_branch
|
101
101
|
|
102
102
|
if git_call.any?
|
103
|
-
Util.system! git_call.join(' && '), :
|
103
|
+
Util.system! git_call.join(' && '), show_cmd: true
|
104
104
|
end
|
105
105
|
|
106
106
|
invoke_cmd 'bundle_install'
|
107
107
|
|
108
|
-
Util.system! capistrano_call, :
|
108
|
+
Util.system! capistrano_call, show_cmd: true
|
109
109
|
|
110
|
-
success 'Deployment complete.'
|
110
|
+
Interaction.success 'Deployment complete.'
|
111
111
|
else
|
112
112
|
Util.system! "git checkout #{source_branch}"
|
113
|
-
fail 'Deployment cancelled.'
|
113
|
+
Interaction.fail 'Deployment cancelled.'
|
114
114
|
end
|
115
|
-
|
116
115
|
end
|