Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitaly.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/danger
diff options
context:
space:
mode:
authorJames Fargher <jfargher@gitlab.com>2021-08-04 04:35:15 +0300
committerJames Fargher <jfargher@gitlab.com>2021-08-11 21:18:31 +0300
commit0e73b69a8554f32ff3c002fab21a9e5b38eb564e (patch)
tree84db2985936ac880218dbc8cf0e975e8218c5d0a /danger
parent7953f740adfc114375713e56eb10df393ba39d54 (diff)
Use gitlab-dangerfiles for assignee selection
Imports the Dangerfile code from GDK.
Diffstat (limited to 'danger')
-rw-r--r--danger/assignees/Dangerfile24
-rw-r--r--danger/plugins/project_helper.rb22
-rw-r--r--danger/roulette/Dangerfile74
3 files changed, 96 insertions, 24 deletions
diff --git a/danger/assignees/Dangerfile b/danger/assignees/Dangerfile
deleted file mode 100644
index b1534736f..000000000
--- a/danger/assignees/Dangerfile
+++ /dev/null
@@ -1,24 +0,0 @@
-# frozen_string_literal: true
-
-def link_reviewer(name)
- "[`@#{name}`](https://gitlab.com/dashboard/merge_requests?assignee_username=#{name}&not[author_username]=#{name})"
-end
-
-if gitlab.mr_json['assignees'].none?
- warn <<~TXT
- This merge request does not have any assignee yet. Setting an assignee
- clarifies who needs to take action on the merge request at any given time.
- TXT
-end
-
-suggestions = (GITALY_TEAM - [gitlab.mr_author]).sample(2, random: Random.new(gitlab.mr_json['iid']))
-
-case suggestions.size
-when 0
-when 1
- message "Suggested maintainer: #{link_reviewer(suggestions.first)}"
-else
- message "Suggested maintainers: #{link_reviewer(suggestions.first)}, and #{link_reviewer(suggestions.last)}"
-end
-
-# vim: ft=ruby
diff --git a/danger/plugins/project_helper.rb b/danger/plugins/project_helper.rb
new file mode 100644
index 000000000..bb7036586
--- /dev/null
+++ b/danger/plugins/project_helper.rb
@@ -0,0 +1,22 @@
+# frozen_string_literal: true
+
+module Danger
+ # Common helper functions for danger scripts
+ class ProjectHelper < ::Danger::Plugin
+ # First-match win, so be sure to put more specific regex at the top...
+ CATEGORIES = {
+ %r{\Adoc/.*(\.(md|png|gif|jpg))\z} => :docs,
+ %r{\A(CONTRIBUTING|LICENSE|README|REVIEWING|STYLE)(\.md)?\z} => :docs,
+
+ %r{.*} => [nil]
+ }.freeze
+
+ def changes_by_category
+ helper.changes_by_category(CATEGORIES)
+ end
+
+ def project_name
+ 'gitaly'
+ end
+ end
+end
diff --git a/danger/roulette/Dangerfile b/danger/roulette/Dangerfile
new file mode 100644
index 000000000..80ee666df
--- /dev/null
+++ b/danger/roulette/Dangerfile
@@ -0,0 +1,74 @@
+# frozen_string_literal: true
+
+MESSAGE = <<MARKDOWN
+## Reviewer roulette
+
+Changes that require review have been detected! A merge request is normally
+reviewed by both a reviewer and a maintainer in its primary category and by a
+maintainer in all other categories.
+MARKDOWN
+
+CATEGORY_TABLE_HEADER = <<MARKDOWN
+
+To spread load more evenly across eligible reviewers, Danger has picked a candidate for each
+review slot. Feel free to
+[override these selections](https://about.gitlab.com/handbook/engineering/projects/#gitaly)
+if you think someone else would be better-suited
+or use the [GitLab Review Workload Dashboard](https://gitlab-org.gitlab.io/gitlab-roulette/) to find other available reviewers.
+
+To read more on how to use the reviewer roulette, please take a look at the
+[Engineering workflow](https://about.gitlab.com/handbook/engineering/workflow/#basics)
+and [code review guidelines](https://docs.gitlab.com/ee/development/code_review.html).
+Please consider assigning a reviewer or maintainer who is a
+[domain expert](https://about.gitlab.com/handbook/engineering/projects/#gitaly) in the area of the merge request.
+
+Once you've decided who will review this merge request, mention them as you
+normally would! Danger does not automatically notify them for you.
+
+| Category | Reviewer | Maintainer |
+| -------- | -------- | ---------- |
+MARKDOWN
+
+OPTIONAL_REVIEW_TEMPLATE = '%{role} review is optional for %{category}'
+NOT_AVAILABLE_TEMPLATE = 'No %{role} available'
+
+def note_for_spins_role(spins, role)
+ spins.each do |spin|
+ note = note_for_spin_role(spin, role)
+
+ return note if note
+ end
+
+ NOT_AVAILABLE_TEMPLATE % { role: role }
+end
+
+def note_for_spin_role(spin, role)
+ if spin.optional_role == role
+ return OPTIONAL_REVIEW_TEMPLATE % { role: role.capitalize, category: helper.label_for_category(spin.category) }
+ end
+
+ spin.public_send(role)&.markdown_name(author: roulette.team_mr_author) # rubocop:disable GitlabSecurity/PublicSend
+end
+
+def markdown_row_for_spins(category, spins_array)
+ reviewer_note = note_for_spins_role(spins_array, :reviewer)
+ maintainer_note = note_for_spins_role(spins_array, :maintainer)
+
+ "| #{helper.label_for_category(category)} | #{reviewer_note} | #{maintainer_note} |"
+end
+
+changes = project_helper.changes_by_category
+
+if changes.any?
+ categories = changes.keys
+ project = project_helper.project_name
+
+ random_roulette_spins = roulette.spin(project, [nil], timezone_experiment: false)
+
+ rows = random_roulette_spins.map do |spin|
+ markdown_row_for_spins(spin.category, [spin])
+ end
+
+ markdown(MESSAGE)
+ markdown(CATEGORY_TABLE_HEADER + rows.join("\n")) unless rows.empty?
+end