| @PLUGIN@ configuration | |
| ====================== | |
| ## Global configuration | |
| The global plugin configuration is read from the `$GERRIT_SITE/etc/owners.config` | |
| and is applied across all projects in Gerrit. | |
| owners.disable.branch | |
| : List of branches regex where the resolution of owners is disabled. | |
| Example: | |
| ``` | |
| [owners "disable"] | |
| branch = refs/meta/config | |
| branch = refs/heads/sandboxes.* | |
| ``` | |
| owners.expandGroups | |
| : Expand owners and groups into account ids. If set to `false` all owners are left untouched, | |
| apart from e-mail | |
| addresses which have the domain dropped. Defaults to `true`. | |
| Example: | |
| ``` | |
| [owners] | |
| expandGroups = false | |
| ``` | |
| owners.label | |
| : Global override for the label and score, separated by a comma, to use by | |
| the owners of changes for approving them. When defined, it overrides any | |
| other label definition set by the OWNERS at any level in any project. | |
| > **NOTE:** Compulsory when the selected label's function is NoBlock/NoOp. | |
| Example: | |
| ``` | |
| [owners] | |
| label = Code-Review, 1 | |
| ``` | |
| <a name="owners.enableSubmitRequirement">owners.enableSubmitRequirement</a> | |
| : If set to `true` the approvals are evaluated through the owners plugin | |
| default submit requirement, named "Code-Review-from-Owners", without a need of | |
| prolog predicate being added to a project or submit requirement configured | |
| in the `project.config` as it is automatically applied to all projects. | |
| Defaults to `false`. | |
| Example: | |
| ``` | |
| [owners] | |
| enableSubmitRequirement = true | |
| ``` | |
| > **Notes:** | |
| > | |
| > The `owners.enableSubmitRequirement = true` is a global | |
| > setting and allows for quick site switch from `prolog` submit rule to | |
| > plugin's provided submit rule. It is a drop-in replacement therefore, | |
| > similarly to `prolog` rule, it cannot be overridden by Gerrit. In case | |
| > when one-step migration is not feasible (e.g. when `prolog` rules need to | |
| > be slowly phased out or when more control is needed over rule's | |
| > applicability, submitability or ability to overide) one can configure | |
| > submit requirement in `project.config` for a certain project (or | |
| > hierarchy of projects), without turning it on globally, as | |
| > `approval_owners` predicate is _always_ available. | |
| > | |
| > Please also note, that project's `rules.pl` should be removed in this | |
| > case so that it doesn't interfere with a change evaluation. | |
| > | |
| > The minimal configuration looks like below (see | |
| > [submit requirements documentation](/Documentation/config-submit-requirements.html) for more details): | |
| > ``` | |
| > [submit-requirement "Owner-Approval"] | |
| > description = Files needs to be approved by owners | |
| > submittableIf = has:approval_owners | |
| > ``` | |
| cache."owners.path_owners_entries".memoryLimit | |
| : The cache is used to hold the parsed version of `OWNERS` files in the | |
| repository so that when submit rules are calculated (either through prolog | |
| or through submit requirements) it is not read over and over again. The | |
| cache entry gets invalidated when `OWNERS` file branch is updated. | |
| By default it follows default Gerrit's cache memory limit but it makes | |
| sense to adjust it as a function of number of project that use the `owners` | |
| plugin multiplied by average number of active branches (plus 1 for the | |
| refs/meta/config) and average number of directories (as directory hierarchy | |
| back to root is checked for the `OWNERS` file existence). | |
| _Note that in opposite to the previous settings the modification needs to be | |
| performed in the `$GERRIT_SITE/etc/gerrit.config` file._ | |
| Example | |
| ``` | |
| [cache "owners.path_owners_entries"] | |
| memoryLimit = 2048 | |
| ``` | |
| ## 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 | |
| label: Code-Review, 1 | |
| 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. | |
| > **NOTE:** The `generic` matcher is a special type of regex matching that | |
| > is applied only when none of the other sections are matching. It is | |
| > used to define fallback rules. The `generic: .*` is the top-level fallback | |
| > and can be used with other more specific `generic` matchers. | |
| 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 it’s true.) | |
| > **NOTE:** The `label` value (default is `Code-Review`) is taken into | |
| > consideration only when `owners.enableSubmitRequirement = true`. | |
| > Owners scores are matched against the label specified in the property in | |
| > question. | |
| > The required label's score can be provided (by default label's scores | |
| > configuration is used) so that owners don't have to be granted with the | |
| > maximum label's score. Note that only single digit (0..9) is allowed. | |
| For example, imagine the following tree with a default Gerrit project labels configuration: | |
| ``` | |
| /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. | |
| If the global project OWNERS has the 'inherited: true', it will check for a global project OWNERS | |
| in all parent projects up to All-Projects. | |
| ## auto-owners-approved | |
| The optional `auto-owners-approved` field controls a specific exception to the default | |
| `approverin:already-approved-by_owners` copy condition behavior. | |
| Please refer to the [relevant paragraph](./copy-conditions.md#auto-owners-approved) in | |
| the [copy-conditions.md](./copy-conditions.md) documentation for details on this. | |
| ## Example 1 - OWNERS file without matchers | |
| Given an OWNERS configuration of: | |
| ```yaml | |
| inherited: true | |
| owners: | |
| - John Doe | |
| - Doug Smith | |
| ``` | |
| In this case the owners plugin will assume the default label configuration,`Code-Review | |
| +2`, as indication of approval. | |
| To enforce submittability only when the specified owners have approved the | |
| change, you can then either enable `owners.enableSubmitRequirement = true` in | |
| your `gerrit.config` or define a submit requirement in your `project.config` that | |
| uses the `has:approval_owners` in the `submittableIf` section, like so: | |
| ``` | |
| [submit-requirement "Owner-Approval"] | |
| description = Files needs to be approved by owners | |
| submittableIf = has:approval_owners | |
| ``` | |
| > See [notes](#owners.enableSubmitRequirement) for an example on how to enable | |
| > submit requirements for a specific project only. | |
| ## Example 2 - OWNERS file with custom approval label | |
| Sometimes, teams might wish to use a different label to signal approval from an | |
| owner, rather than the default `Code-Review +2`. For example, you might wish to | |
| have a governance team explicitly approving changes but do not wish to necessarily grant | |
| them code review permissions. | |
| In this case, we need to grant specific groups with a custom label without | |
| necessarily giving them Code-Review +2 rights on the entire project. | |
| Amend the project.config as shown in below and add a new label; then give | |
| permissions to any registered user: | |
| ``` | |
| [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 | |
| ``` | |
| Given now an OWNERS configuration of: | |
| ```yaml | |
| inherited: true | |
| label: Owner-Approved, 1 | |
| owners: | |
| - John Doe | |
| - Doug Smith | |
| ``` | |
| This will mean that, a change cannot be submitted until 'John Doe' or 'Doug | |
| Smith' vote +1 on the `Owner-Approved` label, independently from whomever else | |
| has provided a `Code-Review +2`. | |
| > **NOTE:** You can also use `label: Code-Review, 1` as your definition of submittability | |
| Finally to enable this, you'll need to define a custom submit requirement in | |
| your `project.config`(as above) or enable `owners.enableSubmitRequirement = true` in your | |
| `owners.config` | |
| If you no longer wish to require a `Code-Review +2` and would rather only use | |
| the custom submit requirement, you have two options: | |
| - change the definition of the `Code-Review` label in `All-Projects`'s | |
| `project.config` so that `function = NoOp`. | |
| - set an `overrideIf` clause in your custom submit requirement definition | |
| > See [notes](#owners.enableSubmitRequirement) for an example on how to enable | |
| > submit requirements for a specific project only. | |
| > See [notes](#label.Label-Name.function) for an example on how to modify | |
| > label functions, as by default `Code-Review` requires at least one max vote | |
| > from any user. | |
| ## Example 3 - Owners based on matchers | |
| Often the ownership comes from the developer's skills and competencies and | |
| cannot be purely defined 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 that contain 'Test' should be reviewed by the QA team. | |
| Given an OWNERS configuration of: | |
| ```yaml | |
| inherited: true | |
| matchers: | |
| - suffix: .sql | |
| owners: | |
| - Mister Dba | |
| - regex: .*Test.* | |
| owners: | |
| - John Bug | |
| - Matt Free | |
| ``` | |
| You can then either enable `owners.enableSubmitRequirement = true` in your | |
| `gerrit.config` or define a submit requirement in your `project.config` that | |
| uses the `has:approval_owners` in the `applicableIf` section. | |
| > See [notes](#owners.enableSubmitRequirement) for an example on how to enable | |
| > submit requirements for a specific project only. |