gitlab-dangerfiles 3.9.0 → 3.11.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5759d8762183090115e7cb10b4b2d7244735d3225b53966c8feaf28e9d9eee7e
4
- data.tar.gz: f49d06c663430072bad4c4f05b8bd1f509ca2c1a095bd1e499e3870fbe061fc9
3
+ metadata.gz: 2ee27fb91564bfb45f28aed3fca576c6731c91ae9f69719e2ebb0ce5807ff1ee
4
+ data.tar.gz: 3bcd268c5fc1a91141a447ff6bb1b0c63841fe4dab2c65fffc61c7c488048275
5
5
  SHA512:
6
- metadata.gz: 3cd96f3ceb33c2a028f62b1f72a16196ee1afa3768f0463783262ce3a4bd1d98d85e9ab905a916c0ad27cf7bfaf2c16608c5d533e07c30b6463807122d711f09
7
- data.tar.gz: 253aa1b4a8a31c2c323ff05fbad3e2f613b932c82a5f1d61505e92966c1bfe7c593d17bae094f6ebd59b5568433d93d83e443b16df7c75d1b257d1015834a405
6
+ metadata.gz: d5cab2d3171779a9f28c00452e4e0435a6aa93852d80847b4da3b03f38fe294e7c855232b1402d6f3ac14f99b04518993b5fb6401da928ed9189f86a44948769
7
+ data.tar.gz: dc580aa4781087b6598c8d4f2befb2fec6b9d87ae4ce964227b35a4fbc537c62f2bad0e4d947a65154753157a896cb890472be33d99f0e15463d63beed17b6ee
@@ -2,7 +2,7 @@
2
2
  commit from this merge request, and `<NEW_VERSION>` with the upcoming version number. -->
3
3
  ## Diff
4
4
 
5
- https://gitlab.com/gitlab-org/ruby/gems/gitlab-dangerfiles/compare/v<PREVIOUS_VERSION>...<COMMIT_UPDATING_VERSION>
5
+ https://gitlab.com/gitlab-org/ruby/gems/gitlab-dangerfiles/-/compare/v<PREVIOUS_VERSION>...<COMMIT_UPDATING_VERSION>
6
6
 
7
7
  ## Checklist
8
8
 
data/README.md CHANGED
@@ -218,17 +218,32 @@ danger-review:
218
218
  - bundle add gitlab-dangerfiles --version 3.1.0
219
219
  ```
220
220
 
221
- ## Rake tasks
221
+ ## Local Danger Rake task
222
222
 
223
- You can import this gem's Rake tasks by adding the following to your project's `Rakefile`:
223
+ You can run a Danger Rake task locally in a project to detect Danger errors before pushing commits to a remote
224
+ branch.
224
225
 
225
- ```ruby
226
- require 'gitlab-dangerfiles'
226
+ 1. [Install `gitlab-dangerfiles`](#installation) in your project.
227
+ 1. Add the following to your project's `Rakefile`:
228
+
229
+ ```ruby
230
+ require 'gitlab-dangerfiles'
231
+
232
+ Gitlab::Dangerfiles.load_tasks
233
+ ```
234
+
235
+ To run the Danger Rake task in a project that has `master` as the default branch, run:
227
236
 
228
- Gitlab::Dangerfiles.load_tasks
237
+ ```shell
238
+ bundle exec rake danger_local
229
239
  ```
230
240
 
231
- That will add the `danger_local` Rake task that allows to run Danger locally.
241
+ To run the Danger Rake task in a project that doesn't have `master` as the default branch, you must set the
242
+ `DANGER_LOCAL_BASE` environment variable. For example, in a project with `main` as the default branch:
243
+
244
+ ```shell
245
+ DANGER_LOCAL_BASE="origin/main" bundle exec rake danger_local
246
+ ```
232
247
 
233
248
  ## Documentation
234
249
 
@@ -264,6 +279,12 @@ end
264
279
 
265
280
  See an [example](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/92580) for more details.
266
281
 
282
+ ## Contributing
283
+
284
+ Bug reports and merge requests are welcome at https://gitlab.com/gitlab-org/gitlab-dangerfiles. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [code of conduct](https://gitlab.com/gitlab-org/gitlab-dangerfiles/blob/master/CODE_OF_CONDUCT.md).
285
+
286
+ Make sure to include a changelog entry in your commit message and read the [changelog entries section](https://docs.gitlab.com/ee/development/changelog.html).
287
+
267
288
  ## Release
268
289
 
269
290
  [Automated gem release process](https://gitlab.com/gitlab-org/quality/pipeline-common#release-process) is used to release new version of `gitlab-dangerfiles` through [pipelines](https://gitlab.com/gitlab-org/ruby/gems/gitlab-dangerfiles/-/blob/4f33cf30cab84f7e27ca0cb9a7c0da3ecc675c11/.gitlab-ci.yml#L51), and this will:
@@ -272,24 +293,22 @@ See an [example](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/92580) fo
272
293
  - Add a release in the `gitlab-dangerfiles` project: https://gitlab.com/gitlab-org/ruby/gems/gitlab-dangerfiles/-/releases
273
294
  - Populate the release log with the API contents. For example: https://gitlab.com/api/v4/projects/19861191/repository/changelog?version=3.4.4
274
295
 
296
+ We follow this release process in a separate merge request from the one that introduced the changes. The release merge request should just contain a version bump.
297
+
275
298
  ### Before release
276
299
 
277
- Make sure to include a changelog entry in your commit message and read the [changelog entries section](https://docs.gitlab.com/ee/development/changelog.html).
300
+ Changes merged since the last release should have had changelog entries (see [Contributing](#contributing)).
278
301
 
279
- If you forget to set the changelog entry in your commit messages, you can also edit the release notes after it's being released.
302
+ If changelog entries are missing, you can also edit the release notes after it's being released.
280
303
 
281
304
  ### Steps to release
282
305
 
283
- Use a `Release` merge request template and create a merge requet to update the version number in `version.rb`, and get the merge request merged by a maintainer.
306
+ Use a `Release` merge request template and create a merge request to update the version number in `version.rb`, and get the merge request merged by a maintainer.
284
307
 
285
308
  This will then be packaged into a gem and pushed to [rubygems.org](https://rubygems.org) by the CI/CD.
286
309
 
287
310
  For example: [Bump version to 3.4.3](https://gitlab.com/gitlab-org/ruby/gems/gitlab-dangerfiles/-/merge_requests/149).
288
311
 
289
- ## Contributing
290
-
291
- Bug reports and merge requests are welcome at https://gitlab.com/gitlab-org/gitlab-dangerfiles. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [code of conduct](https://gitlab.com/gitlab-org/gitlab-dangerfiles/blob/master/CODE_OF_CONDUCT.md).
292
-
293
312
  ## License
294
313
 
295
314
  The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
@@ -25,7 +25,7 @@ module Danger
25
25
  engineering_productivity: '~"Engineering Productivity" for CI, Danger',
26
26
  tooling: '~"maintenance::workflow" / ~"maintenance::pipelines" for CI, Danger',
27
27
  ci_template: '~"ci::templates"',
28
- product_intelligence: '~"product intelligence"',
28
+ analytics_instrumentation: '~"analytics instrumentation"',
29
29
  import_integrate_be: '~"group::import and integrate" (backend)',
30
30
  import_integrate_fe: '~"group::import and integrate" (frontend)',
31
31
  "Authentication and Authorization": '~"group::authentication and authorization"',
@@ -33,6 +33,34 @@ module Danger
33
33
  end
34
34
  end
35
35
 
36
+ def prepare_categories(changes_keys)
37
+ categories = Set.new(changes_keys)
38
+
39
+ # Ensure to spin for database reviewer/maintainer when ~database is applied (e.g. to review SQL queries)
40
+ categories << :database if labels.include?("database")
41
+
42
+ # Ensure to spin for Analytics Instrumentation reviewer when ~"analytics instrumentation::review pending" is applied
43
+ categories << :analytics_instrumentation if labels.include?("analytics instrumentation::review pending")
44
+
45
+ # Skip Analytics Instrumentation reviews for growth experiment MRs
46
+ categories.delete(:analytics_instrumentation) if labels.include?("growth experiment")
47
+
48
+ prepare_ux_category!(categories) if labels.include?("UX")
49
+
50
+ # Remove disabled categories
51
+ categories.subtract(helper.config.disabled_roulette_categories)
52
+
53
+ categories
54
+ end
55
+
56
+ def assign_pedroms_for_ux_wider_community_contribution(spins)
57
+ # We want at least a UX reviewer who can review any wider community
58
+ # contribution even without a team designer. We assign this to Pedro.
59
+ ux_spin = look_for_fallback_designer_for_ux_wider_community_contribution?(spins)
60
+
61
+ ux_spin && ux_spin.reviewer = teammate_pedroms
62
+ end
63
+
36
64
  # Finds the +Gitlab::Dangerfiles::Teammate+ object whose username matches the MR author username.
37
65
  #
38
66
  # @return [Gitlab::Dangerfiles::Teammate]
@@ -89,7 +117,7 @@ module Danger
89
117
  # Fetch an already picked backend maintainer, or pick one otherwise
90
118
  spin.maintainer = backend_spin&.maintainer || spin_for_category(project, :backend, timezone_experiment: including_timezone).maintainer
91
119
  end
92
- when :product_intelligence
120
+ when :analytics_instrumentation
93
121
  spin.optional_role = :maintainer
94
122
 
95
123
  if spin.maintainer.nil?
@@ -124,6 +152,10 @@ module Danger
124
152
  @warnings ||= []
125
153
  end
126
154
 
155
+ def teammate_pedroms
156
+ @teammate_pedroms ||= find_member("pedroms")
157
+ end
158
+
127
159
  private
128
160
 
129
161
  def spin_for_approval_rule?(rule)
@@ -175,8 +207,8 @@ module Danger
175
207
  # @return [Boolean]
176
208
  def import_and_integrate_reject_category?(category, project)
177
209
  # Reject Import and Integrate categories if the MR author has reviewing abilities for the category.
178
- team_mr_author&.import_integrate_be?(project, category, helper.mr_labels) ||
179
- team_mr_author&.import_integrate_fe?(project, category, helper.mr_labels)
210
+ team_mr_author&.import_integrate_be?(project, category, labels) ||
211
+ team_mr_author&.import_integrate_fe?(project, category, labels)
180
212
  end
181
213
 
182
214
  def random
@@ -185,7 +217,7 @@ module Danger
185
217
 
186
218
  def spin_role_for_category(team, role, project, category)
187
219
  team.select do |member|
188
- member.public_send("#{role}?", project, category, helper.mr_labels)
220
+ member.public_send("#{role}?", project, category, labels)
189
221
  end
190
222
  end
191
223
 
@@ -258,6 +290,38 @@ module Danger
258
290
  Spin.new(category, reviewer, maintainer, false, timezone_experiment)
259
291
  end
260
292
 
293
+ def prepare_ux_category!(categories)
294
+ # Ensure to spin for UX reviewer when ~UX is applied (e.g. to review changes to the UI)
295
+ if labels.include?("Community contribution")
296
+ categories << :ux
297
+ else
298
+ begin
299
+ # We only want to spin a reviewer for merge requests which has a
300
+ # designer for the team. There's no easy way to tell this, so we
301
+ # pretend this is a community contribution, in which case we only
302
+ # pick the team designer. If there's no one got picked, it means
303
+ # there's no designer for this team.
304
+ labels << "Community contribution"
305
+
306
+ ux_spin = spin(nil, [:ux]).first
307
+
308
+ categories << :ux if ux_spin.reviewer || ux_spin.maintainer
309
+ ensure
310
+ # Make sure we delete the label afterward
311
+ labels.delete("Community contribution")
312
+ end
313
+ end
314
+ end
315
+
316
+ def look_for_fallback_designer_for_ux_wider_community_contribution?(spins)
317
+ labels.include?("Community contribution") &&
318
+ spins.find do |spin|
319
+ spin.category == :ux &&
320
+ spin.reviewer.nil? &&
321
+ spin.maintainer.nil?
322
+ end
323
+ end
324
+
261
325
  # Fetches the given +url+ and parse its response as JSON.
262
326
  #
263
327
  # @param [String] url
@@ -316,14 +380,20 @@ module Danger
316
380
  helper.config.project_name
317
381
  end
318
382
 
383
+ # Return the labels from the merge requests. This is cached.
384
+ #
385
+ # @return [String]
386
+ def labels
387
+ @labels ||= helper.mr_labels
388
+ end
389
+
319
390
  # Like +team+, but only returns teammates in the current project, based on
320
391
  # project_name.
321
392
  #
322
393
  # @return [Array<Gitlab::Dangerfiles::Teammate>]
323
394
  def project_team(project_name)
324
395
  company_members.select do |member|
325
- member.in_project?(project_name) ||
326
- member.in_project?("gitlab") # Used for universal reviewer
396
+ member.in_project?(project_name)
327
397
  end
328
398
  rescue => err
329
399
  warn("Reviewer roulette failed to load team data: #{err.message}")
@@ -81,30 +81,16 @@ def warning_list(roulette)
81
81
  end
82
82
 
83
83
  changes = helper.changes_by_category
84
-
85
- # Replicating label based categories from:
86
- # https://gitlab.com/gitlab-org/gitlab/-/blob/master/danger/roulette/Dangerfile
87
- categories = Set.new(changes.keys)
88
-
89
- # Ensure to spin for database reviewer/maintainer when ~database is applied (e.g. to review SQL queries)
90
- categories << :database if helper.mr_labels.include?('database')
91
-
92
- # Ensure to spin for UX reviewer when ~UX is applied (e.g. to review changes to the UI) except when it's from wider community contribution where we want to assign from the corresponding group
93
- categories << :ux if helper.mr_labels.include?('UX') && !helper.mr_labels.include?('Community contribution')
94
-
95
- # Ensure to spin for Product Intelligence reviewer when ~"product intelligence::review pending" is applied
96
- categories << :product_intelligence if helper.mr_labels.include?("product intelligence::review pending")
97
-
98
- # Skip Product intelligence reviews for growth experiment MRs
99
- categories.delete(:product_intelligence) if helper.mr_labels.include?("growth experiment")
100
-
101
- # Remove disabled categories
102
- categories.subtract(helper.config.disabled_roulette_categories)
84
+ categories = roulette.prepare_categories(changes.keys)
103
85
 
104
86
  if changes.any?
105
87
  show_category_column = categories.size > 1 || categories.first != :none
106
88
  random_roulette_spins = roulette.spin(nil, categories)
107
89
 
90
+ if categories.include?(:ux)
91
+ roulette.assign_pedroms_for_ux_wider_community_contribution(random_roulette_spins)
92
+ end
93
+
108
94
  rows = random_roulette_spins.map do |spin|
109
95
  markdown_row_for_spins(spin.category, [spin], show_category_column: show_category_column)
110
96
  end
@@ -21,19 +21,11 @@ module Gitlab
21
21
  end
22
22
  private_class_method :name_to_class
23
23
 
24
- def has_capability?(...)
25
- has_particular_capability?(...) || has_universal_capability?(...)
26
- end
27
-
28
- private
29
-
30
- def has_particular_capability?(teammate)
24
+ def has_capability?(teammate)
31
25
  teammate.capabilities(project).include?(capability)
32
26
  end
33
27
 
34
- def has_universal_capability?(teammate)
35
- false
36
- end
28
+ private
37
29
 
38
30
  def capability
39
31
  @capability ||= "#{kind} #{name}"
@@ -46,21 +38,17 @@ module Gitlab
46
38
  end
47
39
 
48
40
  class Test < Category
49
- private
50
-
51
- def has_particular_capability?(teammate)
41
+ def has_capability?(teammate)
52
42
  return false if kind != :reviewer
53
43
 
54
44
  area = teammate.role[/Software Engineer in Test(?:.*?, (\w+))/, 1]
55
45
 
56
- area && labels.any?("devops::#{area.downcase}")
46
+ !!area && labels.any?("devops::#{area.downcase}")
57
47
  end
58
48
  end
59
49
 
60
50
  class Tooling < Category
61
- private
62
-
63
- def has_particular_capability?(teammate)
51
+ def has_capability?(teammate)
64
52
  if super
65
53
  true
66
54
  elsif %i[trainee_maintainer maintainer].include?(kind)
@@ -72,59 +60,52 @@ module Gitlab
72
60
  end
73
61
 
74
62
  class ImportIntegrateBE < Category
75
- private
76
-
77
- def has_particular_capability?(teammate)
63
+ def has_capability?(teammate)
78
64
  kind == :reviewer &&
79
- teammate.role.match?(/Backend Engineer.+Manage:Integrations/)
65
+ teammate.role.match?(/Backend Engineer.+Manage:Import and Integrate/)
80
66
  end
81
67
  end
82
68
 
83
69
  class ImportIntegrateFE < Category
84
- private
85
-
86
- def has_particular_capability?(teammate)
70
+ def has_capability?(teammate)
87
71
  kind == :reviewer &&
88
- teammate.role.match?(/Frontend Engineer.+Manage:Integrations/)
72
+ teammate.role.match?(/Frontend Engineer.+Manage:Import and Integrate/)
89
73
  end
90
74
  end
91
75
 
92
76
  class UX < Category
77
+ def has_capability?(teammate)
78
+ super &&
79
+
80
+ if labels.any?("Community contribution")
81
+ can_review_wider_community_contribution?(teammate)
82
+ else
83
+ can_review_team_memeber_contribution?(teammate)
84
+ end
85
+ end
86
+
93
87
  private
94
88
 
95
- def has_particular_capability?(teammate)
96
- if labels.any?("Community contribution")
97
- can_review_wider_community_contribution?(teammate)
98
- else
99
- super
100
- end
89
+ def can_review_wider_community_contribution?(teammate)
90
+ # We want the designer for the team to review the wider community
91
+ # contribution because they're more familiar with that area.
92
+ the_designer_for_the_team?(teammate)
101
93
  end
102
94
 
103
- def has_universal_capability?(teammate)
104
- # No universal reviewer for community contribution.
105
- # If we do, then picking from corresponding group won't be accurate.
106
- # After solving the following issue, then we can revisit this:
107
- # https://gitlab.com/gitlab-org/ruby/gems/gitlab-dangerfiles/-/issues/58
108
- return false if labels.any?("Community contribution")
109
-
110
- teammate.projects.each_value.any? do |capabilities|
111
- capabilities.include?(capability)
112
- end
95
+ def can_review_team_memeber_contribution?(teammate)
96
+ # We don't want the designer for the team to review merge
97
+ # requests for the same team which is designed by themselves.
98
+ # So they can only review if they're not the designer for the team.
99
+ !the_designer_for_the_team?(teammate)
113
100
  end
114
101
 
115
- def can_review_wider_community_contribution?(teammate)
102
+ def the_designer_for_the_team?(teammate)
116
103
  # Pick corresponding group for community contribution
117
- # Role can be:
118
- # Product Designer, Create:Source Code
119
- # Product Designer, Verify:Pipeline Insights, Verify:Runner
120
- # Product Designer, Release
121
104
  # Specialty can be:
122
105
  # Source Code
123
106
  # [Growth: Activation, Growth: Expansion]
124
107
  # Runner
125
- areas = teammate.role[/Product Designer(?:.*?, (.+))/, 1]&.split(",")
126
-
127
- group_labels = [*teammate.specialty, *areas].map do |field|
108
+ group_labels = Array(teammate.specialty).map do |field|
128
109
  group = field.strip.sub(/^.+: ?/, "").downcase
129
110
 
130
111
  "group::#{group}"
@@ -1,5 +1,5 @@
1
1
  module Gitlab
2
2
  module Dangerfiles
3
- VERSION = "3.9.0"
3
+ VERSION = "3.11.0"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gitlab-dangerfiles
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.9.0
4
+ version: 3.11.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - GitLab
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-05-02 00:00:00.000000000 Z
11
+ date: 2023-06-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake