blob: 6cba6eb2eae6109a263669e41f8f37ec07fff54f [file] [log] [blame] [view]
## Configuration
Owner approval is determined based on OWNERS files located in the same
repository on the target branch of the changes uploaded for review.
The `OWNERS` file has the following YAML structure:
```yaml
inherited: true
owners:
- some.email@example.com
- User Name
- group/Group of Users
matchers:
- suffix: .java
owners:
[...]
- regex: .*/README.*
owners:
[...]
- partial_regex: example
owners:
[...]
- exact: path/to/file.txt
[...]
```
_NOTE: Be aware to double check that emails and full user names correspond to
valid registered Gerrit users. When owner user full name or e-mail cannot be
resolved, a corresponding WARN message is logged on Gerrit error_log and the
user entry dropped._
That translates to inheriting owner email address from any parent OWNER files
and to define 'some.email@example.com' or 'User Name' users as the mandatory
reviewers for all changes that include modification to those files.
To specify a group of people instead of naming individual owners, prefix the
group name or UUID with 'group/'.
Additional owners can be specified for files selected by other matching
conditions (matchers section). Matching can be done by file suffix, regex
(partial or full) and exact string comparison. For exact match, path is
relative to the root of the repo.
The plugin analyzes the latest patch set by looking at each file directory and
building an OWNERS hierarchy. It stops once it finds an OWNERS file that has
inherited set to false (by default its true.)
For example, imagine the following tree:
```
/OWNERS
/example/src/main/OWNERS
/example/src/main/java/com/example/foo/Foo.java
/example/src/main/resources/config.properties
/example/src/test/OWNERS
/example/src/test/java/com/example/foo/FooTest.java
```
If you submit a patch set that changes /example/src/main/java/com/example/foo/Foo.java
then the plugin will first open /example/src/main/OWNERS and if inherited is set
to true combine it with the owners listed in /OWNERS.
If for each patch there is a reviewer who gave a Code-Review +2 then the plugin
will not add any labels, otherwise, it will add ```label('Code-Review from owners', need(_)).```
## Global project OWNERS
Set a OWNERS file into the project refs/meta/config to define a global set of
rules applied to every change pushed, regardless of the folder or target branch.
Example of assigning every configuration files to a specific owner group:
```yaml
matchers:
- suffix: .config
owners:
- Configuration Managers
```
Global refs/meta/config OWNERS configuration is inherited only when the OWNERS file
contain the 'inherited: true' condition at the top of the file or if they are absent.
That means that in the absence of any OWNERS file in the target branch, the refs/meta/config
OWNERS is used as global default.
## Example 1 - OWNERS file without matchers and default Gerrit submit rules
Given an OWNERS configuration of:
```yaml
inherited: true
owners:
- John Doe
- Doug Smith
```
And sample rules.pl that uses this predicate to enable the submit rule if
one of the owners has given a Code Review +2
```prolog
submit_rule(S) :-
gerrit:default_submit(D),
D =.. [submit | Ds],
findall(U, gerrit:commit_label(label('Code-Review', 2), U), Approvers),
gerrit_owners:add_owner_approval(Approvers, Ds, A),
S =.. [submit | A].
```
Then Gerrit would evaluate the Prolog rule as follows:
It first gets the current default on rule which gives ok() if no Code-Review -2
and at least a Code-Review +2 is being provided.
Then it accumulates in Approvers the list of users who had given Code-Review +2
and then checks if this list contains either 'John Doe' or 'Doug Smith'.
If Approvers list does not include one of the owners, then Owner-Approval need()
is added thus making the change not submittable.
## Example 2 - OWNERS file without matchers and no default Gerrit rules
Given an OWNERS configuration of:
```yaml
inherited: true
owners:
- John Doe
- Doug Smith
```
And a rule which makes submittable a change if at least one of the owners has
given a +1 without taking into consideration any other label:
```prolog
submit_rule(S) :-
Ds = [ label(‘owners_plugin_default’,ok(user(100000))) ],
findall(U, gerrit:commit_label(label('Code-Review', 1), U), Approvers),
gerrit_owners:add_owner_approval(Approvers, Ds, A),
S =.. [submit | A].
```
Then Gerrit would make the change Submittable only if 'John Doe' or 'Doug Smith'
have provided at least a Code-Review +1.
## Example 3 - OWNERS file without matchers and custom _Owner-Approves_ label
Sometimes to differentiate the _owners approval_ on a change from the code
review on the entire project. The scenario could be for instance the sign-off of
the project's build dependencies based on the Company roles-and-responsibilities
matrix and governance process.
In this case, we need to grant specific people with the _Owner-Approved_ label
without necessarily having to give Code-Review +2 rights on the entire project.
Amend the project.config as shown in (1) and add a new label; then give
permissions to any registered user. Finally, define a small variant of the
Prolog rules as shown in (2).
(1) Example fo the project config changes with the new label with values
(label name and values are arbitrary)
```
[label "Owner-Approved"]
function = NoOp
defaultValue = 0
copyMinScore = true
copyAllScoresOnTrivialRebase = true
value = -1 I don't want this to be merged
value = 0 No score
value = +1 Approved
[access "refs/heads/*"]
label-Owner-Approved = -1..+1 group Registered Users
```
(2) Define the project's rules.pl with an amended version of Example 1:
```prolog
submit_rule(S) :-
gerrit:default_submit(D),
D =.. [submit | Ds],
findall(U, gerrit:commit_label(label('Owner-Approved', 1), U), Approvers),
gerrit_owners:add_owner_approval(Approvers, Ds, A),
S =.. [submit | A].
```
Given now an OWNERS configuration of:
```yaml
inherited: true
owners:
- John Doe
- Doug Smith
```
A change cannot be submitted until John Doe or Doug Smith add a label
"Owner-Approved", independently from being able to provide any Code-Review.
## Example 4 - Owners based on matchers
Often the ownership comes from the developer's skills and competencies and
cannot be defined solely by the project's directory structure.
For instance, all the files ending with .sql should be owned and signed-off by
the DBA while all the ones ending with .css by approved by the UX Team.
Given an OWNERS configuration of:
```yaml
inherited: true
matchers:
- suffix: .sql
owners:
- Mister Dba
- suffix: .css
owners:
- John Creative
- Matt Designer
```
And a rules.pl of:
```prolog
submit_rule(S) :-
gerrit:default_submit(L),
L =.. [submit | Sr ],
gerrit_owners:add_match_owner_approval(Sr,A),
S =.. [submit | A ].
```
Then for any change that contains files with .sql or .css extensions, besides
to the default Gerrit submit rules, the extra constraints on the additional
owners of the modified files will be added. The final submit is enabled if both
Gerrit default rules are satisfied and all the owners of the .sql files
(Mister Dba) and the .css files (either John Creative or Matt Designer) have
provided their Code-Review +2 feedback.
The `add_match_owner_approval` predicate would also honour the OWNERS file
without matchers, giving, therefore, the possibility of having different ownership
criteria for different subdirectories. Example: /foo-dir/OWNERS can define a
directory-based ownership while /bar-dir/OWNERS can rely on matching rules.
__PERFORMANCE NOTE: The predicate `add_match_owner_approval` looks,
at first sight, more powerful and versatile. However, it may generate a significant
number of reductions and therefore, impact the Gerrit server performance.
When used with changes with a high number of files involved, it may even crash
the Gerrit default `rules.reductionLimit`.
When not using any matcher in the OWNERS file, prefer the `add_owner_approval`,
which generates a minimal number of reductions.__
## Example 5 - Owners details on a per-file basis
When using the owners with a series of matchers associated to different set of
owners, it may not be trivial to understand exactly *why* change is not approved
yet.
We need to define one extra submit rule to scan the entire list of files in the
change and their associated owners and cross-check with the existing Code-Review
feedback received.
Given the same OWNERS and rules.pl configuration of Example 4 with the following
extra rule:
```prolog
submit_rule(submit(W)) :-
gerrit_owners:findall_match_file_user(W).
```
For every change that would include any .sql or .css file (e.g. my-update.sql
and styles.css) Gerrit will display as additional description on the "need" code
review labels section of the change screen:
```
Code-Review from owners
Mister Dba owns my-update.sql
John Creative, Matt Designer own styles.css
```
As soon as the owners reviews are provided, the corresponding entry will be
removed from the "need" section of the change.
In this way, it is always clear which owner needs to provide their feedback on
which file of the change.