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