gitlab-dangerfiles 2.5.0 → 2.7.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitlab/changelog_config.yml +13 -0
- data/.gitlab/merge_request_templates/Release.md +6 -29
- data/CONTRIBUTING.md +40 -0
- data/Dangerfile +3 -8
- data/README.md +84 -9
- data/lib/danger/plugins/{helper.rb → internal/helper.rb} +14 -11
- data/lib/danger/plugins/roulette.rb +2 -2
- data/lib/danger/rules/simple_roulette/Dangerfile +96 -0
- data/lib/gitlab/dangerfiles/config.rb +12 -0
- data/lib/gitlab/dangerfiles/teammate.rb +3 -4
- data/lib/gitlab/dangerfiles/version.rb +1 -1
- data/lib/gitlab/dangerfiles.rb +65 -17
- metadata +6 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: '083c7ae273083c8b4a4e62ae6b6ef18a86f541770681aec50e01e70f15e62953'
|
4
|
+
data.tar.gz: 0ec743dea037dbc84a59adc29acf405d834e1110aaf9e86320f935868dce3e34
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ecc770656df082b0cec24b6293ec92f118cd04ed7d654c65f3791fad283dbfa53583c14c33a93b29f0dc79e921ee8cdddc9d2c062ba1cc9e8e97f44e05244121
|
7
|
+
data.tar.gz: b92837330d8edef3136ff37751589592a7a4b2cb6c1f4204e982a1b2bcce236f7cd09e8501b1190c79ff4c4590cbe63ed5b02567d3b377435cc3c7db3c83a747
|
@@ -0,0 +1,13 @@
|
|
1
|
+
---
|
2
|
+
# Settings for generating changelogs using the GitLab API. See
|
3
|
+
# https://docs.gitlab.com/ee/api/repositories.html#generate-changelog-data for
|
4
|
+
# more information.
|
5
|
+
categories:
|
6
|
+
added: Added
|
7
|
+
fixed: Fixed
|
8
|
+
changed: Changed
|
9
|
+
deprecated: Deprecated
|
10
|
+
removed: Removed
|
11
|
+
security: Security
|
12
|
+
performance: Performance
|
13
|
+
other: Other
|
@@ -1,35 +1,12 @@
|
|
1
|
-
<!-- Replace
|
2
|
-
with the latest commit from
|
3
|
-
- Diff: https://gitlab.com/gitlab-org/gitlab-dangerfiles/compare/
|
4
|
-
|
5
|
-
- Release notes:
|
6
|
-
|
7
|
-
<!-- Keep the sections order but remove the empty sections -->
|
8
|
-
|
9
|
-
```markdown
|
10
|
-
### New features and features updates
|
11
|
-
|
12
|
-
- !aaa <Title of the aaa MR>.
|
13
|
-
|
14
|
-
### Fixes
|
15
|
-
|
16
|
-
- !bbb <Title of the bbb MR>.
|
17
|
-
|
18
|
-
### Doc changes
|
19
|
-
|
20
|
-
- !ccc <Title of the ccc MR>.
|
21
|
-
|
22
|
-
### Other changes (tooling, technical debt)
|
23
|
-
|
24
|
-
- !ddd <Title of the ddd MR>.
|
25
|
-
```
|
1
|
+
<!-- Replace `<NEW_VERSION>` with the previous release here, and `<COMMIT_UPDATING_VERSION>`
|
2
|
+
with the latest commit from this merge request. -->
|
3
|
+
- Diff: https://gitlab.com/gitlab-org/ruby/gems/gitlab-dangerfiles/compare/v<NEW_VERSION>...<COMMIT_UPDATING_VERSION>
|
26
4
|
|
27
5
|
- Checklist before merging:
|
28
6
|
- [ ] Diff link is up-to-date.
|
29
|
-
- [ ] Based on the diff, `
|
30
|
-
- [ ] Release notes are accurate.
|
7
|
+
- [ ] Based on the diff, `version.rb` is updated, according to [SemVer](https://semver.org).
|
31
8
|
|
32
9
|
- Checklist after merging:
|
33
|
-
- [ ]
|
10
|
+
- [ ] Check that automatic release notes (generated following the same process as https://docs.gitlab.com/ee/development/changelog.html) are correct.
|
34
11
|
|
35
|
-
/label ~"
|
12
|
+
/label ~"type::maintenance" ~"static code analysis"
|
data/CONTRIBUTING.md
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
## Developer Certificate of Origin and License
|
2
|
+
|
3
|
+
By contributing to GitLab B.V., you accept and agree to the following terms and
|
4
|
+
conditions for your present and future contributions submitted to GitLab B.V.
|
5
|
+
Except for the license granted herein to GitLab B.V. and recipients of software
|
6
|
+
distributed by GitLab B.V., you reserve all right, title, and interest in and to
|
7
|
+
your Contributions.
|
8
|
+
|
9
|
+
All contributions are subject to the Developer Certificate of Origin and license set out at [docs.gitlab.com/ce/legal/developer_certificate_of_origin](https://docs.gitlab.com/ce/legal/developer_certificate_of_origin).
|
10
|
+
|
11
|
+
_This notice should stay as the first item in the CONTRIBUTING.md file._
|
12
|
+
|
13
|
+
## Code of conduct
|
14
|
+
|
15
|
+
As contributors and maintainers of this project, we pledge to respect all people
|
16
|
+
who contribute through reporting issues, posting feature requests, updating
|
17
|
+
documentation, submitting pull requests or patches, and other activities.
|
18
|
+
|
19
|
+
We are committed to making participation in this project a harassment-free
|
20
|
+
experience for everyone, regardless of level of experience, gender, gender
|
21
|
+
identity and expression, sexual orientation, disability, personal appearance,
|
22
|
+
body size, race, ethnicity, age, or religion.
|
23
|
+
|
24
|
+
Examples of unacceptable behavior by participants include the use of sexual
|
25
|
+
language or imagery, derogatory comments or personal attacks, trolling, public
|
26
|
+
or private harassment, insults, or other unprofessional conduct.
|
27
|
+
|
28
|
+
Project maintainers have the right and responsibility to remove, edit, or reject
|
29
|
+
comments, commits, code, wiki edits, issues, and other contributions that are
|
30
|
+
not aligned to this Code of Conduct. Project maintainers who do not follow the
|
31
|
+
Code of Conduct may be removed from the project team.
|
32
|
+
|
33
|
+
This code of conduct applies both within project spaces and in public spaces
|
34
|
+
when an individual is representing the project or its community.
|
35
|
+
|
36
|
+
Instances of abusive, harassing, or otherwise unacceptable behavior can be
|
37
|
+
reported by emailing contact@gitlab.com.
|
38
|
+
|
39
|
+
This Code of Conduct is adapted from the [Contributor Covenant](https://contributor-covenant.org), version 1.1.0,
|
40
|
+
available at [https://contributor-covenant.org/version/1/1/0/](https://contributor-covenant.org/version/1/1/0/).
|
data/Dangerfile
CHANGED
@@ -1,10 +1,5 @@
|
|
1
1
|
require_relative "lib/gitlab-dangerfiles"
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
# Import all plugins from the gem
|
7
|
-
gitlab_dangerfiles.import_plugins
|
8
|
-
|
9
|
-
# Import all rules from the gem
|
10
|
-
gitlab_dangerfiles.import_dangerfiles
|
3
|
+
Gitlab::Dangerfiles.for_project(self) do |dangerfiles|
|
4
|
+
dangerfiles.import_defaults
|
5
|
+
end
|
data/README.md
CHANGED
@@ -26,22 +26,45 @@ $ gem install gitlab-dangerfiles
|
|
26
26
|
|
27
27
|
### Importing plugins and rules
|
28
28
|
|
29
|
-
In your project's `Dangerfile`, add the following
|
29
|
+
In your project's `Dangerfile`, add the following to import the plugins and rules from this gem:
|
30
30
|
|
31
31
|
```ruby
|
32
32
|
require 'gitlab-dangerfiles'
|
33
33
|
|
34
|
-
|
35
|
-
|
34
|
+
Gitlab::Dangerfiles.for_project(self) do |dangerfiles|
|
35
|
+
# Import all plugins from the gem
|
36
|
+
dangerfiles.import_plugins
|
36
37
|
|
37
|
-
# Import all
|
38
|
-
|
38
|
+
# Import all rules from the gem
|
39
|
+
dangerfiles.import_dangerfiles
|
39
40
|
|
40
|
-
#
|
41
|
-
|
41
|
+
# Or import only a subset of rules
|
42
|
+
dangerfiles.import_dangerfiles(only: %w[changes_size])
|
42
43
|
|
43
|
-
# Or import a subset of rules
|
44
|
-
|
44
|
+
# Or import all rules except a subset of rules
|
45
|
+
dangerfiles.import_dangerfiles(except: %w[commit_messages])
|
46
|
+
|
47
|
+
# Or import only a subset of rules, except a subset of rules
|
48
|
+
dangerfiles.import_dangerfiles(only: %w[changes_size], except: %w[commit_messages])
|
49
|
+
end
|
50
|
+
```
|
51
|
+
|
52
|
+
For simple projects such as libraries, you can use the convenience method `import_defaults`:
|
53
|
+
|
54
|
+
```ruby
|
55
|
+
Gitlab::Dangerfiles.for_project(self) do |dangerfiles|
|
56
|
+
# Imports all plugins, rules and the default reviewer roulette
|
57
|
+
dangerfiles.import_defaults
|
58
|
+
end
|
59
|
+
```
|
60
|
+
|
61
|
+
You may optionally pass a project name; by default, `ENV['CI_PROJECT_NAME']` will be used:
|
62
|
+
|
63
|
+
```ruby
|
64
|
+
Gitlab::Dangerfiles.for_project(self, 'my-project') do |dangerfiles|
|
65
|
+
# Imports all plugins, rules and the default reviewer roulette
|
66
|
+
dangerfiles.import_defaults
|
67
|
+
end
|
45
68
|
```
|
46
69
|
|
47
70
|
### Plugins
|
@@ -53,6 +76,20 @@ Danger plugins are located under `lib/danger/plugins`.
|
|
53
76
|
|
54
77
|
For the full documentation about the plugins, please see https://www.rubydoc.info/gems/gitlab-dangerfiles.
|
55
78
|
|
79
|
+
### Configuration
|
80
|
+
|
81
|
+
Default configuration can be overriden in the form `helper.config.CONFIG_NAME = NEW_VALUE` (`CONFIG_NAME` being a value configuration key).
|
82
|
+
|
83
|
+
Alternatively, you can also get/set configuration on the engine directly via `Gitlab::Dangerfiles::Engine#config`.
|
84
|
+
|
85
|
+
#### Available general configurations
|
86
|
+
|
87
|
+
- `project_name`: The project name. Currently used by the Roulette plugin to fetch relevant
|
88
|
+
reviewers/maintainers based on the project name. Default to `ENV["CI_PROJECT_NAME"]`.
|
89
|
+
- `files_to_category`: A hash of the form `{ filename_regex => categories, [filename_regex, changes_regex] => categories }`.
|
90
|
+
`filename_regex` is the regex pattern to match file names. `changes_regex` is the regex pattern to
|
91
|
+
match changed lines in files that match `filename_regex`. Used in `helper.changes_by_category`, `helper.changes`, and `helper.categories_for_file`.
|
92
|
+
|
56
93
|
### Rules
|
57
94
|
|
58
95
|
Danger rules are located under `lib/danger/rules`.
|
@@ -72,6 +109,44 @@ Danger rules are located under `lib/danger/rules`.
|
|
72
109
|
- `max_commits_count`: The maximum number of allowed non-squashed/non-fixup commits for a given MR.
|
73
110
|
A warning is triggered if the MR has more commits.
|
74
111
|
|
112
|
+
### Reviewer Roulette
|
113
|
+
|
114
|
+
The library includes a simplified default reviewer roulette that you can use in your
|
115
|
+
project. To use it in your project, perform the following steps:
|
116
|
+
|
117
|
+
1. If not yet done, create a `Dangerfile` at the top-level of your project. Refer to [Usage](#usage) to
|
118
|
+
see how to set it up.
|
119
|
+
1. When using the default roulette, use `import_defaults` or import it manually when setting
|
120
|
+
up the gitlab-dangerfiles instance:
|
121
|
+
```ruby
|
122
|
+
Gitlab::Dangerfiles.for_project(self) do |dangerfiles|
|
123
|
+
dangerfiles.import_dangerfiles(only: %w[simple_roulette])
|
124
|
+
end
|
125
|
+
```
|
126
|
+
|
127
|
+
### CI configuration
|
128
|
+
|
129
|
+
In order to run `danger` on GitLab CI, perform the following steps:
|
130
|
+
|
131
|
+
1. If not yet done, create a `Dangerfile` at the top-level of your project. Refer to [Usage](#usage) to
|
132
|
+
see how to set it up.
|
133
|
+
2. In `.gitlab-ci.yml`, include [CI configuration](https://gitlab.com/gitlab-org/quality/pipeline-common/-/blob/master/ci/danger-review.yml)
|
134
|
+
which defines `danger-review` [CI job](https://docs.gitlab.com/ee/ci/jobs/):
|
135
|
+
|
136
|
+
```yaml
|
137
|
+
include:
|
138
|
+
- project: 'gitlab-org/quality/pipeline-common'
|
139
|
+
file:
|
140
|
+
- '/ci/danger-review.yml'
|
141
|
+
```
|
142
|
+
|
143
|
+
3. Create a [Project access token](https://docs.gitlab.com/ee/user/project/settings/project_access_tokens.html)
|
144
|
+
with scope `api` and role `Maintainer`.
|
145
|
+
4. Add a [CI/CD variable](https://docs.gitlab.com/ee/ci/variables/#add-a-cicd-variable-to-a-project)
|
146
|
+
`DANGER_GITLAB_API_TOKEN` (`Masked` but not `Protected`) and use Project access token as value.
|
147
|
+
|
148
|
+
See a [real world example](https://gitlab.com/gitlab-org/ruby/gems/gitlab-styles/-/merge_requests/105).
|
149
|
+
|
75
150
|
## Documentation
|
76
151
|
|
77
152
|
Latest documentation can be found at <https://www.rubydoc.info/gems/gitlab-dangerfiles>.
|
@@ -3,10 +3,10 @@
|
|
3
3
|
require "net/http"
|
4
4
|
require "json"
|
5
5
|
|
6
|
-
require_relative "
|
7
|
-
require_relative "
|
8
|
-
require_relative "
|
9
|
-
require_relative "
|
6
|
+
require_relative "../../../gitlab/dangerfiles/changes"
|
7
|
+
require_relative "../../../gitlab/dangerfiles/config"
|
8
|
+
require_relative "../../../gitlab/dangerfiles/teammate"
|
9
|
+
require_relative "../../../gitlab/dangerfiles/title_linting"
|
10
10
|
|
11
11
|
module Danger
|
12
12
|
# Common helper functions for our danger scripts.
|
@@ -175,7 +175,7 @@ module Danger
|
|
175
175
|
#
|
176
176
|
# @return [{Symbol => Array<String>}] a hash of the type +{ category1: ["file1", "file2"], category2: ["file3", "file4"] }+
|
177
177
|
# using filename regex (+filename_regex+) and specific change regex (+changes_regex+) from the given +categories+ hash.
|
178
|
-
def changes_by_category(categories)
|
178
|
+
def changes_by_category(categories = [])
|
179
179
|
all_changed_files.each_with_object(Hash.new { |h, k| h[k] = [] }) do |file, hash|
|
180
180
|
categories_for_file(file, categories).each { |category| hash[category] << file }
|
181
181
|
end
|
@@ -187,7 +187,7 @@ module Danger
|
|
187
187
|
#
|
188
188
|
# @return [Gitlab::Dangerfiles::Changes] a +Gitlab::Dangerfiles::Changes+ object that represents the changes of an MR
|
189
189
|
# using filename regex (+filename_regex+) and specific change regex (+changes_regex+) from the given +categories+ hash.
|
190
|
-
def changes(categories)
|
190
|
+
def changes(categories = [])
|
191
191
|
Gitlab::Dangerfiles::Changes.new([]).tap do |changes|
|
192
192
|
added_files.each do |file|
|
193
193
|
categories_for_file(file, categories).each { |category| changes << Gitlab::Dangerfiles::Change.new(file, :added, category) }
|
@@ -212,14 +212,17 @@ module Danger
|
|
212
212
|
end
|
213
213
|
|
214
214
|
# @param filename [String] A file name.
|
215
|
-
# @param
|
216
|
-
#
|
217
|
-
#
|
215
|
+
# @param files_to_category [{Regexp => Array<Symbol>}, {Array<Regexp> => Array<Symbol>}] A hash of the form +{ filename_regex => categories, [filename_regex, changes_regex] => categories }+.
|
216
|
+
# +filename_regex+ is the regex pattern to match file names. +changes_regex+ is the regex pattern to
|
217
|
+
# match changed lines in files that match +filename_regex+
|
218
218
|
#
|
219
219
|
# @return [Array<Symbol>] the categories a file is in, e.g., +[:frontend]+, +[:backend]+, or +%i[frontend tooling]+
|
220
220
|
# using filename regex (+filename_regex+) and specific change regex (+changes_regex+) from the given +categories+ hash.
|
221
|
-
def categories_for_file(filename,
|
222
|
-
|
221
|
+
def categories_for_file(filename, files_to_category = {})
|
222
|
+
files_to_category = Array(files_to_category).compact
|
223
|
+
files_to_category = helper.config.files_to_category if files_to_category.empty?
|
224
|
+
|
225
|
+
_, categories = files_to_category.find do |key, _|
|
223
226
|
filename_regex, changes_regex = Array(key)
|
224
227
|
|
225
228
|
found = filename_regex.match?(filename)
|
@@ -33,8 +33,8 @@ module Danger
|
|
33
33
|
# @param timezone_experiment [Boolean] Whether to select reviewers based in timezone or not.
|
34
34
|
#
|
35
35
|
# @return [Array<Spin>]
|
36
|
-
def spin(project, categories = [nil], timezone_experiment: false)
|
37
|
-
project = project.downcase
|
36
|
+
def spin(project = nil, categories = [nil], timezone_experiment: false)
|
37
|
+
project = (project || helper.config.project_name).downcase
|
38
38
|
categories = categories.map { |category| category&.downcase }
|
39
39
|
|
40
40
|
spins = categories.sort_by(&:to_s).map do |category|
|
@@ -0,0 +1,96 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
PROJECT_NAME = helper.config.project_name
|
4
|
+
|
5
|
+
MESSAGE = <<MARKDOWN
|
6
|
+
## Reviewer roulette
|
7
|
+
|
8
|
+
Changes that require review have been detected! A merge request is normally
|
9
|
+
reviewed by both a reviewer and a maintainer in its primary category and by a
|
10
|
+
maintainer in all other categories.
|
11
|
+
MARKDOWN
|
12
|
+
|
13
|
+
TABLE_MARKDOWN = <<MARKDOWN
|
14
|
+
|
15
|
+
To spread load more evenly across eligible reviewers, Danger has picked a candidate for each
|
16
|
+
review slot. Feel free to
|
17
|
+
[override these selections](https://about.gitlab.com/handbook/engineering/projects/##{PROJECT_NAME})
|
18
|
+
if you think someone else would be better-suited
|
19
|
+
or use the [GitLab Review Workload Dashboard](https://gitlab-org.gitlab.io/gitlab-roulette/) to find other available reviewers.
|
20
|
+
|
21
|
+
To read more on how to use the reviewer roulette, please take a look at the
|
22
|
+
[Engineering workflow](https://about.gitlab.com/handbook/engineering/workflow/#basics)
|
23
|
+
and [code review guidelines](https://docs.gitlab.com/ee/development/code_review.html).
|
24
|
+
Please consider assigning a reviewer or maintainer who is a
|
25
|
+
[domain expert](https://about.gitlab.com/handbook/engineering/projects/#gitlab-development-kit) in the area of the merge request.
|
26
|
+
|
27
|
+
Once you've decided who will review this merge request, mention them as you
|
28
|
+
normally would! Danger does not automatically notify them for you.
|
29
|
+
|
30
|
+
MARKDOWN
|
31
|
+
|
32
|
+
TABLE_HEADER_WITH_CATEGORIES = <<MARKDOWN
|
33
|
+
| Category | Reviewer | Maintainer |
|
34
|
+
| -------- | -------- | ---------- |
|
35
|
+
MARKDOWN
|
36
|
+
|
37
|
+
TABLE_HEADER_WITHOUT_CATEGORIES = <<MARKDOWN
|
38
|
+
| Reviewer | Maintainer |
|
39
|
+
| -------- | ---------- |
|
40
|
+
MARKDOWN
|
41
|
+
|
42
|
+
OPTIONAL_REVIEW_TEMPLATE = '%{role} review is optional'
|
43
|
+
NOT_AVAILABLE_TEMPLATE = 'No %{role} available'
|
44
|
+
|
45
|
+
def note_for_spins_role(spins, role)
|
46
|
+
spins.each do |spin|
|
47
|
+
note = note_for_spin_role(spin, role)
|
48
|
+
|
49
|
+
return note if note
|
50
|
+
end
|
51
|
+
|
52
|
+
NOT_AVAILABLE_TEMPLATE % { role: role }
|
53
|
+
end
|
54
|
+
|
55
|
+
def note_for_spin_role(spin, role)
|
56
|
+
if spin.optional_role == role
|
57
|
+
return OPTIONAL_REVIEW_TEMPLATE % { role: role.capitalize }
|
58
|
+
end
|
59
|
+
|
60
|
+
spin.public_send(role)&.markdown_name(author: roulette.team_mr_author)
|
61
|
+
end
|
62
|
+
|
63
|
+
def markdown_row_for_spins(category = nil, spins_array)
|
64
|
+
reviewer_note = note_for_spins_role(spins_array, :reviewer)
|
65
|
+
maintainer_note = note_for_spins_role(spins_array, :maintainer)
|
66
|
+
|
67
|
+
row = +"| #{reviewer_note} | #{maintainer_note} |"
|
68
|
+
row.prepend("| #{helper.label_for_category(category)} ") if categories_defined?
|
69
|
+
|
70
|
+
row
|
71
|
+
end
|
72
|
+
|
73
|
+
def categories_defined?
|
74
|
+
helper.config.files_to_category.any?
|
75
|
+
end
|
76
|
+
|
77
|
+
def categories(changes)
|
78
|
+
categories_defined? ? changes.keys : [nil]
|
79
|
+
end
|
80
|
+
|
81
|
+
def table_header
|
82
|
+
categories_defined? ? TABLE_HEADER_WITH_CATEGORIES : TABLE_HEADER_WITHOUT_CATEGORIES
|
83
|
+
end
|
84
|
+
|
85
|
+
changes = helper.changes_by_category
|
86
|
+
|
87
|
+
if changes.any?
|
88
|
+
random_roulette_spins = roulette.spin(nil, categories(changes))
|
89
|
+
|
90
|
+
rows = random_roulette_spins.map do |spin|
|
91
|
+
markdown_row_for_spins(spin.category, [spin])
|
92
|
+
end
|
93
|
+
|
94
|
+
markdown(MESSAGE)
|
95
|
+
markdown(TABLE_MARKDOWN + table_header + rows.join("\n")) unless rows.empty?
|
96
|
+
end
|
@@ -3,6 +3,16 @@
|
|
3
3
|
module Gitlab
|
4
4
|
module Dangerfiles
|
5
5
|
class Config
|
6
|
+
# @!attribute project_name
|
7
|
+
# @return [String] the project name. Currently used by the Roulette plugin to fetch relevant reviewers/maintainers based on the project name. Default to +ENV["CI_PROJECT_NAME"]+.
|
8
|
+
attr_accessor :project_name
|
9
|
+
|
10
|
+
# @!attribute files_to_category
|
11
|
+
# @return [{Regexp => Array<Symbol>}, {Array<Regexp> => Array<Symbol>}] A hash of the form +{ filename_regex => categories, [filename_regex, changes_regex] => categories }+.
|
12
|
+
# +filename_regex+ is the regex pattern to match file names. +changes_regex+ is the regex pattern to
|
13
|
+
# match changed lines in files that match +filename_regex+. Used in `helper.changes_by_category`, `helper.changes`, and `helper.categories_for_file`.
|
14
|
+
attr_accessor :files_to_category
|
15
|
+
|
6
16
|
# @!attribute code_size_thresholds
|
7
17
|
# @return [{ high: Integer, medium: Integer }] a hash of the form +{ high: 42, medium: 12 }+ where +:high+ is the lines changed threshold which triggers an error, and +:medium+ is the lines changed threshold which triggers a warning. Also, see +DEFAULT_CHANGES_SIZE_THRESHOLDS+ for the format of the hash.
|
8
18
|
attr_accessor :code_size_thresholds
|
@@ -15,6 +25,8 @@ module Gitlab
|
|
15
25
|
DEFAULT_COMMIT_MESSAGES_MAX_COMMITS_COUNT = 10
|
16
26
|
|
17
27
|
def initialize
|
28
|
+
@files_to_category = {}
|
29
|
+
@project_name = ENV["CI_PROJECT_NAME"]
|
18
30
|
@code_size_thresholds = DEFAULT_CHANGES_SIZE_THRESHOLDS
|
19
31
|
@max_commits_count = DEFAULT_COMMIT_MESSAGES_MAX_COMMITS_COUNT
|
20
32
|
end
|
@@ -116,11 +116,10 @@ module Gitlab
|
|
116
116
|
|
117
117
|
area && labels.any?("devops::#{area.downcase}") if kind == :reviewer
|
118
118
|
when :tooling, :engineering_productivity # Deprecated as of 2.3.0 in favor of tooling
|
119
|
-
return
|
120
|
-
return
|
121
|
-
return true if capabilities(project).include?("#{kind} engineering_productivity")
|
119
|
+
return true if capabilities(project).include?("#{kind} #{category}")
|
120
|
+
return false if kind == :maintainer
|
122
121
|
|
123
|
-
capabilities(project).include?("#{kind} backend")
|
122
|
+
capabilities(project).include?("#{kind} backend") # fallback to backend reviewer
|
124
123
|
when :integrations_be
|
125
124
|
kind == :reviewer &&
|
126
125
|
role.match?(/Backend Engineer.+Ecosystem:Integrations/)
|
data/lib/gitlab/dangerfiles.rb
CHANGED
@@ -13,8 +13,24 @@ module Gitlab
|
|
13
13
|
commit_messages
|
14
14
|
].freeze
|
15
15
|
CI_ONLY_RULES = %w[
|
16
|
+
simple_roulette
|
16
17
|
].freeze
|
17
18
|
|
19
|
+
# Utility method to construct a [Gitlab::Dangerfiles::Engine] instance,
|
20
|
+
# which is yielded to the given block.
|
21
|
+
#
|
22
|
+
# @param dangerfile [Danger::Dangerfile] A +Danger::Dangerfile+ object.
|
23
|
+
# @param project_name An option string to set the project name. Defaults to +ENV['CI_PROJECT_NAME']+.
|
24
|
+
#
|
25
|
+
# @return [Gitlab::Dangerfiles::Engine]
|
26
|
+
def self.for_project(dangerfile, project_name = nil)
|
27
|
+
Engine.new(dangerfile).tap do |engine|
|
28
|
+
engine.config.project_name = project_name if project_name
|
29
|
+
|
30
|
+
yield engine
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
18
34
|
# This class provides utility methods to import plugins and dangerfiles easily.
|
19
35
|
class Engine
|
20
36
|
# @param dangerfile [Danger::Dangerfile] A +Danger::Dangerfile+ object.
|
@@ -26,41 +42,75 @@ module Gitlab
|
|
26
42
|
# @return [Gitlab::Dangerfiles::Engine]
|
27
43
|
def initialize(dangerfile)
|
28
44
|
@dangerfile = dangerfile
|
45
|
+
|
46
|
+
# Import internal plugins eagerly, since other functionality in this class may depend on them.
|
47
|
+
danger_plugin.import_plugin(File.expand_path("../danger/plugins/internal/*.rb", __dir__))
|
29
48
|
end
|
30
49
|
|
31
50
|
# Import all available plugins.
|
32
51
|
#
|
33
52
|
# @example
|
34
53
|
# # In your main Dangerfile:
|
35
|
-
#
|
36
|
-
#
|
37
|
-
#
|
38
|
-
# dangerfiles.import_plugins
|
54
|
+
# Gitlab::Dangerfiles.for_project(self) do |dangerfiles|
|
55
|
+
# dangerfiles.import_plugins
|
56
|
+
# end
|
39
57
|
def import_plugins
|
40
58
|
danger_plugin.import_plugin(File.expand_path("../danger/plugins/*.rb", __dir__))
|
41
59
|
end
|
42
60
|
|
43
61
|
# Import available Dangerfiles.
|
44
62
|
#
|
63
|
+
# @deprecated
|
45
64
|
# @param rules [Symbol, Array<String>] Can be either +:all+ (default) to import all rules,
|
46
65
|
# or an array of rules.
|
47
66
|
# Available rules are: +changes_size+.
|
48
67
|
#
|
49
|
-
# @
|
50
|
-
#
|
51
|
-
# dangerfiles = Gitlab::Dangerfiles::Engine.new(self)
|
68
|
+
# @param only [Symbol, Array<String>] An array of rules to import (defaults to all rules).
|
69
|
+
# Available rules are: +changes_size+.
|
52
70
|
#
|
53
|
-
#
|
54
|
-
#
|
71
|
+
# @param except [Symbol, Array<String>] An array of rules to not import (defaults to []).
|
72
|
+
# Available rules are: +changes_size+.
|
55
73
|
#
|
56
|
-
#
|
57
|
-
#
|
58
|
-
|
59
|
-
|
74
|
+
# @example
|
75
|
+
# # In your main Dangerfile:
|
76
|
+
# Gitlab::Dangerfiles.for_project(self) do |dangerfiles|
|
77
|
+
# # Import all rules
|
78
|
+
# dangerfiles.import_dangerfiles
|
79
|
+
# # Or import only a subset of rules
|
80
|
+
# dangerfiles.import_dangerfiles(only: %w[changes_size])
|
81
|
+
# # Or import all rules except a subset of rules
|
82
|
+
# dangerfiles.import_dangerfiles(except: %w[commit_messages])
|
83
|
+
# # Or import only a subset of rules, except a subset of rules
|
84
|
+
# dangerfiles.import_dangerfiles(only: %w[changes_size], except: %w[commit_messages])
|
85
|
+
# end
|
86
|
+
def import_dangerfiles(rules: nil, only: nil, except: [])
|
87
|
+
puts "The `:rules` parameter is deprecated in favor of `:only`." unless rules.nil?
|
88
|
+
|
89
|
+
only ||= EXISTING_RULES if rules == :all
|
90
|
+
only ||= rules || EXISTING_RULES
|
91
|
+
|
92
|
+
filtered_rules(only, except).each do |rule|
|
60
93
|
danger_plugin.import_dangerfile(path: File.join(RULES_DIR, rule))
|
61
94
|
end
|
62
95
|
end
|
63
96
|
|
97
|
+
# Proxy method to +helper_plugin.config+.
|
98
|
+
def config
|
99
|
+
helper_plugin.config
|
100
|
+
end
|
101
|
+
|
102
|
+
# Imports all default plugins and rules.
|
103
|
+
#
|
104
|
+
# @example
|
105
|
+
# # In your main Dangerfile:
|
106
|
+
# Gitlab::Dangerfiles.for_project(self) do |dangerfiles|
|
107
|
+
# dangerfiles.import_defaults
|
108
|
+
# end
|
109
|
+
def import_defaults
|
110
|
+
import_plugins
|
111
|
+
import_dangerfiles
|
112
|
+
end
|
113
|
+
|
64
114
|
private
|
65
115
|
|
66
116
|
attr_reader :dangerfile
|
@@ -71,10 +121,8 @@ module Gitlab
|
|
71
121
|
helper_plugin.ci? ? LOCAL_RULES | CI_ONLY_RULES : LOCAL_RULES
|
72
122
|
end
|
73
123
|
|
74
|
-
def filtered_rules(
|
75
|
-
|
76
|
-
|
77
|
-
Array(rules).map(&:to_s) & EXISTING_RULES & allowed_rules
|
124
|
+
def filtered_rules(only, except)
|
125
|
+
(Array(only).map(&:to_s) & EXISTING_RULES & allowed_rules) - except
|
78
126
|
end
|
79
127
|
|
80
128
|
def danger_plugin
|
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: 2.
|
4
|
+
version: 2.7.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- GitLab
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-12-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: danger-gitlab
|
@@ -132,10 +132,12 @@ files:
|
|
132
132
|
- ".gitignore"
|
133
133
|
- ".gitlab-ci.yml"
|
134
134
|
- ".gitlab/CODEOWNERS"
|
135
|
+
- ".gitlab/changelog_config.yml"
|
135
136
|
- ".gitlab/merge_request_templates/Release.md"
|
136
137
|
- ".rspec"
|
137
138
|
- ".yardopts"
|
138
139
|
- CODE_OF_CONDUCT.md
|
140
|
+
- CONTRIBUTING.md
|
139
141
|
- Dangerfile
|
140
142
|
- Gemfile
|
141
143
|
- Guardfile
|
@@ -147,10 +149,11 @@ files:
|
|
147
149
|
- fixtures/emojis/aliases.json
|
148
150
|
- fixtures/emojis/digests.json
|
149
151
|
- gitlab-dangerfiles.gemspec
|
150
|
-
- lib/danger/plugins/helper.rb
|
152
|
+
- lib/danger/plugins/internal/helper.rb
|
151
153
|
- lib/danger/plugins/roulette.rb
|
152
154
|
- lib/danger/rules/changes_size/Dangerfile
|
153
155
|
- lib/danger/rules/commit_messages/Dangerfile
|
156
|
+
- lib/danger/rules/simple_roulette/Dangerfile
|
154
157
|
- lib/gitlab-dangerfiles.rb
|
155
158
|
- lib/gitlab/Dangerfile
|
156
159
|
- lib/gitlab/dangerfiles.rb
|