lib/hu/deploy.rb in hu-1.5.1 vs lib/hu/deploy.rb in hu-1.5.2
- old
+ new
@@ -1,26 +1,7 @@
# frozen_string_literal: true
-require 'version_sorter'
-require 'versionomy'
-require 'tty-prompt'
require 'tty-spinner'
-require 'tty-table'
-require 'rainbow'
-require 'rainbow/ext/string'
-require 'open3'
-require 'json'
-require 'awesome_print'
-require 'chronic_duration'
-require 'tempfile'
-require 'thread_safe'
-require 'io/console'
-require 'rugged'
-require 'pty'
-require 'thread'
-require 'paint'
-require 'lolcat/lol'
-require 'io/console'
module Hu
class Cli < Optix::Cli
class Deploy < Optix::Cli
::TTY::Formats::FORMATS[:hu] = { frames: '🌑🌒🌓🌔🌕🌖🌗🌘'.chars, interval: 10 }
@@ -42,20 +23,52 @@
filter do
if Hu::API_TOKEN.nil?
STDERR.puts "\e[0;31;1mERROR: Environment variable 'HEROKU_API_KEY' must be set.\e[0m"
exit 1
end
+ require 'tty-cursor'
+ print TTY::Cursor.hide + "\e[30;1ms"
+ require 'rainbow'
+ print 'y'
+ require 'rainbow/ext/string'
+ print 'n'
+ require 'platform-api'
+ print 'c'
+ require 'version_sorter'
+ print 'h'
+ require 'versionomy'
+ print 'r'
+ require 'tty-prompt'
+ print 'o'
+ require 'tty-table'
+ print 'n'
+ require 'open3'
+ print 'i'
+ require 'json'
+ require 'awesome_print'
+ print 'z'
+ require 'chronic_duration'
+ require 'tempfile'
+ print 'i'
+ require 'thread_safe'
+ require 'io/console'
+ print 'n'
+ require 'rugged'
+ require 'pty'
+ print 'g'
+ require 'thread'
+ require 'paint'
+ require 'lolcat/lol'
+ require 'io/console'
end
def deploy(_cmd, _opts, _argv)
- Hu::Tm.t(:invoke, cmd: 'deploy')
trap('INT') { shutdown; puts "\e[0m\e[35;1m^C\e[0m"; exit 1 }
at_exit do
if $!.class == SystemExit && 130 == $!.status
puts "\n\n"
end
- Hu::Tm.flush!
shutdown
return_to_home_branch
print "\e[0m\e[?25h"
end
@@ -64,11 +77,10 @@
rescue Rugged::RepositoryError => e
puts
puts "Git error: #{e}".color(:red)
puts 'You need to be inside the working copy of the app that you wish to deploy.'.color(:red)
puts
- Hu::Tm.t(:error_not_in_working_copy, cmd: 'deploy')
exit 1
end
Dir.chdir(@git.workdir)
@@ -76,21 +88,19 @@
puts
puts "ERROR: Remote of branch 'master' does not point to 'origin'.".color(:red)
puts
puts ' Sorry, we need an origin here. We really do.'
puts
- Hu::Tm.t(:error_no_git_origin, cmd: 'deploy')
exit 1
end
if @git.config['gitflow.branch.master'].nil?
puts
puts "ERROR: This repository doesn't seem to be git-flow enabled.".color(:red)
puts
puts " Please run 'git flow init -d'"
puts
- Hu::Tm.t(:error_no_git_flow, cmd: 'deploy')
exit 1
end
unless @git.config['gitflow.prefix.versiontag'].nil? ||
@git.config['gitflow.prefix.versiontag'].empty?
@@ -99,11 +109,10 @@
puts
puts ' Please use this command to remove the prefix:'
puts
puts " git config --add gitflow.prefix.versiontag ''".bright
puts
- Hu::Tm.t(:error_git_flow_prefix_enabled, cmd: 'deploy')
exit 1
end
push_url = heroku_git_remote
@@home_branch = current_branch_name
@@ -117,11 +126,10 @@
puts "ERROR: Found no heroku app for git remote #{push_url}".color(:red)
puts ' Are you logged into the right heroku account?'.color(:red)
puts
puts " Please run 'git remote rm heroku'. Then run 'hu deploy' again to select a new remote."
puts
- Hu::Tm.t(:error_no_heroku_app_for_remote, cmd: 'deploy')
exit 1
end
pipeline_name, stag_app_id, prod_app_id = heroku_pipeline_details(app)
@@ -133,23 +141,22 @@
puts
puts ' The referenced app MUST be the staging member of the pipeline.'
puts " Please run 'git remote rm heroku'. Then run 'hu deploy' again to select a new remote."
puts
- Hu::Tm.t(:error_remote_not_staging, cmd: 'deploy')
sleep 2
exit 1
end
stag_app_name = app['name']
busy 'synchronizing', :dots
prod_app_name = h.app.info(prod_app_id)['name']
wc_update.join
- unbusy
unless develop_can_be_merged_into_master?
+ unbusy
puts
puts "ERROR: It looks like a merge of 'develop' into 'master' would fail.".color(:red)
puts ' Aborting early to prevent a merge conflict.'.color(:red)
puts
exit 1
@@ -188,10 +195,12 @@
release_tag, branch_already_exists = prompt_for_release_tag(likely_next_version, likely_next_version, true)
prompt = TTY::Prompt.new
+ unbusy
+
clearscreen = true
loop do
git_revisions = show_pipeline_status(pipeline_name, stag_app_name, prod_app_name, release_tag, clearscreen)
clearscreen = true
@@ -219,31 +228,28 @@
unless git_revisions[:release] == git_revisions[stag_app_name] || !release_branch_exists
puts ' Phase 1/3 '.inverse + ' The local release branch ' + "release/#{release_tag}".bright + ' was created.'
puts ' Nothing else has happened so far. Push this branch to'
puts ' ' + stag_app_name.to_s.bright + ' to begin the deploy procedure.'
puts
- Hu::Tm.t(:phase1, cmd: 'deploy')
end
if release_branch_exists && git_revisions[:release] == git_revisions[stag_app_name]
puts ' Phase 2/3 '.inverse + ' Your local ' + "release/#{release_tag}".bright + ' (formerly ' + 'develop'.bright + ') is live at ' + stag_app_name.to_s.bright + '.'
puts ' Please test here: ' + (app['web_url']).to_s.bright
puts ' If everything looks good, you may proceed and finish the release.'
puts ' If there are problems: Quit, delete the release branch and start fixing.'
puts
- Hu::Tm.t(:phase2, cmd: 'deploy')
elsif git_revisions[prod_app_name] != git_revisions[stag_app_name] && !release_branch_exists && git_revisions[:release] != git_revisions[stag_app_name]
puts ' Phase 3/3 '.inverse + ' HEADS UP! This is the last chance to detect problems.'
puts ' The final version of ' + "release/#{release_tag}".bright + ' is now staged.'
puts
puts ' Test here: ' + (app['web_url']).to_s.bright
sleep 1
puts
puts ' This is the exact version that will be promoted to production.'
puts " From here you are on your own. Good luck #{`whoami`.chomp}!"
puts
- Hu::Tm.t(:phase3, cmd: 'deploy')
end
choice = prompt.select('Choose your destiny') do |menu|
menu.enum '.'
menu.choice 'Refresh', :refresh
@@ -272,16 +278,13 @@
end
end
case choice
when :DEPLOY
- Hu::Tm.t(:promote_begin, cmd: 'deploy')
promote_to_production
- Hu::Tm.t(:promote_end, cmd: 'deploy')
anykey
when :finish_release
- Hu::Tm.t(:finish_begin, cmd: 'deploy')
old_editor = ENV['EDITOR']
old_git_editor = ENV['GIT_EDITOR']
tf = Tempfile.new('hu-tag')
tf.write "#{release_tag}\n#{changelog}"
tf.close
@@ -300,43 +303,35 @@
puts
puts 'Please bring the universe into a state'
puts 'where the above sequence of commands can'
puts 'succeed. Then try again.'
puts
- Hu::Tm.t(:finish_fail, cmd: 'deploy')
exit 1
end
ENV['EDITOR'] = old_editor
ENV['GIT_EDITOR'] = old_git_editor
- Hu::Tm.t(:finish_end, cmd: 'deploy')
anykey
when :push_to_staging
- Hu::Tm.t(:stage_begin, cmd: 'deploy')
run_each <<-EOS.strip_heredoc
:stream
git push #{push_url} release/#{release_tag}:master -f
EOS
- Hu::Tm.t(:stage_end, cmd: 'deploy')
anykey
when :abort_ask
- Hu::Tm.t(:user_quit, cmd: 'deploy')
puts if delete_branch("release/#{release_tag}")
exit 0
when :bump_tiny
if delete_branch("release/#{release_tag}")
release_tag, branch_already_exists = prompt_for_release_tag(tiny_bump, tiny_bump)
- Hu::Tm.t(:switch_release_type, bump: 'patch', cmd: 'deploy')
end
when :bump_minor
if delete_branch("release/#{release_tag}")
release_tag, branch_already_exists = prompt_for_release_tag(minor_bump, minor_bump)
- Hu::Tm.t(:switch_release_type, bump: 'minor', cmd: 'deploy')
end
when :bump_major
if delete_branch("release/#{release_tag}")
release_tag, branch_already_exists = prompt_for_release_tag(major_bump, major_bump)
- Hu::Tm.t(:switch_release_type, bump: 'major', cmd: 'deploy')
end
when :refresh
puts
end
end
@@ -468,11 +463,10 @@
puts ' WARNING '.color(:red).bright.inverse + ' Missing config in ' + prod_app_name.bright + ": #{var}"
sleep 0.42
end
end
- Hu::Tm.t(:status_screen, cmd: 'deploy')
revs
end
def heroku_app_by_git(git_url)
busy('synchronizing', :dots)
@@ -599,11 +593,10 @@
end
next unless status.exitstatus != 0
shutdown if opts[:failfast]
puts "Error, exit #{status.exitstatus}: #{line} (L#{i})".color(:red).bright
- Hu::Tm.t(:runeach_error, exitstatus: status.exitstatus, cmd: 'deploy')
exit status.exitstatus if opts[:failfast]
return status.exitstatus
end
0
end
@@ -644,11 +637,10 @@
:quiet
# Delete branch #{branch_name}
git checkout develop
git branch -D #{branch_name}
EOS
- Hu::Tm.t(:delete_release_branch, cmd: 'deploy')
puts "Branch #{branch_name} deleted.".color(:red)
true
end
def checkout_branch(branch_name)
@@ -662,31 +654,30 @@
def start_release(release_tag)
run_each <<-EOS.strip_heredoc
# Starting release #{release_tag.color(:green)}
git flow release start #{release_tag} >/dev/null
EOS
- Hu::Tm.t(:start_release, cmd: 'deploy')
end
def update_working_copy
run_each <<-EOS.strip_heredoc
:quiet
:nospinner
# Ensure local repository is up to date
git checkout develop && git pull
git checkout master && git pull --rebase origin master
EOS
- Hu::Tm.t(:update_working_copy, cmd: 'deploy')
end
def heroku_git_remote
ensure_repo_has_heroku_remote
`git remote show -n heroku | grep Push`.chomp.split(':', 2)[1][1..-1]
end
def ensure_repo_has_heroku_remote
exit_code = run_each <<-EOS.strip_heredoc
+ :nospinner
:quiet
:return
# Ensure we have a 'heroku' git remote
git remote | grep -q "^heroku$"
EOS
@@ -850,11 +841,10 @@
run_each <<-EOS.strip_heredoc
:return
# Abort failed merge (if any)
git merge --abort
EOS
- Hu::Tm.t(:abort_merge, cmd: 'deploy')
end
def return_to_home_branch
return if @@home_branch.nil? || @@home_branch == current_branch_name
run_each <<-EOS.strip_heredoc
@@ -862,10 +852,9 @@
:nospinner
:return
# Return to home branch
git checkout #{@@home_branch}
EOS
- Hu::Tm.t(:return_home, cmd: 'deploy')
end
def develop_can_be_merged_into_master?
status = run_each <<-EOS.strip_heredoc
:quiet