diff options
author | James Fargher <jfargher@gitlab.com> | 2021-08-04 04:35:15 +0300 |
---|---|---|
committer | James Fargher <jfargher@gitlab.com> | 2021-08-11 21:18:31 +0300 |
commit | 0e73b69a8554f32ff3c002fab21a9e5b38eb564e (patch) | |
tree | 84db2985936ac880218dbc8cf0e975e8218c5d0a /danger | |
parent | 7953f740adfc114375713e56eb10df393ba39d54 (diff) |
Use gitlab-dangerfiles for assignee selection
Imports the Dangerfile code from GDK.
Diffstat (limited to 'danger')
-rw-r--r-- | danger/assignees/Dangerfile | 24 | ||||
-rw-r--r-- | danger/plugins/project_helper.rb | 22 | ||||
-rw-r--r-- | danger/roulette/Dangerfile | 74 |
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}¬[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 |