blob: 3f2d639080532134fd39e53aa9d7ffb58d2775ca [file] [log] [blame] [view]
Edwin Kempin6b2a18c2020-09-22 17:04:56 +02001# Validation
2
3The code owners functionality relies on the validity of the following:
4
5* [code owner config files](user-guide.html#codeOwnerConfigFiles) that define
6 the code owners
7* [code-owner.config](config.html#projectLevelConfigFile) files in the
8 'refs/meta/config' branches of the projects that contain the project-level
9 configuration of the `@PLUGIN@` plugin
10
11To reduce the risk that these files become invalid, they are validated when
Edwin Kempin3d489e22020-09-30 12:57:08 +020012they are modified and invalid modifications are rejected. In addition code owner
13config files in a repository can be validated on demand by the [Check code
14owners files REST endpoint](rest-api.html#check-code-owner-config-files).
Edwin Kempin6b2a18c2020-09-22 17:04:56 +020015
16**NOTE:** Most configuration issues are gracefully handled and do not break the
17code owners functionality (e.g. non-resolveable code owners or non-resolveable
18imports are silently ignored), however some configuration issue (non-parseable
19configuration files, configuration of a non-existing [backend](backends.html)
20etc.) are severe errors and block the submission of all changes for which the
21affected configuration files are relevant.
22
Edwin Kempin205285a2020-12-01 09:53:04 +010023**NOTE:** It's possible to disable the validation of code owner config files on
24push and setup an [external
25validation](config-guide.html#externalValidationOfCodeOwnerConfigs) by a CI bot
26instead. In this case findings would be posted on the change.
27
Edwin Kempin6b2a18c2020-09-22 17:04:56 +020028All validations are best effort to prevent invalid configurations from
29entering the repository, but not all possible issues can be prevented. Doing the
30validation is useful since it prevents most issues and also gives quick feedback
31to uploaders about typos (e.g. if an email is misspelled it's not breaking
32anything, but the intended change of the uploader is not working).
33
34No validation is done when:
35
36* the `@PLUGIN@` plugin is not installed/enabled (this means when the `@PLUGIN@`
37 plugin gets installed/enabled, it is possible that invalid configuration files
38 already exist in the repository)
39* updates happen behind Gerrit's back (e.g. pushes that bypass Gerrit)
Edwin Kempinb05f24f2020-12-11 13:03:29 +010040* the validation is disabled via the
41 [enableValidationOnCommitReceived](config.html#codeOwnersEnableValidationOnCommitReceived)
42 or [enableValidationOnSubmit](config.html#codeOwnersEnableValidationOnSubmit)
43 config options
Edwin Kempinea5f8322021-03-12 15:37:48 +010044* the [--code-owners~skip-validation](#skipCodeOwnerConfigValidationOnDemand)
45 push option was specified on push
Edwin Kempin6b2a18c2020-09-22 17:04:56 +020046
47In addition for [code owner config files](user-guide.html#codeOwnerConfigFiles)
48no validation is done when:
49
50* the code owners functionality is disabled for the repository or branch (this
51 means when the code owners functionality gets enabled, it is possible that
52 invalid code owner configs already exist in the repository)
53* the `@PLUGIN@` plugin configuration is invalid (in this case we don't know
54 which files are code owner config files, so we allow all uploads rather than
55 blocking all uploads, to reduce the risk of breaking the plugin configuration
56 `code-owner.config` files are validated too)
57
Edwin Kempin29b692c2021-01-19 11:45:22 +010058## <a id="howCodeOwnerConfigsCanGetIssuesAfterSubmit">
Edwin Kempin6b2a18c2020-09-22 17:04:56 +020059In addition it is possible that [code owner config
60files](user-guide.hmtl#codeOwnerConfigFiles) get issues after they have been
61submitted:
62
63* configuration parameters that are relevant for the validation are changed
64 (e.g. the [accounts.visibility](../../../Documentation/config-gerrit.html#accounts.visibility)
65 setting is changed, [another code owners backend is
66 configured](setup-guide.html#configureCodeOwnersBackend) which now uses a
Edwin Kempinc85684a2021-01-19 12:01:01 +010067 different syntax or different names for code owner config files, the [file
68 extension for code owner config file is set/changed](config.html#codeOwnersFileExtension),
Edwin Kempin3ded05a2021-06-09 15:09:37 +020069 [arbitrary file extensions for code owner config files](config.html#codeOwnersEnableCodeOwnerConfigFilesWithFileExtensions)
70 get enabled/disabled or the [allowed email domains are
71 changed](config.html#pluginCodeOwnersAllowedEmailDomain))
Edwin Kempin6b2a18c2020-09-22 17:04:56 +020072* emails of users may change so that emails in code owner configs can no longer
73 be resolved
74* imported code owner config files may get deleted or renamed so that import
75 references can no longer be resolved
76
77When updating [code owner config files](user-guide.html#codeOwnerConfigFiles)
78the validation only rejects the update if it introduces **new** issues. This
79means the update is allowed if:
80
81* there are issues that are still present after the update, but the update
82 doesn't introduce any new issues
83* the file was non-parseable and the update makes it parseable, but issues are
84 present (since a parseable file with issues is better than a non-parseable
85 file)
86* the file was non-parseable and with the update it is still non-parseable
87
88For [code owner config files](user-guide.html#codeOwnerConfigFiles) the
Edwin Kempin1914db52021-03-24 15:31:23 +010089validation may also be performed on submit (in addition to the validation that
90is performed on upload of the change, see
91[enableValidationOnSubmit](config.html#codeOwnersEnableValidationOnSubmit)
92config setting). Repeating the validation on submit can make sense because
93relevant configuration can change between the time a change is uploaded and the
94time a change is submitted. If enabled, on submit we repeat the exact same
95validation that was done on upload. This means, all visibility checks will be
96done from the perspective of the uploader.
Edwin Kempin6b2a18c2020-09-22 17:04:56 +020097
Edwin Kempin515aec02022-02-11 15:26:27 +010098## <a id="codeOwnerConfigValidationOnBranchCreation">Code owner config validation on branch creation
99
100It's possible to [enable validation of code owner config files on branch
101creation](config.html#pluginCodeOwnersEnableValidationOnBranchCreation) (off by
102default).
103
104If the validation is enabled and a new branch is created, all code owner config
105files that are contained in the initial commit are newly validated, even if the
106branch is created for a commit that already exists in the repository.
107
108Validating code owner config files newly when a branch is created makes sense
109because:
110
111* the validation configuration of the new branch may differ from the validation
112 configuration of the branch that already contains the commit
113* [imports from other projects](backend-find-owners.html#referenceCodeOwnerConfigFilesFromOtherProjects)
114 that do not specify a branch may not be resolvable: If a branch is not
115 specified it's assumed that the code owner config file from the other project
116 should be imported from the same branch that contains the importing code owner
117 config. This means when a new branch `foo` is being created a code owner
118 config file that is referenced by such an import is expected to be found in
119 the branch `foo` of the other project, but this branch may not exist there so
120 that the import is unresolvable. By validating the code owner config files on
121 branch creation such unresolvable imports are detected and flagged.
122
123What should be done if the creation of a branch fails due to invalid code owner
124config files is explained in the
125[config FAQs](config-faqs.html#branchCreationFailsDueInvalidCodeOwnerConfigFiles).
126
Edwin Kempin2fd84e02021-05-17 09:02:53 +0000127## <a id="skipCodeOwnerConfigValidationOnDemand">Skip code owner config validation on demand
128
Edwin Kempin65181c42021-06-15 14:32:12 +0200129By setting the `code-owners~skip-validation` push option it is possible to skip
130the code owner config validation on push:
131`git push -o code-owners~skip-validation origin HEAD:refs/for/master`
Edwin Kempin2fd84e02021-05-17 09:02:53 +0000132
Edwin Kempin56df6ea2022-02-11 13:47:55 +0100133For the [Create
Edwin Kempin515aec02022-02-11 15:26:27 +0100134Branch](../../../Documentation/rest-api-projects.html#create-branch), [Create
Edwin Kempin56df6ea2022-02-11 13:47:55 +0100135Change](../../../Documentation/rest-api-changes.html#create-change), the [Cherry
136Pick Revision](../../../Documentation/rest-api-changes.html#cherry-pick) and the
137[Rebase](../../../Documentation/rest-api-changes.html#rebase-change) REST
138endpoints skipping the code owner config validation is possible by setting
Edwin Kempin0be91192021-06-15 14:28:41 +0200139`code-owners~skip-validation` with the value `true` as a validation option in
Edwin Kempin56df6ea2022-02-11 13:47:55 +0100140the input (see field `validation_options`).
Edwin Kempinec23f6e2022-02-10 09:20:31 +0100141
Edwin Kempin0be91192021-06-15 14:28:41 +0200142Using the push option or the validation option requires the calling user to
143have the `Can Skip Code Owner Config Validation` global capability. Host
144administrators have this capability implicitly assigned via the `Administrate
145Server` global capability.
Edwin Kempin2fd84e02021-05-17 09:02:53 +0000146
147**NOTE:** Using this option only makes sense if the [code owner config validation
148on submit](config.html#pluginCodeOwnersEnableValidationOnSubmit) is disabled, as
149otherwise it's not possible to submit the created change (using the push option
150only skips the validation for the push, but not for the submission of the
151change).
152
Edwin Kempin6b2a18c2020-09-22 17:04:56 +0200153### <a id="codeOwnerConfigFileChecks">Validation checks for code owner config files
154
155For [code owner config files](user-guide.html#codeOwnerConfigFiles) the
156following checks are performed:
157
158* the code owner config files are parseable
Edwin Kempin91664dd2021-03-24 14:12:50 +0100159* the code owner emails are resolveable (unless this check is
160 [disabled](config.html#codeOwnersRejectNonResolvableCodeOwners)):\
Edwin Kempin6b2a18c2020-09-22 17:04:56 +0200161 a code owners email is not resolveable if:
162 * the account that owns it is inactive
163 * the account that owns it is not visible to the uploader (according to
164 [accounts.visibility](../../../Documentation/config-gerrit.html#accounts.visibility)
165 setting)
166 * it is a non-visible secondary email
167 * there is no account that has this email assigned
Edwin Kempinba6cd402021-02-24 10:11:35 +0100168 * it is ambiguous (the same email is assigned to multiple active accounts)
Edwin Kempin6b2a18c2020-09-22 17:04:56 +0200169 * it has an email domain that is disallowed (see
170 [allowedEmailDomain](config.html#pluginCodeOwnersAllowedEmailDomain))
171 configuration
Edwin Kempin91664dd2021-03-24 14:12:50 +0100172* the imports are resolveable (unless this check is
173 [disabled](config.html#codeOwnersRejectNonResolvableImports)):\
Edwin Kempin6b2a18c2020-09-22 17:04:56 +0200174 an import is not resolveable if:
175 * the imported file is not a code owner config file
176 * the imported file is not parseable
177 * the imported file doesn't exists
178 * the branch from which the file should be imported doesn't exist or is not
179 visible to the uploader
180 * the project from which the file should be imported doesn't exist or is not
181 visible to the uploader
182 * the project from which the file should be imported doesn't permit reads
183 (e.g. has the state `HIDDEN`)
184
Edwin Kempin9bb90142022-06-09 13:44:56 +0200185**NOTE:** Non-resolvable code owner emails are rejected with a generic message,
186rather than informing about the exact reason why a code owner email is not
187resolvable. This is intentional and prevents that uploaders can probe the
188existence of emails/accounts (if specific reasons would be returned an uploader
189could create a code owner config file with arbitrary emails and then deduce from
190the messages which emails/accounts exist, which would a privacy issue).
191
Edwin Kempin21660042020-12-11 15:42:54 +0100192**NOTE:** Whether commits that newly add non-resolvable code owners and
193non-resolvable imports are rejected on commit received and on submit is
194controlled by the
195[rejectNonResolvableCodeOwners](config.html#pluginCodeOwnersRejectNonResolvableCodeOwners)
196and [rejectNonResolvableImports](config.html#pluginCodeOwnersRejectNonResolvableImports)
197config settings.
198
Edwin Kempin6b2a18c2020-09-22 17:04:56 +0200199The following things are **not** checked (not an exhaustive list):
200
201* Cycles in imports of owner config files:\
202 Detecting cycles in imports can be expensive and they are not seen as a
203 problem. When imports are resolved we keep track of the imported code owner
204 config files and stop if we see a code owner config file that weve imported
205 already. This behaviour is consistent with how Gerrit handles cycles in group
206 includes.
207* Impossible code owner configurations:\
208 It is possible to create a code owner configuration where some folders/files
209 have no code owners. In this case nobody can give a code owner approval for
210 these folders/files, and submitting changes to them requires a
211 [code owner override](user-guide.html#codeOwnerOverride).
212
213
Edwin Kempinbdb32822020-12-11 14:05:24 +0100214### <a id="codeOwnersConfigFileChecks">Validation checks for code-owners.config files
Edwin Kempin6b2a18c2020-09-22 17:04:56 +0200215
216For the [code-owner.config](config.html#projectLevelConfigFile) in the
217`refs/meta/config` branch the following checks are performed:
218
219* `code-owner.config` file is parseable
220* the [codeOwners.backend](config.html#codeOwnersBackend) and
221 [codeOwners.\<branch\>.backend](config.html#codeOwnersBranchBackend)
222 configurations are valid (that they reference an existing [code owner
223 backend](backends.html))
224* the [codeOwners.disabled](config.html#codeOwnersDisabled) and
225 [codeOwners.disabledBranch](config.html#codeOwnersDisabledBranch)
226 configurations are valid (that they have parseable value)
227* the [codeOwners.requiredApproval](config.html#codeOwnersRequiredApproval)
228 and [codeOwners.overrideApproval](config.html#codeOwnersOverrideApproval)
229 configurations are valid (that they reference an existing label that has a
230 range that covers the specified voting value, it's currently not possible to
231 add the definition of this label in the same commit but it must be present
232 before)
Edwin Kempin748b63a2020-09-24 09:13:50 +0200233* the [codeOwners.mergeCommitStrategy](config.html#codeOwnersMergeCommitStrategy)
234 configuration is valid
Edwin Kempine1849882020-11-26 13:19:13 +0100235* the [codeOwners.fallbackCodeOwners](config.html#codeOwnersFallbackCodeOwners)
236 configuration is valid
Edwin Kempinaa2c2552020-12-14 09:29:29 +0100237* the [codeOwners.maxPathsInChangeMessages](config.html#codeOwnersMaxPathsInChangeMessages)
238 configuration is valid
Edwin Kempin6b2a18c2020-09-22 17:04:56 +0200239
240---
241
242Back to [@PLUGIN@ documentation index](index.html)
243
244Part of [Gerrit Code Review](../../../Documentation/index.html)