Skip to content

Commit

Permalink
feat(can-i-deploy): add --dry-run option
Browse files Browse the repository at this point in the history
  • Loading branch information
bethesque committed Jun 16, 2021
1 parent 7630f31 commit 9d90c79
Show file tree
Hide file tree
Showing 6 changed files with 120 additions and 25 deletions.
41 changes: 36 additions & 5 deletions lib/pact_broker/client/can_i_deploy.rb
Original file line number Diff line number Diff line change
Expand Up @@ -33,9 +33,9 @@ def initialize(pact_broker_base_url, version_selectors, matrix_options, options,
def call
create_result(fetch_matrix_with_retries)
rescue PactBroker::Client::Error => e
Result.new(false, Term::ANSIColor.red(e.message))
Result.new(dry_run_or_false, for_dry_run(Term::ANSIColor.red(e.message)))
rescue StandardError => e
Result.new(false, "Error retrieving matrix. #{e.class} - #{e.message}\n#{e.backtrace.join("\n")}")
Result.new(dry_run_or_false, for_dry_run(Term::ANSIColor.red("Error retrieving matrix. #{e.class} - #{e.message}") + "\n#{e.backtrace.join("\n")}"))
end

private
Expand All @@ -46,26 +46,40 @@ def create_result(matrix)
if matrix.deployable?
Result.new(true, success_message(matrix))
else
Result.new(false, failure_message(matrix))
Result.new(dry_run_or_false, failure_message(matrix))
end
end

def success_message(matrix)
message = format_matrix(matrix)
if format != 'json'
message = warning(matrix) + Term::ANSIColor.green('Computer says yes \o/ ') + message + "\n\n" + notice_or_reason(matrix, :green)
message = warning(matrix) + computer_says(true) + message + "\n\n" + notice_or_reason(matrix, :green)
message = for_dry_run(message)
end
message
end

def failure_message(matrix)
message = format_matrix(matrix)
if format != 'json'
message = warning(matrix) + Term::ANSIColor.red('Computer says no ¯\_(ツ)_/¯ ') + message + "\n\n" + notice_or_reason(matrix, :red)
message = warning(matrix) + computer_says(false) + message + "\n\n" + notice_or_reason(matrix, :red)
message = for_dry_run(message)
end
message
end

def computer_says(success)
if success
Term::ANSIColor.green('Computer says yes \o/ ')
else
if dry_run?
"Computer says no ¯\_(ツ)_/¯ (but you're ignoring this with --dry-run)"
else
Term::ANSIColor.red("Computer says no ¯\_(ツ)_/¯")
end
end
end

def notice_or_reason(matrix, reason_color)
if matrix.notices
PactBroker::Client::ColorizeNotices.call(matrix.notices).join("\n")
Expand Down Expand Up @@ -114,6 +128,23 @@ def retry_while_unknown?
options[:retry_while_unknown] > 0
end

def dry_run?
options[:dry_run]
end

def dry_run_or_false
dry_run? || false
end

def for_dry_run(lines)
if dry_run?
prefix = Term::ANSIColor.yellow("[dry-run] ")
lines.split("\n").collect { |line| prefix + Term::ANSIColor.uncolor(line) }.join("\n") + "\n" + prefix + "\n" + prefix + Term::ANSIColor.green("Dry run enabled - ignoring any failures")
else
lines
end
end

def retry_options
{
condition: lambda { |matrix| !matrix.any_unknown? },
Expand Down
21 changes: 5 additions & 16 deletions lib/pact_broker/client/cli/broker.rb
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
require 'pact_broker/client/cli/custom_thor'
require 'pact_broker/client/hash_refinements'
require 'thor/error'
require 'term/ansicolor'
require 'pact_broker/client/cli/environment_commands'
require 'pact_broker/client/cli/deployment_commands'
require 'pact_broker/client/cli/pacticipant_commands'
Expand Down Expand Up @@ -53,21 +52,11 @@ def can_i_deploy(*ignored_but_necessary)
[]
end
validate_can_i_deploy_selectors(selectors)
can_i_deploy_options = { output: options.output, retry_while_unknown: options.retry_while_unknown, retry_interval: options.retry_interval }
can_i_deploy_options = { output: options.output, retry_while_unknown: options.retry_while_unknown, retry_interval: options.retry_interval, dry_run: options.dry_run }
result = CanIDeploy.call(options.broker_base_url, selectors, { to_tag: options.to, to_environment: options.to_environment, limit: options.limit, ignore_selectors: ignore_selectors }, can_i_deploy_options, pact_broker_client_options)

if options.dry_run
$stderr.puts Term::ANSIColor.yellow("Dry run enabled - ignoring any failures")
# $stdout.puts Term::ANSIColor.uncolor(result.message)
$stdout.puts result.message
# $stdout.puts result.message.split("\n").collect { |line| Term::ANSIColor.yellow("[dry-run] ") + line }
# $stderr.puts Term::ANSIColor.yellow("Dry run enabled - ignoring any failures")
$stdout.flush
else
$stdout.puts result.message
$stdout.flush
exit(1) unless result.success
end
$stdout.puts result.message
$stdout.flush
exit(can_i_deploy_exit_status) unless result.success
end

desc 'publish PACT_DIRS_OR_FILES ...', "Publish pacts to a Pact Broker."
Expand Down Expand Up @@ -202,7 +191,7 @@ def self.exit_on_failure?
def can_i_deploy_exit_status
exit_code_string = ENV.fetch('PACT_BROKER_CAN_I_DEPLOY_EXIT_CODE_BETA', '')
if exit_code_string =~ /^\d+$/
$stderr.puts Term::ANSIColor.yellow("Dry run enabled - ignoring any failures")
$stderr.puts "Exiting can-i-deploy with configured exit code #{exit_code_string}"
exit_code_string.to_i
else
1
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
[dry-run] Computer says no ¯_(ツ)_/¯ (but you're ignoring this with --dry-run)
[dry-run] 
[dry-run] text matrix
[dry-run] 
[dry-run] some reason
[dry-run] 
[dry-run] Dry run enabled - ignoring any failures
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
[dry-run] Computer says yes \o/
[dry-run] 
[dry-run] text matrix
[dry-run] 
[dry-run] some reason
[dry-run] 
[dry-run] Dry run enabled - ignoring any failures
64 changes: 62 additions & 2 deletions spec/lib/pact_broker/client/can_i_deploy_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ module Client
let(:version_selectors) { [{ pacticipant: "Foo", version: "1" }] }
let(:matrix_options) { { } }
let(:pact_broker_client_options) { { foo: 'bar' } }
let(:dry_run) { false }
let(:matrix_client) { instance_double('PactBroker::Client::Matrix') }
let(:matrix) do
instance_double('Matrix::Resource',
Expand All @@ -23,7 +24,7 @@ module Client
let(:any_unknown) { unknown_count > 0 }
let(:supports_unknown_count) { true }
let(:retry_while_unknown) { 0 }
let(:options) { { output: 'text', retry_while_unknown: retry_while_unknown, retry_interval: 5 } }
let(:options) { { output: 'text', retry_while_unknown: retry_while_unknown, retry_interval: 5, dry_run: dry_run } }
let(:notices) { nil }
let(:supports_ignore) { true }
let(:deployable) { true }
Expand Down Expand Up @@ -69,6 +70,14 @@ module Client
expect(subject.message).to include "some notice"
end
end

context "when dry_run is enabled" do
let(:dry_run) { true }

it "prefixes each line with [dry-run]" do
Approvals.verify(subject.message, :name => "can_i_deploy_success_dry_run", format: :txt)
end
end
end

context "when the versions are not deployable" do
Expand All @@ -94,6 +103,18 @@ module Client
expect(subject.message).to include "some notice"
end
end

context "when dry_run is enabled" do
let(:dry_run) { true }

it "returns a success response" do
expect(subject.success).to be true
end

it "prefixes each line with [dry-run]" do
Approvals.verify(subject.message, :name => "can_i_deploy_failure_dry_run", format: :txt)
end
end
end

context "when retry_while_unknown is greater than 0" do
Expand Down Expand Up @@ -135,6 +156,19 @@ module Client
it "returns a failure message" do
expect(subject.message).to match /does not provide a count/
end

context "when dry_run is enabled" do
let(:dry_run) { true }

it "returns a success response" do
expect(subject.success).to be true
end

it "returns a failure message" do
expect(subject.message).to include "[dry-run]"
expect(subject.message).to match /does not provide a count/
end
end
end
end

Expand Down Expand Up @@ -169,6 +203,19 @@ module Client
it "returns a failure message" do
expect(subject.message).to include "error text"
end

context "when dry_run is enabled" do
let(:dry_run) { true }

it "returns a success response" do
expect(subject.success).to be true
end

it "returns a failure message" do
expect(subject.message).to include "[dry-run]"
expect(subject.message).to match /error text/
end
end
end

context "when a StandardError is raised" do
Expand All @@ -183,7 +230,20 @@ module Client
end

it "returns a failure message and backtrace" do
expect(subject.message).to include "Error retrieving matrix. StandardError - error text\n"
expect(subject.message).to include "Error retrieving matrix. StandardError - error text"
end

context "when dry_run is enabled" do
let(:dry_run) { true }

it "returns a success response" do
expect(subject.success).to be true
end

it "returns a failure message" do
expect(subject.message).to include "[dry-run]"
expect(subject.message).to match /error text/
end
end
end
end
Expand Down
5 changes: 3 additions & 2 deletions spec/lib/pact_broker/client/cli/broker_can_i_deploy_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@ module CLI
verbose: 'verbose',
retry_while_unknown: 1,
retry_interval: 2,
limit: 1000
limit: 1000,
dry_run: false
}
end

Expand All @@ -37,7 +38,7 @@ module CLI
end

it "invokes the CanIDeploy service" do
expect(CanIDeploy).to receive(:call).with('http://pact-broker', version_selectors, { to_tag: nil, to_environment: nil, limit: 1000, ignore_selectors: []}, {output: 'table', retry_while_unknown: 1, retry_interval: 2}, { pact_broker_base_url: 'http://pact-broker', verbose: 'verbose' })
expect(CanIDeploy).to receive(:call).with('http://pact-broker', version_selectors, { to_tag: nil, to_environment: nil, limit: 1000, ignore_selectors: []}, {output: 'table', retry_while_unknown: 1, retry_interval: 2, dry_run: false}, { pact_broker_base_url: 'http://pact-broker', verbose: 'verbose' })
invoke_can_i_deploy
end

Expand Down

0 comments on commit 9d90c79

Please sign in to comment.