lib/release_tools/security/prepare/fixes_verifier.rb (67 lines of code) (raw):
# frozen_string_literal: true
module ReleaseTools
module Security
module Prepare
class FixesVerifier
include ::SemanticLogger::Loggable
include ::ReleaseTools::Security::IssueHelper
def initialize
@client = ReleaseTools::GitlabClient
@fetcher = ReleaseTools::Security::IssuesFetcher.new(@client)
@security_fixes = []
end
def execute
security_issues = fetcher.execute
if security_issues.present?
logger.info('The patch release includes security fixes. Nothing to do')
send_slack_notification(:success)
return
end
logger.info("The patch release doesn't include security fixes, notifying Delivery and AppSec release managers")
notify_release_managers
notify_appsec_release_managers
send_slack_notification(:success)
rescue StandardError => ex
logger.fatal(failure_message, error: ex)
send_slack_notification(:failed)
raise
end
private
attr_reader :client, :fetcher, :security_fixes
def notify_release_managers
message = <<~MSG.strip
#{usernames(release_managers.active_release_managers)} :wave:,
There are no security fixes available for the patch release. This might be caused due to a global holiday period.
Review if security fixes were recently unlinked from the [security tracking issue](#{security_tracking_issue.web_url}),
ping the authors to notify them about the patch release due date.
If necessary, consider delaying the patch release to the next day (Thursday).
If there are no security fixes available:
1. Notify AppSec about this.
2. Perform the patch release with only bug fixes.
MSG
create_issue_note(ReleaseTools::Project::Release::Tasks, security_task_issue, message)
end
def notify_appsec_release_managers
message = <<~MSG.strip
#{usernames(release_managers.active_appsec_release_managers)} :wave:,
This patch release doesn't include security fixes, please coordinate with release managers.
If there are no security fixes available, notify the Marketing team that
no email alert should be sent - #{security_communication_issue.web_url}.
MSG
create_issue_note(ReleaseTools::Project::GitlabEe, security_tracking_issue, message)
end
def create_issue_note(project, issue, body)
logger.info('Posting note', project: project.path, issue: issue.web_url, body: body)
return if SharedStatus.dry_run?
Retriable.with_context(:api) do
client.create_issue_note(project, issue: issue, body: body)
end
end
def usernames(users)
users.map do |user|
"@#{user.username}"
end.join(', ')
end
def release_managers
@release_managers ||= ReleaseTools::ReleaseManagers::Schedule.new
end
def send_slack_notification(status)
ReleaseTools::Slack::ReleaseJobEndNotifier.new(
job_type: 'Security fixes verifier',
status: status,
release_type: :patch
).send_notification
end
def failure_message
<<~MSG.strip
Security fixes could not be verified. Review if there are any security fixes on the
[tracking issue](#{security_tracking_issue.web_url}). If no security issues are present:
* Notify AppSec that no security fixes are present on the patch release
* Perform the patch release with only bug fixes.
MSG
end
end
end
end
end