lib/release_tools/promotion/manager.rb (51 lines of code) (raw):

# frozen_string_literal: true module ReleaseTools module Promotion class Manager include ::SemanticLogger::Loggable class UnsafeProductionError < StandardError; end def status @status ||= ProductionStatus.new(:active_gprd_deployments) end # Authorize production promotion based on the current system status # # @param package_version [String] the package we want to promote # @param issue [ReleaseTools::Issue] the issue to track the outcome # @raise [UnsafeProductionError] if the deployment isn't authorized def authorize!(package_version, issue) Retriable.with_context(:api) do create_issue_comment(issue, package_version) end raise UnsafeProductionError unless safe? end private def safe? ignore_production_checks? || status.fine? end # ignore_production_checks return the reason for bypassing production checks # # Production check bypassing starts with a chatops command. # If the release manager provides a reason for bypassing the checks, # it will be propagated to the deployer, and then to release-tools using # the IGNORE_PRODUCTION_CHECKS trigger variable. # On every stage this defaults to 'false', meaning that checks should not # be ignored. # # @return [String] the reason for bypassing the production checks, defaults to 'false' def ignore_production_checks CGI.unescape(ENV.fetch('IGNORE_PRODUCTION_CHECKS', 'false')) end # ignore_production_checks? verifies if a reason for bypassing production checks was provided # # @see Manager#ignore_production_checks def ignore_production_checks? ignore_production_checks != 'false' end def note(package_version) StatusNote.new( status: status, package_version: package_version, override_reason: ignore_production_checks ) end def create_issue_comment(issue, package_version) if SharedStatus.dry_run? logger.warn( 'Dry run mode, no comment will be posted', issue: issue.url, package_version: package_version, production_healthy: status.fine?, ignore_production_checks: ignore_production_checks ) return end GitlabClient.create_issue_note( issue.project, issue: issue, body: note(package_version).body ) end end end end