82 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Ruby
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			82 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Ruby
		
	
	
		
			Executable File
		
	
	
#!/usr/bin/env ruby
 | 
						|
 | 
						|
# frozen_string_literal: true
 | 
						|
 | 
						|
require 'optparse'
 | 
						|
require 'json'
 | 
						|
 | 
						|
require_relative 'api/create_merge_request_discussion'
 | 
						|
require_relative 'api/commit_merge_requests'
 | 
						|
require_relative 'api/get_package_and_test_job'
 | 
						|
 | 
						|
class GenerateFailedPackageAndTestMrMessage
 | 
						|
  DEFAULT_OPTIONS = {
 | 
						|
    project: nil
 | 
						|
  }.freeze
 | 
						|
 | 
						|
  def initialize(options)
 | 
						|
    @project = options.fetch(:project)
 | 
						|
  end
 | 
						|
 | 
						|
  def execute
 | 
						|
    return unless failed_package_and_test_pipeline
 | 
						|
 | 
						|
    add_discussion_to_mr
 | 
						|
  end
 | 
						|
 | 
						|
  private
 | 
						|
 | 
						|
  attr_reader :project
 | 
						|
 | 
						|
  def add_discussion_to_mr
 | 
						|
    CreateMergeRequestDiscussion.new(
 | 
						|
      API::DEFAULT_OPTIONS.merge(merge_request: merge_request)
 | 
						|
    ).execute(content)
 | 
						|
  end
 | 
						|
 | 
						|
  def failed_package_and_test_pipeline
 | 
						|
    @failed_package_and_test_pipeline ||= GetPackageAndTestJob.new(API::DEFAULT_OPTIONS).execute
 | 
						|
  end
 | 
						|
 | 
						|
  def merge_request
 | 
						|
    @merge_request ||= CommitMergeRequests.new(
 | 
						|
      API::DEFAULT_OPTIONS.merge(sha: ENV['CI_MERGE_REQUEST_SOURCE_BRANCH_SHA'])
 | 
						|
    ).execute.first
 | 
						|
  end
 | 
						|
 | 
						|
  def content
 | 
						|
    <<~MARKDOWN
 | 
						|
    :warning: @#{author_username} The `e2e:package-and-test-ee` job has failed.
 | 
						|
 | 
						|
    - `e2e:package-and-test-ee` pipeline: #{failed_package_and_test_pipeline['web_url']}
 | 
						|
 | 
						|
    `e2e:package-and-test-ee` pipeline is allowed to fail due its [flakiness](#{package_and_test_link}). Failures should be
 | 
						|
    investigated to guarantee this backport complies with the Quality standards.
 | 
						|
 | 
						|
    Ping your team's associated Software Engineer in Test (SET) to confirm the failures are unrelated to the merge request.
 | 
						|
    If there's no SET assigned, ask for assistance on the `#test-platform` Slack channel.
 | 
						|
    MARKDOWN
 | 
						|
  end
 | 
						|
 | 
						|
  def author_username
 | 
						|
    merge_request['author']['username'] if merge_request
 | 
						|
  end
 | 
						|
 | 
						|
  def package_and_test_link
 | 
						|
    "https://about.gitlab.com/handbook/engineering/quality/quality-engineering/test-metrics-dashboards/#package-and-test"
 | 
						|
  end
 | 
						|
end
 | 
						|
 | 
						|
if $PROGRAM_NAME == __FILE__
 | 
						|
  options = GenerateFailedPackageAndTestMrMessage::DEFAULT_OPTIONS.dup
 | 
						|
 | 
						|
  OptionParser.new do |opts|
 | 
						|
    opts.on("-h", "--help", "Prints this help") do
 | 
						|
      puts opts
 | 
						|
      exit
 | 
						|
    end
 | 
						|
  end.parse!
 | 
						|
 | 
						|
  GenerateFailedPackageAndTestMrMessage.new(options).execute
 | 
						|
end
 |