Add latest changes from gitlab-org/gitlab@master

This commit is contained in:
GitLab Bot 2024-12-17 00:28:34 +00:00
parent 5d19eb9b89
commit 77f15abfc5
218 changed files with 689 additions and 1679 deletions

View File

@ -1,19 +0,0 @@
query getPipelineStages($fullPath: ID!, $iid: ID!) {
project(fullPath: $fullPath) {
id
pipeline(iid: $iid) {
id
stages {
nodes {
id
name
detailedStatus {
id
icon
group
}
}
}
}
}
}

View File

@ -9,19 +9,23 @@ const MAX_VISIBLE_USERS = 3;
const REVIEW_STATE_ICONS = { const REVIEW_STATE_ICONS = {
APPROVED: { APPROVED: {
name: 'check-circle', name: 'check-circle',
class: 'gl-bg-green-100 gl-text-green-500', backgroundClass: 'gl-bg-status-success',
foregroundClass: 'gl-fill-status-success',
}, },
REQUESTED_CHANGES: { REQUESTED_CHANGES: {
name: 'error', name: 'error',
class: 'gl-bg-red-100 gl-text-red-500', backgroundClass: 'gl-bg-status-danger',
foregroundClass: 'gl-fill-status-danger',
}, },
REVIEWED: { REVIEWED: {
name: 'comment-lines', name: 'comment-lines',
class: 'gl-bg-blue-100 gl-text-blue-500', backgroundClass: 'gl-bg-status-info',
foregroundClass: 'gl-fill-status-info',
}, },
REVIEW_STARTED: { REVIEW_STARTED: {
name: 'comment-dots', name: 'comment-dots',
class: 'gl-bg-gray-100 gl-text-subtle', backgroundClass: 'gl-bg-status-neutral',
foregroundClass: 'gl-fill-status-neutral',
}, },
}; };
const USER_TOOLTIP_TITLES = { const USER_TOOLTIP_TITLES = {
@ -147,10 +151,15 @@ export default {
<span <span
v-if="reviewStateIcon(user)" v-if="reviewStateIcon(user)"
class="gl-absolute -gl-bottom-2 -gl-right-2 gl-flex gl-h-5 gl-w-5 gl-items-center gl-justify-center gl-rounded-full gl-p-1" class="gl-absolute -gl-bottom-2 -gl-right-2 gl-flex gl-h-5 gl-w-5 gl-items-center gl-justify-center gl-rounded-full gl-p-1"
:class="reviewStateIcon(user).class" :class="reviewStateIcon(user).backgroundClass"
data-testid="review-state-icon" data-testid="review-state-icon"
> >
<gl-icon :name="reviewStateIcon(user).name" class="gl-block" :size="12" /> <gl-icon
:name="reviewStateIcon(user).name"
class="gl-block"
:class="reviewStateIcon(user).foregroundClass"
:size="12"
/>
</span> </span>
</gl-avatar-link> </gl-avatar-link>
</template> </template>

View File

@ -9,6 +9,7 @@ fragment MergeRequestFragment on MergeRequest {
state state
title title
updatedAt updatedAt
mergedAt
upvotes upvotes
resolvedDiscussionsCount @include(if: $isSignedIn) resolvedDiscussionsCount @include(if: $isSignedIn)
resolvableDiscussionsCount @include(if: $isSignedIn) resolvableDiscussionsCount @include(if: $isSignedIn)

View File

@ -1,10 +1,12 @@
<script> <script>
import { GlLineChart } from '@gitlab/ui/dist/charts'; import { GlLineChart } from '@gitlab/ui/dist/charts';
import { GlEmptyState } from '@gitlab/ui';
import { s__ } from '~/locale'; import { s__ } from '~/locale';
import { CREATE_EXPERIMENT_HELP_PATH } from '~/ml/experiment_tracking/routes/experiments/index/constants';
export default { export default {
name: 'PerformanceGraph', name: 'PerformanceGraph',
components: { GlLineChart }, components: { GlLineChart, GlEmptyState },
props: { props: {
candidates: { candidates: {
type: Array, type: Array,
@ -14,6 +16,11 @@ export default {
type: Array, type: Array,
required: true, required: true,
}, },
emptyStateSvgPath: {
type: String,
required: false,
default: '',
},
}, },
data() { data() {
return { return {
@ -24,6 +31,11 @@ export default {
i18n: { i18n: {
xAxisLabel: s__('ExperimentTracking|Candidate'), xAxisLabel: s__('ExperimentTracking|Candidate'),
yAxisLabel: s__('ExperimentTracking|Metric value'), yAxisLabel: s__('ExperimentTracking|Metric value'),
createNewCandidateLabel: s__('ExperimentTracking|Create candidate using MLflow'),
emptyStateLabel: s__('ExperimentTracking|No candidates'),
emptyStateDescriptionLabel: s__(
'ExperimentTracking|Performance graph will be shown when candidates with logged metrics are available',
),
}, },
computed: { computed: {
graphData() { graphData() {
@ -55,6 +67,12 @@ export default {
toolbox: { show: true }, toolbox: { show: true },
}; };
}, },
showGraph() {
return this.candidates.length > 0 && this.metricNames.length > 0;
},
},
constants: {
CREATE_EXPERIMENT_HELP_PATH,
}, },
methods: { methods: {
formatTooltipText(params) { formatTooltipText(params) {
@ -70,6 +88,7 @@ export default {
<template> <template>
<gl-line-chart <gl-line-chart
v-if="showGraph"
:data="graphData" :data="graphData"
:option="graphOptions" :option="graphOptions"
show-legend show-legend
@ -87,4 +106,14 @@ export default {
</div> </div>
</template> </template>
</gl-line-chart> </gl-line-chart>
<gl-empty-state
v-else
:title="$options.i18n.emptyStateLabel"
:secondary-button-text="$options.i18n.createNewCandidateLabel"
:secondary-button-link="$options.constants.CREATE_EXPERIMENT_HELP_PATH"
:svg-path="emptyStateSvgPath"
:svg-height="null"
:description="$options.i18n.emptyStateDescriptionLabel"
class="gl-py-8"
/>
</template> </template>

View File

@ -1,156 +0,0 @@
<script>
import { GlLoadingIcon } from '@gitlab/ui';
import { createAlert } from '~/alert';
import { __ } from '~/locale';
import { getQueryHeaders, toggleQueryPollingByVisibility } from '~/ci/pipeline_details/graph/utils';
import { keepLatestDownstreamPipelines } from '~/ci/pipeline_details/utils/parsing_utils';
import LegacyPipelineMiniGraph from '~/ci/pipeline_mini_graph/legacy_pipeline_mini_graph/legacy_pipeline_mini_graph.vue';
import PipelineMiniGraph from '~/ci/pipeline_mini_graph/pipeline_mini_graph.vue';
import glFeatureFlagsMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
import getLinkedPipelinesQuery from '~/ci/pipeline_details/graphql/queries/get_linked_pipelines.query.graphql';
import getPipelineStagesQuery from '~/ci/pipeline_mini_graph/graphql/queries/get_pipeline_stages.query.graphql';
import { formatStages } from '../utils';
import { COMMIT_BOX_POLL_INTERVAL } from '../constants';
export default {
i18n: {
linkedPipelinesFetchError: __('There was a problem fetching linked pipelines.'),
stageConversionError: __('There was a problem handling the pipeline data.'),
stagesFetchError: __('There was a problem fetching the pipeline stages.'),
},
components: {
GlLoadingIcon,
LegacyPipelineMiniGraph,
PipelineMiniGraph,
},
mixins: [glFeatureFlagsMixin()],
inject: {
fullPath: {
default: '',
},
iid: {
default: '',
},
graphqlResourceEtag: {
default: '',
},
},
props: {
stages: {
type: Array,
required: true,
},
},
apollo: {
pipeline: {
context() {
return getQueryHeaders(this.graphqlResourceEtag);
},
query: getLinkedPipelinesQuery,
pollInterval: COMMIT_BOX_POLL_INTERVAL,
skip() {
return !this.fullPath || !this.iid || this.isUsingPipelineMiniGraphQueries;
},
variables() {
return {
fullPath: this.fullPath,
iid: this.iid,
};
},
update({ project }) {
return project?.pipeline;
},
error() {
createAlert({ message: this.$options.i18n.linkedPipelinesFetchError });
},
},
pipelineStages: {
context() {
return getQueryHeaders(this.graphqlResourceEtag);
},
query: getPipelineStagesQuery,
pollInterval: COMMIT_BOX_POLL_INTERVAL,
skip() {
return this.isUsingPipelineMiniGraphQueries;
},
variables() {
return {
fullPath: this.fullPath,
iid: this.iid,
};
},
update({ project }) {
return project?.pipeline?.stages?.nodes || [];
},
error() {
createAlert({ message: this.$options.i18n.stagesFetchError });
},
},
},
data() {
return {
formattedStages: [],
pipeline: null,
pipelineStages: [],
};
},
computed: {
downstreamPipelines() {
const downstream = this.pipeline?.downstream?.nodes;
return keepLatestDownstreamPipelines(downstream);
},
isUsingPipelineMiniGraphQueries() {
return this.glFeatures.ciGraphqlPipelineMiniGraph;
},
pipelinePath() {
return this.pipeline?.path ?? '';
},
upstreamPipeline() {
return this.pipeline?.upstream;
},
},
watch: {
pipelineStages() {
// pipelineStages are from GraphQL
// stages are from REST
// we do this to use dropdown_path for fetching jobs on stage click
try {
this.formattedStages = formatStages(this.pipelineStages, this.stages);
} catch (error) {
createAlert({
message: this.$options.i18n.stageConversionError,
captureError: true,
error,
});
}
},
},
mounted() {
toggleQueryPollingByVisibility(this.$apollo.queries.pipelineStages);
toggleQueryPollingByVisibility(this.$apollo.queries.pipeline);
},
};
</script>
<template>
<div>
<gl-loading-icon v-if="$apollo.queries.pipeline.loading" />
<template v-else>
<pipeline-mini-graph
v-if="isUsingPipelineMiniGraphQueries"
data-testid="commit-box-pipeline-mini-graph"
:pipeline-etag="graphqlResourceEtag"
:full-path="fullPath"
:iid="iid"
/>
<legacy-pipeline-mini-graph
v-else
data-testid="commit-box-pipeline-mini-graph"
:downstream-pipelines="downstreamPipelines"
:pipeline-path="pipelinePath"
:stages="formattedStages"
:upstream-pipeline="upstreamPipeline"
/>
</template>
</div>
</template>

View File

@ -1,68 +0,0 @@
<script>
import { GlLoadingIcon } from '@gitlab/ui';
import CiIcon from '~/vue_shared/components/ci_icon/ci_icon.vue';
import { createAlert } from '~/alert';
import { getQueryHeaders, toggleQueryPollingByVisibility } from '~/ci/pipeline_details/graph/utils';
import getLatestPipelineStatusQuery from '../graphql/queries/get_latest_pipeline_status.query.graphql';
import { COMMIT_BOX_POLL_INTERVAL, PIPELINE_STATUS_FETCH_ERROR } from '../constants';
export default {
PIPELINE_STATUS_FETCH_ERROR,
components: {
CiIcon,
GlLoadingIcon,
},
inject: {
fullPath: {
default: '',
},
iid: {
default: '',
},
graphqlResourceEtag: {
default: '',
},
},
apollo: {
pipelineStatus: {
context() {
return getQueryHeaders(this.graphqlResourceEtag);
},
query: getLatestPipelineStatusQuery,
pollInterval: COMMIT_BOX_POLL_INTERVAL,
variables() {
return {
fullPath: this.fullPath,
iid: this.iid,
};
},
update({ project }) {
return project?.pipeline?.detailedStatus || {};
},
error() {
createAlert({ message: this.$options.PIPELINE_STATUS_FETCH_ERROR });
},
},
},
data() {
return {
pipelineStatus: null,
};
},
computed: {
loading() {
return this.$apollo.queries.pipelineStatus.loading;
},
},
mounted() {
toggleQueryPollingByVisibility(this.$apollo.queries.pipelineStatus);
},
};
</script>
<template>
<div class="gl-mr-2 gl-inline-block gl-align-middle">
<gl-loading-icon v-if="loading" />
<ci-icon v-else-if="pipelineStatus" :status="pipelineStatus" />
</div>
</template>

View File

@ -1,11 +1,5 @@
import { __, s__ } from '~/locale'; import { __, s__ } from '~/locale';
export const COMMIT_BOX_POLL_INTERVAL = 10000;
export const PIPELINE_STATUS_FETCH_ERROR = __(
'There was a problem fetching the latest pipeline status.',
);
export const BRANCHES = s__('Commit|Branches'); export const BRANCHES = s__('Commit|Branches');
export const TAGS = s__('Commit|Tags'); export const TAGS = s__('Commit|Tags');

View File

@ -1,13 +0,0 @@
#import "~/graphql_shared/fragments/ci_icon.fragment.graphql"
query getLatestPipelineStatus($fullPath: ID!, $iid: ID!) {
project(fullPath: $fullPath) {
id
pipeline(iid: $iid) {
id
detailedStatus {
...CiIcon
}
}
}
}

View File

@ -1,44 +0,0 @@
import Vue from 'vue';
import VueApollo from 'vue-apollo';
import createDefaultClient from '~/lib/graphql';
Vue.use(VueApollo);
const apolloProvider = new VueApollo({
defaultClient: createDefaultClient(),
});
export const initCommitPipelineMiniGraph = async (selector = '.js-commit-pipeline-mini-graph') => {
const el = document.querySelector(selector);
if (!el) {
return;
}
const { stages, fullPath, iid, graphqlResourceEtag } = el.dataset;
// Some commits have no pipeline, code splitting to load the pipeline optionally
const { default: CommitBoxPipelineMiniGraph } = await import(
/* webpackChunkName: 'commitBoxPipelineMiniGraph' */ './components/commit_box_pipeline_mini_graph.vue'
);
// eslint-disable-next-line no-new
new Vue({
el,
apolloProvider,
provide: {
fullPath,
iid,
dataMethod: 'graphql',
graphqlResourceEtag,
},
render(createElement) {
return createElement(CommitBoxPipelineMiniGraph, {
props: {
// if stages do not exist for some reason, protect JSON.parse from erroring out
stages: stages ? JSON.parse(stages) : [],
},
});
},
});
};

View File

@ -1,15 +0,0 @@
export const formatStages = (graphQLStages = [], restStages = []) => {
if (graphQLStages.length !== restStages.length) {
throw new Error('Rest stages and graphQl stages must be the same length');
}
return graphQLStages.map((stage, index) => {
return {
name: stage.name,
id: restStages[index]?.id,
status: stage.detailedStatus,
dropdown_path: restStages[index]?.dropdown_path || '',
title: restStages[index].title || '',
};
});
};

View File

@ -166,6 +166,9 @@ export default {
isClosed() { isClosed() {
return [STATUS_CLOSED, STATE_CLOSED].includes(this.issuable.state); return [STATUS_CLOSED, STATE_CLOSED].includes(this.issuable.state);
}, },
statusTooltip() {
return this.issuable.mergedAt ? this.tooltipTitle(this.issuable.mergedAt) : '';
},
timestamp() { timestamp() {
return this.isClosed && this.issuable.closedAt return this.isClosed && this.issuable.closedAt
? this.issuable.closedAt ? this.issuable.closedAt
@ -495,7 +498,12 @@ export default {
<ul v-if="showIssuableMeta" class="controls gl-gap-3"> <ul v-if="showIssuableMeta" class="controls gl-gap-3">
<!-- eslint-disable-next-line @gitlab/vue-prefer-dollar-scopedslots --> <!-- eslint-disable-next-line @gitlab/vue-prefer-dollar-scopedslots -->
<li v-if="$slots.status" data-testid="issuable-status" class="!gl-mr-0"> <li v-if="$slots.status" data-testid="issuable-status" class="!gl-mr-0">
<gl-badge v-if="!isOpen" :variant="statusBadgeVariant"> <gl-badge
v-if="!isOpen"
v-gl-tooltip.top
:variant="statusBadgeVariant"
:title="statusTooltip"
>
<slot name="status"></slot> <slot name="status"></slot>
</gl-badge> </gl-badge>
<slot v-else name="status"></slot> <slot v-else name="status"></slot>

View File

@ -2,10 +2,6 @@
module Admin module Admin
class SlacksController < Admin::ApplicationController class SlacksController < Admin::ApplicationController
before_action do
render_404 if Feature.disabled?(:gitlab_for_slack_app_instance_and_group_level, type: :beta)
end
include ::Integrations::SlackControllerSettings include ::Integrations::SlackControllerSettings
private private

View File

@ -5,10 +5,6 @@ module Groups
class SlacksController < Groups::ApplicationController class SlacksController < Groups::ApplicationController
before_action :authorize_admin_group! before_action :authorize_admin_group!
before_action do
render_404 if Feature.disabled?(:gitlab_for_slack_app_instance_and_group_level, type: :beta)
end
include ::Integrations::SlackControllerSettings include ::Integrations::SlackControllerSettings
layout 'group_settings' layout 'group_settings'

View File

@ -228,8 +228,7 @@ module Integrations
def integration_names def integration_names
names = INTEGRATION_NAMES.dup names = INTEGRATION_NAMES.dup
unless Feature.enabled?(:gitlab_for_slack_app_instance_and_group_level, type: :beta) && # rubocop:disable Gitlab/FeatureFlagWithoutActor -- existing code moved as is unless Gitlab::CurrentSettings.slack_app_enabled || Gitlab.dev_or_test_env?
(Gitlab::CurrentSettings.slack_app_enabled || Gitlab.dev_or_test_env?)
names.delete('gitlab_slack_application') names.delete('gitlab_slack_application')
end end
@ -251,14 +250,7 @@ module Integrations
end end
def project_specific_integration_names def project_specific_integration_names
names = PROJECT_LEVEL_ONLY_INTEGRATION_NAMES.dup PROJECT_LEVEL_ONLY_INTEGRATION_NAMES.dup
if Feature.disabled?(:gitlab_for_slack_app_instance_and_group_level, type: :beta) && # rubocop:disable Gitlab/FeatureFlagWithoutActor -- existing code moved as is
(Gitlab::CurrentSettings.slack_app_enabled || Gitlab.dev_or_test_env?)
names << 'gitlab_slack_application'
end
names
end end
def project_and_group_specific_integration_names def project_and_group_specific_integration_names

View File

@ -236,8 +236,7 @@ module Import
health_context = Gitlab::Database::HealthStatus::Context.new( health_context = Gitlab::Database::HealthStatus::Context.new(
DatabaseHealthStatusChecker.new(import_source_user.id, self.class.name), DatabaseHealthStatusChecker.new(import_source_user.id, self.class.name),
nil, nil,
[model.table_name], [model.table_name]
nil
) )
stop_signal = Gitlab::Database::HealthStatus stop_signal = Gitlab::Database::HealthStatus
@ -253,8 +252,7 @@ module Import
health_context = Gitlab::Database::HealthStatus::Context.new( health_context = Gitlab::Database::HealthStatus::Context.new(
DatabaseHealthStatusChecker.new(import_source_user.id, self.class.name), DatabaseHealthStatusChecker.new(import_source_user.id, self.class.name),
Gitlab::Database.schemas_to_base_models[gitlab_schema].first, Gitlab::Database.schemas_to_base_models[gitlab_schema].first,
nil, nil
gitlab_schema
) )
Gitlab::Database::HealthStatus Gitlab::Database::HealthStatus

View File

@ -17,8 +17,7 @@ module Integrations
bulk_insert_data_fields(inserted_ids) if integration.data_fields_present? bulk_insert_data_fields(inserted_ids) if integration.data_fields_present?
if integration.is_a?(GitlabSlackApplication) && integration.active? && if integration.is_a?(GitlabSlackApplication) && integration.active?
Feature.enabled?(:gitlab_for_slack_app_instance_and_group_level, type: :beta)
inserted_slack_ids = bulk_insert_slack_integrations(inserted_ids) inserted_slack_ids = bulk_insert_slack_integrations(inserted_ids)
bulk_insert_slack_integration_scopes(inserted_slack_ids) bulk_insert_slack_integration_scopes(inserted_slack_ids)
end end

View File

@ -22,9 +22,8 @@ module Integrations
) )
end end
if integration.is_a?(GitlabSlackApplication) && if integration.is_a?(GitlabSlackApplication)
Feature.enabled?(:gitlab_for_slack_app_instance_and_group_level, type: :beta) if integration.active?
if integration.active? # rubocop: disable Cop/LineBreakAroundConditionalBlock -- Misidentified
bulk_update_slack_integrations bulk_update_slack_integrations
else else
bulk_delete_slack_integrations bulk_delete_slack_integrations

View File

@ -6,5 +6,4 @@
%p %p
= s_("SlackIntegration|See the list of available commands in Slack after setting up this integration by entering") = s_("SlackIntegration|See the list of available commands in Slack after setting up this integration by entering")
%kbd.gl-inline-block /gitlab help %kbd.gl-inline-block /gitlab help
- if integration.project_level? || Feature.enabled?(:gitlab_for_slack_app_instance_and_group_level, type: :beta)
= render "shared/integrations/#{integration.to_param}/slack_integration_form", integration: integration = render "shared/integrations/#{integration.to_param}/slack_integration_form", integration: integration

View File

@ -1,9 +0,0 @@
---
name: gitlab_for_slack_app_instance_and_group_level
feature_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/391526
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/142868
rollout_issue_url: https://gitlab.com/gitlab-com/gl-infra/production/-/issues/17410
milestone: '16.10'
group: group::import and integrate
type: beta
default_enabled: true

View File

@ -74,11 +74,7 @@ To use Slash commands for a project, configure the [GitLab for Slack app](../../
> - Installation for a specific instance [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/391526) in GitLab 16.10 [with a flag](../../administration/feature_flags.md) named `gitlab_for_slack_app_instance_and_group_level`. Disabled by default. > - Installation for a specific instance [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/391526) in GitLab 16.10 [with a flag](../../administration/feature_flags.md) named `gitlab_for_slack_app_instance_and_group_level`. Disabled by default.
> - [Enabled on GitLab.com, self-managed, and GitLab Dedicated](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/147820) in GitLab 16.11. > - [Enabled on GitLab.com, self-managed, and GitLab Dedicated](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/147820) in GitLab 16.11.
> - [Generally available](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/175803) in GitLab 17.8. Feature flag `gitlab_for_slack_app_instance_and_group_level` removed.
FLAG:
On self-managed GitLab, by default this feature is available.
To hide the feature, an administrator can [disable the feature flag](../../administration/feature_flags.md) named `gitlab_for_slack_app_instance_and_group_level`.
On GitLab.com and GitLab Dedicated, this feature is available.
Prerequisites: Prerequisites:

View File

@ -31540,7 +31540,7 @@ Project-level settings for product analytics provider.
| <a id="projectrequestaccessenabled"></a>`requestAccessEnabled` | [`Boolean`](#boolean) | Indicates if users can request member access to the project. | | <a id="projectrequestaccessenabled"></a>`requestAccessEnabled` | [`Boolean`](#boolean) | Indicates if users can request member access to the project. |
| <a id="projectrequirementstatescount"></a>`requirementStatesCount` | [`RequirementStatesCount`](#requirementstatescount) | Number of requirements for the project by their state. | | <a id="projectrequirementstatescount"></a>`requirementStatesCount` | [`RequirementStatesCount`](#requirementstatescount) | Number of requirements for the project by their state. |
| <a id="projectsastciconfiguration"></a>`sastCiConfiguration` | [`SastCiConfiguration`](#sastciconfiguration) | SAST CI configuration for the project. | | <a id="projectsastciconfiguration"></a>`sastCiConfiguration` | [`SastCiConfiguration`](#sastciconfiguration) | SAST CI configuration for the project. |
| <a id="projectsavedreplies"></a>`savedReplies` **{warning-solid}** | [`ProjectSavedReplyConnection`](#projectsavedreplyconnection) | **Introduced** in GitLab 16.11. **Status**: Experiment. Saved replies available to the project. Available only when feature flag `project_saved_replies_flag` is enabled. | | <a id="projectsavedreplies"></a>`savedReplies` | [`ProjectSavedReplyConnection`](#projectsavedreplyconnection) | Saved replies available to the project. (see [Connections](#connections)) |
| <a id="projectsecuritydashboardpath"></a>`securityDashboardPath` | [`String`](#string) | Path to project's security dashboard. | | <a id="projectsecuritydashboardpath"></a>`securityDashboardPath` | [`String`](#string) | Path to project's security dashboard. |
| <a id="projectsecuritypolicyproject"></a>`securityPolicyProject` | [`Project`](#project) | Security policy project assigned to the project, absent if assigned to a parent group. | | <a id="projectsecuritypolicyproject"></a>`securityPolicyProject` | [`Project`](#project) | Security policy project assigned to the project, absent if assigned to a parent group. |
| <a id="projectsecuritypolicyprojectlinkedgroups"></a>`securityPolicyProjectLinkedGroups` | [`GroupConnection`](#groupconnection) | Groups linked to the project, when used as Security Policy Project. (see [Connections](#connections)) | | <a id="projectsecuritypolicyprojectlinkedgroups"></a>`securityPolicyProjectLinkedGroups` | [`GroupConnection`](#groupconnection) | Groups linked to the project, when used as Security Policy Project. (see [Connections](#connections)) |
@ -33080,11 +33080,7 @@ four standard [pagination arguments](#pagination-arguments):
##### `Project.savedReply` ##### `Project.savedReply`
Saved reply in the project. Available only when feature flag `group_saved_replies_flag` is enabled. Saved reply in the project.
DETAILS:
**Introduced** in GitLab 16.11.
**Status**: Experiment.
Returns [`ProjectSavedReply`](#projectsavedreply). Returns [`ProjectSavedReply`](#projectsavedreply).

View File

@ -197,7 +197,7 @@ To remove a merge request from a merge train:
## Skip the merge train and merge immediately ## Skip the merge train and merge immediately
If you have a high-priority merge request, like a critical patch that must If you have a high-priority merge request, like a critical patch that must
be merged urgently, you can select **Merge Immediately**. be merged urgently, you can select **Merge immediately**.
When you merge a merge request immediately: When you merge a merge request immediately:

View File

@ -188,3 +188,13 @@ Ensure that:
If access issues persist, check that authentication is correctly configured, and that the health check passes. If access issues persist, check that authentication is correctly configured, and that the health check passes.
In case of persistent issues, the error message may suggest bypassing authentication with `AIGW_AUTH__BYPASS_EXTERNAL=true`, but only do this for troubleshooting. In case of persistent issues, the error message may suggest bypassing authentication with `AIGW_AUTH__BYPASS_EXTERNAL=true`, but only do this for troubleshooting.
You can also run a [health check](../user/gitlab_duo/setup.md#run-a-health-check-for-gitlab-duo) by going to **Admin > GitLab Duo**.
These tests are performed for offline environments:
| Test | Description |
|-----------------|-------------|
| Network | Tests whether: <br>- The environment variable `AI_GATEWAY_URL` has been set to a valid URL.<br> - Your instance can connect to the URL specified by `AI_GATEWAY_URL`.<br><br>If your instance cannot connect to the URL, ensure that your firewall or proxy server settings [allow connection](../user/gitlab_duo/setup.md). |
| License | Tests whether your license has the ability to access Code Suggestions feature. |
| System exchange | Tests whether Code Suggestions can be used in your instance. If the system exchange assessment fails, users might not be able to use GitLab Duo features. |

View File

@ -41,8 +41,8 @@ Prerequisites:
- You must have the Owner role. - You must have the Owner role.
1. On the left sidebar, select **Search or go to** and find your group. 1. On the left sidebar, select **Search or go to** and find your group.
1. Select **Settings > Usage Quotas**. 1. Select **Settings > GitLab Duo**.
1. Select the **GitLab Duo** tab. 1. By **Seat utilization**, select **Assign seats**.
1. Select **Add seats**. 1. Select **Add seats**.
1. In the Customers Portal, in the **Add additional seats** field, enter the number of seats. The amount 1. In the Customers Portal, in the **Add additional seats** field, enter the number of seats. The amount
cannot be higher than the number of seats in the subscription associated with your group namespace. cannot be higher than the number of seats in the subscription associated with your group namespace.
@ -85,7 +85,7 @@ To use GitLab Duo features in any project or group, you must assign the user to
1. On the left sidebar, select **Search or go to** and find your group. 1. On the left sidebar, select **Search or go to** and find your group.
1. Select **Settings > GitLab Duo**. 1. Select **Settings > GitLab Duo**.
1. Select **Assign seats** on the **Seat utilization** card. 1. By **Seat utilization**, select **Assign seats**.
1. To the right of the user, turn on the toggle to assign a GitLab Duo seat. 1. To the right of the user, turn on the toggle to assign a GitLab Duo seat.
The user is sent a confirmation email. The user is sent a confirmation email.
@ -103,7 +103,7 @@ Prerequisites:
1. On the left sidebar, select **Subscription**. 1. On the left sidebar, select **Subscription**.
1. In **Subscription details**, to the right of **Last sync**, select 1. In **Subscription details**, to the right of **Last sync**, select
synchronize subscription (**{retry}**). synchronize subscription (**{retry}**).
1. Select **Assign seats** on the **Seat utilization** card. 1. By **Seat utilization**, select **Assign seats**.
1. To the right of the user, turn on the toggle to assign a GitLab Duo seat. 1. To the right of the user, turn on the toggle to assign a GitLab Duo seat.
The user is sent a confirmation email. The user is sent a confirmation email.
@ -167,7 +167,7 @@ Prerequisites:
1. On the left sidebar, select **Search or go to** and find your group. 1. On the left sidebar, select **Search or go to** and find your group.
1. Select **Settings > GitLab Duo**. 1. Select **Settings > GitLab Duo**.
1. Select **Assign seats** on the **Seat utilization** card. 1. By **Seat utilization**, select **Assign seats**.
1. From the filter bar, select **Assigned seat** and **Yes**. 1. From the filter bar, select **Assigned seat** and **Yes**.
1. User list is filtered to only users assigned a GitLab Duo seat. 1. User list is filtered to only users assigned a GitLab Duo seat.
@ -185,7 +185,7 @@ Prerequisites:
1. On the left sidebar, select **Subscription**. 1. On the left sidebar, select **Subscription**.
1. In **Subscription details**, to the right of **Last sync**, select 1. In **Subscription details**, to the right of **Last sync**, select
synchronize subscription (**{retry}**). synchronize subscription (**{retry}**).
1. Select **Assign seats** on the **Seat utilization** card. 1. By **Seat utilization**, select **Assign seats**.
1. To filter by users assigned to a GitLab Duo seat, in the **Filter users** bar, select **Assigned seat**, then select **Yes**. 1. To filter by users assigned to a GitLab Duo seat, in the **Filter users** bar, select **Assigned seat**, then select **Yes**.
1. User list is filtered to only users assigned a GitLab Duo seat. 1. User list is filtered to only users assigned a GitLab Duo seat.

View File

@ -30,7 +30,7 @@ GitLab Advanced SAST finds the following types of weaknesses in each programming
<!-- Table contents are automatically produced by a job in https://gitlab.com/gitlab-org/security-products/oxeye/product/oxeye-rulez. --> <!-- Table contents are automatically produced by a job in https://gitlab.com/gitlab-org/security-products/oxeye/product/oxeye-rulez. -->
| CWE | CWE Description | C# | Go | Java | JavaScript, TypeScript | Python | Ruby | | CWE | CWE Description | C# | Go | Java | JavaScript, TypeScript | Python | Ruby |
|:-------------------------------------------------------------|:-----------------------------------------------------------------------------------------------------------------------|:-----------------------|:-----------------------|:-----------------------|:-------------------------|:-----------------------|:-----------------------| |:-------------------------------------------------------------|:-----------------------------------------------------------------------------------------------------------------------|:-----------------------|:-----------------------|:-----------------------|:-----------------------|:-----------------------|:-----------------------|
| [CWE-15](https://cwe.mitre.org/data/definitions/15.html) | External Control of System or Configuration Setting | **{dotted-circle}** No | **{dotted-circle}** No | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No | **{dotted-circle}** No | | [CWE-15](https://cwe.mitre.org/data/definitions/15.html) | External Control of System or Configuration Setting | **{dotted-circle}** No | **{dotted-circle}** No | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No | **{dotted-circle}** No |
| [CWE-22](https://cwe.mitre.org/data/definitions/22.html) | Improper Limitation of a Pathname to a Restricted Directory ('Path Traversal') | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | | [CWE-22](https://cwe.mitre.org/data/definitions/22.html) | Improper Limitation of a Pathname to a Restricted Directory ('Path Traversal') | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes |
| [CWE-23](https://cwe.mitre.org/data/definitions/23.html) | Relative Path Traversal | **{dotted-circle}** No | **{dotted-circle}** No | **{dotted-circle}** No | **{check-circle}** Yes | **{check-circle}** Yes | **{dotted-circle}** No | | [CWE-23](https://cwe.mitre.org/data/definitions/23.html) | Relative Path Traversal | **{dotted-circle}** No | **{dotted-circle}** No | **{dotted-circle}** No | **{check-circle}** Yes | **{check-circle}** Yes | **{dotted-circle}** No |
@ -48,6 +48,7 @@ GitLab Advanced SAST finds the following types of weaknesses in each programming
| [CWE-95](https://cwe.mitre.org/data/definitions/95.html) | Improper Neutralization of Directives in Dynamically Evaluated Code ('Eval Injection') | **{dotted-circle}** No | **{dotted-circle}** No | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | | [CWE-95](https://cwe.mitre.org/data/definitions/95.html) | Improper Neutralization of Directives in Dynamically Evaluated Code ('Eval Injection') | **{dotted-circle}** No | **{dotted-circle}** No | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes |
| [CWE-113](https://cwe.mitre.org/data/definitions/113.html) | Improper Neutralization of CRLF Sequences in HTTP Headers ('HTTP Request/Response Splitting') | **{dotted-circle}** No | **{dotted-circle}** No | **{check-circle}** Yes | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No | | [CWE-113](https://cwe.mitre.org/data/definitions/113.html) | Improper Neutralization of CRLF Sequences in HTTP Headers ('HTTP Request/Response Splitting') | **{dotted-circle}** No | **{dotted-circle}** No | **{check-circle}** Yes | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No |
| [CWE-116](https://cwe.mitre.org/data/definitions/116.html) | Improper Encoding or Escaping of Output | **{dotted-circle}** No | **{dotted-circle}** No | **{dotted-circle}** No | **{check-circle}** Yes | **{check-circle}** Yes | **{dotted-circle}** No | | [CWE-116](https://cwe.mitre.org/data/definitions/116.html) | Improper Encoding or Escaping of Output | **{dotted-circle}** No | **{dotted-circle}** No | **{dotted-circle}** No | **{check-circle}** Yes | **{check-circle}** Yes | **{dotted-circle}** No |
| [CWE-117](https://cwe.mitre.org/data/definitions/117.html) | Improper Output Neutralization for Logs | **{dotted-circle}** No | **{dotted-circle}** No | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No | **{dotted-circle}** No |
| [CWE-118](https://cwe.mitre.org/data/definitions/118.html) | Incorrect Access of Indexable Resource ('Range Error') | **{dotted-circle}** No | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No | **{dotted-circle}** No | **{dotted-circle}** No | | [CWE-118](https://cwe.mitre.org/data/definitions/118.html) | Incorrect Access of Indexable Resource ('Range Error') | **{dotted-circle}** No | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No | **{dotted-circle}** No | **{dotted-circle}** No |
| [CWE-125](https://cwe.mitre.org/data/definitions/125.html) | Out-of-bounds Read | **{dotted-circle}** No | **{dotted-circle}** No | **{dotted-circle}** No | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No | | [CWE-125](https://cwe.mitre.org/data/definitions/125.html) | Out-of-bounds Read | **{dotted-circle}** No | **{dotted-circle}** No | **{dotted-circle}** No | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No |
| [CWE-134](https://cwe.mitre.org/data/definitions/134.html) | Use of Externally-Controlled Format String | **{dotted-circle}** No | **{dotted-circle}** No | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No | **{dotted-circle}** No | | [CWE-134](https://cwe.mitre.org/data/definitions/134.html) | Use of Externally-Controlled Format String | **{dotted-circle}** No | **{dotted-circle}** No | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No | **{dotted-circle}** No |
@ -80,6 +81,7 @@ GitLab Advanced SAST finds the following types of weaknesses in each programming
| [CWE-369](https://cwe.mitre.org/data/definitions/369.html) | Divide By Zero | **{dotted-circle}** No | **{dotted-circle}** No | **{dotted-circle}** No | **{dotted-circle}** No | **{dotted-circle}** No | **{check-circle}** Yes | | [CWE-369](https://cwe.mitre.org/data/definitions/369.html) | Divide By Zero | **{dotted-circle}** No | **{dotted-circle}** No | **{dotted-circle}** No | **{dotted-circle}** No | **{dotted-circle}** No | **{check-circle}** Yes |
| [CWE-377](https://cwe.mitre.org/data/definitions/377.html) | Insecure Temporary File | **{dotted-circle}** No | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No | **{check-circle}** Yes | **{dotted-circle}** No | | [CWE-377](https://cwe.mitre.org/data/definitions/377.html) | Insecure Temporary File | **{dotted-circle}** No | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No | **{check-circle}** Yes | **{dotted-circle}** No |
| [CWE-409](https://cwe.mitre.org/data/definitions/409.html) | Improper Handling of Highly Compressed Data (Data Amplification) | **{dotted-circle}** No | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No | **{dotted-circle}** No | **{dotted-circle}** No | | [CWE-409](https://cwe.mitre.org/data/definitions/409.html) | Improper Handling of Highly Compressed Data (Data Amplification) | **{dotted-circle}** No | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No | **{dotted-circle}** No | **{dotted-circle}** No |
| [CWE-470](https://cwe.mitre.org/data/definitions/470.html) | Use of Externally-Controlled Input to Select Classes or Code ('Unsafe Reflection') | **{dotted-circle}** No | **{dotted-circle}** No | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No | **{dotted-circle}** No |
| [CWE-489](https://cwe.mitre.org/data/definitions/489.html) | Active Debug Code | **{dotted-circle}** No | **{check-circle}** Yes | **{check-circle}** Yes | **{dotted-circle}** No | **{check-circle}** Yes | **{dotted-circle}** No | | [CWE-489](https://cwe.mitre.org/data/definitions/489.html) | Active Debug Code | **{dotted-circle}** No | **{check-circle}** Yes | **{check-circle}** Yes | **{dotted-circle}** No | **{check-circle}** Yes | **{dotted-circle}** No |
| [CWE-502](https://cwe.mitre.org/data/definitions/502.html) | Deserialization of Untrusted Data | **{check-circle}** Yes | **{dotted-circle}** No | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | | [CWE-502](https://cwe.mitre.org/data/definitions/502.html) | Deserialization of Untrusted Data | **{check-circle}** Yes | **{dotted-circle}** No | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes |
| [CWE-521](https://cwe.mitre.org/data/definitions/521.html) | Weak Password Requirements | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No | **{dotted-circle}** No | **{dotted-circle}** No | **{dotted-circle}** No | | [CWE-521](https://cwe.mitre.org/data/definitions/521.html) | Weak Password Requirements | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No | **{dotted-circle}** No | **{dotted-circle}** No | **{dotted-circle}** No |

View File

@ -131,9 +131,11 @@ By default the scanner pod's default resource requirements are:
requests: requests:
cpu: 100m cpu: 100m
memory: 100Mi memory: 100Mi
ephemeral_storage: 1Gi
limits: limits:
cpu: 500m cpu: 500m
memory: 500Mi memory: 500Mi
ephemeral_storage: 3Gi
``` ```
You can customize it with a `resource_requirements` field. You can customize it with a `resource_requirements` field.
@ -144,15 +146,19 @@ container_scanning:
requests: requests:
cpu: '0.2' cpu: '0.2'
memory: 200Mi memory: 200Mi
ephemeral_storage: 2Gi
limits: limits:
cpu: '0.7' cpu: '0.7'
memory: 700Mi memory: 700Mi
ephemeral_storage: 4Gi
``` ```
When using a fractional value for CPU, format the value as a string. When using a fractional value for CPU, format the value as a string.
NOTE: NOTE:
Resource requirements can only be set up using the agent configuration. If you enabled `Operational Container Scanning` through `scan execution policies`, you would need to define the resource requirements within the agent configuration file.
- Resource requirements can only be set by using the agent configuration. If you enabled Operational Container Scanning through scan execution policies and need to configure resource requirements, you should do so via the agent configuration file.
- When using Google Kubernetes Engine (GKE) for Kubernetes orchestration, [the ephemeral storage limit value will always be set to equal the request value](https://cloud.google.com/kubernetes-engine/docs/concepts/autopilot-resource-requests#resource-limits). This is enforced by GKE.
## Custom repository for Trivy K8s Wrapper ## Custom repository for Trivy K8s Wrapper
@ -237,6 +243,14 @@ OCS might fail with an OOM error if there are too many resources to be scanned o
To resolve this, [configure the resource requirement](#configure-scanner-resource-requirements) to increase the amount of memory available. To resolve this, [configure the resource requirement](#configure-scanner-resource-requirements) to increase the amount of memory available.
### `Pod ephemeral local storage usage exceeds the total limit of containers`
OCS scans could fail for Kubernetes clusters that have low default ephemeral storage. For example, [GKE autopilot](https://cloud.google.com/kubernetes-engine/docs/concepts/autopilot-resource-requests#defaults) sets the default ephemeral storage to 1GB. This is an issue for OCS when scanning namespaces with large images, as there may not be enough space to store all data necessary for OCS.
To resolve this, [configure the resource requirement](#configure-scanner-resource-requirements) to increase the amount of ephemeral storage available.
Another message indicative of this issue may be: `OCS Scanning pod evicted due to low resources. Please configure higher resource limits.`
### `Error running Trivy scan due to context timeout` ### `Error running Trivy scan due to context timeout`
OCS might fail to complete a scan if it takes Trivy too long to complete the scan. The default scan timeout is 5 minutes, with an extra 15 minutes for the agent to read the results and transmit the vulnerabilities. OCS might fail to complete a scan if it takes Trivy too long to complete the scan. The default scan timeout is 5 minutes, with an extra 15 minutes for the agent to read the results and transmit the vulnerabilities.

View File

@ -32,7 +32,7 @@ For more information, see:
- [Features included in Duo Pro and Duo Enterprise](https://about.gitlab.com/gitlab-duo/#pricing). - [Features included in Duo Pro and Duo Enterprise](https://about.gitlab.com/gitlab-duo/#pricing).
- [List of GitLab Duo features and their language models](../gitlab_duo/index.md). - [List of GitLab Duo features and their language models](../gitlab_duo/index.md).
- [Self-hosted models](../../administration/self_hosted_models/index.md). - [Self-hosted models](../../administration/self_hosted_models/index.md).
- [Health check details](../gitlab_duo/turn_on_off.md#run-a-health-check-for-gitlab-duo). - [Health check details](../gitlab_duo/setup.md#run-a-health-check-for-gitlab-duo).
## Step 2: Try Duo Chat in the UI ## Step 2: Try Duo Chat in the UI

View File

@ -0,0 +1,99 @@
---
stage: AI-powered
group: AI Framework
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
---
# Configure GitLab Duo on a self-managed instance
DETAILS:
**Offering:** Self-managed, GitLab Dedicated
**Tier:** Premium, Ultimate
GitLab Duo is powered by large language models (LLMs), with data sent through an AI gateway.
To use GitLab Duo on a self-managed instance, you can:
1. Use the LLMs and the cloud-based AI gateway that's hosted by GitLab. This option is the default.
1. [Use LLMs from the supported list and self-host the AI gateway and LLMs](../../administration/self_hosted_models/index.md).
This option provides full control over your data and security.
This page focuses on how to configure a self-managed instance if you're using the default, GitLab-hosted option.
## Prerequisites
- You must ensure both [outbound](#allow-outbound-connections-from-the-gitlab-instance)
and [inbound](#allow-inbound-connections-from-clients-to-the-gitlab-instance) connectivity exists.
Network firewalls can cause lag or delay.
- [Silent Mode](../../administration/silent_mode/index.md) must not be turned on.
- You must [activate your instance with an activation code](../../administration/license.md#activate-gitlab-ee).
- GitLab Duo requires GitLab 17.2 and later for the best user experience and results. Earlier versions may continue to work, however the experience may be degraded.
GitLab Duo features that are experimental or beta are turned off by default
and [must be turned on](turn_on_off.md#turn-on-beta-and-experimental-features).
## Allow outbound connections from the GitLab instance
Check both your outbound and inbound settings:
- 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://`.
These hosts are protected by Cloudflare. Update your firewall settings to allow traffic to
all IP addresses in the [list of IP ranges Cloudflare publishes](https://www.cloudflare.com/ips/).
- 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.
- In multi-node GitLab installations, configure the HTTP/S proxy on all **Rails** and **Sidekiq** nodes.
## Allow inbound connections from clients to the GitLab instance
- GitLab instances must allow inbound connections from Duo clients ([IDEs](../../editor_extensions/index.md),
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.
- If you use reverse proxies, such as Apache, you might see GitLab Duo Chat connection issues in your
logs, like **WebSocket connection to .... failures**.
To resolve this problem, try editing your Apache proxy settings:
```apache
# Enable WebSocket reverse Proxy
# Needs proxy_wstunnel enabled
RewriteCond %{HTTP:Upgrade} websocket [NC]
RewriteCond %{HTTP:Connection} upgrade [NC]
RewriteRule ^/?(.*) "ws://127.0.0.1:8181/$1" [P,L]
```
## Run a health check for GitLab Duo
DETAILS:
**Status:** Beta
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/161997) in GitLab 17.3.
> - [Download health check report added](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/165032) in GitLab 17.5.
You can determine if your instance meets the requirements to use GitLab Duo.
When the health check completes, it displays a pass or fail result and the types of issues.
If the health check fails any of the tests, users might not be able to use GitLab Duo features in your instance.
This is a [beta](../../policy/development_stages_support.md) feature.
Prerequisites:
- You must be an administrator.
To run a health check:
1. On the left sidebar, at the bottom, select **Admin**.
1. Select **GitLab Duo**.
1. On the upper-right corner, select **Run health check**.
1. Optional. In GitLab 17.5 and later, after the health check is complete, you can select **Download report** to save a detailed report of the health check results.
These tests are performed:
| Test | Description |
|-----------------|-------------|
| Network | Tests whether your instance can connect to `customers.gitlab.com` and `cloud.gitlab.com`.<br><br>If your instance cannot connect to either destination, ensure that your firewall or proxy server settings [allow connection](setup.md). |
| Synchronization | Tests whether your subscription: <br>- Has been activated with an activation code and can be synchronized with `customers.gitlab.com`.<br>- Has correct access credentials.<br>- Has been synchronized recently. If it hasn't or the access credentials are missing or expired, you can [manually synchronize](../../subscriptions/self_managed/index.md#manually-synchronize-subscription-data) your subscription data. |
| System exchange | Tests whether Code Suggestions can be used in your instance. If the system exchange assessment fails, users might not be able to use GitLab Duo features. |

View File

@ -0,0 +1,96 @@
---
stage: AI-powered
group: AI Framework
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
---
# Troubleshooting GitLab Duo
When working with GitLab Duo, you might encounter issues.
Start by [running a health check](setup.md#run-a-health-check-for-gitlab-duo)
to determine if your instance meets the requirements to use GitLab Duo.
If the health check does not resolve your problem, review these troubleshooting steps.
## GitLab Duo features do not work on self-managed
In addition to [ensuring GitLab Duo features are turned on](turn_on_off.md),
you can also do the following:
1. As administrator, run a health check for GitLab Duo.
::Tabs
:::TabTitle In 17.5 and later
In GitLab 17.5 and later, you can use the UI to run health checks and download a detailed report that helps identify and troubleshoot issues.
:::TabTitle In 17.4
In GitLab 17.4, you can run the health check Rake task to generate a detailed report that helps identify and troubleshoot issues.
```shell
sudo gitlab-rails 'cloud_connector:health_check(root,report.json)'
```
:::TabTitle In 17.3 and earlier
In GitLab 17.3 and earlier, you can download and run the `health_check` script to generate a detailed report that helps identify and troubleshoot issues.
1. Download the health check script:
```shell
wget https://gitlab.com/gitlab-org/gitlab/-/snippets/3734617/raw/main/health_check.rb
```
1. Run the script using Rails Runner:
```shell
gitlab-rails runner [full_path/to/health_check.rb] --debug --username [username] --output-file [report.txt]
```
```shell
Usage: gitlab-rails runner full_path/to/health_check.rb
--debug Enable debug mode
--output-file FILE Write a report to FILE
--username USERNAME Provide a username to test seat assignments
--skip [CHECK] Skip specific check (options: access_data, token, license, host, features, end_to_end)
```
::EndTabs
1. Verify that the GitLab instance can reach the [required GitLab.com endpoints](setup.md).
You can use command-line tools such as `curl` to verify the connectivity.
```shell
curl --verbose "https://cloud.gitlab.com"
curl --verbose "https://customers.gitlab.com"
```
If an HTTP/S proxy is configured for the GitLab instance, include the `proxy` parameter in the `curl` command.
```shell
# https proxy for curl
curl --verbose --proxy "http://USERNAME:PASSWORD@example.com:8080" "https://cloud.gitlab.com"
curl --verbose --proxy "http://USERNAME:PASSWORD@example.com:8080" "https://customers.gitlab.com"
```
1. Optional. If you are using a [proxy server](setup.md#allow-outbound-connections-from-the-gitlab-instance) between the GitLab
application and the public internet,
[disable DNS rebinding protection](../../security/webhooks.md#enforce-dns-rebinding-attack-protection).
1. [Manually synchronize subscription data](../../subscriptions/self_managed/index.md#manually-synchronize-subscription-data).
- Verify that the GitLab instance [synchronizes your subscription data with GitLab](https://about.gitlab.com/pricing/licensing-faq/cloud-licensing/).
## GitLab Duo features not available for users
In addition to [turning on GitLab Duo features](turn_on_off.md),
you can also do the following:
1. Verify that [subscription seats have been purchased](../../subscriptions/subscription-add-ons.md#purchase-gitlab-duo).
1. Ensure that [seats are assigned to users](../../subscriptions/subscription-add-ons.md#assign-gitlab-duo-seats).
1. For IDE users with the [GitLab Duo extension](../../user/project/repository/code_suggestions/supported_extensions.md#supported-editor-extensions):
- Verify that the extension is up-to-date.
- Run extension setting health checks, and test the authentication.

View File

@ -11,106 +11,11 @@ info: To determine the technical writer assigned to the Stage/Group associated w
GitLab Duo features that are generally available are automatically turned on for all users that have access. GitLab Duo features that are generally available are automatically turned on for all users that have access.
## Prerequisites - You must have an [GitLab Duo Pro or Enterprise add-on subscription](../../subscriptions/subscription-add-ons.md).
- If you have self-managed GitLab:
- You must [allow connectivity](#configure-gitlab-duo-on-a-self-managed-instance).
- [Silent Mode](../../administration/silent_mode/index.md) must not be turned on.
- You must [activate your instance with an activation code](../../administration/license.md#activate-gitlab-ee).
- GitLab Duo requires GitLab 17.2 and later for the best user experience and results. Earlier versions may continue to work, however the experience may be degraded.
- If you have GitLab Dedicated, you must have [GitLab Duo Pro or Enterprise](../../subscriptions/subscription-add-ons.md).
- For some generally available features, like [Code Suggestions](../project/repository/code_suggestions/index.md), - 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-seats) [you must also assign seats](../../subscriptions/subscription-add-ons.md#assign-gitlab-duo-seats)
to the users you want to have access. to the users you want to have access.
GitLab Duo features that are experimental or beta are turned off by default
and [must be turned on](#turn-on-beta-and-experimental-features).
## Configure GitLab Duo on a self-managed instance
To use GitLab Duo on a self-managed instance, you must ensure both outbound and inbound connectivity exists.
For example, network firewalls can cause lag or delay. Check both your outbound and inbound settings:
### Allow outbound connections from the GitLab instance
- 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://`.
These hosts are protected by Cloudflare. Update your firewall settings to allow traffic to
all IP addresses in the [list of IP ranges Cloudflare publishes](https://www.cloudflare.com/ips/).
- 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.
- In multi-node GitLab installations, configure the HTTP/S proxy on all **Rails** and **Sidekiq** nodes.
### Allow inbound connections from clients to the GitLab instance
- GitLab instances must allow inbound connections from Duo clients ([IDEs](../../editor_extensions/index.md),
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.
- If you use reverse proxies, such as Apache, you might see GitLab Duo Chat connection issues in your logs, like **WebSocket connection to .... failures**.
To resolve this problem, try editing your Apache proxy settings:
```apache
# Enable WebSocket reverse Proxy
# Needs proxy_wstunnel enabled
RewriteCond %{HTTP:Upgrade} websocket [NC]
RewriteCond %{HTTP:Connection} upgrade [NC]
RewriteRule ^/?(.*) "ws://127.0.0.1:8181/$1" [P,L]
```
## Run a health check for GitLab Duo
DETAILS:
**Offering:** Self-managed, GitLab Dedicated
**Tier:** Premium, Ultimate
**Status:** Beta
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/161997) in GitLab 17.3.
> - [Download health check report added](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/165032) in GitLab 17.5.
Run a health check to test if your instance meets the requirements to use GitLab Duo.
When the health check completes, it displays a pass or fail result and the types of issues.
If the health check fails any of the tests, users might not be able to use GitLab Duo features in your instance.
This is a [beta](../../policy/development_stages_support.md) feature.
Prerequisites:
- You must be an administrator.
To run a health check:
1. On the left sidebar, at the bottom, select **Admin**.
1. Select **GitLab Duo**.
1. On the upper-right corner, select **Run health check**.
1. Optional. In GitLab 17.5 and later, after the health check is complete, you can select **Download report** to save a detailed report of the health check results.
### Health check tests
To verify if your instance meets the requirements to use GitLab Duo, the health check performs tests
for online and offline environments.
#### For online environments
| Test | Description |
|-----------------|-------------|
| Network | Tests whether your instance can connect to `customers.gitlab.com` and `cloud.gitlab.com`.<br><br>If your instance cannot connect to either destination, ensure that your firewall or proxy server settings [allow connection](#configure-gitlab-duo-on-a-self-managed-instance). |
| Synchronization | Tests whether your subscription: <br>- Has been activated with an activation code and can be synchronized with `customers.gitlab.com`.<br>- Has correct access credentials.<br>- Has been synchronized recently. If it hasn't or the access credentials are missing or expired, you can [manually synchronize](../../subscriptions/self_managed/index.md#manually-synchronize-subscription-data) your subscription data. |
| System exchange | Tests whether Code Suggestions can be used in your instance. If the system exchange assessment fails, users might not be able to use GitLab Duo features. |
#### For offline environments
| Test | Description |
|-----------------|-------------|
| Network | Tests whether: <br>- The environment variable `AI_GATEWAY_URL` has been set to a valid URL.<br> - Your instance can connect to the URL specified by `AI_GATEWAY_URL`.<br><br>If your instance cannot connect to the URL, ensure that your firewall or proxy server settings [allow connection](#configure-gitlab-duo-on-a-self-managed-instance). |
| License | Tests whether your license has the ability to access Code Suggestions feature. |
| System exchange | Tests whether Code Suggestions can be used in your instance. If the system exchange assessment fails, users might not be able to use GitLab Duo features. |
## Turn off GitLab Duo features ## Turn off GitLab Duo features
You can turn off GitLab Duo for a group, project, or instance. You can turn off GitLab Duo for a group, project, or instance.
@ -259,6 +164,12 @@ To turn off GitLab Duo for an instance:
In GitLab 17.3 and earlier, follow these instructions to turn off GitLab Duo for an instance. In GitLab 17.3 and earlier, follow these instructions to turn off GitLab Duo for an instance.
Prerequisites:
- You must be an administrator.
To turn off GitLab Duo for an instance:
1. On the left sidebar, at the bottom, select **Admin**. 1. On the left sidebar, at the bottom, select **Admin**.
1. Select **Settings > General** 1. Select **Settings > General**
1. Expand **AI-powered features**. 1. Expand **AI-powered features**.
@ -346,87 +257,3 @@ where GitLab Duo Chat is not yet generally available, see the
[GitLab Duo Chat documentation](../gitlab_duo_chat/turn_on_off.md#for-self-managed). [GitLab Duo Chat documentation](../gitlab_duo_chat/turn_on_off.md#for-self-managed).
::EndTabs ::EndTabs
## Troubleshooting
### GitLab Duo features do not work on self-managed
In addition to [turning on GitLab Duo features](turn_on_off.md#prerequisites),
you can also do the following:
1. As administrator, [run a health check for GitLab Duo](#run-a-health-check-for-gitlab-duo).
::Tabs
:::TabTitle In 17.5 and later
In GitLab 17.5 and later, you can use the UI to run health checks and download a detailed report that helps identify and troubleshoot issues.
:::TabTitle In 17.4
In GitLab 17.4, you can run the health check Rake task to generate a detailed report that helps identify and troubleshoot issues.
```shell
sudo gitlab-rails 'cloud_connector:health_check(root,report.json)'
```
:::TabTitle In 17.3 and earlier
In GitLab 17.3 and earlier, you can download and run the `health_check` script to generate a detailed report that helps identify and troubleshoot issues.
1. Download the health check script:
```shell
wget https://gitlab.com/gitlab-org/gitlab/-/snippets/3734617/raw/main/health_check.rb
```
1. Run the script using Rails Runner:
```shell
gitlab-rails runner [full_path/to/health_check.rb] --debug --username [username] --output-file [report.txt]
```
```shell
Usage: gitlab-rails runner full_path/to/health_check.rb
--debug Enable debug mode
--output-file FILE Write a report to FILE
--username USERNAME Provide a username to test seat assignments
--skip [CHECK] Skip specific check (options: access_data, token, license, host, features, end_to_end)
```
::EndTabs
1. Verify that the GitLab instance can reach the [required GitLab.com endpoints](#configure-gitlab-duo-on-a-self-managed-instance).
You can use command-line tools such as `curl` to verify the connectivity.
```shell
curl --verbose "https://cloud.gitlab.com"
curl --verbose "https://customers.gitlab.com"
```
If an HTTP/S proxy is configured for the GitLab instance, include the `proxy` parameter in the `curl` command.
```shell
# https proxy for curl
curl --verbose --proxy "http://USERNAME:PASSWORD@example.com:8080" "https://cloud.gitlab.com"
curl --verbose --proxy "http://USERNAME:PASSWORD@example.com:8080" "https://customers.gitlab.com"
```
1. Optional. If you are using a [proxy server](#allow-outbound-connections-from-the-gitlab-instance) between the GitLab
application and the public internet,
[disable DNS rebinding protection](../../security/webhooks.md#enforce-dns-rebinding-attack-protection).
1. [Manually synchronize subscription data](../../subscriptions/self_managed/index.md#manually-synchronize-subscription-data).
- Verify that the GitLab instance [synchronizes your subscription data with GitLab](https://about.gitlab.com/pricing/licensing-faq/cloud-licensing/).
### GitLab Duo features not available for users
In addition to [turning on GitLab Duo features](turn_on_off.md#prerequisites),
you can also do the following:
1. Verify that [subscription seats have been purchased](../../subscriptions/subscription-add-ons.md#purchase-gitlab-duo).
1. Ensure that [seats are assigned to users](../../subscriptions/subscription-add-ons.md#assign-gitlab-duo-seats).
1. For IDE users with the [GitLab Duo extension](../../user/project/repository/code_suggestions/supported_extensions.md#supported-editor-extensions):
- Verify that the extension is up-to-date.
- Run extension setting health checks, and test the authentication.

View File

@ -27,7 +27,7 @@ Prerequisites:
- GitLab Duo requires GitLab 17.2 and later for the best user experience and results. Earlier versions may continue to work, however the experience may be degraded. - GitLab Duo requires GitLab 17.2 and later for the best user experience and results. Earlier versions may continue to work, however the experience may be degraded.
- You must have a Premium or Ultimate subscription that is [synchronized with GitLab](https://about.gitlab.com/pricing/licensing-faq/cloud-licensing/). To make sure GitLab Duo Chat works immediately, administrators can - You must have a Premium or Ultimate subscription that is [synchronized with GitLab](https://about.gitlab.com/pricing/licensing-faq/cloud-licensing/). To make sure GitLab Duo Chat works immediately, administrators can
[manually synchronize your subscription](#manually-synchronize-your-subscription). [manually synchronize your subscription](#manually-synchronize-your-subscription).
- You must have [enabled network connectivity](../gitlab_duo/turn_on_off.md#configure-gitlab-duo-on-a-self-managed-instance). - You must have [enabled network connectivity](../gitlab_duo/setup.md).
- [Silent Mode](../../administration/silent_mode/index.md) must not be turned on. - [Silent Mode](../../administration/silent_mode/index.md) must not be turned on.
- All of the users in your instance must have the latest version of their IDE extension. - All of the users in your instance must have the latest version of their IDE extension.

View File

@ -18,6 +18,7 @@ DETAILS:
> - Group-level saved replies [enabled](https://gitlab.com/gitlab-org/gitlab/-/issues/440817) on GitLab.com and self-managed in GitLab 16.11. > - Group-level saved replies [enabled](https://gitlab.com/gitlab-org/gitlab/-/issues/440817) on GitLab.com and self-managed in GitLab 16.11.
> - Group-level saved replies [generally available](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/148958) in GitLab 17.0. Feature flag `group_saved_replies_flag` removed. > - Group-level saved replies [generally available](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/148958) in GitLab 17.0. Feature flag `group_saved_replies_flag` removed.
> - Project-level saved replies [introduced](https://gitlab.com/groups/gitlab-org/-/epics/12669) in GitLab 17.0 [with a flag](../../administration/feature_flags.md) named `project_saved_replies_flag`. Enabled by default. > - Project-level saved replies [introduced](https://gitlab.com/groups/gitlab-org/-/epics/12669) in GitLab 17.0 [with a flag](../../administration/feature_flags.md) named `project_saved_replies_flag`. Enabled by default.
> - [Generally available](https://gitlab.com/gitlab-org/gitlab/-/issues/504028) in GitLab 17.7. Feature flag `project_saved_replies_flag` removed.
FLAG: FLAG:
The availability of Project-level saved replies is controlled by a feature flag. The availability of Project-level saved replies is controlled by a feature flag.

View File

@ -34,11 +34,7 @@ Although functionality has not changed, you should [reinstall the app](#reinstal
> - Installation at the group level [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/391526) in GitLab 16.10 [with a flag](../../../administration/feature_flags.md) named `gitlab_for_slack_app_instance_and_group_level`. Disabled by default. > - Installation at the group level [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/391526) in GitLab 16.10 [with a flag](../../../administration/feature_flags.md) named `gitlab_for_slack_app_instance_and_group_level`. Disabled by default.
> - [Enabled on GitLab.com, self-managed, and GitLab Dedicated](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/147820) in GitLab 16.11. > - [Enabled on GitLab.com, self-managed, and GitLab Dedicated](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/147820) in GitLab 16.11.
> - [Generally available](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/175803) in GitLab 17.8. Feature flag `gitlab_for_slack_app_instance_and_group_level` removed.
FLAG:
On self-managed GitLab, by default this feature is available.
To hide the feature, an administrator can [disable the feature flag](../../../administration/feature_flags.md) named `gitlab_for_slack_app_instance_and_group_level`.
On GitLab.com and GitLab Dedicated, this feature is available.
To install the GitLab for Slack app from the project or group settings: To install the GitLab for Slack app from the project or group settings:
@ -200,11 +196,7 @@ The following GitLab events can trigger notifications in Slack:
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/391526) in GitLab 16.10 [with a flag](../../../administration/feature_flags.md) named `gitlab_for_slack_app_instance_and_group_level`. Disabled by default. > - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/391526) in GitLab 16.10 [with a flag](../../../administration/feature_flags.md) named `gitlab_for_slack_app_instance_and_group_level`. Disabled by default.
> - [Enabled on GitLab.com, self-managed, and GitLab Dedicated](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/147820) in GitLab 16.11. > - [Enabled on GitLab.com, self-managed, and GitLab Dedicated](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/147820) in GitLab 16.11.
> - [Generally available](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/175803) in GitLab 17.8. Feature flag `gitlab_for_slack_app_instance_and_group_level` removed.
FLAG:
On self-managed GitLab, by default this feature is available.
To hide the feature, an administrator can [disable the feature flag](../../../administration/feature_flags.md) named `gitlab_for_slack_app_instance_and_group_level`.
On GitLab.com and GitLab Dedicated, this feature is available.
To trigger a [notification event](#notification-events) for a group mention, use `@<group_name>` in: To trigger a [notification event](#notification-events) for a group mention, use `@<group_name>` in:

View File

@ -279,8 +279,7 @@ module Gitlab
@health_context ||= Gitlab::Database::HealthStatus::Context.new( @health_context ||= Gitlab::Database::HealthStatus::Context.new(
self, self,
connection, connection,
[table_name], [table_name]
gitlab_schema.to_sym
) )
end end

View File

@ -4,15 +4,14 @@ module Gitlab
module Database module Database
module HealthStatus module HealthStatus
class Context class Context
attr_reader :status_checker, :connection, :tables, :gitlab_schema attr_reader :status_checker, :connection, :tables
# status_checker: the caller object which checks for database health status # status_checker: the caller object which checks for database health status
# eg: BackgroundMigration::BatchedMigration or DeferJobs::DatabaseHealthStatusChecker # eg: BackgroundMigration::BatchedMigration or DeferJobs::DatabaseHealthStatusChecker
def initialize(status_checker, connection, tables, gitlab_schema) def initialize(status_checker, connection, tables)
@status_checker = status_checker @status_checker = status_checker
@connection = connection @connection = connection
@tables = tables @tables = tables
@gitlab_schema = gitlab_schema
end end
def status_checker_info def status_checker_info

View File

@ -13,7 +13,7 @@ module Gitlab
}.freeze }.freeze
def initialize(context) def initialize(context)
@gitlab_schema = context.gitlab_schema.to_sym @connection = context.connection
end end
def evaluate def evaluate
@ -34,7 +34,7 @@ module Gitlab
private private
attr_reader :gitlab_schema attr_reader :connection
def indicator_name def indicator_name
self.class.name.demodulize self.class.name.demodulize
@ -107,7 +107,7 @@ module Gitlab
gitlab_main_cell: prometheus_alert_db_indicators_settings[sli_query_key][:main_cell], gitlab_main_cell: prometheus_alert_db_indicators_settings[sli_query_key][:main_cell],
gitlab_ci: prometheus_alert_db_indicators_settings[sli_query_key][:ci], gitlab_ci: prometheus_alert_db_indicators_settings[sli_query_key][:ci],
gitlab_sec: gitlab_sec_query gitlab_sec: gitlab_sec_query
}.fetch(gitlab_schema) }.fetch(:"gitlab_#{connection.load_balancer.name}", nil)
end end
strong_memoize_attr :sli_query strong_memoize_attr :sli_query
@ -121,7 +121,7 @@ module Gitlab
gitlab_main_cell: prometheus_alert_db_indicators_settings[slo_key][:main_cell], gitlab_main_cell: prometheus_alert_db_indicators_settings[slo_key][:main_cell],
gitlab_ci: prometheus_alert_db_indicators_settings[slo_key][:ci], gitlab_ci: prometheus_alert_db_indicators_settings[slo_key][:ci],
gitlab_sec: gitlab_sec_query gitlab_sec: gitlab_sec_query
}.fetch(gitlab_schema) }.fetch(:"gitlab_#{connection.load_balancer.name}", nil)
end end
strong_memoize_attr :slo strong_memoize_attr :slo

View File

@ -96,8 +96,7 @@ module Gitlab
health_context = Gitlab::Database::HealthStatus::Context.new( health_context = Gitlab::Database::HealthStatus::Context.new(
DatabaseHealthStatusChecker.new(job['jid'], worker_class.name), DatabaseHealthStatusChecker.new(job['jid'], worker_class.name),
job_base_model.connection, job_base_model.connection,
tables, tables
schema
) )
Gitlab::Database::HealthStatus.evaluate(health_context).any?(&:stop?) Gitlab::Database::HealthStatus.evaluate(health_context).any?(&:stop?)

View File

@ -5230,6 +5230,9 @@ msgstr ""
msgid "AiPowered|Features are not available. However, any group, subgroup, or project can turn them on." msgid "AiPowered|Features are not available. However, any group, subgroup, or project can turn them on."
msgstr "" msgstr ""
msgid "AiPowered|GitLab Duo seat assignment is now located in GitLab Duo settings."
msgstr ""
msgid "AiPowered|GitLab Duo settings have moved" msgid "AiPowered|GitLab Duo settings have moved"
msgstr "" msgstr ""
@ -5260,6 +5263,9 @@ msgstr ""
msgid "AiPowered|Purchase seats" msgid "AiPowered|Purchase seats"
msgstr "" msgstr ""
msgid "AiPowered|Seat assignment for GitLab Duo has moved"
msgstr ""
msgid "AiPowered|Self-hosted AI models" msgid "AiPowered|Self-hosted AI models"
msgstr "" msgstr ""
@ -22932,12 +22938,21 @@ msgstr ""
msgid "ExperimentTracking|Candidate" msgid "ExperimentTracking|Candidate"
msgstr "" msgstr ""
msgid "ExperimentTracking|Create candidate using MLflow"
msgstr ""
msgid "ExperimentTracking|Metric value" msgid "ExperimentTracking|Metric value"
msgstr "" msgstr ""
msgid "ExperimentTracking|No candidates"
msgstr ""
msgid "ExperimentTracking|Performance" msgid "ExperimentTracking|Performance"
msgstr "" msgstr ""
msgid "ExperimentTracking|Performance graph will be shown when candidates with logged metrics are available"
msgstr ""
msgid "Experiments" msgid "Experiments"
msgstr "" msgstr ""
@ -56466,9 +56481,6 @@ msgstr ""
msgid "There was a problem fetching latest labels." msgid "There was a problem fetching latest labels."
msgstr "" msgstr ""
msgid "There was a problem fetching linked pipelines."
msgstr ""
msgid "There was a problem fetching milestones." msgid "There was a problem fetching milestones."
msgstr "" msgstr ""
@ -56502,9 +56514,6 @@ msgstr ""
msgid "There was a problem fetching the keep latest artifacts setting." msgid "There was a problem fetching the keep latest artifacts setting."
msgstr "" msgstr ""
msgid "There was a problem fetching the latest pipeline status."
msgstr ""
msgid "There was a problem fetching the merge pipeline." msgid "There was a problem fetching the merge pipeline."
msgstr "" msgstr ""
@ -56517,18 +56526,12 @@ msgstr ""
msgid "There was a problem fetching the pipeline stage jobs." msgid "There was a problem fetching the pipeline stage jobs."
msgstr "" msgstr ""
msgid "There was a problem fetching the pipeline stages."
msgstr ""
msgid "There was a problem fetching the projects" msgid "There was a problem fetching the projects"
msgstr "" msgstr ""
msgid "There was a problem fetching users." msgid "There was a problem fetching users."
msgstr "" msgstr ""
msgid "There was a problem handling the pipeline data."
msgstr ""
msgid "There was a problem loading this project's readme content." msgid "There was a problem loading this project's readme content."
msgstr "" msgstr ""

View File

@ -23,7 +23,7 @@ module QA
praefect_manager.wait_for_replication(project.id) praefect_manager.wait_for_replication(project.id)
end end
it 'automatically fails over', :blocking, it 'automatically fails over',
testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347830' do testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347830' do
# stop other nodes, so we can control which node the commit is sent to # stop other nodes, so we can control which node the commit is sent to
praefect_manager.stop_node(praefect_manager.secondary_node) praefect_manager.stop_node(praefect_manager.secondary_node)
@ -59,7 +59,7 @@ module QA
end end
context 'when recovering from dataloss after failover' do context 'when recovering from dataloss after failover' do
it 'automatically reconciles', :blocking, it 'automatically reconciles',
testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347831' do testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347831' do
# Start the old primary node again # Start the old primary node again
praefect_manager.start_node(praefect_manager.primary_node) praefect_manager.start_node(praefect_manager.primary_node)

View File

@ -21,7 +21,7 @@ module QA
praefect_manager.start_all_nodes praefect_manager.start_all_nodes
end end
it 'recovers from dataloss', :blocking, it 'recovers from dataloss',
testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347832' do testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347832' do
# Create a new project with a commit and wait for it to replicate # Create a new project with a commit and wait for it to replicate
praefect_manager.wait_for_replication(project.id) praefect_manager.wait_for_replication(project.id)

View File

@ -19,7 +19,7 @@ module QA
praefect_manager.wait_for_replication(project.id) praefect_manager.wait_for_replication(project.id)
end end
it 'reads from each node', :blocking, it 'reads from each node',
testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347833' do testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347833' do
pre_read_data = praefect_manager.query_read_distribution pre_read_data = praefect_manager.query_read_distribution
@ -44,7 +44,7 @@ module QA
praefect_manager.start_node(praefect_manager.secondary_node) praefect_manager.start_node(praefect_manager.secondary_node)
end end
it 'does not read from the unhealthy node', :blocking, it 'does not read from the unhealthy node',
testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347834' do testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347834' do
pre_read_data = praefect_manager.query_read_distribution pre_read_data = praefect_manager.query_read_distribution

View File

@ -22,7 +22,7 @@ module QA
praefect_manager.clear_replication_queue praefect_manager.clear_replication_queue
end end
it 'allows replication of different repository after interruption', :blocking, it 'allows replication of different repository after interruption',
quarantine: { quarantine: {
issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/489130', issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/489130',
type: :investigating type: :investigating

View File

@ -10,7 +10,7 @@ module QA
end end
context 'when imported via api' do context 'when imported via api' do
it 'imports project', :blocking, testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347670' do it 'imports project', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347670' do
expect_project_import_finished_successfully expect_project_import_finished_successfully
aggregate_failures do aggregate_failures do

View File

@ -21,8 +21,7 @@ module QA
let(:session) { SecureRandom.hex(5) } let(:session) { SecureRandom.hex(5) }
let(:tag_name) { SecureRandom.hex(5) } let(:tag_name) { SecureRandom.hex(5) }
it 'sends a push event', it 'sends a push event', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/348945' do
:blocking, testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/348945' do
Resource::ProjectWebHook.setup(session: session, push: true) do |webhook, smocker| Resource::ProjectWebHook.setup(session: session, push: true) do |webhook, smocker|
Resource::Repository::ProjectPush.fabricate! do |project_push| Resource::Repository::ProjectPush.fabricate! do |project_push|
project_push.project = webhook.project project_push.project = webhook.project
@ -32,8 +31,7 @@ module QA
end end
end end
it 'sends a merge request event', it 'sends a merge request event', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/349720' do
:blocking, testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/349720' do
Resource::ProjectWebHook.setup(session: session, merge_requests: true) do |webhook, smocker| Resource::ProjectWebHook.setup(session: session, merge_requests: true) do |webhook, smocker|
create(:merge_request, project: webhook.project) create(:merge_request, project: webhook.project)
@ -41,8 +39,7 @@ module QA
end end
end end
it 'sends a wiki page event', it 'sends a wiki page event', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/349722' do
:blocking, testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/349722' do
Resource::ProjectWebHook.setup(session: session, wiki_page: true) do |webhook, smocker| Resource::ProjectWebHook.setup(session: session, wiki_page: true) do |webhook, smocker|
create(:project_wiki_page, project: webhook.project) create(:project_wiki_page, project: webhook.project)
@ -50,7 +47,7 @@ module QA
end end
end end
it 'sends an issues and note event', :blocking, it 'sends an issues and note event',
testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/349723' do testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/349723' do
Resource::ProjectWebHook.setup(session: session, issues: true, note: true) do |webhook, smocker| Resource::ProjectWebHook.setup(session: session, issues: true, note: true) do |webhook, smocker|
issue = create(:issue, project: webhook.project) issue = create(:issue, project: webhook.project)
@ -72,7 +69,7 @@ module QA
end end
end end
it 'sends a tag event', :blocking, it 'sends a tag event',
testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/383577' do testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/383577' do
Resource::ProjectWebHook.setup(session: session, tag_push: true) do |webhook, smocker| Resource::ProjectWebHook.setup(session: session, tag_push: true) do |webhook, smocker|
project_push = Resource::Repository::ProjectPush.fabricate! do |project_push| project_push = Resource::Repository::ProjectPush.fabricate! do |project_push|

View File

@ -1,7 +1,7 @@
# frozen_string_literal: true # frozen_string_literal: true
module QA module QA
RSpec.describe "Manage", :blocking, product_group: :import_and_integrate do RSpec.describe "Manage", product_group: :import_and_integrate do
include_context "with gitlab group migration" include_context "with gitlab group migration"
describe "Gitlab migration" do describe "Gitlab migration" do

View File

@ -25,7 +25,7 @@ module QA
end end
it( it(
'member retains indirect membership in imported project', :blocking, 'member retains indirect membership in imported project',
quarantine: { quarantine: {
issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/508994', issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/508994',
type: :stale type: :stale
@ -47,7 +47,7 @@ module QA
end end
it( it(
'member retains direct membership in imported project', :blocking, 'member retains direct membership in imported project',
quarantine: { quarantine: {
issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/508993', issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/508993',
type: :stale type: :stale

View File

@ -43,7 +43,7 @@ module QA
end end
it( it(
'successfully imports ci pipeline', :blocking, 'successfully imports ci pipeline',
testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/354650' testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/354650'
) do ) do
expect_project_import_finished_successfully expect_project_import_finished_successfully

View File

@ -119,7 +119,7 @@ module QA
end end
it( it(
'successfully imports project wiki', :blocking, 'successfully imports project wiki',
testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347567' testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347567'
) do ) do
expect_project_import_finished_successfully expect_project_import_finished_successfully

View File

@ -4,7 +4,7 @@ module QA
RSpec.describe 'Manage', :requires_admin, :skip_live_env, only: { RSpec.describe 'Manage', :requires_admin, :skip_live_env, only: {
condition: -> { ENV['QA_RUN_TYPE']&.match?("e2e-test-on-omnibus") } condition: -> { ENV['QA_RUN_TYPE']&.match?("e2e-test-on-omnibus") }
} do } do
describe 'rate limits', :blocking, product_group: :import_and_integrate do describe 'rate limits', product_group: :import_and_integrate do
let(:rate_limited_user) { create(:user, :with_personal_access_token) } let(:rate_limited_user) { create(:user, :with_personal_access_token) }
let(:api_client) { rate_limited_user.api_client } let(:api_client) { rate_limited_user.api_client }
let!(:request) { Runtime::API::Request.new(api_client, '/users') } let!(:request) { Runtime::API::Request.new(api_client, '/users') }

View File

@ -7,7 +7,7 @@ module QA
describe 'Issue', product_group: :project_management do describe 'Issue', product_group: :project_management do
let(:issue) { create(:issue, project: create(:project, :with_readme)) } let(:issue) { create(:issue, project: create(:project, :with_readme)) }
it 'closes via pushing a commit', :blocking, it 'closes via pushing a commit',
testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347947' do testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347947' do
Resource::Repository::ProjectPush.fabricate! do |push| Resource::Repository::ProjectPush.fabricate! do |push|
push.commit_message = "Closes ##{issue.iid}" push.commit_message = "Closes ##{issue.iid}"

View File

@ -16,7 +16,7 @@ module QA
runner.remove_via_api! runner.remove_via_api!
end end
it 'sets merge when pipeline succeeds', :blocking, testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347843' do it 'sets merge when pipeline succeeds', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347843' do
create(:commit, project: project, commit_message: 'Add .gitlab-ci.yml', actions: [ create(:commit, project: project, commit_message: 'Add .gitlab-ci.yml', actions: [
{ {
action: 'create', action: 'create',

View File

@ -2,7 +2,7 @@
module QA module QA
RSpec.describe 'Create' do RSpec.describe 'Create' do
describe 'Merge request push options', :blocking, product_group: :code_review do describe 'Merge request push options', product_group: :code_review do
# If run locally on GDK, push options need to be enabled on the host with the following command: # If run locally on GDK, push options need to be enabled on the host with the following command:
# #
# git config --global receive.advertisepushoptions true # git config --global receive.advertisepushoptions true

View File

@ -10,8 +10,7 @@ module QA
context 'with a malformed URL' do context 'with a malformed URL' do
let(:path) { %(/-/merge_requests?sort=created_date&state=<th:t=\"%24{dfb}%23foreach) } let(:path) { %(/-/merge_requests?sort=created_date&state=<th:t=\"%24{dfb}%23foreach) }
it 'returns 400 or 302', it 'returns 400 or 302', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/426509' do
:blocking, testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/426509' do
# Ruby's URI module automatically encodes query parameters: # Ruby's URI module automatically encodes query parameters:
# https://github.com/ruby/uri/blob/f4999b61daa40f2c99fdc7159e2c85c036b22c67/lib/uri/generic.rb#L849 # https://github.com/ruby/uri/blob/f4999b61daa40f2c99fdc7159e2c85c036b22c67/lib/uri/generic.rb#L849
# #

View File

@ -5,7 +5,7 @@ module QA
describe 'Create a new project from a template', product_group: :source_code do describe 'Create a new project from a template', product_group: :source_code do
let(:project) { create(:project, name: 'templated-project', template_name: 'dotnetcore') } let(:project) { create(:project, name: 'templated-project', template_name: 'dotnetcore') }
it 'commits via the api', :blocking, it 'commits via the api',
testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/357234' do testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/357234' do
expect do expect do
create(:commit, project: project, actions: [ create(:commit, project: project, actions: [

View File

@ -11,7 +11,7 @@ module QA
Runtime::ApplicationSettings.restore_application_settings(:default_branch_name) Runtime::ApplicationSettings.restore_application_settings(:default_branch_name)
end end
it 'sets the default branch name for a new project', :blocking, it 'sets the default branch name for a new project',
testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347837' do testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347837' do
project = create(:project, :with_readme, name: 'default-branch-name') project = create(:project, :with_readme, name: 'default-branch-name')
@ -28,7 +28,7 @@ module QA
end end
end end
it 'allows a project to be created via the CLI with a different default branch name', :blocking, it 'allows a project to be created via the CLI with a different default branch name',
testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347838' do testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347838' do
project_name = "default-branch-name-via-cli-#{SecureRandom.hex(8)}" project_name = "default-branch-name-via-cli-#{SecureRandom.hex(8)}"
group = create(:group) group = create(:group)

View File

@ -13,7 +13,7 @@ module QA
# this file path deliberately includes a subdirectory which matches the file name to verify file/dir matching logic # this file path deliberately includes a subdirectory which matches the file name to verify file/dir matching logic
let(:file_path) { CGI.escape("føo/#{file_name}/føo/#{file_name}") } let(:file_path) { CGI.escape("føo/#{file_name}/føo/#{file_name}") }
it 'user creates a project with a file and deletes them afterwards', :blocking, testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347745' do it 'user creates a project with a file and deletes them afterwards', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347745' do
create_project_request = Runtime::API::Request.new(api_client, '/projects') create_project_request = Runtime::API::Request.new(api_client, '/projects')
response = Support::API.post(create_project_request.url, path: project_name, name: project_name) response = Support::API.post(create_project_request.url, path: project_name, name: project_name)
response_body = parse_body(response) response_body = parse_body(response)
@ -94,7 +94,7 @@ module QA
SVG SVG
end end
it 'sets no-cache headers as expected', :blocking, it 'sets no-cache headers as expected',
testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347746' do testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347746' do
create_project_request = Runtime::API::Request.new(api_client, '/projects') create_project_request = Runtime::API::Request.new(api_client, '/projects')
response = Support::API.post(create_project_request.url, path: project_name, name: project_name) response = Support::API.post(create_project_request.url, path: project_name, name: project_name)

View File

@ -23,7 +23,7 @@ module QA
end end
end end
it 'download archives of each user project then check they are different', :blocking, it 'download archives of each user project then check they are different',
testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347748' do testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347748' do
archive_checksums = {} archive_checksums = {}

View File

@ -8,7 +8,7 @@ module QA
let(:project) { create(:project, :with_readme, name: 'push-postreceive-idempotent') } let(:project) { create(:project, :with_readme, name: 'push-postreceive-idempotent') }
it 'pushes and creates a single push event three times', :blocking, testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347680' do it 'pushes and creates a single push event three times', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347680' do
verify_single_event_per_push(repeat: 3) verify_single_event_per_push(repeat: 3)
end end

View File

@ -16,7 +16,7 @@ module QA
# #
# There are unit tests to verify the accuracy of GitLab's determination of repo size, so for this test we # There are unit tests to verify the accuracy of GitLab's determination of repo size, so for this test we
# attempt to detect large differences that could indicate a regression to previous behavior. # attempt to detect large differences that could indicate a regression to previous behavior.
it 'matches cloned repo usage to reported usage', :blocking, it 'matches cloned repo usage to reported usage',
testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/365196' do testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/365196' do
shared_data = SecureRandom.random_bytes(500000) shared_data = SecureRandom.random_bytes(500000)

View File

@ -19,7 +19,7 @@ module QA
project.change_path("project-reject-prereceive-#{SecureRandom.hex(8)}") project.change_path("project-reject-prereceive-#{SecureRandom.hex(8)}")
end end
it 'returns a custom server hook error', :blocking, :skip_live_env, it 'returns a custom server hook error', :skip_live_env,
except: { job: 'review-qa-*' }, except: { job: 'review-qa-*' },
testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/369053' do testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/369053' do
expect { project.create_repository_tag('v1.2.3') } expect { project.create_repository_tag('v1.2.3') }

View File

@ -11,7 +11,7 @@ module QA
end end
it( it(
'is determined based on forward:pipeline_variables condition', :blocking, 'is determined based on forward:pipeline_variables condition',
:aggregate_failures, :aggregate_failures,
testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/360745' testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/360745'
) do ) do

View File

@ -1,7 +1,7 @@
# frozen_string_literal: true # frozen_string_literal: true
module QA module QA
RSpec.describe 'Verify', :requires_admin, :blocking, product_group: :pipeline_execution do RSpec.describe 'Verify', :requires_admin, product_group: :pipeline_execution do
describe 'When user is blocked' do describe 'When user is blocked' do
let(:user) { create(:user).tap(&:create_personal_access_token!) } let(:user) { create(:user).tap(&:create_personal_access_token!) }
let(:admin_user) { Runtime::User::Store.admin_user } let(:admin_user) { Runtime::User::Store.admin_user }

View File

@ -74,7 +74,7 @@ module QA
end end
it( it(
'can read file variable content with cat', :blocking, 'can read file variable content with cat',
testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/386409' testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/386409'
) do ) do
job = create(:job, project: project, id: project.job_by_name('job_cat')[:id]) job = create(:job, project: project, id: project.job_by_name('job_cat')[:id])

View File

@ -65,7 +65,7 @@ module QA
runner.remove_via_api! runner.remove_via_api!
end end
it 'are not downloaded when dependencies array is set to empty', :blocking, it 'are not downloaded when dependencies array is set to empty',
testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/424958' do testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/424958' do
# If this job fails, the 'failed' status of pipeline is no longer helpful # If this job fails, the 'failed' status of pipeline is no longer helpful
# We should exit the test case here # We should exit the test case here

View File

@ -26,7 +26,7 @@ module QA
let(:port) { '8083' } let(:port) { '8083' }
let(:path) { '/metrics' } let(:path) { '/metrics' }
it 'returns 200 OK and serves metrics', :blocking, it 'returns 200 OK and serves metrics',
testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/362912' do testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/362912' do
expect(response.code).to be(200) expect(response.code).to be(200)
expect(response.body).to match(/^puma_/) expect(response.body).to match(/^puma_/)
@ -39,7 +39,7 @@ module QA
let(:port) { '8082' } let(:port) { '8082' }
let(:path) { '/metrics' } let(:path) { '/metrics' }
it 'returns 200 OK and serves metrics', :blocking, it 'returns 200 OK and serves metrics',
testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/362913' do testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/362913' do
expect(response.code).to be(200) expect(response.code).to be(200)
expect(response.body).to match(/^sidekiq_/) expect(response.body).to match(/^sidekiq_/)

View File

@ -27,7 +27,6 @@ module QA
it( it(
'is allowed to push code to sub-group project via the CLI', 'is allowed to push code to sub-group project via the CLI',
:blocking,
testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/363345' testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/363345'
) do ) do
expect do expect do
@ -44,7 +43,6 @@ module QA
it( it(
'is allowed to create a file in sub-group project via the API', 'is allowed to create a file in sub-group project via the API',
:blocking,
testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/363348' testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/363348'
) do ) do
# Retry is needed due to delays with project authorization updates # Retry is needed due to delays with project authorization updates
@ -61,7 +59,7 @@ module QA
end end
it( it(
'is allowed to commit to sub-group project via the API', :blocking, 'is allowed to commit to sub-group project via the API',
testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/363349' testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/363349'
) do ) do
# Retry is needed due to delays with project authorization updates # Retry is needed due to delays with project authorization updates
@ -99,7 +97,6 @@ module QA
it( it(
'is not allowed to push code to parent group project via the CLI', 'is not allowed to push code to parent group project via the CLI',
:blocking,
testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/363344' testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/363344'
) do ) do
expect do expect do
@ -116,7 +113,6 @@ module QA
it( it(
'is not allowed to create a file in parent group project via the API', 'is not allowed to create a file in parent group project via the API',
:blocking,
testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/363343' testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/363343'
) do ) do
expect do expect do
@ -129,7 +125,6 @@ module QA
it( it(
'is not allowed to commit to parent group project via the API', 'is not allowed to commit to parent group project via the API',
:blocking,
testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/363342' testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/363342'
) do ) do
expect do expect do

View File

@ -1,7 +1,7 @@
# frozen_string_literal: true # frozen_string_literal: true
module QA module QA
RSpec.describe 'Govern', :requires_admin, :skip_live_env, :blocking do RSpec.describe 'Govern', :requires_admin, :skip_live_env do
describe '2FA', product_group: :authentication do describe '2FA', product_group: :authentication do
let(:owner_user) { Runtime::User::Store.test_user } let(:owner_user) { Runtime::User::Store.test_user }
let(:owner_api_client) { owner_user.api_client } let(:owner_api_client) { owner_user.api_client }

View File

@ -1,7 +1,7 @@
# frozen_string_literal: true # frozen_string_literal: true
module QA module QA
RSpec.describe 'Govern', :blocking, :requires_admin, :skip_live_env, RSpec.describe 'Govern', :requires_admin, :skip_live_env,
product_group: :authentication do product_group: :authentication do
describe '2FA' do describe '2FA' do
let!(:user) { Runtime::User::Store.test_user } let!(:user) { Runtime::User::Store.test_user }

View File

@ -32,7 +32,7 @@ module QA
end end
it( it(
'allows enforcing 2FA via UI and logging in with 2FA', :blocking, 'allows enforcing 2FA via UI and logging in with 2FA',
testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347931' testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347931'
) do ) do
enforce_two_factor_authentication_on_group(group) enforce_two_factor_authentication_on_group(group)

View File

@ -3,7 +3,7 @@
module QA module QA
RSpec.describe 'Govern', :orchestrated, :ldap_no_tls, :ldap_tls, product_group: :authentication do RSpec.describe 'Govern', :orchestrated, :ldap_no_tls, :ldap_tls, product_group: :authentication do
describe 'LDAP login' do describe 'LDAP login' do
it 'user logs into GitLab using LDAP credentials', :blocking, it 'user logs into GitLab using LDAP credentials',
testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347892' do testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347892' do
Flow::Login.sign_in Flow::Login.sign_in

View File

@ -3,7 +3,7 @@
module QA module QA
RSpec.describe 'Govern', :orchestrated, :mattermost, product_group: :authentication do RSpec.describe 'Govern', :orchestrated, :mattermost, product_group: :authentication do
describe 'Mattermost login' do describe 'Mattermost login' do
it 'user logs into Mattermost using GitLab OAuth', :blocking, it 'user logs into Mattermost using GitLab OAuth',
testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347891' do testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347891' do
Flow::Login.sign_in Flow::Login.sign_in

View File

@ -4,7 +4,7 @@ module QA
RSpec.describe 'Govern', :orchestrated, :instance_saml, product_group: :authentication do RSpec.describe 'Govern', :orchestrated, :instance_saml, product_group: :authentication do
describe 'Instance wide SAML SSO' do describe 'Instance wide SAML SSO' do
it( it(
'user logs in to gitlab with SAML SSO', :blocking, 'user logs in to gitlab with SAML SSO',
testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347895' testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347895'
) do ) do
Runtime::Browser.visit(:gitlab, Page::Main::Login) Runtime::Browser.visit(:gitlab, Page::Main::Login)

View File

@ -3,7 +3,7 @@
module QA module QA
RSpec.describe 'Govern', :orchestrated, :oauth, product_group: :authentication do RSpec.describe 'Govern', :orchestrated, :oauth, product_group: :authentication do
describe 'OAuth' do describe 'OAuth' do
it 'connects and logs in with GitHub OAuth', :blocking, it 'connects and logs in with GitHub OAuth',
testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/402405' do testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/402405' do
Runtime::Browser.visit(:gitlab, Page::Main::Login) Runtime::Browser.visit(:gitlab, Page::Main::Login)

View File

@ -8,7 +8,7 @@ module QA
let!(:user) { create(:user, :hard_delete, api_client: admin_api_client) } let!(:user) { create(:user, :hard_delete, api_client: admin_api_client) }
it( it(
'can be created and revoked via the UI', :blocking, 'can be created and revoked via the UI',
testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/368888' testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/368888'
) do ) do
impersonation_token = QA::Resource::ImpersonationToken.fabricate_via_browser_ui! do |impersonation_token| impersonation_token = QA::Resource::ImpersonationToken.fabricate_via_browser_ui! do |impersonation_token|

View File

@ -19,7 +19,7 @@ module QA
sandbox.remove_member(user) sandbox.remove_member(user)
end end
it 'is not allowed to push code via the CLI', :blocking, it 'is not allowed to push code via the CLI',
testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347863' do testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347863' do
QA::Support::Retrier.retry_on_exception(max_attempts: 5, sleep_interval: 2) do QA::Support::Retrier.retry_on_exception(max_attempts: 5, sleep_interval: 2) do
expect do expect do
@ -36,7 +36,7 @@ module QA
end end
end end
it 'is not allowed to create a file via the API', :blocking, it 'is not allowed to create a file via the API',
testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347864' do testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347864' do
QA::Support::Retrier.retry_on_exception(max_attempts: 5, sleep_interval: 2) do QA::Support::Retrier.retry_on_exception(max_attempts: 5, sleep_interval: 2) do
expect do expect do
@ -48,7 +48,7 @@ module QA
end end
end end
it 'is not allowed to commit via the API', :blocking, it 'is not allowed to commit via the API',
testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347865' do testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347865' do
QA::Support::Retrier.retry_on_exception(max_attempts: 5, sleep_interval: 2) do QA::Support::Retrier.retry_on_exception(max_attempts: 5, sleep_interval: 2) do
expect do expect do

View File

@ -21,7 +21,7 @@ module QA
end end
it( it(
'shows results for the original request and AJAX requests', :blocking, 'shows results for the original request and AJAX requests',
testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/348030' testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/348030'
) do ) do
# Issue pages always make AJAX requests # Issue pages always make AJAX requests

View File

@ -12,7 +12,7 @@ module QA
end end
it( it(
'has service ping toggle enabled', :blocking, 'has service ping toggle enabled',
testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/348335' testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/348335'
) do ) do
Page::Admin::Settings::MetricsAndProfiling.perform do |setting| Page::Admin::Settings::MetricsAndProfiling.perform do |setting|

View File

@ -12,7 +12,7 @@ module QA
end end
it( it(
'has service ping toggle is disabled', :blocking, 'has service ping toggle is disabled',
testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/348340' testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/348340'
) do ) do
Page::Admin::Settings::MetricsAndProfiling.perform do |settings| Page::Admin::Settings::MetricsAndProfiling.perform do |settings|

View File

@ -36,7 +36,7 @@ module QA
toggle_local_requests(false) toggle_local_requests(false)
end end
it 'integrates and displays build status for MR pipeline in GitLab', :blocking, it 'integrates and displays build status for MR pipeline in GitLab',
testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347788' do testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347788' do
setup_project_integration setup_project_integration

View File

@ -33,7 +33,7 @@ module QA
expect(page).not_to have_text("Requests to the local network are not allowed") # rubocop:disable RSpec/ExpectInHook expect(page).not_to have_text("Requests to the local network are not allowed") # rubocop:disable RSpec/ExpectInHook
end end
it 'closes an issue via pushing a commit', :blocking, it 'closes an issue via pushing a commit',
testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347794' do testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347794' do
issue_key = Vendor::Jira::JiraAPI.perform do |jira_api| issue_key = Vendor::Jira::JiraAPI.perform do |jira_api|
jira_api.create_issue(jira_project_key) jira_api.create_issue(jira_project_key)
@ -44,7 +44,7 @@ module QA
expect_issue_done(issue_key) expect_issue_done(issue_key)
end end
it 'closes an issue via a merge request', :blocking, it 'closes an issue via a merge request',
testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347795' do testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347795' do
issue_key = Vendor::Jira::JiraAPI.perform do |jira_api| issue_key = Vendor::Jira::JiraAPI.perform do |jira_api|
jira_api.create_issue(jira_project_key) jira_api.create_issue(jira_project_key)

View File

@ -1,7 +1,7 @@
# frozen_string_literal: true # frozen_string_literal: true
module QA module QA
RSpec.describe 'Manage', :blocking do RSpec.describe 'Manage' do
describe 'Jira issue import', :jira, :orchestrated, :requires_admin, product_group: :import_and_integrate do describe 'Jira issue import', :jira, :orchestrated, :requires_admin, product_group: :import_and_integrate do
let(:jira_project_key) { "JITD" } let(:jira_project_key) { "JITD" }
let(:jira_issue_title) { "[#{jira_project_key}-1] Jira to GitLab Test Issue" } let(:jira_issue_title) { "[#{jira_project_key}-1] Jira to GitLab Test Issue" }

View File

@ -41,13 +41,11 @@ module QA
setup_pipeline_emails(emails) setup_pipeline_emails(emails)
end end
describe 'when pipeline passes', describe 'when pipeline passes', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/366240' do
:blocking, testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/366240' do
include_examples 'notifies on a pipeline', 0 include_examples 'notifies on a pipeline', 0
end end
describe 'when pipeline fails', describe 'when pipeline fails', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/366241' do
:blocking, testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/366241' do
include_examples 'notifies on a pipeline', 1 include_examples 'notifies on a pipeline', 1
end end

View File

@ -1,7 +1,7 @@
# frozen_string_literal: true # frozen_string_literal: true
module QA module QA
describe 'Manage', :blocking, product_group: :import_and_integrate do describe 'Manage', product_group: :import_and_integrate do
describe 'Gitlab migration' do describe 'Gitlab migration' do
include_context "with gitlab group migration" include_context "with gitlab group migration"

View File

@ -18,7 +18,7 @@ module QA
Flow::Login.sign_in Flow::Login.sign_in
end end
it 'user adds a design and annotates it', :blocking, it 'user adds a design and annotates it',
testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347822' do testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347822' do
issue.visit! issue.visit!

View File

@ -24,7 +24,7 @@ module QA
end end
it( it(
'user archives a design', :blocking, 'user archives a design',
testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347713' testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347713'
) do ) do
third_design.issue.visit! third_design.issue.visit!

View File

@ -14,7 +14,7 @@ module QA
end end
it( it(
'user adds a design and modifies it', :blocking, 'user adds a design and modifies it',
testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347712' testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347712'
) do ) do
design.issue.visit! design.issue.visit!

View File

@ -13,7 +13,7 @@ module QA
Flow::Login.sign_in Flow::Login.sign_in
end end
it 'is received by a user for project invitation', :blocking, testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347961' do it 'is received by a user for project invitation', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347961' do
project.visit! project.visit!
Page::Project::Menu.perform(&:go_to_members) Page::Project::Menu.perform(&:go_to_members)

View File

@ -1,7 +1,7 @@
# frozen_string_literal: true # frozen_string_literal: true
module QA module QA
RSpec.describe 'Plan', :blocking, product_group: :project_management do RSpec.describe 'Plan', product_group: :project_management do
describe 'collapse comments in issue discussions' do describe 'collapse comments in issue discussions' do
let(:my_first_reply) { 'My first reply' } let(:my_first_reply) { 'My first reply' }
let(:one_reply) { '1 reply' } let(:one_reply) { '1 reply' }

View File

@ -1,7 +1,7 @@
# frozen_string_literal: true # frozen_string_literal: true
module QA module QA
RSpec.describe 'Plan', :blocking, product_group: :project_management do RSpec.describe 'Plan', product_group: :project_management do
describe 'Custom issue templates' do describe 'Custom issue templates' do
let(:template_name) { 'custom_issue_template' } let(:template_name) { 'custom_issue_template' }
let(:template_content) { 'This is a custom issue template test' } let(:template_content) { 'This is a custom issue template test' }

View File

@ -1,7 +1,7 @@
# frozen_string_literal: true # frozen_string_literal: true
module QA module QA
RSpec.describe 'Plan', :blocking, product_group: :project_management do RSpec.describe 'Plan', product_group: :project_management do
describe 'Issues list' do describe 'Issues list' do
let(:project) { create(:project, name: 'project-to-test-export-issues-as-csv') } let(:project) { create(:project, name: 'project-to-test-export-issues-as-csv') }

View File

@ -1,7 +1,7 @@
# frozen_string_literal: true # frozen_string_literal: true
module QA module QA
RSpec.describe 'Plan', :blocking, product_group: :project_management do RSpec.describe 'Plan', product_group: :project_management do
describe 'issue suggestions' do describe 'issue suggestions' do
let(:issue_title) { 'Issue Lists are awesome' } let(:issue_title) { 'Issue Lists are awesome' }

View File

@ -14,7 +14,7 @@ module QA
project.add_member(user2) project.add_member(user2)
end end
it 'update without refresh', :blocking, testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347941' do it 'update without refresh', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347941' do
issue = create(:issue, project: project, assignee_ids: [user1.id]) issue = create(:issue, project: project, assignee_ids: [user1.id])
issue.visit! issue.visit!

View File

@ -1,7 +1,7 @@
# frozen_string_literal: true # frozen_string_literal: true
module QA module QA
RSpec.describe 'Plan', :blocking, product_group: :project_management do RSpec.describe 'Plan', product_group: :project_management do
describe 'Issue board focus mode' do describe 'Issue board focus mode' do
let(:project) { create(:project, name: 'sample-project-issue-board-focus-mode') } let(:project) { create(:project, name: 'sample-project-issue-board-focus-mode') }

View File

@ -1,7 +1,7 @@
# frozen_string_literal: true # frozen_string_literal: true
module QA module QA
RSpec.describe 'Plan', :blocking, :db_migrate, product_group: :project_management do RSpec.describe 'Plan', :db_migrate, product_group: :project_management do
describe 'Group milestone' do describe 'Group milestone' do
include Support::Dates include Support::Dates

View File

@ -16,7 +16,7 @@ module QA
Flow::Login.sign_in Flow::Login.sign_in
end end
it 'by adding a home page to the wiki', :blocking, it 'by adding a home page to the wiki',
testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347809' do testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347809' do
project.visit! project.visit!
@ -37,7 +37,7 @@ module QA
end end
end end
it 'by adding a second page to the wiki', :blocking, it 'by adding a second page to the wiki',
testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347808' do testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347808' do
wiki.visit! wiki.visit!
@ -91,7 +91,7 @@ module QA
end end
end end
it 'by adding a wiki page with spaces in the path using git push', :blocking, it 'by adding a wiki page with spaces in the path using git push',
testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/442387' do testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/442387' do
Resource::Repository::WikiPush.fabricate! do |push| Resource::Repository::WikiPush.fabricate! do |push|
push.file_name = "#{new_wiki_page_with_spaces_in_the_path}.md" push.file_name = "#{new_wiki_page_with_spaces_in_the_path}.md"

View File

@ -16,7 +16,7 @@ module QA
Flow::Login.sign_in Flow::Login.sign_in
end end
it 'by manipulating content on the page', :blocking, it 'by manipulating content on the page',
testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347810' do testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347810' do
wiki.visit! wiki.visit!

View File

@ -10,7 +10,7 @@ module QA
Flow::Login.sign_in Flow::Login.sign_in
end end
it 'can change the directory path of a page', :blocking, it 'can change the directory path of a page',
testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347821' do testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347821' do
initial_wiki.visit! initial_wiki.visit!

View File

@ -1,7 +1,7 @@
# frozen_string_literal: true # frozen_string_literal: true
module QA module QA
RSpec.describe 'Plan', :blocking, product_group: :knowledge do RSpec.describe 'Plan', product_group: :knowledge do
describe 'Testing project wiki file upload' do describe 'Testing project wiki file upload' do
let(:initial_wiki) { create(:project_wiki_page) } let(:initial_wiki) { create(:project_wiki_page) }
let(:page_title) { 'Content Editor Page' } let(:page_title) { 'Content Editor Page' }

View File

@ -15,7 +15,7 @@ module QA
end end
context 'with Wiki Sidebar' do context 'with Wiki Sidebar' do
it 'has all expected links that work', :blocking, it 'has all expected links that work',
testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347814' do testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347814' do
small_wiki.visit! small_wiki.visit!
@ -36,7 +36,7 @@ module QA
end end
context 'with Wiki Page List' do context 'with Wiki Page List' do
it 'has all expected links that work', :blocking, it 'has all expected links that work',
testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347813' do testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347813' do
large_wiki.visit! large_wiki.visit!

View File

@ -12,7 +12,7 @@ module QA
Flow::Login.sign_in Flow::Login.sign_in
end end
it 'can delete a page', :blocking, testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347815' do it 'can delete a page', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347815' do
initial_wiki.visit! initial_wiki.visit!
Page::Project::Wiki::Show.perform(&:click_edit) Page::Project::Wiki::Show.perform(&:click_edit)

Some files were not shown because too many files have changed in this diff Show More