lib/release_tools/services/omnibus_packages/base.rb (91 lines of code) (raw):

# frozen_string_literal: true module ReleaseTools module Services module OmnibusPackages class Base include ::SemanticLogger::Loggable OmnibusPackagesError = Class.new(StandardError) OmnibusPackagesInProgressError = Class.new(StandardError) FAILED_STATUSES = %w[failed canceled skipped manual].freeze SUCCESS_STATUS = "success" def initialize(version:, package_type: :tag) @version = version @packages_statuses = {} @package_type = package_type end def execute logger.info("Verifying Omnibus CE/EE package #{action_progressive_tense} for #{version}") Retriable.with_context(:release_package_pipeline, on: OmnibusPackagesInProgressError) do @packages_statuses = packages_service.new(version, package_type: package_type).execute if packages_statuses.empty? raise OmnibusPackagesError, "No Omnibus packages found for #{version}" end if all_packages_succeeded? log_success send_slack_notification(:success) elsif any_package_failed? log_failure raise OmnibusPackagesError else log_in_progress raise OmnibusPackagesInProgressError end end rescue StandardError send_slack_notification(:failed) raise end private attr_accessor :packages_statuses attr_reader :version, :package_type def action_progressive_tense raise NotImplementedError, "Subclasses must implement action_progressive_tense" end def packages_service raise NotImplementedError, "Subclasses must implement packages_service" end def all_packages_succeeded? packages_statuses.values.all?(SUCCESS_STATUS) end def any_package_failed? packages_statuses.values.any? { |status| FAILED_STATUSES.include?(status) } end def log_success logger.info("Packages for #{packages_statuses.keys.join(', ')} have completed #{action_progressive_tense}") end def log_failure failed_packages = packages_statuses.select { |_, status| FAILED_STATUSES.include?(status) } logger.error("Failed to complete #{action_progressive_tense} packages: #{failed_packages}") end def log_in_progress in_progress = packages_statuses.reject { |_, status| FAILED_STATUSES.include?(status) || status == SUCCESS_STATUS } logger.info("Package #{action_progressive_tense} is in progress: #{in_progress}") end def send_slack_notification(status) job_type = if internal? "Verify internal package is built and available for version #{version}" else "Verify package #{action_progressive_tense} for version #{version}" end ReleaseTools::Slack::ReleaseJobEndNotifier .new(job_type: job_type, status: status, release_type: release_type) .send_notification end def release_type if internal? :internal elsif patch? :patch else :monthly end end def patch? ReleaseTools::Version.new(version).patch? end def internal? package_type == :internal end end end end end