require 'gitlab_reviewbot/strategies' module Danger # This is your plugin class. Any attributes or methods you expose here will # be available from within your Dangerfile. # # To be published on the Danger plugins site, you will need to have # the public interface documented. Danger uses [YARD](http://yardoc.org/) # for generating documentation from your plugin source, and you can verify # by running `danger plugins lint` or `bundle exec rake spec`. # # You should replace these comments with a public description of your library. # # @example Ensure people are well warned about merging on Mondays # # my_plugin.warn_on_mondays # # @see Fabio Gallonetto/danger-gitlab_reviewbot # @tags monday, weekends, time, rattata # class DangerGitlabReviewbot < Plugin # Define the group to take the reviewers from. # NOTE: This is the group full path as in 'tech/iOS' instead of just the group name # # @return String attr_accessor :gitlab_group # Define the amount of reviewers to add to the merge requests. # Default is 1. # NOTE: The plugin won't remove existing assigned reviewers # # @return Int attr_accessor :assignees_amount def assignees_amount @assignees_amount || 1 end # Define the strategy for chosing reviewers. # Valid values are: # * Danger::AssignStrategies::RandomStrategy - assigns N reviewers at random from the group # (excluding the author). # * Danger::AssignStrategies::LeastBusyStrategy - assign the N users with the least amount of open MRs # to review # attr_accessor :strategy def strategy @strategy || Danger::AssignStrategies::RandomStrategy end # Add verbosity to the logs # @return Bool attr_accessor :verbose # Call this method from the Dangerfile to assign reviewers to your merge requests # @return The usernames list of assigned reviewes [Array<String>] # def assign! project_id = ENV['CI_PROJECT_ID'] mr_iid = ENV['CI_MERGE_REQUEST_IID'] if mr_iid.nil? raise "Env variable CI_MERGE_REQUEST_IID doesn't point to a valid merge request iid" end if project_id.nil? raise "Env variable CI_PROJECT_ID doesn't point to a valid project id" end current_assignees = (ENV['CI_MERGE_REQUEST_ASSIGNEES'] || '').split(',') required_assignees_count = [assignees_amount - current_assignees.length, 0].max puts "Project ID: #{project_id}" if @verbose puts "MR IID: #{mr_iid}" if @verbose puts "Currently assigned: #{current_assignees}" if @verbose puts "Required: #{required_assignees_count}" if @verbose if required_assignees_count == 0 puts "Nothing to do" if @verbose return end strategy_class = strategy.new(client: gitlab.api, project: project_id, mr: mr_iid, group: gitlab_group) assignees = strategy_class.assign! required_assignees_count puts "Assigning: #{assignees}" if @verbose return assignees end end end