From 4c9d60c166ff44abb3a354925e8a15d31b08e15c Mon Sep 17 00:00:00 2001 From: GitLab Bot Date: Wed, 29 Jan 2020 03:08:38 +0000 Subject: [PATCH] Add latest changes from gitlab-org/gitlab@master --- doc/api/merge_request_approvals.md | 2 +- doc/development/background_migrations.md | 3 +- doc/user/application_security/index.md | 9 +- doc/user/instance_statistics/dev_ops_score.md | 2 +- doc/user/project/code_owners.md | 2 +- .../img/approvals_can_override.png | Bin 7634 -> 0 bytes .../img/approvals_remove_on_push.png | Bin 6551 -> 0 bytes .../img/approvals_starter_project_edit.png | Bin 16217 -> 0 bytes .../img/approvals_starter_project_empty.png | Bin 16982 -> 0 bytes .../merge_requests/merge_request_approvals.md | 374 +++++++----------- .../img/filter_approver_merge_requests.png | Bin doc/user/search/index.md | 9 + qa/qa/resource/project_milestone.rb | 28 +- .../create_merge_request_spec.rb | 1 - 14 files changed, 171 insertions(+), 259 deletions(-) delete mode 100644 doc/user/project/merge_requests/img/approvals_can_override.png delete mode 100644 doc/user/project/merge_requests/img/approvals_remove_on_push.png delete mode 100644 doc/user/project/merge_requests/img/approvals_starter_project_edit.png delete mode 100644 doc/user/project/merge_requests/img/approvals_starter_project_empty.png rename doc/user/{project/merge_requests => search}/img/filter_approver_merge_requests.png (100%) diff --git a/doc/api/merge_request_approvals.md b/doc/api/merge_request_approvals.md index 4cee25f4680..37cd4da9e2c 100644 --- a/doc/api/merge_request_approvals.md +++ b/doc/api/merge_request_approvals.md @@ -956,7 +956,7 @@ POST /projects/:id/merge_requests/:merge_request_iid/approve | `id` | integer | yes | The ID of a project | | `merge_request_iid` | integer | yes | The IID of MR | | `sha` | string | no | The HEAD of the MR | -| `approval_password` **(STARTER)** | string | no | Current user's password. Required if [**Require user password to approve**](../user/project/merge_requests/merge_request_approvals.md#require-authentication-when-approving-a-merge-request-starter) is enabled in the project settings. | +| `approval_password` **(STARTER)** | string | no | Current user's password. Required if [**Require user password to approve**](../user/project/merge_requests/merge_request_approvals.md#require-authentication-when-approving-a-merge-request) is enabled in the project settings. | The `sha` parameter works in the same way as when [accepting a merge request](merge_requests.md#accept-mr): if it is passed, then it must diff --git a/doc/development/background_migrations.md b/doc/development/background_migrations.md index 746618be50f..02d31976481 100644 --- a/doc/development/background_migrations.md +++ b/doc/development/background_migrations.md @@ -59,8 +59,7 @@ integrity is guaranteed. ## Background migrations for EE-only features All the background migration classes for EE-only features should be present in GitLab CE. -For this purpose, an empty class can be created for GitLab CE and for GitLab EE it can be extended -For this purpose, an empty class can be created for GitLab CE, and it can be extended for GitLab EE +For this purpose, an empty class can be created for GitLab CE, and it can be extended for GitLab EE as explained in the [guidelines for implementing Enterprise Edition features](ee_features.md#code-in-libgitlabbackground_migration). ## How It Works diff --git a/doc/user/application_security/index.md b/doc/user/application_security/index.md index a3bfe5e69e8..35fdaa6fc9b 100644 --- a/doc/user/application_security/index.md +++ b/doc/user/application_security/index.md @@ -148,12 +148,15 @@ Clicking on this button will create a merge request to apply the solution onto t ![Create merge request from vulnerability](img/create_issue_with_list_hover.png) -## Security approvals in merge requests **(ULTIMATE)** +## Security approvals in merge requests > [Introduced](https://gitlab.com/gitlab-org/gitlab/issues/9928) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 12.2. -Merge Request Approvals can be configured to require approval from a member -of your security team when a vulnerability, or a software license compliance violation would be introduced by a merge request. +Merge Request Approvals can be configured to require approval from a member of your +security team when a merge request would introduce one of the following security issues: + +- a security vulnerability +- a software license compliance violation This threshold is defined as `high`, `critical`, or `unknown` severity. When any vulnerabilities are present within a merge request, an diff --git a/doc/user/instance_statistics/dev_ops_score.md b/doc/user/instance_statistics/dev_ops_score.md index a68f2a1e92a..35270f75f50 100644 --- a/doc/user/instance_statistics/dev_ops_score.md +++ b/doc/user/instance_statistics/dev_ops_score.md @@ -15,7 +15,7 @@ the last 30 days, averaged over the number of active users in that time period. provides a Lead score per feature, which is calculated based on GitLab's analysis of top-performing instances based on [usage ping data](../admin_area/settings/usage_statistics.md#usage-ping-core-only) that GitLab has collected. Your score is compared to the lead score of each feature and then expressed as a percentage at the bottom of said feature. -Your overall index score is an average of all your feature score percentages - this percentage value is presented above all the of features on the page. +Your overall **index score** is an average of your feature scores. You can use this score to compare your DevOps status to other organizations. ![DevOps Score](img/dev_ops_score_v12_6.png) diff --git a/doc/user/project/code_owners.md b/doc/user/project/code_owners.md index 476f513480c..5dca1af83c1 100644 --- a/doc/user/project/code_owners.md +++ b/doc/user/project/code_owners.md @@ -33,7 +33,7 @@ the given file. Once you've set Code Owners to a project, you can configure it to receive approvals: -- As [merge request eligible approvers](merge_requests/merge_request_approvals.md#code-owners-as-eligible-approvers-starter). **(STARTER)** +- As [merge request eligible approvers](merge_requests/merge_request_approvals.md#code-owners-as-eligible-approvers). - As required approvers for [protected branches](protected_branches.md#protected-branches-approval-by-code-owners-premium). **(PREMIUM)** Once set, Code Owners are displayed in merge requests widgets: diff --git a/doc/user/project/merge_requests/img/approvals_can_override.png b/doc/user/project/merge_requests/img/approvals_can_override.png deleted file mode 100644 index 8d207d018e0f7a9b05df1f7d3b160fbb47e5fb7e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7634 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 diff --git a/doc/user/project/merge_requests/img/approvals_remove_on_push.png b/doc/user/project/merge_requests/img/approvals_remove_on_push.png deleted file mode 100644 index 7396482758760b19275a5fa7d0cc5723fca19f5d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6551 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 GhW!sgwvj9V diff --git a/doc/user/project/merge_requests/img/approvals_starter_project_edit.png b/doc/user/project/merge_requests/img/approvals_starter_project_edit.png deleted file mode 100644 index 4c554d846cc759fedfcb104a21a30b7a4766af7d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16217 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 Introduced in [GitLab Enterprise Edition 7.12](https://about.gitlab.com/blog/2015/06/22/gitlab-7-12-released/#merge-request-approvers-ee-only). Merge request approvals enable enforced code review by requiring specified people -to approve a merge request before it can be unblocked for merging. +to approve a merge request before it can be merged. -## Use cases +Merge request approvals enable multiple use cases: -1. Enforcing review of all code that gets merged into a repository. -1. Specifying code maintainers for an entire repository. -1. Specifying reviewers for a given proposed code change. -1. Specifying categories of reviewers, such as BE, FE, QA, DB, etc., for all proposed code changes. +- Enforcing review of all code that gets merged into a repository. +- Specifying reviewers for a given proposed code change, as well as a minimum number + of reviewers, through [Approval rules](#approval-rules) +- Specifying categories of reviewers, such as backend, frontend, quality assurance, + database, etc., for all proposed code changes. +- Automatically designating [Code Owners as eligible approvers](#code-owners-as-eligible-approvers), + determined by the files changed in a merge request. +- [Requiring approval from a security team](#security-approvals-in-merge-requests-ultimate) + before merging code that could introduce a vulnerability.**(ULTIMATE)** -## Enabling the new approvals interface - -NOTE: **Note:** -Prior to 12.0, if you are running a self-managed instance, the new interface shown on -this page will not be available unless the feature flag -`approval_rules` is enabled, which can be done from the Rails console by -instance administrators. - -Use these commands to start the Rails console: - -```sh -# Omnibus GitLab -gitlab-rails console - -# Installation from source -cd /home/git/gitlab -sudo -u git -H bin/rails console RAILS_ENV=production -``` - -Then run `Feature.enable(:approval_rules)` to enable the feature flag. - -## Editing approvals - -To edit the merge request approvals: - -1. Navigate to your project's **Settings > General** and expand - **Merge request approvals**. - - ![Approvals starter project empty](img/approvals_starter_project_empty.png) - -1. Click **Edit**. -1. Search for users or groups that will be [eligible to approve](#eligible-approvers) - merge requests and click the **Add** button to add them as approvers. Note: selecting - approvers is optional. -1. Set the minimum number of required approvals under the **No. approvals required** - box. Note: the minimum can be 0. -1. Click **Update approvers**. - - ![Approvals starter project edit](img/approvals_starter_project_edit.png) - -The steps above are the minimum required to get approvals working in your -merge requests, but there are a couple more options available that might be -suitable to your workflow: +## Approval rules -- Choose whether the default settings can be - [overridden per merge request](#overriding-the-merge-request-approvals-default-settings) -- Choose whether [approvals will be reset with new pushed commits](#resetting-approvals-on-push) +Approval rules define how many approvals a merge request must receive before it can +be merged, and optionally which users should do the approving. This can be defined: -## Editing approvals **(PREMIUM)** +- [As project defaults](#adding--editing-a-default-approval-rule) +- [Per merge request](#editing--overriding-approval-rules-per-merge-request) -> [Introduced](https://gitlab.com/gitlab-org/gitlab/issues/1979) in [GitLab Premium](https://about.gitlab.com/pricing/) 11.10. - -For GitLab Premium, [multiple approver rules](#multiple-approval-rules-premium) can be configured. To configure the merge -request approval rules: - -1. Navigate to your project's **Settings > General** and expand **Merge request approvals**. -1. Click **Add approvers** to create a new approval rule. -1. Just like in [GitLab Starter](#editing-approvals), select the approval members and approvals required. -1. Give the approval rule a name that describes the set of approvers selected. -1. Click **Add approval rule** to submit the new rule. - - ![Approvals premium project edit](img/approvals_premium_project_edit_v12_5.png) - -## Multiple approval rules **(PREMIUM)** +If no approval rules are defined, any user can approve a merge request, though the default +minimum number of required approvers can still be set in the [project settings for merge request approvals](#merge-request-approvals-project-settings). -> [Introduced](https://gitlab.com/gitlab-org/gitlab/issues/1979) in [GitLab Premium](https://about.gitlab.com/pricing/) 11.10. - -For GitLab Premium, a merge request's overall approval status is determined by a set of rules. Each rule contains: - -- A set of [eligible approvers](#eligible-approvers). -- A minimum number of approvals required. - -When an [eligible approver](#eligible-approvers) approves a merge request, it will reduce the number of approvals left for -all rules that the approver belongs to. - -![Approvals premium merge request widget](img/approvals_premium_mr_widget.png) - -If no approval rules are set, then the overall minimum number of approvals required can be configured. With no approval rules, -any [eligible approver](#eligible-approvers) may approve. - -## Eligible approvers +### Eligible approvers The following can approve merge requests: - Users being added as approvers at project or merge request level. -- [Code owners](#code-owners-as-eligible-approvers-starter) to the files changed by the merge request. +- [Code owners](#code-owners-as-eligible-approvers) to the files changed by the merge request. An individual user can be added as an approver for a project if they are a member of: @@ -109,8 +45,8 @@ An individual user can be added as an approver for a project if they are a membe - The project's immediate parent group. - A group that has access to the project via a [share](../members/share_project_with_groups.md). -A group can also be added as an approver. [In the future](https://gitlab.com/gitlab-org/gitlab/issues/2048), -group approvers will be restricted. +A group of users can also be added as approvers. In the future, group approvers may be +[restricted to only groups with share access to the project](https://gitlab.com/gitlab-org/gitlab/issues/2048). If a user is added as an individual approver and is also part of a group approver, then that user is just counted once. The merge request author, as well as users who have committed @@ -119,19 +55,25 @@ if [**Prevent author approval**](#allowing-merge-request-authors-to-approve-thei and [**Prevent committers approval**](#prevent-approval-of-merge-requests-by-their-committers) (disabled by default) are enabled on the project settings. -### Code Owners as eligible approvers **(STARTER)** +#### Implicit approvers + +If the number of required approvals is greater than the number of assigned approvers, +approvals from other users will count towards meeting the requirement. These would be +users with developer [permissions](../../permissions.md) or higher in the project who +were not explicitly listed in the approval rules. + +#### Code Owners as eligible approvers > [Introduced](https://gitlab.com/gitlab-org/gitlab/merge_requests/7933) in [GitLab Starter](https://about.gitlab.com/pricing/) 11.5. -Once you've added [Code Owners](../code_owners.md) to your -repository, the owners to the corresponding files will become -eligible approvers, together with members with Developer or -higher permissions. +If you add [Code Owners](../code_owners.md) to your repository, the owners to the +corresponding files will become eligible approvers, together with members with Developer +or higher permissions. To enable this merge request approval rule: 1. Navigate to your project's **Settings > General** and expand -**Merge request approvals**. + **Merge request approvals**. 1. Locate **All members with Developer role or higher and code owners (if any)** and click **Edit** to choose the number of approvals required. ![MR approvals by Code Owners](img/mr_approvals_by_code_owners_v12_4.png) @@ -144,205 +86,185 @@ indistinguishably. Alternatively, you can **require** [Code Owner's approvals for Protected Branches](../protected_branches.md#protected-branches-approval-by-code-owners-premium). **(PREMIUM)** -### Implicit approvers +### Adding / editing a default approval rule -If the number of required approvals is greater than the number of approvers, -other users will become implicit approvers to fill the gap. -Those implicit approvers include members of the given project with Developer role or higher. +To add or edit the default merge request approval rule: -## Adding or removing an approval +1. Navigate to your project's **Settings > General** and expand **Merge request approvals**. -If approvals are activated for the given project, when a user visits an open -merge request, depending on their [eligibility](#eligible-approvers), one of -the following is possible: +1. Click **Add approval rule**, or **Edit**. + - Add or change the **Rule name**. + - Set the number of required approvals in **No. approvals required**. The minimum value is `0`. + - (Optional) Search for users or groups that will be [eligible to approve](#eligible-approvers) + merge requests and click the **Add** button to add them as approvers. Before typing + in the search field, approvers will be suggested based on the previous authors of + the files being changed by the merge request. + - (Optional) Click the **"trashcan"** button next to a group or user to delete it from + the rule. +1. Click **Add approval rule** or **Update approval rule**. -- **They are not an eligible approver**: They cannot do anything with respect - to approving this merge request. +Any merge requests that were created before changing the rules will not be changed. +They will keep the original approval rules, unless manually [overridden](#editing--overriding-approval-rules-per-merge-request). -- **They have not approved this merge request**: +NOTE: **Note:** +If a merge request targets a different project, such as from a fork to the upstream project, +the default approval rules will be taken from the target (upstream) project, not the +source (fork). - - If the required number of approvals has _not_ been yet met, they can approve - it by clicking the displayed **Approve** button. +#### Editing / overriding approval rules per merge request - ![Approve](img/approve.png) +> Introduced in GitLab Enterprise Edition 9.4. - - If the required number of approvals has already been met, they can still - approve it by clicking the displayed **Approve additionally** button. +By default, the merge request approval rule listed in each merge request (MR) can be +edited by the MR author or a user with sufficient [permissions](../../permissions.md). +This ability can be disabled in the [merge request approvals settings](#prevent-overriding-default-approvals). - ![Add approval](img/approve_additionally.png) +One possible scenario would be to add more approvers than were defined in the default +settings. -- **They have already approved this merge request**: They can remove their approval. +When creating or editing a merge request, find the **Approval rules** section, then follow +the same steps as [Adding / editing a default approval rule](#adding--editing-a-default-approval-rule). - ![Remove approval](img/remove_approval.png) +### Multiple approval rules **(PREMIUM)** -NOTE: **Note:** -The merge request author is only allowed to approve their own merge request -if [**Prevent author approval**](#allowing-merge-request-authors-to-approve-their-own-merge-requests) is disabled on the project settings. - -For a given merge request, if the approval restrictions have been satisfied, -the merge request is unblocked and can be merged. -Note that meeting the required number of approvals is a necessary, but not -sufficient condition for unblocking a merge request from being merged. There -are other conditions that may block it, such as merge conflicts, -[pending discussions](../../discussions/index.md#only-allow-merge-requests-to-be-merged-if-all-threads-are-resolved) -or a [failed CI/CD pipeline](merge_when_pipeline_succeeds.md). +> [Introduced](https://gitlab.com/gitlab-org/gitlab/issues/1979) in [GitLab Premium](https://about.gitlab.com/pricing/) 11.10. -## Overriding the merge request approvals default settings +In GitLab Premium, it is possible to have multiple approval rules per merge request, +as well as multiple default approval rules per project. -> Introduced in GitLab Enterprise Edition 9.4. +Adding or editing multiple default rules is identical to +[adding or editing a single default approval rule](#adding--editing-a-default-approval-rule), +except the **Add approval rule** button will be available to add more rules, even after +a rule is already defined. -NOTE: **Note:** -If you are using GitLab Premium, things are a little different with [multiple approval rules](#multiple-approval-rules-premium). -Read the differences [in GitLab Premium when overriding merge request approvals](#overriding-merge-request-approvals-default-settings-premium). +Similarly, editing or overriding multiple approval rules per merge request is identical +to [editing or overriding approval rules per merge request](#editing--overriding-approval-rules-per-merge-request), +except the **Add approval rule** button will be available to add more rules, even after +a rule is already defined. + +When an [eligible approver](#eligible-approvers) approves a merge request, it will +reduce the number of approvals left for all rules that the approver belongs to. -If approvals are [set at the project level](#editing-approvals), the -default configuration (number of required approvals and approvers) can be -overridden for each merge request in that project. +![Approvals premium merge request widget](img/approvals_premium_mr_widget.png) -One possible scenario would be to assign a group of approvers at the project -level and change them later when creating or editing the merge request. +## Adding or removing an approval -First, you have to enable this option in the project's settings: +When an [eligible approver](#eligible-approvers) visits an open merge request, +one of the following is possible: -1. Navigate to your project's **Settings > General** and expand - **Merge request approvals** -1. Tick the "Can override approvers and approvals required per merge request" - checkbox +- If the required number of approvals has _not_ been yet met, they can approve + it by clicking the displayed **Approve** button. - ![Approvals can override](img/approvals_can_override.png) + ![Approve](img/approve.png) -1. Click **Save changes** +- If the required number of approvals has already been met, they can still + approve it by clicking the displayed **Approve additionally** button. -NOTE: **Note:** -If approver overriding is enabled -and the project level approvers are changed after a merge request is created, -the merge request retains the previous approvers. -However, the approvers can be changed by [editing the merge request](#overriding-the-merge-request-approvals-default-settings). - -The default approval settings can now be overridden when creating a -[merge request](index.md) or by editing it after it's been created: - -1. Click **Edit** under the **Approvers** section. -1. Search for users or groups that will be [eligible to approve](#eligible-approvers) - merge requests and click the **Add** button to add them as approvers or - remove existing approvers that were set in the project's settings. -1. If you want to change the number of required approvals, set a new number - in the **No. approvals required** box. -1. Click **Update approvers**. + ![Add approval](img/approve_additionally.png) + +- **They have already approved this merge request**: They can remove their approval. + + ![Remove approval](img/remove_approval.png) NOTE: **Note:** -If you are contributing to a forked project, things are a little different. -Read what happens when the -[source and target branches are not the same](#merge-requests-with-different-source-branch-and-target-branch-projects). +The merge request author is not allowed to approve their own merge request if +[**Prevent author approval**](#allowing-merge-request-authors-to-approve-their-own-merge-requests) +is enabled in the project settings. -## Overriding merge request approvals default settings **(PREMIUM)** +Once the approval rules have been met, the merge request can be merged if there is nothing +else blocking it. Note that the merge request could still be blocked by other conditions, +such as merge conflicts, [pending discussions](../../discussions/index.md#only-allow-merge-requests-to-be-merged-if-all-threads-are-resolved), +or a [failed CI/CD pipeline](merge_when_pipeline_succeeds.md). -In GitLab Premium, when the approval rules are [set at the project level](#editing-approvals-premium), -and **Can override approvers and approvals required per merge request** is checked, -approval rules can be added to an MR with no restriction. +## Merge request approvals project settings -## Resetting approvals on push +The project settings for Merge request approvals are found by going to +**Settings > General** and expanding **Merge request approvals**. -If approvals are [set at the project level](#editing-approvals), -you can choose whether all approvals on a merge request are removed when -new commits are pushed to the source branch of the merge request: +### Prevent overriding default approvals -1. Navigate to your project's **Settings > General** and expand - **Merge request approvals** -1. Tick the "Remove all approvals in a merge request when new commits are pushed to its source branch" - checkbox +By default, users are able to edit the approval rules in merge requests. If disabled, +the approval rules for all new merge requests will be determined by the +[default approval rules](#adding--editing-a-default-approval-rule). To disable this feature: - ![Approvals remove on push](img/approvals_remove_on_push.png) +1. Uncheck the **Can override approvers and approvals required per merge request** checkbox. +1. Click **Save changes** +### Resetting approvals on push + +You can force all approvals on a merge request to be removed when new commits are +pushed to the source branch of the merge request. If disabled, approvals will persist +even if there are changes added to the merge request. To enable this feature: + +1. Check the **Remove all approvals in a merge request when new commits are pushed to its source branch** + checkbox. 1. Click **Save changes** NOTE: **Note:** Approvals do not get reset when [rebasing a merge request](fast_forward_merge.md) -from the UI. -However, approvals will be reset if the target branch is changed. - -If you want approvals to persist, independent of changes to the merge request, -turn this setting to off by unchecking the box and saving the changes. +from the UI. However, approvals will be reset if the target branch is changed. -## Allowing merge request authors to approve their own merge requests +### Allowing merge request authors to approve their own merge requests > [Introduced](https://gitlab.com/gitlab-org/gitlab/issues/3349) in [GitLab Starter](https://about.gitlab.com/pricing/) 11.3. -You can allow merge request authors to self-approve merge requests by -enabling it [at the project level](#editing-approvals). Authors +You can allow merge request authors to self-approve merge requests. Authors also need to be included in the approvers list in order to be able to -approve their merge request. +approve their merge request. To enable this feature: -1. Navigate to your project's **Settings > General** and expand **Merge request approvals**. -1. Uncheck the **Prevent approval of merge requests by merge request author** checkbox, which is enabled by default. +1. Uncheck the **Prevent approval of merge requests by merge request author** checkbox, + which is enabled by default. 1. Click **Save changes**. -## Prevent approval of merge requests by their committers +### Prevent approval of merge requests by their committers > [Introduced](https://gitlab.com/gitlab-org/gitlab/issues/10441) in [GitLab Starter](https://about.gitlab.com/pricing/) 11.10. -You can prevent users that have committed to a merge request from approving it by -enabling [**Prevent approval of merge requests by their committers**](#prevent-approval-of-merge-requests-by-their-committers). +You can prevent users that have committed to a merge request from approving it. To +enable this feature: -1. Navigate to your project's **Settings > General** and expand **Merge request approvals**. -1. Tick the checkbox **Prevent approval of merge requests by their committers**. +1. Check the **Prevent approval of merge requests by their committers** checkbox. 1. Click **Save changes**. -## Require authentication when approving a merge request **(STARTER)** +### Require authentication when approving a merge request > [Introduced](https://gitlab.com/gitlab-org/gitlab/issues/5981) in [GitLab Starter](https://about.gitlab.com/pricing/) 12.0. -You can force the approver to enter a password in order to authenticate who is approving the merge request by -enabling **Require user password to approve**. This enables an Electronic Signature -for approvals such as the one defined by [CFR Part 11](https://www.accessdata.fda.gov/scripts/cdrh/cfdocs/cfcfr/CFRSearch.cfm?CFRPart=11&showFR=1&subpartNode=21:1.0.1.1.8.3)): +You can force the approver to enter a password in order to authenticate before adding +the approval. This enables an Electronic Signature for approvals such as the one defined +by [CFR Part 11](https://www.accessdata.fda.gov/scripts/cdrh/cfdocs/cfcfr/CFRSearch.cfm?CFRPart=11&showFR=1&subpartNode=21:1.0.1.1.8.3)). +To enable this feature: -1. Navigate to your project's **Settings > General** and expand **Merge request approvals**. -1. Tick the checkbox **Require user password to approve**. +1. Check the **Require user password to approve** checkbox. 1. Click **Save changes**. -## Merge requests with different source branch and target branch projects - -If the merge request source branch and target branch belong to different -projects (which happens in merge requests in forked projects), everything is -with respect to the target branch's project (typically the original project). -In particular, since the merge request in this case is part of the target -branch's project, the relevant settings are the target project's. The source -branch's project settings are not applicable. Even if you start the merge -request from the source branch's project UI, pay attention to the created merge -request itself. It belongs to the target branch's project. - -## Approver suggestions - -Approvers are suggested for merge requests based on the previous authors of the files affected by the merge request. - -## Filtering merge requests by approvers - -> [Introduced](https://gitlab.com/gitlab-org/gitlab/merge_requests/9468) in [GitLab Starter](https://about.gitlab.com/pricing/) 11.9. - -To filter merge requests by an individual approver, you can type (or select from -the dropdown) `approver` and select the user. - -![Filter MRs by an approver](img/filter_approver_merge_requests.png) - ## Security approvals in merge requests **(ULTIMATE)** -> Introduced in [GitLab Ultimate](https://about.gitlab.com/pricing/) 12.2. - Merge Request Approvals can be configured to require approval from a member of your security team when a vulnerability would be introduced by a merge request. For more information, see -[Security approvals in merge requests](../../application_security/index.md#security-approvals-in-merge-requests-ultimate). +[Security approvals in merge requests](../../application_security/index.md#security-approvals-in-merge-requests). + +## Enabling the new approvals interface -## License compliance approvals in merge requests **(ULTIMATE)** +Since [GitLab v12.0](https://gitlab.com/gitlab-org/gitlab/issues/10685), an updated approvals +interface is available by default. In versions older than 12.0, the updated interface is not +available unless the `approval_rules` feature flag is enabled, which can be done from +the Rails console by instance administrators. -> Introduced in [GitLab Ultimate](https://about.gitlab.com/pricing/) 12.3. +Use these commands to start the Rails console: -Merge Request Approvals can be configured to require approval from a member -of your security team when a blacklisted software license would be introduced by a merge request. +```shell +# Omnibus GitLab +gitlab-rails console -For more information, see -[Security approvals in merge requests](../../application_security/index.md#security-approvals-in-merge-requests-ultimate). +# Installation from source +cd /home/git/gitlab +sudo -u git -H bin/rails console RAILS_ENV=production +``` + +Then run `Feature.enable(:approval_rules)` to enable the updated interface.