lib/release_tools/security/release_preparation/generate_blog_post.rb (94 lines of code) (raw):

# frozen_string_literal: true module ReleaseTools module Security module ReleasePreparation class GenerateBlogPost include ReleaseTools::Security::IssueHelper include ReleaseTools::Security::MergeRequestHelper include ::SemanticLogger::Loggable def initialize @blog_post = PatchRelease::BlogPost::MergeRequestFactory.create( patch_coordinator: ReleaseTools::PatchRelease::Coordinator.new, security_fixes: ReleaseTools::Security::IssueCrawler.new.related_security_issues ) end def execute if SharedStatus.dry_run? logger.info("Printing blog post for patch release") puts blog_post.generate_blog_content return end if blog_post.exists? logger.info('patch release blog post exists') add_comment_on_security_blog_post else logger.info('Creating patch release blog post') blog_post.create notify_release_managers notify_app_sec_release_managers send_success_slack_notification end rescue StandardError => ex logger.fatal(failure_message, error: ex) send_failed_slack_notification raise end private attr_reader :blog_post def notify_release_managers Retriable.with_context(:api) do ReleaseTools::GitlabClient.create_merge_request_comment( ReleaseTools::Project::WWWGitlabCom.security_path, blog_post.iid, "@gitlab-org/release/managers this is the security blog post for #{security_tracking_issue.web_url}." ) end end def notify_app_sec_release_managers ReleaseTools::Slack::Security::AppSecNotifier .new(issuable: blog_post, issue_type: 'patch_blog_post') .send_notification end def add_comment_on_security_blog_post logger.info('Posting a new version of the blog post on the security merge request', merge_request: security_blog_merge_request.web_url) return if SharedStatus.dry_run? blog_content = blog_post .generate_blog_content .split('-->') .last # Return the content not the headers comment_content = <<~HEADER :mega: **A new version of the blog post has been generated** _________________________________________________ #{blog_content} HEADER Retriable.with_context(:api) do GitlabClient.create_merge_request_comment( ReleaseTools::Project::WWWGitlabCom.security_path, security_blog_merge_request.iid, comment_content ) end end def send_failed_slack_notification ReleaseTools::Slack::ReleaseJobEndNotifier.new( job_type: 'Generate blog post', status: :failed, release_type: :patch ).send_notification end def send_success_slack_notification ReleaseTools::Slack::ReleaseJobEndNotifier.new( job_type: 'Generate blog post', status: :success, release_type: :patch, extra_string: "Blog MR: #{blog_post.url}" ).send_notification end def failure_message <<~MSG Generating patch release blog post failed. If this job continues to fail, the blog post can be created by executing the `release:patch_blog_post` rake task. MSG end end end end end