lib/release_tools/deployments/blockers_report.rb (116 lines of code) (raw):

# frozen_string_literal: true require 'release_tools/issuable' require 'release_tools/issue' require_relative 'blockers_calculator' module ReleaseTools module Deployments class BlockersReport < ReleaseTools::Issue include ::SemanticLogger::Loggable PROJECT = ReleaseTools::Project::Release::Tasks def initialize @blockers = ReleaseTools::Deployments::BlockerIssueFetcher.new end def create return create_new_issue unless existing_issue update_issue_description notify_issue existing_issue end def title "Deployment Blockers - Week: #{start_time}-#{end_time}" end def description @blockers.fetch calculator = BlockersCalculator.new(deployment_blockers) variables = binding variables.local_variable_set(:start_time, start_time) variables.local_variable_set(:end_time, end_time) variables.local_variable_set(:staging_blocked_time, staging_deployment_blocked_time) variables.local_variable_set(:production_blocked_time, production_deployment_blocked_time) variables.local_variable_set(:deployment_blockers, deployment_blockers) variables.local_variable_set(:uncategorized_incidents, uncategorized_incidents) variables.local_variable_set(:blocker_types, calculator.blocker_types) variables.local_variable_set(:total_blocker_type_gstg, calculator.total_blocker_type_gstg) variables.local_variable_set(:total_blocker_type_gprd, calculator.total_blocker_type_gprd) variables.local_variable_set(:job_for_blockers_report, job_for_blockers_report) ERB .new(template, trim_mode: '-') .result(variables) end def assignees ReleaseManagers::Schedule.new.active_release_managers.collect(&:id) rescue ReleaseManagers::Schedule::VersionNotFoundError nil end def labels '' end private def start_time @blockers.start_time.strftime('%Y-%m-%d') end def end_time @blockers.end_time.strftime('%Y-%m-%d') end def production_deployment_blocked_time deployment_blockers.sum(&:hours_gprd_blocked) end def staging_deployment_blocked_time deployment_blockers.sum(&:hours_gstg_blocked) end def deployment_blockers @blockers.deployment_blockers end def uncategorized_incidents @blockers.uncategorized_incidents end def job_for_blockers_report ENV.fetch('CI_JOB_URL', nil) end def template template_path = File .expand_path('../../../templates/deployment_blockers_report.md.erb', __dir__) File.read(template_path) end def client ReleaseTools::GitlabClient end def existing_issue @existing_issue ||= Retriable.with_context(:api) do client.issues(PROJECT, options).first end end def options { state: 'opened', author_id: ReleaseTools::Bot::GITLAB_COM_ID, search: title } end def create_new_issue logger.info('Creating new blockers report') Retriable.with_context(:api) { client.create_issue(self, PROJECT) } end def update_issue_description logger.info('Updating Deployment Blockers report issue', web_url: existing_issue.web_url) Retriable.with_context(:api) do client.edit_issue( PROJECT.path, existing_issue.iid, { description: description } ) end end def notify_issue logger.info('Adding comment to Deployment Blockers report issue', web_url: existing_issue.web_url) Retriable.with_context(:api) do client.create_issue_note( PROJECT, issue: existing_issue, body: "The report has been regenerated with the updated blocker types and hours blocked" ) end end end end end