class PactBroker::Client::PublishPactsTheOldWay
def self.call(pact_broker_base_url, pact_file_paths, consumer_version_params, options, pact_broker_client_options={})
def self.call(pact_broker_base_url, pact_file_paths, consumer_version_params, options, pact_broker_client_options={}) new(pact_broker_base_url, pact_file_paths, consumer_version_params, options, pact_broker_client_options).call end
def apply_tags
def apply_tags return true if tags.empty? tags.all? do | tag | tag_consumer_version tag end end
def call
def call validate $stdout.puts("") result = apply_tags && publish_pacts $stdout.puts("") if result PactBroker::Client::CommandResult.new(true) else PactBroker::Client::CommandResult.new(false, "One or more pacts failed to be published") end end
def consumer_names
def consumer_names pact_files.collect(&:consumer_name).uniq end
def index_entry_point
def index_entry_point @index_entry_point ||= create_index_entry_point(pact_broker_base_url, pact_broker_client_options) end
def index_resource
def index_resource @index_resource ||= Retry.while_error do index_entry_point.get! end end
def initialize pact_broker_base_url, pact_file_paths, consumer_version_params, options, pact_broker_client_options={}
def initialize pact_broker_base_url, pact_file_paths, consumer_version_params, options, pact_broker_client_options={} @pact_broker_base_url = pact_broker_base_url @pact_file_paths = pact_file_paths @consumer_version_number = consumer_version_params[:number].respond_to?(:strip) ? consumer_version_params[:number].strip : consumer_version_params[:number] @branch = consumer_version_params[:branch] @build_url = consumer_version_params[:build_url] @tags = consumer_version_params[:tags] ? consumer_version_params[:tags].collect{ |tag| tag.respond_to?(:strip) ? tag.strip : tag } : [] @pact_broker_client_options = pact_broker_client_options end
def merge_contents(pact_files)
def merge_contents(pact_files) MergePacts.call(pact_files.collect(&:pact_hash)) end
def merge_on_server?
def merge_on_server? pact_broker_client_options[:write] == :merge end
def pact_broker_client
def pact_broker_client @pact_broker_client ||= PactBroker::Client::PactBrokerClient.new(base_url: pact_broker_base_url, client_options: pact_broker_client_options) end
def pact_files
def pact_files @pact_files ||= pact_file_paths.collect{ |pact_file_path| PactFile.new(pact_file_path) } end
def publish_pact pact
def publish_pact pact begin $stdout.puts "Publishing #{pact.pact_name} to pact broker at #{pact_broker_base_url}" publish_pact_contents pact rescue => e $stderr.puts "Failed to publish #{pact.pact_name} due to error: #{e.class} - #{e}" false end end
def publish_pact_contents(pact)
def publish_pact_contents(pact) Retry.while_error do pacts = pact_broker_client.pacticipants.versions.pacts if pacts.version_published?(consumer: pact.consumer_name, provider: pact.provider_name, consumer_version: consumer_version_number) if merge_on_server? $stdout.puts "A pact for this consumer version is already published. Merging contents." else $stdout.puts ::Term::ANSIColor.yellow("A pact for this consumer version is already published. Overwriting. (Note: Overwriting pacts is not recommended as it can lead to race conditions. Best practice is to provide a unique consumer version number for each publication. For more information, see https://docs.pact.io/versioning)") end end latest_pact_url = pacts.publish(pact_hash: pact, consumer_version: consumer_version_number) $stdout.puts "The latest version of this pact can be accessed at the following URL:\n#{latest_pact_url}" true end end
def publish_pacts
def publish_pacts pact_files.group_by(&:pact_name).collect do | pact_name, pact_files | $stdout.puts "Merging #{pact_files.collect(&:path).join(", ")}" if pact_files.size > 1 publish_pact(PactHash[merge_contents(pact_files)]) end.all? end
def tag_consumer_version tag
def tag_consumer_version tag versions = pact_broker_client.pacticipants.versions Retry.while_error do consumer_names.collect do | consumer_name | versions.tag(pacticipant: consumer_name, version: consumer_version_number, tag: tag) $stdout.puts "Tagged version #{consumer_version_number} of #{consumer_name} as #{tag.inspect}" true end end rescue => e $stderr.puts "Failed to tag version due to error: #{e.class} - #{e}" false end
def validate
def validate if branch || build_url $stdout.puts ::Term::ANSIColor.yellow("WARN: This version of the Pact Broker does not support versions with branches or build URLs. Please upgrade your broker to 2.86.0 or later.") end raise PactBroker::Client::Error.new("Please specify the consumer_version_number") unless (consumer_version_number && consumer_version_number.to_s.strip.size > 0) raise PactBroker::Client::Error.new("Please specify the pact_broker_base_url") unless (pact_broker_base_url && pact_broker_base_url.to_s.strip.size > 0) raise PactBroker::Client::Error.new("No pact files found") unless (pact_file_paths && pact_file_paths.any?) end
def version_body
def version_body { branch: branch, buildUrl: build_url }.compact end