Add latest changes from gitlab-org/gitlab@master

This commit is contained in:
GitLab Bot 2024-05-01 18:11:10 +00:00
parent e27ddd0d73
commit e6f61449a7
23 changed files with 751 additions and 530 deletions

View File

@ -1 +1 @@
606e33fd67ccb40becec0638fff387caf6dfc035
7acf563cecc93e6c26c0c77151993e6ff0c17318

View File

@ -95,7 +95,12 @@ export default {
<span>{{ tab.title }}</span>
<gl-badge size="sm" class="gl-tab-counter-badge">{{ getTabCount(tab) }}</gl-badge>
</template>
<component :is="tab.component" v-if="tab.component" :namespace="tab.namespace" />
<component
:is="tab.component"
v-if="tab.component"
:namespace="tab.namespace"
:tab-query-param-value="tab.queryParamValue"
/>
<members-app
v-else
:namespace="tab.namespace"

View File

@ -0,0 +1,55 @@
<script>
import { GlPagination } from '@gitlab/ui';
import { mergeUrlParams } from '~/lib/utils/url_utility';
import { ACTIVE_TAB_QUERY_PARAM_NAME } from '~/members/constants';
export default {
name: 'MembersPagination',
components: { GlPagination },
props: {
pagination: {
type: Object,
required: true,
},
tabQueryParamValue: {
type: String,
required: true,
},
},
computed: {
isPaginationShown() {
const { paramName, currentPage, perPage, totalItems } = this.pagination;
return paramName && currentPage && perPage && totalItems;
},
},
methods: {
paginationLinkGenerator(page) {
const { params = {}, paramName } = this.pagination;
return mergeUrlParams(
{
...params,
[ACTIVE_TAB_QUERY_PARAM_NAME]:
this.tabQueryParamValue !== '' ? this.tabQueryParamValue : null,
[paramName]: page,
},
window.location.href,
);
},
},
};
</script>
<template>
<gl-pagination
v-if="isPaginationShown"
:value="pagination.currentPage"
:per-page="pagination.perPage"
:total-items="pagination.totalItems"
:link-gen="paginationLinkGenerator"
:prev-text="__('Prev')"
:next-text="__('Next')"
:label-next-page="__('Go to next page')"
:label-prev-page="__('Go to previous page')"
align="center"
/>
</template>

View File

@ -1,5 +1,5 @@
<script>
import { GlTable, GlBadge, GlPagination } from '@gitlab/ui';
import { GlTable, GlBadge } from '@gitlab/ui';
// eslint-disable-next-line no-restricted-imports
import { mapState } from 'vuex';
import MembersTableCell from 'ee_else_ce/members/components/table/members_table_cell.vue';
@ -12,11 +12,9 @@ import {
canResend,
canUpdate,
} from 'ee_else_ce/members/utils';
import { mergeUrlParams } from '~/lib/utils/url_utility';
import {
FIELD_KEY_ACTIONS,
FIELDS,
ACTIVE_TAB_QUERY_PARAM_NAME,
MEMBER_STATE_AWAITING,
MEMBER_STATE_ACTIVE,
USER_STATE_BLOCKED,
@ -32,13 +30,13 @@ import MemberAvatar from './member_avatar.vue';
import MemberSource from './member_source.vue';
import MemberActivity from './member_activity.vue';
import MaxRole from './max_role.vue';
import MembersPagination from './members_pagination.vue';
export default {
name: 'MembersTable',
components: {
GlTable,
GlBadge,
GlPagination,
MemberAvatar,
CreatedAt,
MembersTableCell,
@ -49,6 +47,7 @@ export default {
RemoveMemberModal,
ExpirationDatepicker,
MemberActivity,
MembersPagination,
DisableTwoFactorModal: () =>
import('ee_component/members/components/modals/disable_two_factor_modal.vue'),
LdapOverrideConfirmationModal: () =>
@ -85,11 +84,6 @@ export default {
userIsLoggedIn() {
return this.currentUserId !== null;
},
showPagination() {
const { paramName, currentPage, perPage, totalItems } = this.pagination;
return paramName && currentPage && perPage && totalItems;
},
},
methods: {
hasActionButtons(member) {
@ -141,19 +135,6 @@ export default {
}),
};
},
paginationLinkGenerator(page) {
const { params = {}, paramName } = this.pagination;
return mergeUrlParams(
{
...params,
[ACTIVE_TAB_QUERY_PARAM_NAME]:
this.tabQueryParamValue !== '' ? this.tabQueryParamValue : null,
[paramName]: page,
},
window.location.href,
);
},
/**
* Returns whether it's a new or existing user
*
@ -319,18 +300,7 @@ export default {
<span data-testid="col-actions" class="gl-sr-only">{{ label }}</span>
</template>
</gl-table>
<gl-pagination
v-if="showPagination"
:value="pagination.currentPage"
:per-page="pagination.perPage"
:total-items="pagination.totalItems"
:link-gen="paginationLinkGenerator"
:prev-text="__('Prev')"
:next-text="__('Next')"
:label-next-page="__('Go to next page')"
:label-prev-page="__('Go to previous page')"
align="center"
/>
<members-pagination :pagination="pagination" :tab-query-param-value="tabQueryParamValue" />
<disable-two-factor-modal />
<remove-group-link-modal />
<remove-member-modal />

View File

@ -409,6 +409,7 @@ module Ci
scope :with_unlockable_status, -> { with_status(*UNLOCKABLE_STATUSES) }
scope :internal, -> { where(source: internal_sources) }
scope :no_tag, -> { where(tag: false) }
scope :no_child, -> { where.not(source: :parent_pipeline) }
scope :ci_sources, -> { where(source: Enums::Ci::Pipeline.ci_sources.values) }
scope :ci_branch_sources, -> { where(source: Enums::Ci::Pipeline.ci_branch_sources.values) }

View File

@ -58,11 +58,11 @@ In GitLab 17.0, the legacy runner registration workflow will be disabled automat
[Using registration tokens after GitLab 17.0](#using-registration-tokens-after-gitlab-170).
If no action is taken before your GitLab instance is upgraded to GitLab 17.0, then your runner registration
workflow will break.
workflow will break, and the `gitlab-runner register` command will receive a `410 Gone - runner registration disallowed` error.
To avoid a broken workflow, you must:
1. [Create an instance runner](runners_scope.md#create-an-instance-runner-with-a-runner-authentication-token) and obtain the authentication token.
1. [Create a runner](runners_scope.md) and obtain the authentication token.
1. Replace the registration token in your runner registration workflow with the
authentication token.
@ -70,8 +70,10 @@ To avoid a broken workflow, you must:
To continue using registration tokens after GitLab 17.0:
- On GitLab.com, you can manually re-enable the legacy runner registration process in the top-level group settings until GitLab 18.0.
- On GitLab self-managed, you can manually re-enable the legacy runner registration process in the Admin Area settings until GitLab 18.0.
- On GitLab.com, you can manually [enable the legacy runner registration process](runners_scope.md#enable-use-of-runner-registration-tokens-in-projects-and-groups)
in the top-level group settings until GitLab 18.0.
- On GitLab self-managed, you can manually [enable the legacy runner registration process](../../administration/settings/continuous_integration.md#enable-runner-registrations-tokens)
in the Admin Area settings until GitLab 18.0.
Plans to implement a UI setting to re-enable registration tokens are proposed in [issue 411923](https://gitlab.com/gitlab-org/gitlab/-/issues/411923)

View File

@ -1380,7 +1380,7 @@ Add the new prefix to:
- The [GitLab Secret Detection gem](https://gitlab.com/gitlab-org/gitlab/-/tree/master/gems/gitlab-secret_detection)
- GitLab [secrets SAST analyzer](https://gitlab.com/gitlab-org/security-products/analyzers/secrets)
- [Tokinator](https://gitlab.com/gitlab-com/gl-security/appsec/tokinator/-/blob/main/CONTRIBUTING.md?ref_type=heads) (internal tool / team members only)
- [Token Overview](../security/token_overview.md#gitlab-tokens) documentation
- [Token Overview](../security/token_overview.md) documentation
### Examples

View File

@ -34,3 +34,8 @@ Report any issues, bugs, or feature requests in the
- [Download the plugin](https://marketplace.visualstudio.com/items?itemName=GitLab.GitLabExtensionForVisualStudio)
- [Plugin documentation](https://gitlab.com/gitlab-org/editor-extensions/gitlab-visual-studio-extension/-/blob/main/README.md)
- [View source code](https://gitlab.com/gitlab-org/editor-extensions/gitlab-visual-studio-extension)
## Troubleshooting
For troubleshooting information, see the
[extension's troubleshooting page](https://gitlab.com/gitlab-org/editor-extensions/gitlab-visual-studio-extension/-/blob/main/docs/user/troubleshooting.md).

View File

@ -218,18 +218,18 @@ Each user has a long-lived incoming email token that does not expire. This token
This table shows available scopes per token. Scopes can be limited further on token creation.
| | API access | Registry access | Repository access |
|-----------------------------|------------|-----------------|-------------------|
| Personal access token | ✅ | ✅ | ✅ |
| OAuth2 token | ✅ | 🚫 | ✅ |
| Impersonation token | ✅ | ✅ | ✅ |
| Project access token | ✅(1) | ✅(1) | ✅(1) |
| Group access token | ✅(2) | ✅(2) | ✅(2) |
| Deploy token | 🚫 | ✅ | ✅ |
| Deploy key | 🚫 | 🚫 | ✅ |
| Runner registration token | 🚫 | 🚫 | ✴️(3) |
| Runner authentication token | 🚫 | 🚫 | ✴️(3) |
| Job token | ✴️(4) | 🚫 | ✅ |
| Token name | API access | Registry access | Repository access |
|-----------------------------|---------------------------|---------------------------|-------------------|
| Personal access token | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes |
| OAuth2 token | **{check-circle}** Yes | **{dotted-circle}** No | **{check-circle}** Yes |
| Impersonation token | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes |
| Project access token | **{check-circle}** Yes(1) | **{check-circle}** Yes(1) | **{check-circle}** Yes(1) |
| Group access token | **{check-circle}** Yes(2) | **{check-circle}** Yes(2) | **{check-circle}** Yes(2) |
| Deploy token | **{dotted-circle}** No | **{check-circle}** Yes | **{check-circle}** Yes |
| Deploy key | **{dotted-circle}** No | **{dotted-circle}** No | **{check-circle}** Yes |
| Runner registration token | **{dotted-circle}** No | **{dotted-circle}** No | ✴️(3) |
| Runner authentication token | **{dotted-circle}** No | **{dotted-circle}** No | ✴️(3) |
| Job token | ✴️(4) | **{dotted-circle}** No | **{check-circle}** Yes |
1. Limited to the one project.
1. Limited to the one group.
@ -238,24 +238,19 @@ This table shows available scopes per token. Scopes can be limited further on to
## Token prefixes
The following tables show the prefixes for each type of token where applicable.
### GitLab tokens
The following table shows the prefixes for each type of token.
| Token name | Prefix |
|-----------------------------------|--------------------|
| Personal access token | `glpat-` |
| OAuth Application Secret | `gloas-` |
| Impersonation token | Not applicable. |
| Project access token | Not applicable. |
| Group access token | Not applicable. |
| Impersonation token | `glpat-` |
| Project access token | `glpat-` |
| Group access token | `glpat-` |
| Deploy token | `gldt-` ([Added in GitLab 16.7](https://gitlab.com/gitlab-org/gitlab/-/issues/376752)) |
| Deploy key | Not applicable. |
| Runner registration token | Not applicable. |
| Runner authentication token | `glrt-` |
| CI/CD Job token | `glcbt-` <br /> &bull; ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/426137) in GitLab 16.8 behind a feature flag named `prefix_ci_build_tokens`. Disabled by default.) <br /> &bull; ([Generally available](https://gitlab.com/gitlab-com/gl-infra/production/-/issues/17299) in GitLab 16.9. Feature flag `prefix_ci_build_tokens` removed.) |
| Trigger token | `glptt-` |
| Legacy runner registration token | GR1348941 |
| Feed token | `glft-` |
| Incoming mail token | `glimt-` |
| GitLab agent for Kubernetes token | `glagent-` |
@ -263,14 +258,6 @@ The following tables show the prefixes for each type of token where applicable.
| SCIM Tokens | `glsoat-` <br /> &bull; ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/435096) in GitLab 16.8 behind a feature flag named `prefix_scim_tokens`. Disabled by default.) <br > &bull; ([Generally available](https://gitlab.com/gitlab-org/gitlab/-/issues/435423) in GitLab 16.9. Feature flag `prefix_scim_tokens` removed.) |
| Feature Flags Client token | `glffct-` |
### External system tokens
| Token name | Prefix |
|-----------------|-----------------|
| Omamori tokens | `omamori_pat_` |
| AWS credentials | `AKIA` |
| GCP credentials | Not applicable. |
## Security considerations
1. Treat access tokens like passwords and keep them secure.

View File

@ -10,22 +10,22 @@ info: To determine the technical writer assigned to the Stage/Group associated w
> - [Removed third-party AI setting](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/136144) in GitLab 16.6.
> - [Removed support for OpenAI from all GitLab Duo features](https://gitlab.com/groups/gitlab-org/-/epics/10964) in GitLab 16.6.
GitLab is creating AI-assisted features across our DevSecOps platform. These features aim to help increase velocity and solve key pain points across the software development lifecycle. GitLab Duo features are accessible through the [IDE extension](../editor_extensions/index.md) and the GitLab UI. Some of the features are accessible through [GitLab Duo Chat](gitlab_duo_chat.md), which is available in both interfaces.
GitLab Duo is a set of AI-assisted features across the GitLab DevSecOps platform. These features aim to help increase velocity and solve key pain points across the software development lifecycle. GitLab Duo features are accessible through the [IDE extension](../editor_extensions/index.md) and the GitLab UI. Some of the features are also accessible through [GitLab Duo Chat](gitlab_duo_chat.md), which is available in both interfaces.
Some features are still in development. View details about [support for each status](../policy/experiment-beta-support.md#experiment) (Experiment, Beta, Generally Available).
Some features are still in development. View details about [support for each status](../policy/experiment-beta-support.md#experiment) (Experiment, Beta, Generally Available). Learn more about how to [enable GitLab Duo features](ai_features_enable.md).
GitLab is [transparent](https://handbook.gitlab.com/handbook/values/#transparency). As GitLab Duo features mature, the documentation will be updated to clearly state how and where you can access these capabilities.
| Goal | Feature | Tier/Offering/Status |
|---|---|---|
| Helps you write code more efficiently by showing code suggestions as you type.<br><br><i class="fa fa-youtube-play youtube" aria-hidden="true"></i> [Watch overview](https://www.youtube.com/watch?v=hCAyCTacdAQ) | [Code Suggestions](project/repository/code_suggestions/index.md) | **Tier:** Premium and Ultimate with [GitLab Duo Pro](../subscriptions/subscription-add-ons.md)<br>**Offering:** GitLab.com, Self-managed, GitLab Dedicated |
| Processes and generates text and code in a conversational manner. Helps you quickly identify useful information in large volumes of text in issues, epics, code, and GitLab documentation. | [Chat](gitlab_duo_chat.md) | **Tier:** Freely available for Premium and Ultimate for a limited time<br>**Offering:** GitLab.com, Self-managed, GitLab Dedicated |
| Helps you write code more efficiently by showing code suggestions as you type.<br><br><i class="fa fa-youtube-play youtube" aria-hidden="true"></i> [Watch overview](https://www.youtube.com/watch?v=hCAyCTacdAQ) | [Code Suggestions](project/repository/code_suggestions/index.md) | **Tier:** Premium and Ultimate with [GitLab Duo Pro](../subscriptions/subscription-add-ons.md)<br>**Offering:** GitLab.com, Self-managed, GitLab Dedicated <br>**Status:** Generally Available |
| Processes and generates text and code in a conversational manner. Helps you quickly identify useful information in large volumes of text in issues, epics, code, and GitLab documentation. | [Chat](gitlab_duo_chat.md) | **Tier:** Freely available for Premium and Ultimate for a limited time<br>**Offering:** GitLab.com, Self-managed, GitLab Dedicated <br>**Status:** Generally Available |
| Helps you discover or recall Git commands when and where you need them. | [Git suggestions](../editor_extensions/gitlab_cli/index.md#gitlab-duo-commands) | **Tier:** Freely available for Ultimate for a limited time<br>In the future, will require Ultimate with [GitLab Duo Enterprise](../subscriptions/subscription-add-ons.md)<br>**Offering:** GitLab.com<br>**Status:** Experiment |
| Assists with quickly getting everyone up to speed on lengthy conversations to help ensure you are all on the same page. <br><br><i class="fa fa-youtube-play youtube" aria-hidden="true"></i> [Watch overview](https://www.youtube.com/watch?v=IcdxLfTIUgc) | [Discussion summary](#summarize-issue-discussions-with-discussion-summary) | **Tier:** Freely available for Ultimate for a limited time<br>In the future, will require [GitLab Duo Enterprise](../subscriptions/subscription-add-ons.md)<br>**Offering:** GitLab.com <br>**Status:** Experiment |
| Generates issue descriptions. | [Issue description generation](#summarize-an-issue-with-issue-description-generation) | **Tier:** Freely available for Ultimate for a limited time<br>In the future, will require Ultimate with [GitLab Duo Enterprise](../subscriptions/subscription-add-ons.md)<br>**Offering:** GitLab.com <br>**Status:** Experiment |
| Automates repetitive tasks and helps catch bugs early. <br><br><i class="fa fa-youtube-play youtube" aria-hidden="true"></i> [Watch overview](https://www.youtube.com/watch?v=g6MS1JsRWgs) | [Test generation](gitlab_duo_chat.md#write-tests-in-the-ide) | **Tier:** Freely available for Premium and Ultimate for a limited time<br>In the future, will require Premium or Ultimate with [GitLab Duo Pro](../subscriptions/subscription-add-ons.md)<br>**Offering:** GitLab.com, Self-managed, GitLab Dedicated <br>**Status:** Beta |
| Generates a description for the merge request based on the contents of the template. | [Merge request template population](project/merge_requests/ai_in_merge_requests.md#fill-in-merge-request-templates) | **Tier:** Freely available for Ultimate for a limited time<br>In the future, will require Ultimate with [GitLab Duo Enterprise](../subscriptions/subscription-add-ons.md)<br>**Offering:** GitLab.com<br>**Status:** Experiment |
| Assists in creating faster and higher-quality reviews by automatically suggesting reviewers for your merge request. <br><br><i class="fa fa-youtube-play youtube" aria-hidden="true"></i> [Watch overview](https://www.youtube.com/watch?v=ivwZQgh4Rxw) | [Suggested Reviewers](project/merge_requests/reviews/index.md#gitlab-duo-suggested-reviewers) | **Tier:** Ultimate <br>**Offering:** GitLab.com<br>**Status:** Generally Available |
| Assists in creating faster and higher-quality reviews by automatically suggesting reviewers for your merge request. <br><br><i class="fa fa-youtube-play youtube" aria-hidden="true"></i> [Watch overview](https://www.youtube.com/watch?v=ivwZQgh4Rxw) | [Suggested Reviewers](project/merge_requests/reviews/index.md#gitlab-duo-suggested-reviewers) | **Tier:** Ultimate <br>**Offering:** GitLab.com<br>**Status:** Generally Available |
| Efficiently communicates the impact of your merge request changes. | [Merge request summary](project/merge_requests/ai_in_merge_requests.md#summarize-merge-request-changes) | **Tier:** Freely available for Ultimate for a limited time<br>In the future, will require Ultimate with [GitLab Duo Enterprise](../subscriptions/subscription-add-ons.md)<br>**Offering:** GitLab.com <br>**Status:** Beta |
| Helps ease merge request handoff between authors and reviewers and help reviewers efficiently understand suggestions. | [Code review summary](project/merge_requests/ai_in_merge_requests.md#summarize-my-merge-request-review) | **Tier:** Freely available for Ultimate for a limited time<br>In the future, will require Ultimate with [GitLab Duo Enterprise](../subscriptions/subscription-add-ons.md)<br>**Offering:** GitLab.com <br>**Status:** Experiment |
| Helps you remediate vulnerabilities more efficiently, boost your skills, and write more secure code. <br><br><i class="fa fa-youtube-play youtube" aria-hidden="true"></i> [Watch overview](https://www.youtube.com/watch?v=6sDf73QOav8) | [Vulnerability explanation](application_security/vulnerabilities/index.md#explaining-a-vulnerability) | **Tier:** Freely available for Ultimate for a limited time<br>In the future, will require Ultimate with [GitLab Duo Enterprise](../subscriptions/subscription-add-ons.md) <br>**Offering:** GitLab.com <br>**Status:** Beta |
@ -35,123 +35,14 @@ GitLab is [transparent](https://handbook.gitlab.com/handbook/values/#transparenc
| Assists you with predicting productivity metrics and identifying anomalies across your software development lifecycle. | [Value stream forecasting](#forecast-deployment-frequency-with-value-stream-forecasting) | **Tier:** Freely available for Ultimate for a limited time<br>In the future, will require Ultimate with [GitLab Duo Enterprise](../subscriptions/subscription-add-ons.md) <br>**Offering:** GitLab.com, Self-managed, GitLab Dedicated <br>**Status:** Experiment |
| Processes and responds to your questions about your application's usage data. | [Product Analytics](analytics/analytics_dashboards.md#generate-a-custom-visualization-with-gitlab-duo) | **Tier:** Freely available for Ultimate for a limited time<br>In the future, will require Ultimate with [GitLab Duo Enterprise](../subscriptions/subscription-add-ons.md) <br>**Offering:** GitLab.com <br>**Status:** Experiment |
## Controlling GitLab Duo features
## Disable GitLab Duo features for specific groups or projects or an entire instance
There are two different levels at which GitLab Duo features can be controlled. The user level and the content level.
GitLab Duo features that are generally available are always enabled for all users that have access to these features. Whether they have access depends on the tier or the add-on as stated in the previous table. [Experimental](../policy/experiment-beta-support.md#experiment) and [Beta](../policy/experiment-beta-support.md#beta) GitLab Duo features need to be enabled as follows.
Owners of projects and groups as well as administrators of self-managed instances can control if GitLab Duo features can be used with their content such as code files.
### Giving access to users
If a feature is dependent on an add-on seat such as [Code Suggestions](project/repository/code_suggestions/index.md), access to the feature can be controlled through [GitLab Duo seat assignment](../subscriptions/subscription-add-ons.md#assign-gitlab-duo-pro-seats).
### Enabling Beta and Experimental AI-powered features
Features listed as Experiment and Beta are disabled by default. These features are subject to the [Testing Agreement](https://handbook.gitlab.com/handbook/legal/testing-agreement/).
#### GitLab.com
Prerequisites
- You must have the Owner role in the top-level group.
To enable Beta and Experimental AI-powered features, use the [Experiment and Beta features checkbox](group/manage.md#enable-experiment-and-beta-features).
#### GitLab self-managed
To enable Beta and Experimental AI-powered features for GitLab versions where GitLab Duo Chat is not yet generally available, see the [GitLab Duo Chat documentation](gitlab_duo_chat.md#for-self-managed).
### Network Requirements to enable GitLab Duo features for self-managed GitLab
#### Enable outbound connections from GitLab instances
- Your firewalls and HTTP/S proxy servers must allow outbound connections
to `cloud.gitlab.com` and `customers.gitlab.com` on port `443` both with `https://`.
- To use an HTTP/S proxy, both `gitLab_workhorse` and `gitLab_rails` must have the necessary
[web proxy environment variables](https://docs.gitlab.com/omnibus/settings/environment-variables.html) set.
#### Enable inbound connections from Clients to GitLab instances
- GitLab instances must allow inbound connections from Duo clients (IDEs, Code Editors, and GitLab Web Frontend)
on port 443 with `https://` and `wss://`.
- Both `HTTP2` and the `'upgrade'` header must be allowed, because GitLab Duo
uses both REST and WebSockets.
- Check for restrictions on WebSocket (`wss://`) traffic to `wss://gitlab.example.com/-/cable` and other `.com` domains.
Network policy restrictions on `wss://` traffic can cause issues with some GitLab Duo Chat
services. Consider policy updates to allow these services.
### Disable GitLab Duo features for specific groups or projects or an entire instance
DETAILS:
**Tier:** Premium, Ultimate
**Offering:** GitLab.com, Self-managed, GitLab Dedicated
> - [Settings to disable AI features introduced](https://gitlab.com/groups/gitlab-org/-/epics/12404) in GitLab 16.10.
> - [Settings to disable AI features added to the UI](https://gitlab.com/gitlab-org/gitlab/-/issues/441489) in GitLab 16.11.
You can disable GitLab Duo AI features for a group, project, or instance.
When it's disabled, any attempt to use GitLab Duo features on the group, project, or instance is blocked and an error is displayed.
GitLab Duo features are also blocked for resources in the group or project, like epics,
issues, and vulnerabilities.
#### For the group or project
Prerequisites:
- You must have the Owner role for the group or project.
- You must have a Premium or Ultimate subscription.
To disable GitLab Duo for a group:
<!-- vale gitlab.Substitutions = NO -->
1. On the left sidebar, select **Search or go to** and find your group.
1. Select **Settings > General**.
1. Expand **Permissions and group features**.
1. Clear the **Use Duo features** checkbox.
1. Optional. Select the **Enforce for all subgroups** checkbox to cascade the setting to
all subgroups.
![Cascading setting](img/disable_duo_features_v17_0.png)
<!-- vale gitlab.Substitutions = YES -->
To disable GitLab Duo for a project:
1. Use the [GitLab GraphQL API](../api/graphql/getting_started.md)
`projectSettingsUpdate` mutation.
1. Disable GitLab Duo for the project by setting the `duo_features_enabled` setting to `false`.
(The default is `true`.)
#### For an instance
Prerequisites:
- You must be an administrator.
To disable GitLab Duo for an instance:
<!-- vale gitlab.Substitutions = NO -->
1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > General**
1. Expand **AI-powered features**.
1. Clear the **Use Duo features** checkbox.
1. Optional. Select the **Enforce for all subgroups** checkbox to cascade
the setting to all groups in the instance.
<!-- vale gitlab.Substitutions = YES -->
#### Future plans
- An [issue exists](https://gitlab.com/gitlab-org/gitlab/-/issues/448709) for making the setting
cascade to all groups and projects. Right now the projects and groups do not
display the setting of the top-level group. To ensure the setting cascades,
ensure `lock_duo_features_enabled` is set to `true`.
- An [issue exists](https://gitlab.com/gitlab-org/gitlab/-/issues/441532) to allow administrators
to override the setting for specific groups or projects.
Disable GitLab Duo features by [following these instructions](ai_features_enable.md).
## Experimental AI features and how to use them
The following subsections describe the experimental AI features in more detail.
The following subsections describe GitLab Duo features that are in the
Experiment phase.
### Explain code in the Web UI with Code explanation

View File

@ -0,0 +1,140 @@
---
stage: AI-powered
group: AI Model Validation
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://handbook.gitlab.com/handbook/product/ux/technical-writing/#assignments
---
# Enable and disable GitLab Duo features
DETAILS:
**Tier:** Premium, Ultimate
**Offering:** GitLab.com, Self-managed, GitLab Dedicated
> - [Settings to disable AI features introduced](https://gitlab.com/groups/gitlab-org/-/epics/12404) in GitLab 16.10.
> - [Settings to disable AI features added to the UI](https://gitlab.com/gitlab-org/gitlab/-/issues/441489) in GitLab 16.11.
GitLab Duo features that are Generally Available are automatically enabled for all users that have access.
In addition:
- If you have self-managed GitLab, you must
[enable connectivity](#enable-gitlab-duo-on-self-managed-instances).
- For some Generally Available features, like [Code Suggestions](project/repository/code_suggestions/index.md),
[you must assign seats](../subscriptions/subscription-add-ons.md#assign-gitlab-duo-pro-seats)
to the users you want to have access.
GitLab Duo features that are Experiment or Beta are disabled by default
and [must be enabled](#enable-beta-and-experimental-features).
## Enable GitLab Duo on self-managed instances
To enable GitLab Duo, you must ensure connectivity exists.
### Enable outbound connections from GitLab instances
- Your firewalls and HTTP/S proxy servers must allow outbound connections
to `cloud.gitlab.com` and `customers.gitlab.com` on port `443` both with `https://`.
- To use an HTTP/S proxy, both `gitLab_workhorse` and `gitLab_rails` must have the necessary
[web proxy environment variables](https://docs.gitlab.com/omnibus/settings/environment-variables.html) set.
### Enable inbound connections from clients to GitLab instances
- GitLab instances must allow inbound connections from Duo clients (IDEs, Code Editors, and GitLab Web Frontend)
on port 443 with `https://` and `wss://`.
- Both `HTTP2` and the `'upgrade'` header must be allowed, because GitLab Duo
uses both REST and WebSockets.
- Check for restrictions on WebSocket (`wss://`) traffic to `wss://gitlab.example.com/-/cable` and other `.com` domains.
Network policy restrictions on `wss://` traffic can cause issues with some GitLab Duo Chat
services. Consider policy updates to allow these services.
## Disable GitLab Duo features
You can disable GitLab Duo AI features for a group, project, or instance.
When GitLab Duo is disabled, any attempt to use GitLab Duo features on the group,
project, or instance is blocked and an error is displayed.
GitLab Duo features are also blocked for resources in the group or project, like epics,
issues, and vulnerabilities.
### Disable for a group
You can disable GitLab Duo for a group.
Prerequisites:
- You must have the Owner role for the group or project.
To disable GitLab Duo for a group:
<!-- vale gitlab.Substitutions = NO -->
1. On the left sidebar, select **Search or go to** and find your group.
1. Select **Settings > General**.
1. Expand **Permissions and group features**.
1. Clear the **Use Duo features** checkbox.
1. Optional. Select the **Enforce for all subgroups** checkbox to cascade the setting to
all subgroups.
![Cascading setting](img/disable_duo_features_v17_0.png)
<!-- vale gitlab.Substitutions = YES -->
NOTE:
An [issue exists](https://gitlab.com/gitlab-org/gitlab/-/issues/448709) for making the group-level
setting cascade to all groups and projects. Right now the lower-level projects and groups do not
display the setting of the top-level group.
### Disable for a project
You can disable GitLab Duo for a project.
Prerequisites:
- You must have the Owner role for the project.
To disable GitLab Duo for a project:
1. Use the [GitLab GraphQL API](../api/graphql/getting_started.md)
`projectSettingsUpdate` mutation.
1. Disable GitLab Duo for the project by setting the `duo_features_enabled` setting to `false`.
(The default is `true`.)
### Disable for an instance
**Offering:** Self-managed
You can disable GitLab Duo for the instance.
Prerequisites:
- You must be an administrator.
To disable GitLab Duo for an instance:
<!-- vale gitlab.Substitutions = NO -->
1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > General**
1. Expand **AI-powered features**.
1. Clear the **Use Duo features** checkbox.
1. Optional. Select the **Enforce for all subgroups** checkbox to cascade
the setting to all groups in the instance.
<!-- vale gitlab.Substitutions = YES -->
NOTE:
An [issue exists](https://gitlab.com/gitlab-org/gitlab/-/issues/441532) to allow administrators
to override the setting for specific groups or projects.
## Enable Beta and Experimental features
Features listed as Experiment and Beta are disabled by default.
These features are subject to the [Testing Agreement](https://handbook.gitlab.com/handbook/legal/testing-agreement/).
### Enable on GitLab.com
You can enable Experiment and Beta features for your group on GitLab.com.
Prerequisites:
- You must have the Owner role in the top-level group.
To enable Beta and Experimental GitLab Duo features, use the [Experiment and Beta features checkbox](group/manage.md#enable-experiment-and-beta-features).
### Enable on self-managed
To enable Beta and Experimental GitLab Duo features for GitLab versions where GitLab Duo Chat is not yet generally available, see the [GitLab Duo Chat documentation](gitlab_duo_chat.md#for-self-managed).

View File

@ -55,7 +55,7 @@ Prerequisites:
- You must be a member of the project.
- The vulnerability must be a SAST finding.
Learn more about [how to enable all GitLab Duo features](../../ai_features.md#enabling-beta-and-experimental-ai-powered-features).
Learn more about [how to enable all GitLab Duo features](../../ai_features_enable.md).
To explain the vulnerability:
@ -110,7 +110,7 @@ Prerequisites:
- You must be a member of the project.
- The vulnerability must be a SAST finding.
Learn more about [how to enable all GitLab Duo features](../../ai_features.md#enabling-beta-and-experimental-ai-powered-features).
Learn more about [how to enable all GitLab Duo features](../../ai_features_enable.md).
To resolve the vulnerability:

View File

@ -318,7 +318,7 @@ In GitLab 16.8, 16.9, and 16.10, on GitLab Dedicated, GitLab Duo Chat is availab
## Disable GitLab Duo Chat
To disable GitLab Duo Chat, follow the instructions for
[disabling GitLab Duo features](ai_features.md#disable-gitlab-duo-features-for-specific-groups-or-projects-or-an-entire-instance).
[disabling GitLab Duo features](ai_features_enable.md).
When you disable GitLab Duo features, GitLab Duo Chat no longer uses your organization's
data when responding to questions. For example, you can no longer ask about your issues or epics.
@ -460,7 +460,7 @@ ensure GitLab Duo Chat [is enabled](#enable-gitlab-duo-chat).
The **GitLab Duo Chat** button is not displayed on personal projects,
as well as
[groups and projects with GitLab Duo features disabled](ai_features.md#disable-gitlab-duo-features-for-specific-groups-or-projects-or-an-entire-instance).
[groups and projects with GitLab Duo features disabled](ai_features_enable.md).
After you enable GitLab Duo Chat, it might take a few minutes for the
button to appear.
@ -468,7 +468,7 @@ button to appear.
### `This feature is only allowed in groups or projects that enable this feature`
This error occurs when you ask about resources that do have
GitLab Duo [disabled](ai_features.md#disable-gitlab-duo-features-for-specific-groups-or-projects-or-an-entire-instance).
GitLab Duo [disabled](ai_features_enable.md).
If any of the settings are not enabled, information about resources
(like issues, epics, and merge requests) in the group or project

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

After

Width:  |  Height:  |  Size: 34 KiB

View File

@ -72,6 +72,21 @@ module Backup
logger.info "Restore task is done."
end
# Verify whether a backup is compatible with current GitLab's version
def verify!
run_unpack(options.backup_id)
read_backup_information
preconditions = Backup::Restore::Preconditions.new(
backup_information: backup_information,
logger: logger
)
preconditions.validate_backup_version!
ensure
cleanup
end
# @param [Gitlab::Backup::Tasks::Task] task
def run_restore_task(task)
read_backup_information

View File

@ -22,6 +22,13 @@ module Tasks
end
end
# Verify backup file to ensure it is compatible with current GitLab's version
def self.verify_backup
lock_backup do
::Backup::Manager.new(backup_progress).verify!
end
end
def self.create_task(task_id)
lock_backup do
backup_manager = ::Backup::Manager.new(backup_progress)
@ -113,6 +120,11 @@ namespace :gitlab do
Tasks::Gitlab::Backup.restore_backup
end
desc 'GitLab | Backup | Verify a previously created backup'
task verify: :gitlab_environment do
Tasks::Gitlab::Backup.verify_backup
end
namespace :repo do
task create: :gitlab_environment do
Tasks::Gitlab::Backup.create_task('repositories')

View File

@ -1,255 +1,259 @@
{
"qa/specs/features/api/10_govern/group_access_token_spec.rb": 11.845777704000056,
"qa/specs/features/api/10_govern/project_access_token_spec.rb": 29.629922259000068,
"qa/specs/features/api/1_manage/migration/gitlab_migration_project_spec.rb": 84.67422305700029,
"qa/specs/features/api/1_manage/rate_limits_spec.rb": 3.8311902240002382,
"qa/specs/features/api/2_plan/closes_issue_via_pushing_a_commit_spec.rb": 6.664336899000091,
"qa/specs/features/api/3_create/merge_request/push_options_labels_spec.rb": 8.62386656700005,
"qa/specs/features/api/3_create/merge_request/push_options_mwps_spec.rb": 8.868887074000213,
"qa/specs/features/api/3_create/merge_request/push_options_remove_source_branch_spec.rb": 26.45064335899997,
"qa/specs/features/api/3_create/merge_request/push_options_target_branch_spec.rb": 9.136903288999747,
"qa/specs/features/api/3_create/merge_request/push_options_title_description_spec.rb": 24.086982043000035,
"qa/specs/features/api/3_create/repository/add_list_delete_branches_spec.rb": 4.5564385309999125,
"qa/specs/features/api/3_create/repository/commit_to_templated_project_spec.rb": 5.8345988979999674,
"qa/specs/features/api/3_create/repository/default_branch_name_setting_spec.rb": 5.846761321000031,
"qa/specs/features/api/3_create/repository/files_spec.rb": 2.92535676600005,
"qa/specs/features/api/3_create/repository/project_archive_compare_spec.rb": 4.926709618999666,
"qa/specs/features/api/3_create/repository/push_postreceive_idempotent_spec.rb": 7.110461888000145,
"qa/specs/features/api/3_create/repository/storage_size_spec.rb": 13.778573539000035,
"qa/specs/features/api/3_create/repository/tag_revision_trigger_prereceive_hook_spec.rb": 2.958812011999953,
"qa/specs/features/api/4_verify/api_variable_inheritance_with_forward_pipeline_variables_spec.rb": 29.995264238000004,
"qa/specs/features/api/4_verify/cancel_pipeline_when_block_user_spec.rb": 5.013859355000022,
"qa/specs/features/api/4_verify/file_variable_spec.rb": 30.408016119999957,
"qa/specs/features/api/4_verify/job_downloads_artifacts_spec.rb": 18.649016830999926,
"qa/specs/features/api/9_data_stores/user_inherited_access_spec.rb": 66.33117685499974,
"qa/specs/features/api/9_data_stores/users_spec.rb": 0.30634448900002553,
"qa/specs/features/browser_ui/10_govern/group/group_access_token_spec.rb": 12.205313717000081,
"qa/specs/features/browser_ui/10_govern/login/2fa_recovery_spec.rb": 49.970939771000076,
"qa/specs/features/browser_ui/10_govern/login/2fa_ssh_recovery_spec.rb": 34.68408991000001,
"qa/specs/features/browser_ui/10_govern/login/log_in_spec.rb": 8.355788669000049,
"qa/specs/features/browser_ui/10_govern/login/log_in_with_2fa_spec.rb": 66.90763515599997,
"qa/specs/features/browser_ui/10_govern/login/register_spec.rb": 151.59240958100008,
"qa/specs/features/browser_ui/10_govern/project/project_access_token_spec.rb": 11.594508110999982,
"qa/specs/features/browser_ui/10_govern/user/impersonation_token_spec.rb": 32.725683907000075,
"qa/specs/features/browser_ui/10_govern/user/user_access_termination_spec.rb": 40.70794070900001,
"qa/specs/features/browser_ui/14_analytics/performance_bar_spec.rb": 21.563634815999876,
"qa/specs/features/browser_ui/14_analytics/service_ping_default_enabled_spec.rb": 9.944515410999884,
"qa/specs/features/browser_ui/1_manage/integrations/jenkins/jenkins_build_status_spec.rb": 69.29509704500015,
"qa/specs/features/browser_ui/2_plan/design_management/add_design_content_spec.rb": 14.75816440099993,
"qa/specs/features/browser_ui/2_plan/design_management/archive_design_content_spec.rb": 17.468071995000173,
"qa/specs/features/browser_ui/2_plan/design_management/modify_design_content_spec.rb": 14.105749208000134,
"qa/specs/features/browser_ui/2_plan/issue/check_mentions_for_xss_spec.rb": 18.253972190000013,
"qa/specs/features/browser_ui/2_plan/issue/collapse_comments_in_discussions_spec.rb": 14.296773110000231,
"qa/specs/features/browser_ui/2_plan/issue/comment_issue_spec.rb": 15.935146630999952,
"qa/specs/features/browser_ui/2_plan/issue/create_issue_spec.rb": 36.08522541499997,
"qa/specs/features/browser_ui/2_plan/issue/custom_issue_template_spec.rb": 15.522646690999863,
"qa/specs/features/browser_ui/2_plan/issue/export_as_csv_spec.rb": 12.40786507499979,
"qa/specs/features/browser_ui/2_plan/issue/filter_issue_comments_spec.rb": 15.412982451000062,
"qa/specs/features/browser_ui/2_plan/issue/issue_suggestions_spec.rb": 13.714815569000166,
"qa/specs/features/browser_ui/2_plan/issue/mentions_spec.rb": 20.601819114000023,
"qa/specs/features/browser_ui/2_plan/issue/real_time_assignee_spec.rb": 12.992636061999974,
"qa/specs/features/browser_ui/2_plan/issue_boards/focus_mode_spec.rb": 10.45502237400001,
"qa/specs/features/browser_ui/2_plan/milestone/assign_milestone_spec.rb": 69.418488368,
"qa/specs/features/browser_ui/2_plan/milestone/create_group_milestone_spec.rb": 13.338590401999909,
"qa/specs/features/browser_ui/2_plan/milestone/create_project_milestone_spec.rb": 15.05454333900002,
"qa/specs/features/browser_ui/2_plan/project_wiki/project_based_content_creation_spec.rb": 52.34441212799993,
"qa/specs/features/browser_ui/2_plan/project_wiki/project_based_content_manipulation_spec.rb": 43.6322823229998,
"qa/specs/features/browser_ui/2_plan/project_wiki/project_based_directory_management_spec.rb": 15.350823594000076,
"qa/specs/features/browser_ui/2_plan/project_wiki/project_based_file_upload_spec.rb": 25.917155661999914,
"qa/specs/features/browser_ui/2_plan/project_wiki/project_based_list_spec.rb": 36.692525639999985,
"qa/specs/features/browser_ui/2_plan/project_wiki/project_based_page_deletion_spec.rb": 35.09584772900007,
"qa/specs/features/browser_ui/2_plan/related_issues/related_issues_spec.rb": 12.996783154000013,
"qa/specs/features/browser_ui/2_plan/transient/comment_on_discussion_spec.rb": 131.5388501890002,
"qa/specs/features/browser_ui/3_create/merge_request/cherry_pick/cherry_pick_a_merge_spec.rb": 22.721437783000056,
"qa/specs/features/browser_ui/3_create/merge_request/cherry_pick/cherry_pick_commit_spec.rb": 16.35690797899997,
"qa/specs/features/browser_ui/3_create/merge_request/create_merge_request_from_push_notification_spec.rb": 16.71413974999996,
"qa/specs/features/browser_ui/3_create/merge_request/create_merge_request_spec.rb": 63.424813905000065,
"qa/specs/features/browser_ui/3_create/merge_request/create_merge_request_via_template_spec.rb": 17.870231946000104,
"qa/specs/features/browser_ui/3_create/merge_request/merge_merge_request_from_fork_spec.rb": 68.90676294600007,
"qa/specs/features/browser_ui/3_create/merge_request/rebase_merge_request_spec.rb": 49.62434159600002,
"qa/specs/features/browser_ui/3_create/merge_request/revert/revert_commit_spec.rb": 14.912561573999938,
"qa/specs/features/browser_ui/3_create/merge_request/revert/reverting_merge_request_spec.rb": 25.74091061900026,
"qa/specs/features/browser_ui/3_create/merge_request/squash_merge_request_spec.rb": 23.23725501099989,
"qa/specs/features/browser_ui/3_create/merge_request/suggestions/batch_suggestion_spec.rb": 43.48656005800012,
"qa/specs/features/browser_ui/3_create/merge_request/suggestions/custom_commit_suggestion_spec.rb": 30.799825790999876,
"qa/specs/features/browser_ui/3_create/merge_request/view_merge_request_diff_patch_spec.rb": 33.021989203999965,
"qa/specs/features/browser_ui/3_create/repository/add_file_template_spec.rb": 59.955740097000216,
"qa/specs/features/browser_ui/3_create/repository/add_new_branch_rule_spec.rb": 19.18438588500021,
"qa/specs/features/browser_ui/3_create/repository/branch_with_unusual_name_spec.rb": 14.749933145999876,
"qa/specs/features/browser_ui/3_create/repository/clone_spec.rb": 8.990506374999995,
"qa/specs/features/browser_ui/3_create/repository/file/create_file_via_web_spec.rb": 13.799991460000001,
"qa/specs/features/browser_ui/3_create/repository/file/delete_file_via_web_spec.rb": 14.176943869000297,
"qa/specs/features/browser_ui/3_create/repository/file/edit_file_via_web_spec.rb": 11.952637573000061,
"qa/specs/features/browser_ui/3_create/repository/file/file_with_unusual_name_spec.rb": 13.365593128,
"qa/specs/features/browser_ui/3_create/repository/license_detection_spec.rb": 9.630716698000015,
"qa/specs/features/browser_ui/3_create/repository/protected_tags_spec.rb": 80.44472801400002,
"qa/specs/features/browser_ui/3_create/repository/protocol_v2_push_http_spec.rb": 8.70916294999995,
"qa/specs/features/browser_ui/3_create/repository/protocol_v2_push_ssh_spec.rb": 14.474604777999957,
"qa/specs/features/browser_ui/3_create/repository/push_http_private_token_spec.rb": 13.111722950000058,
"qa/specs/features/browser_ui/3_create/repository/push_mirroring_lfs_over_http_spec.rb": 33.69980096300014,
"qa/specs/features/browser_ui/3_create/repository/push_mirroring_over_http_spec.rb": 24.26863342699994,
"qa/specs/features/browser_ui/3_create/repository/push_over_http_file_size_spec.rb": 39.58508278499994,
"qa/specs/features/browser_ui/3_create/repository/push_over_http_spec.rb": 9.91927716300006,
"qa/specs/features/browser_ui/3_create/repository/push_over_ssh_spec.rb": 24.43928877899998,
"qa/specs/features/browser_ui/3_create/repository/push_protected_branch_spec.rb": 7.860695164000049,
"qa/specs/features/browser_ui/3_create/repository/ssh_key_support_spec.rb": 19.788871443999938,
"qa/specs/features/browser_ui/3_create/repository/user_views_commit_diff_patch_spec.rb": 23.88218462399982,
"qa/specs/features/browser_ui/3_create/snippet/add_comment_to_snippet_spec.rb": 32.820279889000176,
"qa/specs/features/browser_ui/3_create/snippet/add_file_to_snippet_spec.rb": 20.28756042300006,
"qa/specs/features/browser_ui/3_create/snippet/clone_push_pull_personal_snippet_spec.rb": 31.44076923900002,
"qa/specs/features/browser_ui/3_create/snippet/clone_push_pull_project_snippet_spec.rb": 39.827039038000066,
"qa/specs/features/browser_ui/3_create/snippet/copy_snippet_file_contents_spec.rb": 26.848457810000127,
"qa/specs/features/browser_ui/3_create/snippet/create_personal_snippet_spec.rb": 10.463153462000037,
"qa/specs/features/browser_ui/3_create/snippet/create_personal_snippet_with_multiple_files_spec.rb": 12.216321762000007,
"qa/specs/features/browser_ui/3_create/snippet/create_project_snippet_spec.rb": 14.736661095000272,
"qa/specs/features/browser_ui/3_create/snippet/create_project_snippet_with_multiple_files_spec.rb": 21.625114675000077,
"qa/specs/features/browser_ui/3_create/snippet/delete_file_from_snippet_spec.rb": 20.82063489999996,
"qa/specs/features/browser_ui/3_create/snippet/share_snippet_spec.rb": 21.19950602300014,
"qa/specs/features/browser_ui/3_create/snippet/snippet_index_page_spec.rb": 57.81089682300012,
"qa/specs/features/browser_ui/3_create/source_editor/source_editor_toolbar_spec.rb": 13.47030033100009,
"qa/specs/features/browser_ui/3_create/web_ide/add_first_file_in_web_ide_spec.rb": 58.027781685000264,
"qa/specs/features/browser_ui/3_create/web_ide/add_new_directory_in_web_ide_spec.rb": 67.75925020699992,
"qa/specs/features/browser_ui/3_create/web_ide/closing_web_ide_with_unsaved_changes_spec.rb": 27.369910391999838,
"qa/specs/features/browser_ui/3_create/web_ide/upload_new_file_in_web_ide_spec.rb": 165.67104204499992,
"qa/specs/features/browser_ui/4_verify/ci_components_catalog/ci_catalog_sorting_spec.rb": 140.059591404,
"qa/specs/features/browser_ui/4_verify/ci_components_catalog/run_component_in_project_pipeline_spec.rb": 179.63176347600006,
"qa/specs/features/browser_ui/4_verify/ci_job_artifacts/expose_job_artifacts_in_mr_spec.rb": 23.454378623999673,
"qa/specs/features/browser_ui/4_verify/ci_job_artifacts/unlocking_job_artifacts_across_pipelines_spec.rb": 208.71474419600008,
"qa/specs/features/browser_ui/4_verify/ci_project_artifacts/user_can_bulk_delete_artifacts_spec.rb": 30.86601010100003,
"qa/specs/features/browser_ui/4_verify/ci_variable/custom_variable_spec.rb": 33.75124175300016,
"qa/specs/features/browser_ui/4_verify/ci_variable/pipeline_with_protected_variable_spec.rb": 56.11306553500003,
"qa/specs/features/browser_ui/4_verify/ci_variable/prefill_variables_spec.rb": 28.525732568000194,
"qa/specs/features/browser_ui/4_verify/ci_variable/raw_variables_defined_in_yaml_spec.rb": 14.967610347000004,
"qa/specs/features/browser_ui/4_verify/ci_variable/ui_variable_inheritable_when_forward_pipeline_variables_true_spec.rb": 60.117336716999944,
"qa/specs/features/browser_ui/4_verify/ci_variable/ui_variable_non_inheritable_when_forward_pipeline_variables_false_spec.rb": 105.80015275599999,
"qa/specs/features/browser_ui/4_verify/pipeline/include_local_config_file_paths_with_wildcard_spec.rb": 13.17050760200027,
"qa/specs/features/browser_ui/4_verify/pipeline/include_multiple_files_from_a_project_spec.rb": 32.71075922299997,
"qa/specs/features/browser_ui/4_verify/pipeline/include_multiple_files_from_multiple_projects_spec.rb": 44.469214015000034,
"qa/specs/features/browser_ui/4_verify/pipeline/parent_child_pipelines_independent_relationship_spec.rb": 49.48554839199994,
"qa/specs/features/browser_ui/4_verify/pipeline/pass_dotenv_variables_to_downstream_via_bridge_spec.rb": 42.771347491999904,
"qa/specs/features/browser_ui/4_verify/pipeline/pipeline_with_image_pull_policy_spec.rb": 231.81616988799988,
"qa/specs/features/browser_ui/4_verify/pipeline/run_pipeline_via_web_only_spec.rb": 16.3156777410004,
"qa/specs/features/browser_ui/4_verify/pipeline/run_pipeline_with_manual_jobs_spec.rb": 54.04839180500005,
"qa/specs/features/browser_ui/4_verify/pipeline/trigger_child_pipeline_with_manual_spec.rb": 35.396570044999976,
"qa/specs/features/browser_ui/4_verify/pipeline/trigger_matrix_spec.rb": 32.334112172000005,
"qa/specs/features/browser_ui/4_verify/pipeline/update_ci_file_with_pipeline_editor_spec.rb": 18.4874334189999,
"qa/specs/features/browser_ui/4_verify/runner/fleet_management/group_runner_counts_spec.rb": 12.776371110000127,
"qa/specs/features/browser_ui/4_verify/runner/fleet_management/group_runner_status_counts_spec.rb": 11.705592156999955,
"qa/specs/features/browser_ui/4_verify/runner/register_group_runner_spec.rb": 9.930739620000054,
"qa/specs/features/browser_ui/4_verify/runner/register_runner_spec.rb": 17.19025577299999,
"qa/specs/features/browser_ui/4_verify/testing/endpoint_coverage_spec.rb": 23.964238816000034,
"qa/specs/features/browser_ui/5_package/package_registry/composer_registry_spec.rb": 32.489651503999994,
"qa/specs/features/browser_ui/5_package/package_registry/conan_repository_spec.rb": 67.56937160200005,
"qa/specs/features/browser_ui/5_package/package_registry/generic_repository_spec.rb": 36.735073006999755,
"qa/specs/features/browser_ui/5_package/package_registry/helm_registry_spec.rb": 179.19978582299973,
"qa/specs/features/browser_ui/5_package/package_registry/maven/maven_group_level_spec.rb": 379.5769147850001,
"qa/specs/features/browser_ui/5_package/package_registry/maven/maven_project_level_spec.rb": 142.0632524179996,
"qa/specs/features/browser_ui/5_package/package_registry/maven_gradle_repository_spec.rb": 188.41450816499992,
"qa/specs/features/browser_ui/5_package/package_registry/npm/npm_group_level_spec.rb": 212.0302533759998,
"qa/specs/features/browser_ui/5_package/package_registry/npm/npm_instance_level_spec.rb": 183.10994732199993,
"qa/specs/features/api/10_govern/group_access_token_spec.rb": 10.968351287000132,
"qa/specs/features/api/10_govern/project_access_token_spec.rb": 25.194142965000083,
"qa/specs/features/api/1_manage/migration/gitlab_migration_project_spec.rb": 91.28221015500003,
"qa/specs/features/api/1_manage/rate_limits_spec.rb": 2.647285179999926,
"qa/specs/features/api/2_plan/closes_issue_via_pushing_a_commit_spec.rb": 7.255896092000057,
"qa/specs/features/api/3_create/merge_request/push_options_labels_spec.rb": 14.72262365000006,
"qa/specs/features/api/3_create/merge_request/push_options_mwps_spec.rb": 7.134752326999887,
"qa/specs/features/api/3_create/merge_request/push_options_remove_source_branch_spec.rb": 13.370818921000136,
"qa/specs/features/api/3_create/merge_request/push_options_target_branch_spec.rb": 25.082678718999887,
"qa/specs/features/api/3_create/merge_request/push_options_title_description_spec.rb": 8.031234368000014,
"qa/specs/features/api/3_create/repository/add_list_delete_branches_spec.rb": 4.078820219000136,
"qa/specs/features/api/3_create/repository/commit_to_templated_project_spec.rb": 5.148622669999895,
"qa/specs/features/api/3_create/repository/default_branch_name_setting_spec.rb": 6.023092592000012,
"qa/specs/features/api/3_create/repository/files_spec.rb": 3.8689950170000884,
"qa/specs/features/api/3_create/repository/project_archive_compare_spec.rb": 7.00044340300019,
"qa/specs/features/api/3_create/repository/push_postreceive_idempotent_spec.rb": 8.44588318700005,
"qa/specs/features/api/3_create/repository/storage_size_spec.rb": 17.5777351669999,
"qa/specs/features/api/3_create/repository/tag_revision_trigger_prereceive_hook_spec.rb": 2.141486212000018,
"qa/specs/features/api/4_verify/api_variable_inheritance_with_forward_pipeline_variables_spec.rb": 30.646977040000024,
"qa/specs/features/api/4_verify/cancel_pipeline_when_block_user_spec.rb": 5.541147142,
"qa/specs/features/api/4_verify/file_variable_spec.rb": 27.79995711699985,
"qa/specs/features/api/4_verify/job_downloads_artifacts_spec.rb": 16.600584907999746,
"qa/specs/features/api/9_data_stores/user_inherited_access_spec.rb": 74.24420877199987,
"qa/specs/features/api/9_data_stores/users_spec.rb": 0.5809960829999454,
"qa/specs/features/browser_ui/10_govern/group/group_access_token_spec.rb": 12.595935416999964,
"qa/specs/features/browser_ui/10_govern/login/2fa_recovery_spec.rb": 45.98987996699998,
"qa/specs/features/browser_ui/10_govern/login/2fa_ssh_recovery_spec.rb": 41.68744044499999,
"qa/specs/features/browser_ui/10_govern/login/log_in_spec.rb": 10.157668312000169,
"qa/specs/features/browser_ui/10_govern/login/log_in_with_2fa_spec.rb": 113.55555127300022,
"qa/specs/features/browser_ui/10_govern/login/login_via_oauth_and_oidc_with_gitlab_as_idp_spec.rb": 556.9541879630001,
"qa/specs/features/browser_ui/10_govern/login/register_spec.rb": 243.62303945400004,
"qa/specs/features/browser_ui/10_govern/project/project_access_token_spec.rb": 15.36247344100002,
"qa/specs/features/browser_ui/10_govern/user/impersonation_token_spec.rb": 33.033242923000216,
"qa/specs/features/browser_ui/10_govern/user/user_access_termination_spec.rb": 41.00197317199991,
"qa/specs/features/browser_ui/14_analytics/performance_bar_spec.rb": 23.329971570999987,
"qa/specs/features/browser_ui/14_analytics/service_ping_default_enabled_spec.rb": 10.902267989999928,
"qa/specs/features/browser_ui/1_manage/integrations/jenkins/jenkins_build_status_spec.rb": 72.78792591299998,
"qa/specs/features/browser_ui/2_plan/design_management/add_design_content_spec.rb": 16.550656955999784,
"qa/specs/features/browser_ui/2_plan/design_management/archive_design_content_spec.rb": 17.80603514099994,
"qa/specs/features/browser_ui/2_plan/design_management/modify_design_content_spec.rb": 16.791742693999822,
"qa/specs/features/browser_ui/2_plan/issue/check_mentions_for_xss_spec.rb": 16.25230245900002,
"qa/specs/features/browser_ui/2_plan/issue/collapse_comments_in_discussions_spec.rb": 16.113660463000087,
"qa/specs/features/browser_ui/2_plan/issue/comment_issue_spec.rb": 14.298300076999794,
"qa/specs/features/browser_ui/2_plan/issue/create_issue_spec.rb": 41.34679757599997,
"qa/specs/features/browser_ui/2_plan/issue/custom_issue_template_spec.rb": 21.051594915999885,
"qa/specs/features/browser_ui/2_plan/issue/export_as_csv_spec.rb": 12.078684757000019,
"qa/specs/features/browser_ui/2_plan/issue/filter_issue_comments_spec.rb": 14.857158587000185,
"qa/specs/features/browser_ui/2_plan/issue/issue_suggestions_spec.rb": 14.253827850000107,
"qa/specs/features/browser_ui/2_plan/issue/mentions_spec.rb": 14.40080294300003,
"qa/specs/features/browser_ui/2_plan/issue/real_time_assignee_spec.rb": 15.189251631000047,
"qa/specs/features/browser_ui/2_plan/issue_boards/focus_mode_spec.rb": 10.311824632000025,
"qa/specs/features/browser_ui/2_plan/milestone/assign_milestone_spec.rb": 66.40452505100029,
"qa/specs/features/browser_ui/2_plan/milestone/create_group_milestone_spec.rb": 16.096540193000237,
"qa/specs/features/browser_ui/2_plan/milestone/create_project_milestone_spec.rb": 15.417163691000042,
"qa/specs/features/browser_ui/2_plan/project_wiki/project_based_content_creation_spec.rb": 54.59673353700009,
"qa/specs/features/browser_ui/2_plan/project_wiki/project_based_content_manipulation_spec.rb": 41.4645009310002,
"qa/specs/features/browser_ui/2_plan/project_wiki/project_based_directory_management_spec.rb": 13.732939894000083,
"qa/specs/features/browser_ui/2_plan/project_wiki/project_based_file_upload_spec.rb": 20.676640094000504,
"qa/specs/features/browser_ui/2_plan/project_wiki/project_based_list_spec.rb": 32.723146000999805,
"qa/specs/features/browser_ui/2_plan/project_wiki/project_based_page_deletion_spec.rb": 35.95009048100019,
"qa/specs/features/browser_ui/2_plan/related_issues/related_issues_spec.rb": 17.465335175000064,
"qa/specs/features/browser_ui/2_plan/transient/comment_on_discussion_spec.rb": 120.28714107199994,
"qa/specs/features/browser_ui/3_create/merge_request/cherry_pick/cherry_pick_a_merge_spec.rb": 31.37618407800005,
"qa/specs/features/browser_ui/3_create/merge_request/cherry_pick/cherry_pick_commit_spec.rb": 17.539273154000057,
"qa/specs/features/browser_ui/3_create/merge_request/create_merge_request_from_push_notification_spec.rb": 16.879146544999912,
"qa/specs/features/browser_ui/3_create/merge_request/create_merge_request_spec.rb": 55.72858070600023,
"qa/specs/features/browser_ui/3_create/merge_request/create_merge_request_via_template_spec.rb": 30.55156040399993,
"qa/specs/features/browser_ui/3_create/merge_request/merge_merge_request_from_fork_spec.rb": 77.83019566999974,
"qa/specs/features/browser_ui/3_create/merge_request/rebase_merge_request_spec.rb": 44.23937567899998,
"qa/specs/features/browser_ui/3_create/merge_request/revert/revert_commit_spec.rb": 18.132605181000145,
"qa/specs/features/browser_ui/3_create/merge_request/revert/reverting_merge_request_spec.rb": 27.364162638999915,
"qa/specs/features/browser_ui/3_create/merge_request/squash_merge_request_spec.rb": 21.24621209499992,
"qa/specs/features/browser_ui/3_create/merge_request/suggestions/batch_suggestion_spec.rb": 48.194628256000215,
"qa/specs/features/browser_ui/3_create/merge_request/suggestions/custom_commit_suggestion_spec.rb": 34.844345934999865,
"qa/specs/features/browser_ui/3_create/merge_request/view_merge_request_diff_patch_spec.rb": 30.23871791900001,
"qa/specs/features/browser_ui/3_create/repository/add_file_template_spec.rb": 69.35550866799986,
"qa/specs/features/browser_ui/3_create/repository/branch_with_unusual_name_spec.rb": 16.55052773999978,
"qa/specs/features/browser_ui/3_create/repository/clone_spec.rb": 9.670112328999949,
"qa/specs/features/browser_ui/3_create/repository/file/create_file_via_web_spec.rb": 14.86290596699996,
"qa/specs/features/browser_ui/3_create/repository/file/delete_file_via_web_spec.rb": 13.291532214000199,
"qa/specs/features/browser_ui/3_create/repository/file/edit_file_via_web_spec.rb": 18.88579231599988,
"qa/specs/features/browser_ui/3_create/repository/file/file_with_unusual_name_spec.rb": 14.769433001999914,
"qa/specs/features/browser_ui/3_create/repository/license_detection_spec.rb": 16.764011815999993,
"qa/specs/features/browser_ui/3_create/repository/protected_tags_spec.rb": 90.75023342999998,
"qa/specs/features/browser_ui/3_create/repository/protocol_v2_push_http_spec.rb": 11.191278599000043,
"qa/specs/features/browser_ui/3_create/repository/protocol_v2_push_ssh_spec.rb": 15.181141084000046,
"qa/specs/features/browser_ui/3_create/repository/push_http_private_token_spec.rb": 13.987146108999923,
"qa/specs/features/browser_ui/3_create/repository/push_mirroring_lfs_over_http_spec.rb": 53.57412987399994,
"qa/specs/features/browser_ui/3_create/repository/push_mirroring_over_http_spec.rb": 51.55664265500013,
"qa/specs/features/browser_ui/3_create/repository/push_over_http_file_size_spec.rb": 38.78119920100016,
"qa/specs/features/browser_ui/3_create/repository/push_over_http_spec.rb": 11.292900274999965,
"qa/specs/features/browser_ui/3_create/repository/push_over_ssh_spec.rb": 31.03089378200002,
"qa/specs/features/browser_ui/3_create/repository/push_protected_branch_spec.rb": 13.104500229999985,
"qa/specs/features/browser_ui/3_create/repository/push_to_canary_gitaly_spec.rb": 16.65781636199972,
"qa/specs/features/browser_ui/3_create/repository/ssh_key_support_spec.rb": 25.353047005999997,
"qa/specs/features/browser_ui/3_create/repository/user_views_commit_diff_patch_spec.rb": 27.614773731000014,
"qa/specs/features/browser_ui/3_create/snippet/add_comment_to_snippet_spec.rb": 41.38943869800005,
"qa/specs/features/browser_ui/3_create/snippet/add_file_to_snippet_spec.rb": 25.166958768000086,
"qa/specs/features/browser_ui/3_create/snippet/clone_push_pull_personal_snippet_spec.rb": 36.574503961000005,
"qa/specs/features/browser_ui/3_create/snippet/clone_push_pull_project_snippet_spec.rb": 43.79364813899997,
"qa/specs/features/browser_ui/3_create/snippet/copy_snippet_file_contents_spec.rb": 28.881859635000183,
"qa/specs/features/browser_ui/3_create/snippet/create_personal_snippet_spec.rb": 10.886490173000084,
"qa/specs/features/browser_ui/3_create/snippet/create_personal_snippet_with_multiple_files_spec.rb": 12.742766575000019,
"qa/specs/features/browser_ui/3_create/snippet/create_project_snippet_spec.rb": 14.479968525999993,
"qa/specs/features/browser_ui/3_create/snippet/create_project_snippet_with_multiple_files_spec.rb": 29.61754254599998,
"qa/specs/features/browser_ui/3_create/snippet/delete_file_from_snippet_spec.rb": 24.69855452799993,
"qa/specs/features/browser_ui/3_create/snippet/share_snippet_spec.rb": 23.975143239000317,
"qa/specs/features/browser_ui/3_create/snippet/snippet_index_page_spec.rb": 51.99392682400003,
"qa/specs/features/browser_ui/3_create/source_editor/source_editor_toolbar_spec.rb": 16.262496680999902,
"qa/specs/features/browser_ui/3_create/web_ide/add_first_file_in_web_ide_spec.rb": 57.85061509499997,
"qa/specs/features/browser_ui/3_create/web_ide/add_new_directory_in_web_ide_spec.rb": 72.43288307300008,
"qa/specs/features/browser_ui/3_create/web_ide/closing_web_ide_with_unsaved_changes_spec.rb": 28.75762391499984,
"qa/specs/features/browser_ui/3_create/web_ide/upload_new_file_in_web_ide_spec.rb": 168.52151369600006,
"qa/specs/features/browser_ui/4_verify/ci_components_catalog/ci_catalog_sorting_spec.rb": 145.73073239400003,
"qa/specs/features/browser_ui/4_verify/ci_components_catalog/run_component_in_project_pipeline_spec.rb": 41.23446954999963,
"qa/specs/features/browser_ui/4_verify/ci_job_artifacts/expose_job_artifacts_in_mr_spec.rb": 26.10383863600009,
"qa/specs/features/browser_ui/4_verify/ci_job_artifacts/unlocking_job_artifacts_across_pipelines_spec.rb": 246.9574709410001,
"qa/specs/features/browser_ui/4_verify/ci_project_artifacts/user_can_bulk_delete_artifacts_spec.rb": 48.40180811600021,
"qa/specs/features/browser_ui/4_verify/ci_variable/custom_variable_spec.rb": 37.90051801699997,
"qa/specs/features/browser_ui/4_verify/ci_variable/pipeline_with_protected_variable_spec.rb": 44.622913115000074,
"qa/specs/features/browser_ui/4_verify/ci_variable/prefill_variables_spec.rb": 29.541657872000087,
"qa/specs/features/browser_ui/4_verify/ci_variable/raw_variables_defined_in_yaml_spec.rb": 17.75402537700029,
"qa/specs/features/browser_ui/4_verify/ci_variable/ui_variable_inheritable_when_forward_pipeline_variables_true_spec.rb": 55.2614102010001,
"qa/specs/features/browser_ui/4_verify/ci_variable/ui_variable_non_inheritable_when_forward_pipeline_variables_false_spec.rb": 125.97877637099998,
"qa/specs/features/browser_ui/4_verify/pipeline/include_local_config_file_paths_with_wildcard_spec.rb": 14.278470316999574,
"qa/specs/features/browser_ui/4_verify/pipeline/include_multiple_files_from_a_project_spec.rb": 31.80548504499984,
"qa/specs/features/browser_ui/4_verify/pipeline/include_multiple_files_from_multiple_projects_spec.rb": 36.119716631999836,
"qa/specs/features/browser_ui/4_verify/pipeline/parent_child_pipelines_independent_relationship_spec.rb": 52.65643664799995,
"qa/specs/features/browser_ui/4_verify/pipeline/pass_dotenv_variables_to_downstream_via_bridge_spec.rb": 35.731067921999966,
"qa/specs/features/browser_ui/4_verify/pipeline/pipeline_with_image_pull_policy_spec.rb": 159.890177979,
"qa/specs/features/browser_ui/4_verify/pipeline/run_pipeline_via_web_only_spec.rb": 19.242920972000093,
"qa/specs/features/browser_ui/4_verify/pipeline/run_pipeline_with_manual_jobs_spec.rb": 41.53441877,
"qa/specs/features/browser_ui/4_verify/pipeline/trigger_child_pipeline_with_manual_spec.rb": 37.92798010199999,
"qa/specs/features/browser_ui/4_verify/pipeline/trigger_matrix_spec.rb": 30.82267260399999,
"qa/specs/features/browser_ui/4_verify/pipeline/update_ci_file_with_pipeline_editor_spec.rb": 18.81333668299999,
"qa/specs/features/browser_ui/4_verify/runner/fleet_management/group_runner_counts_spec.rb": 11.283555156000034,
"qa/specs/features/browser_ui/4_verify/runner/fleet_management/group_runner_status_counts_spec.rb": 14.921751538999956,
"qa/specs/features/browser_ui/4_verify/runner/register_group_runner_spec.rb": 11.555813114999864,
"qa/specs/features/browser_ui/4_verify/runner/register_runner_spec.rb": 14.640512293000029,
"qa/specs/features/browser_ui/4_verify/testing/endpoint_coverage_spec.rb": 33.04167134299996,
"qa/specs/features/browser_ui/5_package/container_registry/saas/container_registry_spec.rb": 171.474669059,
"qa/specs/features/browser_ui/5_package/package_registry/composer_registry_spec.rb": 23.097151681000014,
"qa/specs/features/browser_ui/5_package/package_registry/conan_repository_spec.rb": 68.27819148100002,
"qa/specs/features/browser_ui/5_package/package_registry/generic_repository_spec.rb": 30.958848293999836,
"qa/specs/features/browser_ui/5_package/package_registry/helm_registry_spec.rb": 164.675461994,
"qa/specs/features/browser_ui/5_package/package_registry/maven/maven_group_level_spec.rb": 335.77250134500014,
"qa/specs/features/browser_ui/5_package/package_registry/maven/maven_project_level_spec.rb": 131.54442950199996,
"qa/specs/features/browser_ui/5_package/package_registry/maven_gradle_repository_spec.rb": 144.28180007800006,
"qa/specs/features/browser_ui/5_package/package_registry/npm/npm_group_level_spec.rb": 199.5597331360002,
"qa/specs/features/browser_ui/5_package/package_registry/npm/npm_instance_level_spec.rb": 193.74878787099988,
"qa/specs/features/browser_ui/5_package/package_registry/npm/npm_project_level_spec.rb": 135.95935971000017,
"qa/specs/features/browser_ui/5_package/package_registry/nuget/nuget_group_level_spec.rb": 230.97100191100026,
"qa/specs/features/browser_ui/5_package/package_registry/nuget/nuget_project_level_spec.rb": 167.07799322000005,
"qa/specs/features/browser_ui/5_package/package_registry/pypi_repository_spec.rb": 84.425608592,
"qa/specs/features/browser_ui/6_release/deploy_key/add_deploy_key_spec.rb": 15.678509218000272,
"qa/specs/features/browser_ui/6_release/deploy_key/clone_using_deploy_key_spec.rb": 113.32051443,
"qa/specs/features/browser_ui/6_release/deploy_token/add_deploy_token_spec.rb": 5.473005603000047,
"qa/specs/features/browser_ui/8_monitor/alert_management/alert_settings_create_new_alerts_spec.rb": 26.454336405999925,
"qa/specs/features/browser_ui/8_monitor/alert_management/automatically_creates_incident_for_alert_spec.rb": 29.473660263999932,
"qa/specs/features/browser_ui/8_monitor/alert_management/create_alert_using_authorization_key_spec.rb": 24.847649118999925,
"qa/specs/features/browser_ui/8_monitor/alert_management/recovery_alert_resolves_correct_alert_spec.rb": 25.277828505999878,
"qa/specs/features/browser_ui/9_data_stores/group/group_member_access_request_spec.rb": 55.040246948000004,
"qa/specs/features/browser_ui/9_data_stores/group/transfer_group_spec.rb": 16.725383495000187,
"qa/specs/features/browser_ui/9_data_stores/group/transfer_project_spec.rb": 21.186026469000353,
"qa/specs/features/browser_ui/9_data_stores/project/add_project_member_spec.rb": 15.121612970000115,
"qa/specs/features/browser_ui/9_data_stores/project/create_project_badge_spec.rb": 15.521905476000029,
"qa/specs/features/browser_ui/9_data_stores/project/create_project_spec.rb": 21.49071906500012,
"qa/specs/features/browser_ui/9_data_stores/project/dashboard_images_spec.rb": 12.040240111000003,
"qa/specs/features/browser_ui/9_data_stores/project/invite_group_to_project_spec.rb": 50.43737502900012,
"qa/specs/features/browser_ui/9_data_stores/project/project_owner_permissions_spec.rb": 43.51028612900018,
"qa/specs/features/browser_ui/9_data_stores/project/view_project_activity_spec.rb": 12.068288416000087,
"qa/specs/features/browser_ui/9_data_stores/user/follow_user_activity_spec.rb": 20.219069410999964,
"qa/specs/features/browser_ui/9_data_stores/user/parent_group_access_termination_spec.rb": 29.672383117000095,
"qa/specs/features/browser_ui/9_data_stores/user/user_inherited_access_spec.rb": 23.339209069000162,
"qa/specs/features/ee/api/10_govern/compliance_pipeline_spec.rb": 13.75359881999998,
"qa/specs/features/ee/api/10_govern/instance_audit_event_streaming_spec.rb": 8.81292945000007,
"qa/specs/features/ee/api/10_govern/user/minimal_access_user_spec.rb": 48.25214889500012,
"qa/specs/features/ee/api/2_plan/epics_milestone_dates_spec.rb": 19.347550066000167,
"qa/specs/features/ee/browser_ui/10_govern/change_vulnerability_status_spec.rb": 66.79303077600025,
"qa/specs/features/ee/browser_ui/10_govern/create_merge_request_with_secure_spec.rb": 49.434594770999865,
"qa/specs/features/ee/browser_ui/10_govern/dismissed_vulnerabilities_in_security_widget_spec.rb": 66.69338805999996,
"qa/specs/features/ee/browser_ui/10_govern/export_vulnerability_report_spec.rb": 18.13838322499987,
"qa/specs/features/ee/browser_ui/10_govern/fix_vulnerability_workflow_spec.rb": 80.11628154200002,
"qa/specs/features/ee/browser_ui/10_govern/group/group_audit_event_streaming_spec.rb": 30.562192872000196,
"qa/specs/features/ee/browser_ui/10_govern/group/group_audit_logs_1_spec.rb": 97.6319095140002,
"qa/specs/features/ee/browser_ui/10_govern/group/restrict_by_ip_address_spec.rb": 204.3541991500001,
"qa/specs/features/ee/browser_ui/10_govern/instance/instance_audit_logs_spec.rb": 121.582034088,
"qa/specs/features/ee/browser_ui/10_govern/policies_list_spec.rb": 15.98812212100006,
"qa/specs/features/ee/browser_ui/10_govern/project/project_audit_logs_spec.rb": 112.9744639720002,
"qa/specs/features/ee/browser_ui/10_govern/project_security_dashboard_spec.rb": 31.22108673699995,
"qa/specs/features/ee/browser_ui/10_govern/scan_execution_policy_vulnerabilities_spec.rb": 94.17808544800005,
"qa/specs/features/ee/browser_ui/10_govern/scan_result_policy_vulnerabilities_spec.rb": 81.51367821600002,
"qa/specs/features/ee/browser_ui/10_govern/security_reports_spec.rb": 202.39447051900015,
"qa/specs/features/ee/browser_ui/10_govern/user/minimal_access_user_spec.rb": 9.557056318999912,
"qa/specs/features/ee/browser_ui/10_govern/vulnerability_management_spec.rb": 266.857582042,
"qa/specs/features/ee/browser_ui/10_govern/vulnerability_security_training_spec.rb": 95.21243818200014,
"qa/specs/features/ee/browser_ui/11_fulfillment/license/license_spec.rb": 6.79928407500006,
"qa/specs/features/ee/browser_ui/11_fulfillment/purchase/overage_modal_spec.rb": 511.28502587099865,
"qa/specs/features/ee/browser_ui/11_fulfillment/purchase/upgrade_group_spec.rb": 143.42141925100077,
"qa/specs/features/ee/browser_ui/11_fulfillment/purchase/user_registration_billing_spec.rb": 12.59936691300004,
"qa/specs/features/ee/browser_ui/11_fulfillment/saas_user_limit_experience_spec.rb": 192.47729349099973,
"qa/specs/features/ee/browser_ui/11_fulfillment/utilization/billing_seats_usage_data_spec.rb": 186.42710425699988,
"qa/specs/features/ee/browser_ui/11_fulfillment/utilization/free_namespace_storage_spec.rb": 144.213030807,
"qa/specs/features/ee/browser_ui/11_fulfillment/utilization/usage_quotas_seats_spec.rb": 138.88042444300117,
"qa/specs/features/ee/browser_ui/13_secure/enable_scanning_from_configuration_spec.rb": 56.23008209700015,
"qa/specs/features/ee/browser_ui/2_plan/analytics/contribution_analytics_spec.rb": 24.291836561999844,
"qa/specs/features/ee/browser_ui/2_plan/analytics/mr_analytics_spec.rb": 20.32096900099998,
"qa/specs/features/ee/browser_ui/2_plan/analytics/value_stream_analytics_spec.rb": 23.64442013000007,
"qa/specs/features/ee/browser_ui/2_plan/burndown_chart/burndown_chart_spec.rb": 10.072141640999916,
"qa/specs/features/ee/browser_ui/2_plan/custom_email/custom_email_spec.rb": 11.039305231000071,
"qa/specs/features/ee/browser_ui/2_plan/epic/epics_management_spec.rb": 50.46318405400007,
"qa/specs/features/ee/browser_ui/2_plan/epic/promote_issue_to_epic_spec.rb": 12.852083887999925,
"qa/specs/features/ee/browser_ui/2_plan/group_wiki/create_group_wiki_page_spec.rb": 20.806713658000035,
"qa/specs/features/ee/browser_ui/2_plan/group_wiki/delete_group_wiki_page_spec.rb": 10.287453008999819,
"qa/specs/features/ee/browser_ui/2_plan/group_wiki/file_upload_group_wiki_page_spec.rb": 14.477186050000455,
"qa/specs/features/ee/browser_ui/2_plan/insights/default_insights_spec.rb": 20.884228228999746,
"qa/specs/features/ee/browser_ui/2_plan/issue/default_issue_template_spec.rb": 15.362832389999994,
"qa/specs/features/ee/browser_ui/2_plan/issue_boards/configurable_issue_board_spec.rb": 9.375822048000032,
"qa/specs/features/ee/browser_ui/2_plan/issue_boards/configure_issue_board_by_label_spec.rb": 14.043022876000009,
"qa/specs/features/ee/browser_ui/2_plan/issue_boards/create_group_issue_board_spec.rb": 10.008381520000057,
"qa/specs/features/ee/browser_ui/2_plan/issue_boards/group_issue_boards_spec.rb": 13.316492562000121,
"qa/specs/features/ee/browser_ui/2_plan/issue_boards/project_issue_boards_spec.rb": 34.88129953600014,
"qa/specs/features/ee/browser_ui/2_plan/issue_boards/read_only_board_configuration_spec.rb": 17.101450978999992,
"qa/specs/features/ee/browser_ui/2_plan/issue_boards/sum_of_issues_weights_spec.rb": 12.606875205000051,
"qa/specs/features/ee/browser_ui/2_plan/issues_analytics/issues_analytics_spec.rb": 14.43282710699998,
"qa/specs/features/ee/browser_ui/2_plan/issues_weight/issue_weight_visualization_spec.rb": 16.2576174310002,
"qa/specs/features/ee/browser_ui/2_plan/iterations/assign_group_iteration_spec.rb": 17.141783940000096,
"qa/specs/features/ee/browser_ui/2_plan/iterations/create_group_iteration_spec.rb": 26.744485756999893,
"qa/specs/features/ee/browser_ui/2_plan/multiple_assignees_for_issues/four_assignees_spec.rb": 10.938720898000156,
"qa/specs/features/ee/browser_ui/2_plan/multiple_assignees_for_issues/more_than_four_assignees_spec.rb": 32.049121929999956,
"qa/specs/features/ee/browser_ui/2_plan/scoped_labels/editing_scoped_labels_spec.rb": 14.12629786299999,
"qa/specs/features/ee/browser_ui/3_create/merge_request/add_batch_comments_in_merge_request_spec.rb": 54.406276976999834,
"qa/specs/features/ee/browser_ui/3_create/merge_request/approval_rules_spec.rb": 73.48596869099993,
"qa/specs/features/ee/browser_ui/3_create/merge_request/default_merge_request_template_spec.rb": 24.512427606000074,
"qa/specs/features/ee/browser_ui/3_create/repository/assign_code_owners_spec.rb": 31.10725031900006,
"qa/specs/features/ee/browser_ui/3_create/repository/code_owners_spec.rb": 15.844574579999971,
"qa/specs/features/ee/browser_ui/3_create/repository/code_owners_with_protected_branch_and_squashed_commits_spec.rb": 20.76388520499995,
"qa/specs/features/ee/browser_ui/3_create/repository/file_locking_spec.rb": 185.55264253500002,
"qa/specs/features/ee/browser_ui/3_create/repository/group_file_template_spec.rb": 110.75822625699993,
"qa/specs/features/ee/browser_ui/3_create/repository/merge_with_code_owner_in_root_group_spec.rb": 81.76827380400005,
"qa/specs/features/ee/browser_ui/3_create/repository/merge_with_code_owner_in_subgroup_spec.rb": 101.06186007299993,
"qa/specs/features/ee/browser_ui/3_create/repository/project_templates_spec.rb": 82.42681391400004,
"qa/specs/features/ee/browser_ui/3_create/repository/pull_mirroring_over_http_spec.rb": 23.600735864000058,
"qa/specs/features/ee/browser_ui/3_create/repository/pull_mirroring_over_ssh_with_key_spec.rb": 30.382594358000006,
"qa/specs/features/ee/browser_ui/3_create/repository/push_rules_spec.rb": 451.2222299099999,
"qa/specs/features/ee/browser_ui/3_create/repository/restrict_push_protected_branch_spec.rb": 218.41548214599993,
"qa/specs/features/ee/browser_ui/3_create/web_ide/code_suggestions_in_web_ide_spec.rb": 57.215614150999954,
"qa/specs/features/ee/browser_ui/4_verify/multi-project_pipelines_spec.rb": 30.411709552000048,
"qa/specs/features/ee/browser_ui/4_verify/parent_child_pipelines_dependent_relationship_spec.rb": 53.836596533000034,
"qa/specs/features/ee/browser_ui/4_verify/pipeline_subscription_with_group_owned_project_spec.rb": 42.752049811999996,
"qa/specs/features/ee/browser_ui/4_verify/pipelines_for_merged_results_and_merge_trains_spec.rb": 87.18152337999982,
"qa/specs/features/ee/browser_ui/4_verify/transient/merge_trains_transient_bug_spec.rb": 303.46860319600046,
"qa/specs/features/ee/browser_ui/8_monitor/incident_management/incident_quick_action_spec.rb": 11.328669314999843,
"qa/specs/features/ee/browser_ui/9_data_stores/group/prevent_forking_outside_group_spec.rb": 35.70014257499997,
"qa/specs/features/ee/browser_ui/9_data_stores/group/share_group_with_group_spec.rb": 25.279651425999873
"qa/specs/features/browser_ui/5_package/package_registry/nuget/nuget_group_level_spec.rb": 264.434298829,
"qa/specs/features/browser_ui/5_package/package_registry/nuget/nuget_project_level_spec.rb": 179.07953628499945,
"qa/specs/features/browser_ui/5_package/package_registry/pypi_repository_spec.rb": 66.61316680000027,
"qa/specs/features/browser_ui/6_release/deploy_key/add_deploy_key_spec.rb": 16.368971259999853,
"qa/specs/features/browser_ui/6_release/deploy_key/clone_using_deploy_key_spec.rb": 120.39374872300004,
"qa/specs/features/browser_ui/6_release/deploy_token/add_deploy_token_spec.rb": 7.691309760999957,
"qa/specs/features/browser_ui/8_monitor/alert_management/alert_settings_create_new_alerts_spec.rb": 30.328377170000294,
"qa/specs/features/browser_ui/8_monitor/alert_management/automatically_creates_incident_for_alert_spec.rb": 34.47178493299998,
"qa/specs/features/browser_ui/8_monitor/alert_management/create_alert_using_authorization_key_spec.rb": 28.424765123999805,
"qa/specs/features/browser_ui/8_monitor/alert_management/recovery_alert_resolves_correct_alert_spec.rb": 22.362764356999833,
"qa/specs/features/browser_ui/9_data_stores/group/group_member_access_request_spec.rb": 69.321789481,
"qa/specs/features/browser_ui/9_data_stores/group/transfer_group_spec.rb": 15.349087670000245,
"qa/specs/features/browser_ui/9_data_stores/group/transfer_project_spec.rb": 19.955769109000016,
"qa/specs/features/browser_ui/9_data_stores/project/add_project_member_spec.rb": 18.260062158999972,
"qa/specs/features/browser_ui/9_data_stores/project/create_project_badge_spec.rb": 17.458842443999856,
"qa/specs/features/browser_ui/9_data_stores/project/create_project_spec.rb": 22.771469373999935,
"qa/specs/features/browser_ui/9_data_stores/project/dashboard_images_spec.rb": 14.590715274000104,
"qa/specs/features/browser_ui/9_data_stores/project/invite_group_to_project_spec.rb": 54.95023184499996,
"qa/specs/features/browser_ui/9_data_stores/project/project_owner_permissions_spec.rb": 72.23682060600004,
"qa/specs/features/browser_ui/9_data_stores/project/view_project_activity_spec.rb": 12.366719611000008,
"qa/specs/features/browser_ui/9_data_stores/user/follow_user_activity_spec.rb": 19.59337116200004,
"qa/specs/features/browser_ui/9_data_stores/user/parent_group_access_termination_spec.rb": 30.173765152000215,
"qa/specs/features/browser_ui/9_data_stores/user/user_inherited_access_spec.rb": 25.533543231000294,
"qa/specs/features/ee/api/10_govern/compliance_pipeline_spec.rb": 15.99686870000005,
"qa/specs/features/ee/api/10_govern/instance_audit_event_streaming_spec.rb": 10.014319522999813,
"qa/specs/features/ee/api/10_govern/user/minimal_access_user_spec.rb": 60.30355614899986,
"qa/specs/features/ee/api/2_plan/epics_milestone_dates_spec.rb": 30.616700149999815,
"qa/specs/features/ee/browser_ui/10_govern/change_vulnerability_status_spec.rb": 64.54460948499991,
"qa/specs/features/ee/browser_ui/10_govern/create_merge_request_with_secure_spec.rb": 51.209721040000204,
"qa/specs/features/ee/browser_ui/10_govern/dismissed_vulnerabilities_in_security_widget_spec.rb": 66.58886600799997,
"qa/specs/features/ee/browser_ui/10_govern/export_vulnerability_report_spec.rb": 17.84198918500033,
"qa/specs/features/ee/browser_ui/10_govern/fix_vulnerability_workflow_spec.rb": 93.56028477999962,
"qa/specs/features/ee/browser_ui/10_govern/group/group_audit_event_streaming_spec.rb": 25.344876565999584,
"qa/specs/features/ee/browser_ui/10_govern/group/group_audit_logs_1_spec.rb": 111.06777230499983,
"qa/specs/features/ee/browser_ui/10_govern/group/restrict_by_ip_address_spec.rb": 223.95324160099995,
"qa/specs/features/ee/browser_ui/10_govern/instance/instance_audit_logs_spec.rb": 133.08906034199993,
"qa/specs/features/ee/browser_ui/10_govern/policies_list_spec.rb": 19.63271028700001,
"qa/specs/features/ee/browser_ui/10_govern/project/project_audit_logs_spec.rb": 112.305692969,
"qa/specs/features/ee/browser_ui/10_govern/project_security_dashboard_spec.rb": 41.780432584999744,
"qa/specs/features/ee/browser_ui/10_govern/scan_execution_policy_vulnerabilities_spec.rb": 105.07292722099987,
"qa/specs/features/ee/browser_ui/10_govern/scan_result_policy_vulnerabilities_spec.rb": 81.90928084699999,
"qa/specs/features/ee/browser_ui/10_govern/security_reports_spec.rb": 234.9365302350002,
"qa/specs/features/ee/browser_ui/10_govern/user/minimal_access_user_spec.rb": 14.842938197000421,
"qa/specs/features/ee/browser_ui/10_govern/vulnerability_management_spec.rb": 279.135989762,
"qa/specs/features/ee/browser_ui/10_govern/vulnerability_security_training_spec.rb": 92.56010744200012,
"qa/specs/features/ee/browser_ui/11_fulfillment/license/license_spec.rb": 7.710770873999991,
"qa/specs/features/ee/browser_ui/11_fulfillment/purchase/overage_modal_spec.rb": 361.20276373999997,
"qa/specs/features/ee/browser_ui/11_fulfillment/purchase/purchase_ci_spec.rb": 220.78166149800018,
"qa/specs/features/ee/browser_ui/11_fulfillment/purchase/upgrade_group_spec.rb": 113.4160770069999,
"qa/specs/features/ee/browser_ui/11_fulfillment/purchase/user_registration_billing_spec.rb": 16.268378571000085,
"qa/specs/features/ee/browser_ui/11_fulfillment/saas_user_limit_experience_spec.rb": 157.62122049800007,
"qa/specs/features/ee/browser_ui/11_fulfillment/utilization/billing_seats_usage_data_spec.rb": 45.51385750300051,
"qa/specs/features/ee/browser_ui/11_fulfillment/utilization/free_namespace_storage_spec.rb": 328.98744341899965,
"qa/specs/features/ee/browser_ui/11_fulfillment/utilization/usage_quotas_seats_spec.rb": 98.15295350900033,
"qa/specs/features/ee/browser_ui/13_secure/enable_scanning_from_configuration_spec.rb": 65.0621003350002,
"qa/specs/features/ee/browser_ui/13_secure/on_demand_dast_spec.rb": 95.47956878800005,
"qa/specs/features/ee/browser_ui/2_plan/analytics/contribution_analytics_spec.rb": 27.560869206000007,
"qa/specs/features/ee/browser_ui/2_plan/analytics/mr_analytics_spec.rb": 24.171681919999855,
"qa/specs/features/ee/browser_ui/2_plan/analytics/value_stream_analytics_spec.rb": 31.01041220000002,
"qa/specs/features/ee/browser_ui/2_plan/burndown_chart/burndown_chart_spec.rb": 15.120006549999971,
"qa/specs/features/ee/browser_ui/2_plan/custom_email/custom_email_spec.rb": 12.203800635000107,
"qa/specs/features/ee/browser_ui/2_plan/epic/epics_management_spec.rb": 56.576563952000015,
"qa/specs/features/ee/browser_ui/2_plan/epic/promote_issue_to_epic_spec.rb": 17.53745741800003,
"qa/specs/features/ee/browser_ui/2_plan/group_wiki/create_group_wiki_page_spec.rb": 26.511329111000123,
"qa/specs/features/ee/browser_ui/2_plan/group_wiki/delete_group_wiki_page_spec.rb": 12.651667038999904,
"qa/specs/features/ee/browser_ui/2_plan/group_wiki/file_upload_group_wiki_page_spec.rb": 17.36770923999984,
"qa/specs/features/ee/browser_ui/2_plan/insights/default_insights_spec.rb": 24.994920751999985,
"qa/specs/features/ee/browser_ui/2_plan/issue/default_issue_template_spec.rb": 17.61846453599992,
"qa/specs/features/ee/browser_ui/2_plan/issue_boards/configurable_issue_board_spec.rb": 11.314423112999975,
"qa/specs/features/ee/browser_ui/2_plan/issue_boards/configure_issue_board_by_label_spec.rb": 17.748452938000014,
"qa/specs/features/ee/browser_ui/2_plan/issue_boards/create_group_issue_board_spec.rb": 14.60052765599994,
"qa/specs/features/ee/browser_ui/2_plan/issue_boards/group_issue_boards_spec.rb": 13.786476298000252,
"qa/specs/features/ee/browser_ui/2_plan/issue_boards/project_issue_boards_spec.rb": 33.28423905599993,
"qa/specs/features/ee/browser_ui/2_plan/issue_boards/read_only_board_configuration_spec.rb": 26.76711599400005,
"qa/specs/features/ee/browser_ui/2_plan/issue_boards/sum_of_issues_weights_spec.rb": 11.495171397999911,
"qa/specs/features/ee/browser_ui/2_plan/issues_analytics/issues_analytics_spec.rb": 21.054825729999948,
"qa/specs/features/ee/browser_ui/2_plan/issues_weight/issue_weight_visualization_spec.rb": 12.823165358999859,
"qa/specs/features/ee/browser_ui/2_plan/iterations/assign_group_iteration_spec.rb": 16.298900731999993,
"qa/specs/features/ee/browser_ui/2_plan/iterations/create_group_iteration_spec.rb": 45.393958683000164,
"qa/specs/features/ee/browser_ui/2_plan/multiple_assignees_for_issues/four_assignees_spec.rb": 15.992729044000043,
"qa/specs/features/ee/browser_ui/2_plan/multiple_assignees_for_issues/more_than_four_assignees_spec.rb": 30.660570389999975,
"qa/specs/features/ee/browser_ui/2_plan/scoped_labels/editing_scoped_labels_spec.rb": 15.192015057999924,
"qa/specs/features/ee/browser_ui/3_create/merge_request/add_batch_comments_in_merge_request_spec.rb": 59.00339003400006,
"qa/specs/features/ee/browser_ui/3_create/merge_request/approval_rules_spec.rb": 114.42318613399993,
"qa/specs/features/ee/browser_ui/3_create/merge_request/default_merge_request_template_spec.rb": 21.83372141999996,
"qa/specs/features/ee/browser_ui/3_create/repository/assign_code_owners_spec.rb": 30.466039432000116,
"qa/specs/features/ee/browser_ui/3_create/repository/code_owners_spec.rb": 16.63403581700004,
"qa/specs/features/ee/browser_ui/3_create/repository/code_owners_with_protected_branch_and_squashed_commits_spec.rb": 22.914994434000164,
"qa/specs/features/ee/browser_ui/3_create/repository/file_locking_spec.rb": 175.97324677300003,
"qa/specs/features/ee/browser_ui/3_create/repository/group_file_template_spec.rb": 106.11110679899957,
"qa/specs/features/ee/browser_ui/3_create/repository/merge_with_code_owner_in_root_group_spec.rb": 86.72304173999987,
"qa/specs/features/ee/browser_ui/3_create/repository/merge_with_code_owner_in_subgroup_spec.rb": 127.07800579199989,
"qa/specs/features/ee/browser_ui/3_create/repository/project_templates_spec.rb": 102.24652406700011,
"qa/specs/features/ee/browser_ui/3_create/repository/pull_mirroring_over_http_spec.rb": 26.21021658599966,
"qa/specs/features/ee/browser_ui/3_create/repository/pull_mirroring_over_ssh_with_key_spec.rb": 38.806498636000015,
"qa/specs/features/ee/browser_ui/3_create/repository/push_rules_spec.rb": 238.7351660170001,
"qa/specs/features/ee/browser_ui/3_create/repository/restrict_push_protected_branch_spec.rb": 234.07665563,
"qa/specs/features/ee/browser_ui/3_create/web_ide/code_suggestions_in_web_ide_spec.rb": 56.78907783300002,
"qa/specs/features/ee/browser_ui/4_verify/multi-project_pipelines_spec.rb": 30.859629176,
"qa/specs/features/ee/browser_ui/4_verify/parent_child_pipelines_dependent_relationship_spec.rb": 53.494925411000054,
"qa/specs/features/ee/browser_ui/4_verify/pipeline_subscription_with_group_owned_project_spec.rb": 43.39151472200001,
"qa/specs/features/ee/browser_ui/4_verify/pipelines_for_merged_results_and_merge_trains_spec.rb": 93.4739717949999,
"qa/specs/features/ee/browser_ui/4_verify/transient/merge_trains_transient_bug_spec.rb": 291.665364079,
"qa/specs/features/ee/browser_ui/8_monitor/incident_management/incident_quick_action_spec.rb": 12.384733055999959,
"qa/specs/features/ee/browser_ui/9_data_stores/group/prevent_forking_outside_group_spec.rb": 40.392466111999966,
"qa/specs/features/ee/browser_ui/9_data_stores/group/share_group_with_group_spec.rb": 27.105456914000115
}

View File

@ -0,0 +1,121 @@
import { GlPagination } from '@gitlab/ui';
import setWindowLocation from 'helpers/set_window_location_helper';
import { extendedWrapper, mountExtended } from 'helpers/vue_test_utils_helper';
import MembersPagination from '~/members/components/table/members_pagination.vue';
import { pagination as mockPagination } from '../../mock_data';
describe('MembersPagination', () => {
/** @type {import('helpers/vue_test_utils_helper').ExtendedWrapper} */
let wrapper;
const findPagination = () => extendedWrapper(wrapper.findComponent(GlPagination));
const mockURL = 'https://localhost/foo-bar/-/project_members';
/**
* Checks if 2nd page link exists and it equals to passed URL
* @param {string} expectedUrl
*/
const expectCorrectLinkToPage2 = (expectedUrl) => {
const secondPageLink = findPagination().findByText('2', { selector: 'a' });
expect(secondPageLink.exists()).toBe(true);
expect(secondPageLink.attributes('href')).toBe(expectedUrl);
};
const createComponent = ({ pagination = mockPagination, tabQueryParamValue = '' } = {}) => {
wrapper = mountExtended(MembersPagination, {
propsData: {
pagination,
tabQueryParamValue,
},
});
};
it('renders `gl-pagination` component with correct props', () => {
setWindowLocation(mockURL);
createComponent();
const glPagination = findPagination();
expect(glPagination.exists()).toBe(true);
expect(glPagination.props()).toMatchObject({
value: mockPagination.currentPage,
perPage: mockPagination.perPage,
totalItems: mockPagination.totalItems,
prevText: 'Prev',
nextText: 'Next',
labelNextPage: 'Go to next page',
labelPrevPage: 'Go to previous page',
align: 'center',
});
});
it('uses `pagination.paramName` to generate the pagination links', () => {
setWindowLocation(mockURL);
createComponent({
pagination: {
currentPage: 1,
perPage: 5,
totalItems: 10,
paramName: 'invited_members_page',
},
});
expectCorrectLinkToPage2(`${mockURL}?invited_members_page=2`);
});
it('uses tabQueryParamValue to generate the pagination links', () => {
setWindowLocation(mockURL);
createComponent({
tabQueryParamValue: 'invited',
});
expectCorrectLinkToPage2(`${mockURL}?tab=invited&page=2`);
});
it('removes tab param if tabQueryParamValue is empty', () => {
setWindowLocation(`${mockURL}?tab=invited`);
createComponent();
expectCorrectLinkToPage2(`${mockURL}?page=2`);
});
it('removes any URL params defined as `null` in the `params` attribute', () => {
setWindowLocation(`${mockURL}?search_groups=foo`);
createComponent({
pagination: {
currentPage: 1,
perPage: 5,
totalItems: 10,
paramName: 'page',
params: { search_groups: null },
},
});
expectCorrectLinkToPage2(`${mockURL}?page=2`);
});
describe('no pagination', () => {
describe.each`
attribute | value
${'paramName'} | ${null}
${'currentPage'} | ${null}
${'perPage'} | ${null}
${'totalItems'} | ${0}
`('when pagination.$attribute is $value', ({ attribute, value }) => {
it('does not render `gl-pagination`', () => {
createComponent({
pagination: {
...mockPagination,
[attribute]: value,
},
});
expect(findPagination().exists()).toBe(false);
});
});
});
});

View File

@ -1,9 +1,8 @@
import { GlPagination, GlTable } from '@gitlab/ui';
import { GlTable } from '@gitlab/ui';
import Vue from 'vue';
// eslint-disable-next-line no-restricted-imports
import Vuex from 'vuex';
import setWindowLocation from 'helpers/set_window_location_helper';
import { mountExtended, extendedWrapper } from 'helpers/vue_test_utils_helper';
import { mountExtended } from 'helpers/vue_test_utils_helper';
import CreatedAt from '~/members/components/table/created_at.vue';
import ExpirationDatepicker from '~/members/components/table/expiration_datepicker.vue';
import MemberActions from '~/members/components/table/member_actions.vue';
@ -11,6 +10,7 @@ import MemberAvatar from '~/members/components/table/member_avatar.vue';
import MemberSource from '~/members/components/table/member_source.vue';
import MemberActivity from '~/members/components/table/member_activity.vue';
import MembersTable from '~/members/components/table/members_table.vue';
import MembersPagination from '~/members/components/table/members_pagination.vue';
import MaxRole from '~/members/components/table/max_role.vue';
import {
MEMBER_TYPES,
@ -34,6 +34,7 @@ import {
Vue.use(Vuex);
describe('MembersTable', () => {
/** @type {import('helpers/vue_test_utils_helper').ExtendedWrapper} */
let wrapper;
const createStore = (state = {}) => {
@ -81,22 +82,12 @@ describe('MembersTable', () => {
});
};
const url = 'https://localhost/foo-bar/-/project_members?tab=invited';
const findTable = () => wrapper.findComponent(GlTable);
const findTableCellByMemberId = (tableCellLabel, memberId) =>
wrapper
.findByTestId(`members-table-row-${memberId}`)
.find(`[data-label="${tableCellLabel}"][role="cell"]`);
const findPagination = () => extendedWrapper(wrapper.findComponent(GlPagination));
const expectCorrectLinkToPage2 = () => {
expect(findPagination().findByText('2', { selector: 'a' }).attributes('href')).toBe(
`${url}&invited_members_page=2`,
);
};
describe('fields', () => {
const memberCanUpdate = {
...directMember,
@ -281,75 +272,13 @@ describe('MembersTable', () => {
expect(findTable().find('tbody tr').attributes('data-testid')).toBe('member-row');
});
describe('when required pagination data is provided', () => {
it('renders `gl-pagination` component with correct props', () => {
setWindowLocation(url);
it('renders `members-pagination` component with correct props', () => {
createComponent();
const membersPagination = wrapper.findComponent(MembersPagination);
createComponent();
const glPagination = findPagination();
expect(glPagination.exists()).toBe(true);
expect(glPagination.props()).toMatchObject({
value: pagination.currentPage,
perPage: pagination.perPage,
totalItems: pagination.totalItems,
prevText: 'Prev',
nextText: 'Next',
labelNextPage: 'Go to next page',
labelPrevPage: 'Go to previous page',
align: 'center',
});
});
it('uses `pagination.paramName` to generate the pagination links', () => {
setWindowLocation(url);
createComponent({
pagination: {
currentPage: 1,
perPage: 5,
totalItems: 10,
paramName: 'invited_members_page',
},
});
expectCorrectLinkToPage2();
});
it('removes any url params defined as `null` in the `params` attribute', () => {
setWindowLocation(`${url}&search_groups=foo`);
createComponent({
pagination: {
currentPage: 1,
perPage: 5,
totalItems: 10,
paramName: 'invited_members_page',
params: { search_groups: null },
},
});
expectCorrectLinkToPage2();
});
});
describe.each`
attribute | value
${'paramName'} | ${null}
${'currentPage'} | ${null}
${'perPage'} | ${null}
${'totalItems'} | ${0}
`('when pagination.$attribute is $value', ({ attribute, value }) => {
it('does not render `gl-pagination`', () => {
createComponent({
pagination: {
...pagination,
[attribute]: value,
},
});
expect(findPagination().exists()).toBe(false);
expect(membersPagination.props()).toMatchObject({
pagination,
tabQueryParamValue: TAB_QUERY_PARAM_VALUES.invite,
});
});
});

View File

@ -9,6 +9,11 @@ RSpec.describe Backup::Manager, feature_category: :backup_restore do
let(:logger) { subject.logger }
let(:backup_tasks) { nil }
let(:options) { build(:backup_options, :skip_none) }
let(:backup_path) { Pathname(Dir.mktmpdir('backup-manager', TestEnv::TMP_TEST_PATH)) }
let(:fixtures_path) { Rails.root.join('spec/fixtures/backups') }
let(:backup_fixture_filename) { '1714155640_2024_04_26_17.0.0-pre_gitlab_backup.tar' }
let(:backup_fixture_version) { '17.0.0-pre' }
let(:backup_fixture) { fixtures_path.join(backup_fixture_filename) }
subject { described_class.new(progress, backup_tasks: backup_tasks) }
@ -20,10 +25,11 @@ RSpec.describe Backup::Manager, feature_category: :backup_restore do
allow(FileUtils).to receive(:rm_rf).and_call_original
allow(progress).to receive(:puts).and_call_original
allow(Gitlab.config.backup).to receive(:path).and_return(backup_path)
end
def backup_path
Pathname(Gitlab.config.backup.path)
after do
FileUtils.rm_rf(backup_path)
end
describe '#run_create_task' do
@ -136,7 +142,6 @@ RSpec.describe Backup::Manager, feature_category: :backup_restore do
let(:backup_information) { { backup_created_at: Time.zone.parse('2019-01-01'), gitlab_version: '12.3' } }
let(:backup_id) { "1546300800_2019_01_01_#{Gitlab::VERSION}" }
let(:backup_path) { Pathname.new('tmp/backups') }
let(:restore_process) do
Backup::Restore::Process.new(
backup_id: backup_id,
@ -513,7 +518,7 @@ RSpec.describe Backup::Manager, feature_category: :backup_restore do
end
describe 'cloud storage' do
let(:backup_file) { Tempfile.new('backup', Gitlab.config.backup.path) }
let(:backup_file) { Tempfile.new('backup', backup_path) }
let(:backup_filename) { File.basename(backup_file.path) }
before do
@ -1252,4 +1257,63 @@ RSpec.describe Backup::Manager, feature_category: :backup_restore do
expect(tar_version).to match(/tar \(GNU tar\) [0-9]\.[0-9]+/)
end
end
describe '#verify!' do
let(:backup_id) { '1714155640_2024_04_26_17.0.0-pre' }
before do
FileUtils.cp(backup_fixture, backup_path)
end
it 'unpacks the backup and reads information from disk' do
expect(subject).to receive(:run_unpack).and_call_original
expect(subject).to receive(:read_backup_information).and_call_original
allow_next_instance_of(Backup::Restore::Preconditions) do |preconditions|
allow(preconditions).to receive(:validate_backup_version!)
end
metadata = subject.instance_variable_get(:@metadata)
expect { subject.verify! }.to change { metadata.backup_information.try(:backup_id) }.from(nil).to(backup_id)
end
context 'when backup version matches with running gitlab version' do
it 'runs precondition verification and exit 0' do
stub_const('Gitlab::VERSION', backup_fixture_version)
allow_next_instance_of(Backup::Restore::Preconditions) do |preconditions|
allow(preconditions).to receive(:validate_backup_version!).and_call_original
end
expect { subject.verify! }.to raise_error(SystemExit) do |error|
expect(error.status).to eq(0)
end
end
end
context 'when backup version doesnt match with running gitlab version' do
it 'runs precondition verification and exit 0' do
stub_const('Gitlab::VERSION', '13.5.0')
allow_next_instance_of(Backup::Restore::Preconditions) do |preconditions|
allow(preconditions).to receive(:validate_backup_version!).and_call_original
end
expect { subject.verify! }.to raise_error(SystemExit) do |error|
expect(error.status).to eq(1)
end
end
end
it 'cleans up the backup temporary folder after verification' do
allow_next_instance_of(Backup::Restore::Preconditions) do |preconditions|
allow(preconditions).to receive(:validate_backup_version!)
end
subject.verify!
expect(backup_path.children.size).to eq(1)
expect(backup_path.children[0]).to eq(backup_path.join(backup_fixture_filename))
end
end
end

View File

@ -355,6 +355,15 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep, feature_category:
end
end
describe '.no_tag' do
let_it_be(:pipeline) { create(:ci_pipeline) }
let_it_be(:tag_pipeline) { create(:ci_pipeline, tag: true) }
subject { described_class.no_tag }
it { is_expected.to contain_exactly(pipeline) }
end
describe '.processables' do
let_it_be(:pipeline) { create(:ci_empty_pipeline, :created) }

View File

@ -33,6 +33,7 @@ RSpec.describe 'gitlab:backup namespace rake tasks', :delete, feature_category:
pages.tar.gz
packages.tar.gz
ci_secure_files.tar.gz
uploads.tar.gz
]
end
@ -726,6 +727,16 @@ RSpec.describe 'gitlab:backup namespace rake tasks', :delete, feature_category:
end
end
describe 'verifying a backup' do
it 'delegates to Backup::Manager#verify!' do
expect_next_instance_of(::Backup::Manager) do |manager|
expect(manager).to receive(:verify!)
end
run_rake_task('gitlab:backup:verify')
end
end
def expect_logger_to_receive_messages(messages)
expect_any_instance_of(Gitlab::BackupLogger) do |logger|
messages.each do |message|