Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2022-05-20 15:08:50 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2022-05-20 15:08:50 +0300
commit81fb153d0550c2c0b707a374cb6ee9f2ad089790 (patch)
tree0326c005bea62adc258bb0d4d1a3a7f5fc6a9532
parent084d7453e0866f2b29923552fb1c5f380f283ab5 (diff)
Add latest changes from gitlab-org/gitlab@master
-rw-r--r--CHANGELOG.md10
-rw-r--r--app/assets/javascripts/jira_connect/subscriptions/components/app.vue86
-rw-r--r--app/assets/javascripts/jira_connect/subscriptions/components/user_link.vue2
-rw-r--r--app/assets/javascripts/mr_popover/components/mr_popover.vue15
-rw-r--r--app/assets/javascripts/pipelines/components/pipeline_tabs.vue16
-rw-r--r--app/assets/javascripts/pipelines/pipeline_tabs.js4
-rw-r--r--app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/label_token.vue4
-rw-r--r--app/assets/javascripts/vue_shared/issuable/show/components/issuable_header.vue1
-rw-r--r--app/assets/javascripts/vue_shared/issuable/show/components/issuable_title.vue22
-rw-r--r--app/assets/stylesheets/page_bundles/jira_connect.scss6
-rw-r--r--app/assets/stylesheets/pages/issuable.scss15
-rw-r--r--app/helpers/projects/pipeline_helper.rb4
-rw-r--r--app/helpers/search_helper.rb2
-rw-r--r--app/models/deployment.rb12
-rw-r--r--app/policies/issuable_policy.rb4
-rw-r--r--app/views/jira_connect/subscriptions/index.html.haml6
-rw-r--r--app/views/profiles/_email_settings.html.haml6
-rw-r--r--app/views/profiles/show.html.haml20
-rw-r--r--config/feature_flags/development/ci_enforce_throttle_pipelines_creation.yml (renamed from config/feature_flags/development/ci_throttle_pipelines_creation.yml)8
-rw-r--r--config/feature_flags/development/deployment_hooks_skip_worker.yml (renamed from config/feature_flags/development/ci_throttle_pipelines_creation_dry_run.yml)10
-rw-r--r--doc/.vale/gitlab/EOLWhitespace.yml13
-rw-r--r--doc/administration/audit_event_streaming.md2
-rw-r--r--doc/administration/auth/ldap/ldap-troubleshooting.md2
-rw-r--r--doc/administration/geo/replication/docker_registry.md4
-rw-r--r--doc/administration/geo/replication/troubleshooting.md8
-rw-r--r--doc/administration/gitaly/praefect.md2
-rw-r--r--doc/administration/gitaly/recovery.md2
-rw-r--r--doc/administration/monitoring/prometheus/index.md4
-rw-r--r--doc/administration/object_storage.md6
-rw-r--r--doc/administration/packages/container_registry.md2
-rw-r--r--doc/administration/postgresql/replication_and_failover.md2
-rw-r--r--doc/administration/reference_architectures/10k_users.md4
-rw-r--r--doc/administration/reference_architectures/index.md2
-rw-r--r--doc/administration/sidekiq.md4
-rw-r--r--doc/administration/troubleshooting/gitlab_rails_cheat_sheet.md2
-rw-r--r--doc/api/cluster_agents.md2
-rw-r--r--doc/api/graphql/index.md4
-rw-r--r--doc/api/graphql/reference/index.md2
-rw-r--r--doc/api/index.md2
-rw-r--r--doc/api/lint.md2
-rw-r--r--doc/ci/environments/index.md2
-rw-r--r--doc/ci/jobs/ci_job_token.md2
-rw-r--r--doc/ci/runners/saas/linux_saas_runner.md2
-rw-r--r--doc/development/adding_database_indexes.md2
-rw-r--r--doc/development/cicd/schema.md4
-rw-r--r--doc/development/contributing/merge_request_workflow.md4
-rw-r--r--doc/development/database/avoiding_downtime_in_migrations.md2
-rw-r--r--doc/development/event_store.md2
-rw-r--r--doc/development/experiment_guide/implementing_experiments.md2
-rw-r--r--doc/development/experiment_guide/index.md4
-rw-r--r--doc/development/experiment_guide/testing_experiments.md2
-rw-r--r--doc/development/product_qualified_lead_guide/index.md2
-rw-r--r--doc/development/service_ping/implement.md2
-rw-r--r--doc/development/testing_guide/end_to_end/best_practices.md4
-rw-r--r--doc/development/testing_guide/end_to_end/capybara_to_chemlab_migration_guide.md4
-rw-r--r--doc/development/testing_guide/end_to_end/running_tests_that_require_special_setup.md2
-rw-r--r--doc/downgrade_ee_to_ce/index.md2
-rw-r--r--doc/operations/incident_management/incidents.md2
-rw-r--r--doc/raketasks/backup_restore.md2
-rw-r--r--doc/subscriptions/self_managed/index.md5
-rw-r--r--doc/update/index.md10
-rw-r--r--doc/update/package/index.md2
-rw-r--r--doc/user/admin_area/settings/rate_limit_on_pipelines_creation.md1
-rw-r--r--doc/user/analytics/index.md6
-rw-r--r--doc/user/analytics/value_stream_analytics.md2
-rw-r--r--doc/user/application_security/coverage_fuzzing/index.md2
-rw-r--r--doc/user/application_security/dast/browser_based.md2
-rw-r--r--doc/user/application_security/dast/checks/359.1.md6
-rw-r--r--doc/user/application_security/dast/checks/359.2.md8
-rw-r--r--doc/user/application_security/index.md7
-rw-r--r--doc/user/clusters/agent/gitops.md2
-rw-r--r--doc/user/group/index.md2
-rw-r--r--doc/user/infrastructure/clusters/connect/new_gke_cluster.md2
-rw-r--r--doc/user/infrastructure/iac/terraform_state.md2
-rw-r--r--doc/user/packages/container_registry/reduce_container_registry_data_transfer.md4
-rw-r--r--doc/user/packages/go_proxy/index.md2
-rw-r--r--doc/user/packages/helm_repository/index.md4
-rw-r--r--doc/user/packages/npm_registry/index.md2
-rw-r--r--doc/user/permissions.md2
-rw-r--r--doc/user/profile/index.md4
-rw-r--r--doc/user/project/code_owners.md2
-rw-r--r--doc/user/project/integrations/harbor.md2
-rw-r--r--doc/user/project/integrations/zentao.md6
-rw-r--r--doc/user/project/issues/csv_import.md2
-rw-r--r--doc/user/project/merge_requests/accessibility_testing.md4
-rw-r--r--doc/user/project/merge_requests/approvals/index.md2
-rw-r--r--doc/user/project/working_with_projects.md2
-rw-r--r--doc/user/search/global_search/advanced_search_syntax.md2
-rw-r--r--doc/user/usage_quotas.md2
-rw-r--r--lib/gitlab/application_rate_limiter.rb2
-rw-r--r--lib/gitlab/ci/pipeline/chain/limit/rate_limit.rb14
-rw-r--r--spec/features/commits_spec.rb3
-rw-r--r--spec/features/issues/issue_detail_spec.rb10
-rw-r--r--spec/features/projects/pipelines/legacy_pipeline_spec.rb89
-rw-r--r--spec/features/projects/pipelines/pipeline_spec.rb8
-rw-r--r--spec/frontend/mr_popover/__snapshots__/mr_popover_spec.js.snap8
-rw-r--r--spec/frontend/pipelines/components/pipeline_tabs_spec.js26
-rw-r--r--spec/frontend/vue_shared/components/filtered_search_bar/tokens/label_token_spec.js2
-rw-r--r--spec/frontend/vue_shared/issuable/show/components/issuable_header_spec.js4
-rw-r--r--spec/frontend/vue_shared/issuable/show/components/issuable_title_spec.js16
-rw-r--r--spec/helpers/projects/pipeline_helper_spec.rb4
-rw-r--r--spec/helpers/search_helper_spec.rb24
-rw-r--r--spec/lib/gitlab/ci/pipeline/chain/limit/rate_limit_spec.rb33
-rw-r--r--spec/models/ci/build_spec.rb22
-rw-r--r--spec/models/deployment_spec.rb113
-rw-r--r--spec/services/ci/create_pipeline_service/rate_limit_spec.rb5
-rw-r--r--spec/services/ci/create_pipeline_service_spec.rb4
-rw-r--r--spec/services/deployments/create_service_spec.rb37
-rw-r--r--spec/services/deployments/update_environment_service_spec.rb2
109 files changed, 565 insertions, 334 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index d3adbbe049e..2eeedaa3dfd 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,16 @@
documentation](doc/development/changelog.md) for instructions on adding your own
entry.
+## 14.10.3 (2022-05-20)
+
+### Added (1 change)
+
+- [Add option to disable seperated caches](gitlab-org/gitlab@c39af3e813d5d242068a8ae7e8e011284fd385c9) by @Taucher2003 ([merge request](gitlab-org/gitlab!88013))
+
+### Fixed (1 change)
+
+- [Fix assignee filtering on group/project issues list](gitlab-org/gitlab@317c3a6e1e799f53d7e0812921bbffc4f4733d58) ([merge request](gitlab-org/gitlab!87729))
+
## 14.10.2 (2022-05-04)
### Fixed (2 changes)
diff --git a/app/assets/javascripts/jira_connect/subscriptions/components/app.vue b/app/assets/javascripts/jira_connect/subscriptions/components/app.vue
index 22422872183..66aea60c5b5 100644
--- a/app/assets/javascripts/jira_connect/subscriptions/components/app.vue
+++ b/app/assets/javascripts/jira_connect/subscriptions/components/app.vue
@@ -60,6 +60,12 @@ export default {
isBrowserSupported() {
return !this.isOauthEnabled || AccessorUtilities.canUseCrypto();
},
+ gitlabUrl() {
+ return gon.gitlab_url;
+ },
+ gitlabLogo() {
+ return gon.gitlab_logo;
+ },
},
created() {
this.setInitialAlert();
@@ -99,43 +105,55 @@ export default {
</script>
<template>
- <browser-support-alert v-if="!isBrowserSupported" class="gl-mb-7" />
- <div v-else data-testid="jira-connect-app">
- <compatibility-alert class="gl-mb-7" />
-
- <gl-alert
- v-if="shouldShowAlert"
- :variant="alert.variant"
- :title="alert.title"
- class="gl-mb-5"
- data-testid="jira-connect-persisted-alert"
- @dismiss="setAlert"
+ <div>
+ <header
+ class="jira-connect-header gl-display-flex gl-align-items-center gl-justify-content-center gl-px-5 gl-border-b-solid gl-border-b-gray-100 gl-border-b-1 gl-bg-white"
>
- <gl-sprintf v-if="alert.linkUrl" :message="alert.message">
- <template #link="{ content }">
- <gl-link :href="alert.linkUrl" target="_blank">{{ content }}</gl-link>
- </template>
- </gl-sprintf>
+ <gl-link :href="gitlabUrl" target="_blank">
+ <img :src="gitlabLogo" class="gl-h-6" :alt="__('GitLab')" />
+ </gl-link>
+ <user-link
+ :user-signed-in="userSignedIn"
+ :has-subscriptions="hasSubscriptions"
+ :user="currentUser"
+ class="gl-fixed gl-right-4"
+ />
+ </header>
- <template v-else>
- {{ alert.message }}
- </template>
- </gl-alert>
+ <main class="jira-connect-app gl-px-5 gl-pt-7 gl-mx-auto">
+ <browser-support-alert v-if="!isBrowserSupported" class="gl-mb-7" />
+ <div v-else data-testid="jira-connect-app">
+ <compatibility-alert class="gl-mb-7" />
- <user-link
- :user-signed-in="userSignedIn"
- :has-subscriptions="hasSubscriptions"
- :user="currentUser"
- />
+ <gl-alert
+ v-if="shouldShowAlert"
+ :variant="alert.variant"
+ :title="alert.title"
+ class="gl-mb-5"
+ data-testid="jira-connect-persisted-alert"
+ @dismiss="setAlert"
+ >
+ <gl-sprintf v-if="alert.linkUrl" :message="alert.message">
+ <template #link="{ content }">
+ <gl-link :href="alert.linkUrl" target="_blank">{{ content }}</gl-link>
+ </template>
+ </gl-sprintf>
- <div class="gl-layout-w-limited gl-mx-auto gl-px-5 gl-mb-7">
- <sign-in-page
- v-if="!userSignedIn"
- :has-subscriptions="hasSubscriptions"
- @sign-in-oauth="onSignInOauth"
- @error="onSignInError"
- />
- <subscriptions-page v-else :has-subscriptions="hasSubscriptions" />
- </div>
+ <template v-else>
+ {{ alert.message }}
+ </template>
+ </gl-alert>
+
+ <div class="gl-layout-w-limited gl-mx-auto gl-px-5 gl-mb-7">
+ <sign-in-page
+ v-if="!userSignedIn"
+ :has-subscriptions="hasSubscriptions"
+ @sign-in-oauth="onSignInOauth"
+ @error="onSignInError"
+ />
+ <subscriptions-page v-else :has-subscriptions="hasSubscriptions" />
+ </div>
+ </div>
+ </main>
</div>
</template>
diff --git a/app/assets/javascripts/jira_connect/subscriptions/components/user_link.vue b/app/assets/javascripts/jira_connect/subscriptions/components/user_link.vue
index 5e2c83aff65..1c589abb07f 100644
--- a/app/assets/javascripts/jira_connect/subscriptions/components/user_link.vue
+++ b/app/assets/javascripts/jira_connect/subscriptions/components/user_link.vue
@@ -63,7 +63,7 @@ export default {
};
</script>
<template>
- <div class="jira-connect-user gl-font-base">
+ <div class="gl-font-base">
<gl-sprintf v-if="userSignedIn" :message="signedInText">
<template #user_link>
<gl-link data-testid="gitlab-user-link" :href="gitlabUserLink" target="_blank">
diff --git a/app/assets/javascripts/mr_popover/components/mr_popover.vue b/app/assets/javascripts/mr_popover/components/mr_popover.vue
index fef75b6d5d0..f467d7e93b1 100644
--- a/app/assets/javascripts/mr_popover/components/mr_popover.vue
+++ b/app/assets/javascripts/mr_popover/components/mr_popover.vue
@@ -1,6 +1,6 @@
<script>
/* eslint-disable @gitlab/vue-require-i18n-strings */
-import { GlPopover, GlDeprecatedSkeletonLoading as GlSkeletonLoading } from '@gitlab/ui';
+import { GlBadge, GlPopover, GlDeprecatedSkeletonLoading as GlSkeletonLoading } from '@gitlab/ui';
import CiIcon from '~/vue_shared/components/ci_icon.vue';
import timeagoMixin from '~/vue_shared/mixins/timeago';
import { mrStates, humanMRStates } from '../constants';
@@ -10,6 +10,7 @@ export default {
// name: 'MRPopover' is a false positive: https://gitlab.com/gitlab-org/frontend/eslint-plugin-i18n/issues/25
name: 'MRPopover', // eslint-disable-line @gitlab/require-i18n-strings
components: {
+ GlBadge,
GlPopover,
GlSkeletonLoading,
CiIcon,
@@ -45,14 +46,14 @@ export default {
formattedTime() {
return this.timeFormatted(this.mergeRequest.createdAt);
},
- statusBoxClass() {
+ badgeVariant() {
switch (this.mergeRequest.state) {
case mrStates.merged:
- return 'status-box-mr-merged';
+ return 'info';
case mrStates.closed:
- return 'status-box-closed';
+ return 'danger';
default:
- return 'status-box-open';
+ return 'success';
}
},
stateHumanName() {
@@ -97,9 +98,9 @@ export default {
</div>
<div v-else-if="showDetails" class="d-flex align-items-center justify-content-between">
<div class="d-inline-flex align-items-center">
- <div :class="`issuable-status-box status-box ${statusBoxClass}`">
+ <gl-badge class="gl-mr-3" :variant="badgeVariant">
{{ stateHumanName }}
- </div>
+ </gl-badge>
<span class="gl-text-secondary">Opened <time v-text="formattedTime"></time></span>
</div>
<ci-icon v-if="detailedStatus" :status="detailedStatus" />
diff --git a/app/assets/javascripts/pipelines/components/pipeline_tabs.vue b/app/assets/javascripts/pipelines/components/pipeline_tabs.vue
index 66d30c10362..7cd3d9e2304 100644
--- a/app/assets/javascripts/pipelines/components/pipeline_tabs.vue
+++ b/app/assets/javascripts/pipelines/components/pipeline_tabs.vue
@@ -1,5 +1,5 @@
<script>
-import { GlTabs, GlTab } from '@gitlab/ui';
+import { GlBadge, GlTabs, GlTab } from '@gitlab/ui';
import { __ } from '~/locale';
import { failedJobsTabName, jobsTabName, needsTabName, testReportTabName } from '../constants';
import PipelineGraphWrapper from './graph/graph_component_wrapper.vue';
@@ -25,6 +25,7 @@ export default {
},
components: {
Dag,
+ GlBadge,
GlTab,
GlTabs,
JobsApp,
@@ -32,7 +33,7 @@ export default {
PipelineGraphWrapper,
TestReports,
},
- inject: ['defaultTabValue'],
+ inject: ['defaultTabValue', 'totalJobCount'],
methods: {
isActive(tabName) {
return tabName === this.defaultTabValue;
@@ -54,17 +55,18 @@ export default {
>
<dag />
</gl-tab>
- <gl-tab
- :title="$options.i18n.tabs.jobsTitle"
- :active="isActive($options.tabNames.jobs)"
- data-testid="jobs-tab"
- >
+ <gl-tab :active="isActive($options.tabNames.jobs)" data-testid="jobs-tab" lazy>
+ <template #title>
+ <span class="gl-mr-2">{{ $options.i18n.tabs.jobsTitle }}</span>
+ <gl-badge size="sm" data-testid="builds-counter">{{ totalJobCount }}</gl-badge>
+ </template>
<jobs-app />
</gl-tab>
<gl-tab
:title="$options.i18n.tabs.failedJobsTitle"
:active="isActive($options.tabNames.failures)"
data-testid="failed-jobs-tab"
+ lazy
>
<failed-jobs-app />
</gl-tab>
diff --git a/app/assets/javascripts/pipelines/pipeline_tabs.js b/app/assets/javascripts/pipelines/pipeline_tabs.js
index 530917f0402..3bf23d9d001 100644
--- a/app/assets/javascripts/pipelines/pipeline_tabs.js
+++ b/app/assets/javascripts/pipelines/pipeline_tabs.js
@@ -20,9 +20,11 @@ const createPipelineTabs = (selector, apolloProvider) => {
downloadablePathForReportType,
exposeSecurityDashboard,
exposeLicenseScanningData,
+ fullPath,
graphqlResourceEtag,
pipelineIid,
pipelineProjectPath,
+ totalJobCount,
} = dataset;
const defaultTabValue = getPipelineDefaultTab(window.location.href);
@@ -47,9 +49,11 @@ const createPipelineTabs = (selector, apolloProvider) => {
downloadablePathForReportType,
exposeSecurityDashboard: parseBoolean(exposeSecurityDashboard),
exposeLicenseScanningData: parseBoolean(exposeLicenseScanningData),
+ fullPath,
graphqlResourceEtag,
pipelineIid,
pipelineProjectPath,
+ totalJobCount,
},
errorCaptured(err, _vm, info) {
reportToSentry('pipeline_tabs', `error: ${err}, info: ${info}`);
diff --git a/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/label_token.vue b/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/label_token.vue
index 6f24955814c..914d146fcc3 100644
--- a/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/label_token.vue
+++ b/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/label_token.vue
@@ -43,9 +43,7 @@ export default {
},
methods: {
getActiveLabel(labels, data) {
- return labels.find(
- (label) => this.getLabelName(label).toLowerCase() === stripQuotes(data).toLowerCase(),
- );
+ return labels.find((label) => this.getLabelName(label) === stripQuotes(data));
},
/**
* There's an inconsistency between private and public API
diff --git a/app/assets/javascripts/vue_shared/issuable/show/components/issuable_header.vue b/app/assets/javascripts/vue_shared/issuable/show/components/issuable_header.vue
index 649dbd6576b..d883abd2dfd 100644
--- a/app/assets/javascripts/vue_shared/issuable/show/components/issuable_header.vue
+++ b/app/assets/javascripts/vue_shared/issuable/show/components/issuable_header.vue
@@ -114,7 +114,6 @@ export default {
<div class="detail-page-header">
<div class="detail-page-header-body">
<gl-badge
- data-testid="status"
class="issuable-status-badge gl-mr-3"
:class="statusBadgeClass"
:variant="badgeVariant"
diff --git a/app/assets/javascripts/vue_shared/issuable/show/components/issuable_title.vue b/app/assets/javascripts/vue_shared/issuable/show/components/issuable_title.vue
index 47f05a2cee2..8038b7a80a0 100644
--- a/app/assets/javascripts/vue_shared/issuable/show/components/issuable_title.vue
+++ b/app/assets/javascripts/vue_shared/issuable/show/components/issuable_title.vue
@@ -1,12 +1,14 @@
<script>
import {
GlIcon,
+ GlBadge,
GlButton,
GlIntersectionObserver,
GlTooltipDirective,
GlSafeHtmlDirective as SafeHtml,
} from '@gitlab/ui';
import { __ } from '~/locale';
+import { IssuableStates } from '~/vue_shared/issuable/list/constants';
export default {
i18n: {
@@ -14,6 +16,7 @@ export default {
},
components: {
GlIcon,
+ GlBadge,
GlButton,
GlIntersectionObserver,
},
@@ -44,6 +47,11 @@ export default {
stickyTitleVisible: false,
};
},
+ computed: {
+ badgeVariant() {
+ return this.issuable.state === IssuableStates.Opened ? 'success' : 'info';
+ },
+ },
methods: {
handleTitleAppear() {
this.stickyTitleVisible = false;
@@ -84,14 +92,16 @@ export default {
<div
class="issue-sticky-header-text gl-display-flex gl-align-items-center gl-mx-auto gl-px-5"
>
- <p
- data-testid="status"
- class="issuable-status-box status-box gl-white-space-nowrap gl-my-0"
+ <gl-badge
+ class="gl-white-space-nowrap gl-mr-3"
:class="statusBadgeClass"
+ :variant="badgeVariant"
>
- <gl-icon :name="statusIcon" class="gl-display-block d-sm-none gl-h-6!" />
- <span class="gl-display-none d-sm-block"><slot name="status-badge"></slot></span>
- </p>
+ <gl-icon v-if="statusIcon" class="gl-sm-display-none" :name="statusIcon" />
+ <span class="gl-display-none gl-sm-display-block">
+ <slot name="status-badge"></slot>
+ </span>
+ </gl-badge>
<p
class="gl-font-weight-bold gl-overflow-hidden gl-white-space-nowrap gl-text-overflow-ellipsis gl-my-0"
:title="issuable.title"
diff --git a/app/assets/stylesheets/page_bundles/jira_connect.scss b/app/assets/stylesheets/page_bundles/jira_connect.scss
index f153569f99b..0a2b3175aa9 100644
--- a/app/assets/stylesheets/page_bundles/jira_connect.scss
+++ b/app/assets/stylesheets/page_bundles/jira_connect.scss
@@ -33,12 +33,6 @@ $header-height: 40px;
right: 0;
}
-.jira-connect-user {
- position: fixed;
- top: 10px;
- right: 20px;
-}
-
.jira-connect-app {
margin-top: $header-height;
height: calc(100% - #{$header-height});
diff --git a/app/assets/stylesheets/pages/issuable.scss b/app/assets/stylesheets/pages/issuable.scss
index 4093ef087dc..5062a7bb8fa 100644
--- a/app/assets/stylesheets/pages/issuable.scss
+++ b/app/assets/stylesheets/pages/issuable.scss
@@ -617,21 +617,6 @@
}
}
-.issuable-status-box {
- align-self: stretch;
- display: flex;
- justify-content: center;
- align-items: center;
- margin-top: 0;
- padding: 0 $gl-padding-8;
-
- @include media-breakpoint-up(sm) {
- display: inline-block;
- height: auto;
- align-self: center;
- }
-}
-
.issuable-gutter-toggle {
@include media-breakpoint-down(sm) {
margin-left: $btn-side-margin;
diff --git a/app/helpers/projects/pipeline_helper.rb b/app/helpers/projects/pipeline_helper.rb
index 286026bc290..adb11330ad7 100644
--- a/app/helpers/projects/pipeline_helper.rb
+++ b/app/helpers/projects/pipeline_helper.rb
@@ -5,10 +5,12 @@ module Projects
def js_pipeline_tabs_data(project, pipeline)
{
can_generate_codequality_reports: pipeline.can_generate_codequality_reports?.to_json,
+ full_path: project.full_path,
graphql_resource_etag: graphql_etag_pipeline_path(pipeline),
metrics_path: namespace_project_ci_prometheus_metrics_histograms_path(namespace_id: project.namespace, project_id: project, format: :json),
pipeline_iid: pipeline.iid,
- pipeline_project_path: project.full_path
+ pipeline_project_path: project.full_path,
+ total_job_count: pipeline.total_size
}
end
end
diff --git a/app/helpers/search_helper.rb b/app/helpers/search_helper.rb
index 69bea0abd88..c8750cd9b52 100644
--- a/app/helpers/search_helper.rb
+++ b/app/helpers/search_helper.rb
@@ -117,6 +117,8 @@ module SearchHelper
end
def repository_ref(project)
+ return project.default_branch unless params[:project_id]
+
# Always #to_s the repository_ref param in case the value is also a number
params[:repository_ref].to_s.presence || project.default_branch
end
diff --git a/app/models/deployment.rb b/app/models/deployment.rb
index f84857d3511..3a96f4e3867 100644
--- a/app/models/deployment.rb
+++ b/app/models/deployment.rb
@@ -110,7 +110,11 @@ class Deployment < ApplicationRecord
after_transition any => :running do |deployment|
deployment.run_after_commit do
- Deployments::HooksWorker.perform_async(deployment_id: id, status_changed_at: Time.current)
+ if Feature.enabled?(:deployment_hooks_skip_worker, deployment.project)
+ deployment.execute_hooks(Time.current)
+ else
+ Deployments::HooksWorker.perform_async(deployment_id: id, status_changed_at: Time.current)
+ end
end
end
@@ -124,7 +128,11 @@ class Deployment < ApplicationRecord
after_transition any => FINISHED_STATUSES do |deployment|
deployment.run_after_commit do
- Deployments::HooksWorker.perform_async(deployment_id: id, status_changed_at: Time.current)
+ if Feature.enabled?(:deployment_hooks_skip_worker, deployment.project)
+ deployment.execute_hooks(Time.current)
+ else
+ Deployments::HooksWorker.perform_async(deployment_id: id, status_changed_at: Time.current)
+ end
end
end
diff --git a/app/policies/issuable_policy.rb b/app/policies/issuable_policy.rb
index 4e6df79773e..f1efcb25331 100644
--- a/app/policies/issuable_policy.rb
+++ b/app/policies/issuable_policy.rb
@@ -13,7 +13,9 @@ class IssuablePolicy < BasePolicy
condition(:is_author) { @subject&.author == @user }
- rule { can?(:guest_access) & assignee_or_author }.policy do
+ condition(:is_incident) { @subject.incident? }
+
+ rule { can?(:guest_access) & assignee_or_author & ~is_incident }.policy do
enable :read_issue
enable :update_issue
enable :reopen_issue
diff --git a/app/views/jira_connect/subscriptions/index.html.haml b/app/views/jira_connect/subscriptions/index.html.haml
index 3319137551b..d4ced15b869 100644
--- a/app/views/jira_connect/subscriptions/index.html.haml
+++ b/app/views/jira_connect/subscriptions/index.html.haml
@@ -1,8 +1,4 @@
-%header.jira-connect-header.gl-display-flex.gl-align-items-center.gl-justify-content-center.gl-px-5.gl-border-b-solid.gl-border-b-gray-100.gl-border-b-1.gl-bg-white
- = link_to brand_header_logo, Gitlab.config.gitlab.url, target: '_blank', rel: 'noopener noreferrer'
-
-%main.jira-connect-app.gl-px-5.gl-pt-7.gl-mx-auto
- .js-jira-connect-app{ data: jira_connect_app_data(@subscriptions) }
+.js-jira-connect-app{ data: jira_connect_app_data(@subscriptions) }
= webpack_bundle_tag 'performance_bar' if performance_bar_enabled?
= webpack_bundle_tag 'jira_connect_app'
diff --git a/app/views/profiles/_email_settings.html.haml b/app/views/profiles/_email_settings.html.haml
index 35cad79b6fd..457d6690a78 100644
--- a/app/views/profiles/_email_settings.html.haml
+++ b/app/views/profiles/_email_settings.html.haml
@@ -7,7 +7,7 @@
.form-group.gl-form-group
= form.label :email, _('Email')
- = form.text_field :email, required: true, class: 'gl-form-input form-control gl-form-input-lg', value: (@user.email unless @user.temp_oauth_email?), readonly: readonly || email_change_disabled
+ = form.text_field :email, required: true, class: 'gl-form-input form-control gl-md-form-input-lg', value: (@user.email unless @user.temp_oauth_email?), readonly: readonly || email_change_disabled
%small.form-text.text-gl-muted
= help_text.html_safe
@@ -16,7 +16,7 @@
.form-group.gl-form-group
= form.label :public_email, s_('Profiles|Public email')
- .gl-form-input-lg
+ .gl-md-form-input-lg
= form.select :public_email,
options_for_select(@user.public_verified_emails, selected: @user.public_email),
{ include_blank: s_("Profiles|Do not show on profile") },
@@ -29,7 +29,7 @@
- commit_email_link_start = '<a href="%{url}">'.html_safe % { url: commit_email_link_url }
- commit_email_docs_link = s_('Profiles|This email will be used for web based operations, such as edits and merges. %{commit_email_link_start}Learn more%{commit_email_link_end}').html_safe % { commit_email_link_start: commit_email_link_start, commit_email_link_end: '</a>'.html_safe }
= form.label :commit_email, s_('Profiles|Commit email')
- .gl-form-input-lg
+ .gl-md-form-input-lg
= form.select :commit_email,
options_for_select(commit_email_select_options(@user), selected: @user.commit_email),
{},
diff --git a/app/views/profiles/show.html.haml b/app/views/profiles/show.html.haml
index 107c7cebc61..d1f1ff892d5 100644
--- a/app/views/profiles/show.html.haml
+++ b/app/views/profiles/show.html.haml
@@ -109,44 +109,44 @@
= f.text_field :id, class: 'gl-form-input form-control', readonly: true
.form-group.gl-form-group
= f.label :pronouns, s_('Profiles|Pronouns')
- = f.text_field :pronouns, class: 'gl-form-input form-control gl-form-input-lg'
+ = f.text_field :pronouns, class: 'gl-form-input form-control gl-md-form-input-lg'
%small.form-text.text-gl-muted
= s_("Profiles|Enter your pronouns to let people know how to refer to you")
.form-group.gl-form-group
= f.label :pronunciation, s_('Profiles|Pronunciation')
- = f.text_field :pronunciation, class: 'gl-form-input form-control gl-form-input-lg'
+ = f.text_field :pronunciation, class: 'gl-form-input form-control gl-md-form-input-lg'
%small.form-text.text-gl-muted
= s_("Profiles|Enter how your name is pronounced to help people address you correctly")
= render_if_exists 'profiles/extra_settings', form: f
= render_if_exists 'profiles/email_settings', form: f
.form-group.gl-form-group
= f.label :skype
- = f.text_field :skype, class: 'gl-form-input form-control gl-form-input-lg', placeholder: s_("Profiles|username")
+ = f.text_field :skype, class: 'gl-form-input form-control gl-md-form-input-lg', placeholder: s_("Profiles|username")
.form-group.gl-form-group
= f.label :linkedin
- = f.text_field :linkedin, class: 'gl-form-input form-control gl-form-input-lg'
+ = f.text_field :linkedin, class: 'gl-form-input form-control gl-md-form-input-lg'
%small.form-text.text-gl-muted
= s_("Profiles|Your LinkedIn profile name from linkedin.com/in/profilename")
.form-group.gl-form-group
= f.label :twitter
- = f.text_field :twitter, class: 'gl-form-input form-control gl-form-input-lg', placeholder: s_("Profiles|@username")
+ = f.text_field :twitter, class: 'gl-form-input form-control gl-md-form-input-lg', placeholder: s_("Profiles|@username")
.form-group.gl-form-group
= f.label :website_url, s_('Profiles|Website url')
- = f.text_field :website_url, class: 'gl-form-input form-control gl-form-input-lg', placeholder: s_("Profiles|https://website.com")
+ = f.text_field :website_url, class: 'gl-form-input form-control gl-md-form-input-lg', placeholder: s_("Profiles|https://website.com")
.form-group.gl-form-group
= f.label :location, s_('Profiles|Location')
- if @user.read_only_attribute?(:location)
- = f.text_field :location, class: 'gl-form-input form-control gl-form-input-lg', readonly: true
+ = f.text_field :location, class: 'gl-form-input form-control gl-md-form-input-lg', readonly: true
%small.form-text.text-gl-muted
= s_("Profiles|Your location was automatically set based on your %{provider_label} account") % { provider_label: attribute_provider_label(:location) }
- else
- = f.text_field :location, class: 'gl-form-input form-control gl-form-input-lg', placeholder: s_("Profiles|City, country")
+ = f.text_field :location, class: 'gl-form-input form-control gl-md-form-input-lg', placeholder: s_("Profiles|City, country")
.form-group.gl-form-group
= f.label :job_title, s_('Profiles|Job title')
- = f.text_field :job_title, class: 'gl-form-input form-control gl-form-input-lg'
+ = f.text_field :job_title, class: 'gl-form-input form-control gl-md-form-input-lg'
.form-group.gl-form-group
= f.label :organization, s_('Profiles|Organization')
- = f.text_field :organization, class: 'gl-form-input form-control gl-form-input-lg'
+ = f.text_field :organization, class: 'gl-form-input form-control gl-md-form-input-lg'
%small.form-text.text-gl-muted
= s_("Profiles|Who you represent or work for")
.form-group.gl-form-group
diff --git a/config/feature_flags/development/ci_throttle_pipelines_creation.yml b/config/feature_flags/development/ci_enforce_throttle_pipelines_creation.yml
index 162a69ade5d..828fde06bab 100644
--- a/config/feature_flags/development/ci_throttle_pipelines_creation.yml
+++ b/config/feature_flags/development/ci_enforce_throttle_pipelines_creation.yml
@@ -1,8 +1,8 @@
---
-name: ci_throttle_pipelines_creation
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/83969
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/357520
-milestone: '14.10'
+name: ci_enforce_throttle_pipelines_creation
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/87223
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/362513
+milestone: '15.1'
type: development
group: group::pipeline execution
default_enabled: false
diff --git a/config/feature_flags/development/ci_throttle_pipelines_creation_dry_run.yml b/config/feature_flags/development/deployment_hooks_skip_worker.yml
index 5092767e089..d7d35912e2d 100644
--- a/config/feature_flags/development/ci_throttle_pipelines_creation_dry_run.yml
+++ b/config/feature_flags/development/deployment_hooks_skip_worker.yml
@@ -1,8 +1,8 @@
---
-name: ci_throttle_pipelines_creation_dry_run
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/83969
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/357524
+name: deployment_hooks_skip_worker
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/83351
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/356468
milestone: '14.10'
type: development
-group: group::pipeline execution
-default_enabled: true
+group: group::integrations
+default_enabled: false
diff --git a/doc/.vale/gitlab/EOLWhitespace.yml b/doc/.vale/gitlab/EOLWhitespace.yml
new file mode 100644
index 00000000000..483db0cafe6
--- /dev/null
+++ b/doc/.vale/gitlab/EOLWhitespace.yml
@@ -0,0 +1,13 @@
+---
+# Error: gitlab.EOLWhitespace
+#
+# Checks that there is no useless whitespace at the end of lines.
+#
+# For a list of all options, see https://errata-ai.gitbook.io/vale/getting-started/styles
+extends: existence
+message: 'Lines should not end with whitespace characters.'
+link: https://docs.gitlab.com/ee/development/documentation/versions.html
+level: warning
+scope: raw
+raw:
+ - ' +\n'
diff --git a/doc/administration/audit_event_streaming.md b/doc/administration/audit_event_streaming.md
index 07979e21038..5ccecfa9c8c 100644
--- a/doc/administration/audit_event_streaming.md
+++ b/doc/administration/audit_event_streaming.md
@@ -132,7 +132,7 @@ Delete an event streaming destination by specifying an ID. Get the required ID b
streaming destinations.
```graphql
-mutation {
+mutation {
externalAuditEventDestinationDestroy(input: { id: destination }) {
errors
}
diff --git a/doc/administration/auth/ldap/ldap-troubleshooting.md b/doc/administration/auth/ldap/ldap-troubleshooting.md
index 5c5d5aaffe8..a7077ba3dd3 100644
--- a/doc/administration/auth/ldap/ldap-troubleshooting.md
+++ b/doc/administration/auth/ldap/ldap-troubleshooting.md
@@ -88,7 +88,7 @@ options = {
# :filter is optional
# This filter includes OID 1.2.840.113556.1.4.1941
- # It will search for all direct and nested members of the group gitlab_grp in the LDAP directory
+ # It will search for all direct and nested members of the group gitlab_grp in the LDAP directory
filter: Net::LDAP::Filter.construct("(memberOf:1.2.840.113556.1.4.1941:=CN=gitlab_grp,DC=example,DC=com)"),
# :attributes is optional
diff --git a/doc/administration/geo/replication/docker_registry.md b/doc/administration/geo/replication/docker_registry.md
index 4004ef3c17f..e38be8e4797 100644
--- a/doc/administration/geo/replication/docker_registry.md
+++ b/doc/administration/geo/replication/docker_registry.md
@@ -114,10 +114,10 @@ For each application and Sidekiq node on the **secondary** site:
```ruby
gitlab_rails['geo_registry_replication_enabled'] = true
-
+
# Primary registry's hostname and port, it will be used by
# the secondary node to directly communicate to primary registry
- gitlab_rails['geo_registry_replication_primary_api_url'] = 'https://primary.example.com:5050/'
+ gitlab_rails['geo_registry_replication_primary_api_url'] = 'https://primary.example.com:5050/'
```
1. Reconfigure the node for the change to take effect:
diff --git a/doc/administration/geo/replication/troubleshooting.md b/doc/administration/geo/replication/troubleshooting.md
index 5a29c5a3c54..9714dc56a06 100644
--- a/doc/administration/geo/replication/troubleshooting.md
+++ b/doc/administration/geo/replication/troubleshooting.md
@@ -1129,7 +1129,7 @@ Geo::TrackingBase::SecondaryNotConfigured: Geo secondary database is not configu
On a Geo primary site this error can be ignored.
-This happens because GitLab is attempting to display registries from the [Geo tracking database](../../../administration/geo/#geo-tracking-database) which doesn't exist on the primary site (only the original projects exist on the primary; no replicated projects are present, therefore no tracking database exists).
+This happens because GitLab is attempting to display registries from the [Geo tracking database](../../../administration/geo/#geo-tracking-database) which doesn't exist on the primary site (only the original projects exist on the primary; no replicated projects are present, therefore no tracking database exists).
## Fixing client errors
@@ -1148,7 +1148,7 @@ The partial failover to a secondary Geo *site* may be the result of a temporary/
1. SSH into every Sidekiq, PostgresSQL, Gitaly, and Rails node in the **secondary** site and run one of the following commands:
- To promote the secondary node to primary:
-
+
```shell
sudo gitlab-ctl geo promote
```
@@ -1158,8 +1158,8 @@ The partial failover to a secondary Geo *site* may be the result of a temporary/
```shell
sudo gitlab-ctl geo promote --force
```
-
-1. Verify you can connect to the newly-promoted **primary** site using the URL used previously for the **secondary** site.
+
+1. Verify you can connect to the newly-promoted **primary** site using the URL used previously for the **secondary** site.
1. If **successful**, the **secondary** site is now promoted to the **primary** site.
If the above steps are **not successful**, proceed through the next steps:
diff --git a/doc/administration/gitaly/praefect.md b/doc/administration/gitaly/praefect.md
index fb9f3e9c361..c9724fa5897 100644
--- a/doc/administration/gitaly/praefect.md
+++ b/doc/administration/gitaly/praefect.md
@@ -475,7 +475,7 @@ Updates to example must be made at:
# Some metrics run queries against the database. Enabling separate database metrics allows
# these metrics to be collected when the metrics are
- # scraped on a separate /db_metrics endpoint.
+ # scraped on a separate /db_metrics endpoint.
praefect['separate_database_metrics'] = true
```
diff --git a/doc/administration/gitaly/recovery.md b/doc/administration/gitaly/recovery.md
index 6de2acf1792..ecd68234b01 100644
--- a/doc/administration/gitaly/recovery.md
+++ b/doc/administration/gitaly/recovery.md
@@ -359,7 +359,7 @@ Add the `-older-than` option to avoid showing repositories that are the process
Praefect database. Replace `<duration>` with a time duration (for example, `5s`, `10m`, or `1h`). Defaults to `6h`.
```shell
-sudo /opt/gitlab/embedded/bin/praefect -config /var/opt/gitlab/praefect/config.toml list-untracked-repositories -older-than <duration>
+sudo /opt/gitlab/embedded/bin/praefect -config /var/opt/gitlab/praefect/config.toml list-untracked-repositories -older-than <duration>
```
Only repositories with a creation time before the specified duration are considered.
diff --git a/doc/administration/monitoring/prometheus/index.md b/doc/administration/monitoring/prometheus/index.md
index 22f7419be9a..55e52da7541 100644
--- a/doc/administration/monitoring/prometheus/index.md
+++ b/doc/administration/monitoring/prometheus/index.md
@@ -137,8 +137,8 @@ The steps below are the minimum necessary to configure a Monitoring node running
# Enable service discovery for Prometheus
consul['enable'] = true
- consul['monitoring_service_discovery'] = true
- consul['configuration'] = {
+ consul['monitoring_service_discovery'] = true
+ consul['configuration'] = {
retry_join: %w(10.0.0.1 10.0.0.2 10.0.0.3), # The addresses can be IPs or FQDNs
}
diff --git a/doc/administration/object_storage.md b/doc/administration/object_storage.md
index 0560a8813df..df5480bbaf2 100644
--- a/doc/administration/object_storage.md
+++ b/doc/administration/object_storage.md
@@ -765,7 +765,7 @@ Prerequisites:
1. [Install](https://rclone.org/downloads/) Rclone.
1. Configure Rclone by running the following:
-
+
```shell
rclone config
```
@@ -778,7 +778,7 @@ Prerequisites:
rclone ls old:uploads | head
```
- This should print a partial list of the objects currently stored in your `uploads` bucket. If you get an error, or if
+ This should print a partial list of the objects currently stored in your `uploads` bucket. If you get an error, or if
the list is empty, go back and update your Rclone configuration using `rclone config`.
1. Perform an initial copy. You do not need to take your GitLab server offline for this step.
@@ -788,7 +788,7 @@ Prerequisites:
```
1. After the first sync completes, use the web UI or command-line interface of your new object storage provider to
- verify that there are objects in the new bucket. If there are none, or if you encounter an error while running `rclone
+ verify that there are objects in the new bucket. If there are none, or if you encounter an error while running `rclone
sync`, check your Rclone configuration and try again.
After you have done at least one successful Rclone copy from the old location to the new location, schedule maintenance and take your GitLab server offline. During your maintenance window you must do two things:
diff --git a/doc/administration/packages/container_registry.md b/doc/administration/packages/container_registry.md
index 3a465f4fccc..51945555af8 100644
--- a/doc/administration/packages/container_registry.md
+++ b/doc/administration/packages/container_registry.md
@@ -1729,7 +1729,7 @@ In this case, follow these steps:
```ruby
gitlab_rails['registry_enabled'] = true
```
-
+
1. Save the file and [reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure)
for the changes to take effect.
1. Try the removal again.
diff --git a/doc/administration/postgresql/replication_and_failover.md b/doc/administration/postgresql/replication_and_failover.md
index 84122149cb8..bcac2ff3a2d 100644
--- a/doc/administration/postgresql/replication_and_failover.md
+++ b/doc/administration/postgresql/replication_and_failover.md
@@ -42,7 +42,7 @@ collections "**Consul** x3" as consul #e76a9b
card "Database" as database {
collections "**PGBouncer x3**\n//Consul//" as pgbouncer #4EA7FF
-
+
card "**PostgreSQL** //Primary//\n//Patroni//\n//PgBouncer//\n//Consul//" as postgres_primary #4EA7FF
collections "**PostgreSQL** //Secondary// **x2**\n//Patroni//\n//PgBouncer//\n//Consul//" as postgres_secondary #4EA7FF
diff --git a/doc/administration/reference_architectures/10k_users.md b/doc/administration/reference_architectures/10k_users.md
index f70912dbecb..33571a4eb85 100644
--- a/doc/administration/reference_architectures/10k_users.md
+++ b/doc/administration/reference_architectures/10k_users.md
@@ -86,7 +86,7 @@ card "Database" as database {
card "redis" as redis {
collections "**Redis Persistent** x3" as redis_persistent #FF6347
collections "**Redis Cache** x3" as redis_cache #FF6347
-
+
redis_cache -[hidden]-> redis_persistent
}
@@ -2381,7 +2381,7 @@ card "Database" as database {
card "redis" as redis {
collections "**Redis Persistent** x3" as redis_persistent #FF6347
collections "**Redis Cache** x3" as redis_cache #FF6347
-
+
redis_cache -[hidden]-> redis_persistent
}
diff --git a/doc/administration/reference_architectures/index.md b/doc/administration/reference_architectures/index.md
index 089e8881d7d..3da5af08a13 100644
--- a/doc/administration/reference_architectures/index.md
+++ b/doc/administration/reference_architectures/index.md
@@ -215,7 +215,7 @@ table.test-coverage th {
## Cost to run
-The following table details the cost to run the different reference architectures across GCP, AWS, and Azure. Bare-metal costs are not included here as it varies widely depending on each customer configuration.
+The following table details the cost to run the different reference architectures across GCP, AWS, and Azure. Bare-metal costs are not included here as it varies widely depending on each customer configuration.
<table class="test-coverage">
<col>
diff --git a/doc/administration/sidekiq.md b/doc/administration/sidekiq.md
index d9031e2221b..700fdb5cd77 100644
--- a/doc/administration/sidekiq.md
+++ b/doc/administration/sidekiq.md
@@ -233,7 +233,7 @@ To enable LDAP with the synchronization worker for Sidekiq:
gitlab_rails['ldap_servers'] = {
'main' => {
'label' => 'LDAP',
- 'host' => 'ldap.mydomain.com',
+ 'host' => 'ldap.mydomain.com',
'port' => 389,
'uid' => 'sAMAccountName',
'encryption' => 'simple_tls',
@@ -269,7 +269,7 @@ To enable LDAP with the synchronization worker for Sidekiq:
'external_groups' => [],
'sync_ssh_keys' => false
}
- }
+ }
gitlab_rails['ldap_sync_worker_cron'] = "0 */12 * * *"
```
diff --git a/doc/administration/troubleshooting/gitlab_rails_cheat_sheet.md b/doc/administration/troubleshooting/gitlab_rails_cheat_sheet.md
index 34481582d8b..5eb775a0b6e 100644
--- a/doc/administration/troubleshooting/gitlab_rails_cheat_sheet.md
+++ b/doc/administration/troubleshooting/gitlab_rails_cheat_sheet.md
@@ -760,7 +760,7 @@ parent.members_with_descendants.count
# This section lists all the groups which are pending deletion
#
Group.all.each do |g|
- if g.marked_for_deletion?
+ if g.marked_for_deletion?
puts "Group ID: #{g.id}"
puts "Group name: #{g.name}"
puts "Group path: #{g.full_path}"
diff --git a/doc/api/cluster_agents.md b/doc/api/cluster_agents.md
index 1c2a3b52761..d658d6893f5 100644
--- a/doc/api/cluster_agents.md
+++ b/doc/api/cluster_agents.md
@@ -380,7 +380,7 @@ Supported attributes:
| `id` | integer or string | yes | ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) maintained by the authenticated user. |
| `agent_id` | integer | yes | ID of the agent. |
| `name` | string | yes | Name for the token. |
-| `description` | string | no | Description for the token. |
+| `description` | string | no | Description for the token. |
Response:
diff --git a/doc/api/graphql/index.md b/doc/api/graphql/index.md
index 2ad29e8cb45..09b97a78e04 100644
--- a/doc/api/graphql/index.md
+++ b/doc/api/graphql/index.md
@@ -247,11 +247,11 @@ GraphQL mutations can be detected as spam. If a mutation is detected as spam and
- Use the `captchaSiteKey` to obtain a CAPTCHA response value using the appropriate CAPTCHA API.
Only [Google reCAPTCHA v2](https://developers.google.com/recaptcha/docs/display) is supported.
- Resubmit the request with the `X-GitLab-Captcha-Response` and `X-GitLab-Spam-Log-Id` headers set.
-
+
NOTE:
The GitLab GraphiQL implementation doesn't permit passing of headers, so we must write
this as a cURL query. `--data-binary` is used to properly handle escaped double quotes
-in the JSON-embedded query.
+in the JSON-embedded query.
```shell
export CAPTCHA_RESPONSE="<CAPTCHA response obtained from CAPTCHA service>"
diff --git a/doc/api/graphql/reference/index.md b/doc/api/graphql/reference/index.md
index ed1d58da07f..3c3e7bd9f57 100644
--- a/doc/api/graphql/reference/index.md
+++ b/doc/api/graphql/reference/index.md
@@ -15249,7 +15249,7 @@ Network Policies of the project.
WARNING:
**Deprecated** in 14.8.
-Network policies are deprecated and will be removed in GitLab 16.0.
+Network policies are deprecated and will be removed in GitLab 16.0. Since GitLab 15.0 this field returns no data.
Returns [`NetworkPolicyConnection`](#networkpolicyconnection).
diff --git a/doc/api/index.md b/doc/api/index.md
index 78e5f980679..d285ec081c8 100644
--- a/doc/api/index.md
+++ b/doc/api/index.md
@@ -90,7 +90,7 @@ end of the API URL.
NOTE:
In the example above, replace `gitlab.example.com` with `gitlab.com` to query GitLab.com (GitLab SaaS).
-Access can be denied due to authentication. For more information, see [Authentication](#authentication).
+Access can be denied due to authentication. For more information, see [Authentication](#authentication).
### API request to expose HTTP response headers
diff --git a/doc/api/lint.md b/doc/api/lint.md
index c0d0b69dc77..d5aa6af0e34 100644
--- a/doc/api/lint.md
+++ b/doc/api/lint.md
@@ -126,7 +126,7 @@ Example response:
"stage":"test",
"before_script":[],
"script":["echo 1"],
- "after_script":[],
+ "after_script":[],
"tag_list":[],
"environment":null,
"when":"on_success",
diff --git a/doc/ci/environments/index.md b/doc/ci/environments/index.md
index 7e1ef5efaa5..b13bd041d46 100644
--- a/doc/ci/environments/index.md
+++ b/doc/ci/environments/index.md
@@ -646,7 +646,7 @@ To delete a stopped environment in the GitLab UI:
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/208655) in GitLab 13.2.
-You can define a job that accesses an environment for various purposes, such as verification or preparation. This
+You can define a job that accesses an environment for various purposes, such as verification or preparation. This
effectively bypasses deployment creation, so that you can adjust your CD workflow more accurately.
To do so, add either `action: prepare`, `action: verify`, or `action: access` to the `environment` section of your job:
diff --git a/doc/ci/jobs/ci_job_token.md b/doc/ci/jobs/ci_job_token.md
index 8e5c8c8ab45..e4df593cbb2 100644
--- a/doc/ci/jobs/ci_job_token.md
+++ b/doc/ci/jobs/ci_job_token.md
@@ -28,7 +28,7 @@ There's an open issue,
[GitLab-#333444](https://gitlab.com/gitlab-org/gitlab/-/issues/333444),
which prevents you from using a job token with internal projects. This bug only impacts self-managed
GitLab instances.
-
+
The token has the same permissions to access the API as the user that caused the
job to run. A user can cause a job to run by pushing a commit, triggering a manual job,
being the owner of a scheduled pipeline, and so on. Therefore, this user must be assigned to
diff --git a/doc/ci/runners/saas/linux_saas_runner.md b/doc/ci/runners/saas/linux_saas_runner.md
index fd3fedbc3f5..7f7c4be0ba6 100644
--- a/doc/ci/runners/saas/linux_saas_runner.md
+++ b/doc/ci/runners/saas/linux_saas_runner.md
@@ -18,7 +18,7 @@ region of the VMs is US East1.
Each instance is used only for one job. This ensures that any sensitive data left on the system can't be accessed by other people's CI/CD jobs.
NOTE:
-The final disk space your jobs can use will be less than 25GB. Some disk space allocated to the instance will be occupied by the operating system, the Docker image, and a copy of your cloned repository.
+The final disk space your jobs can use will be less than 25GB. Some disk space allocated to the instance will be occupied by the operating system, the Docker image, and a copy of your cloned repository.
The `gitlab-shared-runners-manager-X.gitlab.com` fleet of runners are dedicated for GitLab projects as well as community forks of them. They use a slightly larger machine type (n1-standard-2) and have a bigger SSD disk size. They don't run untagged jobs and unlike the general fleet of shared runners, the instances are re-used up to 40 times.
diff --git a/doc/development/adding_database_indexes.md b/doc/development/adding_database_indexes.md
index 35dbd80e4d1..0f30734c04b 100644
--- a/doc/development/adding_database_indexes.md
+++ b/doc/development/adding_database_indexes.md
@@ -285,7 +285,7 @@ production clone.
After the index is verified to exist on the production database, create a second
merge request that adds the index synchronously. The schema changes must be
-updated and committed to `structure.sql` in this second merge request.
+updated and committed to `structure.sql` in this second merge request.
The synchronous migration results in a no-op on GitLab.com, but you should still add the
migration as expected for other installations. The below block
demonstrates how to create the second migration for the previous
diff --git a/doc/development/cicd/schema.md b/doc/development/cicd/schema.md
index 0e456a25a7a..ee5b5e4359a 100644
--- a/doc/development/cicd/schema.md
+++ b/doc/development/cicd/schema.md
@@ -77,7 +77,7 @@ For example, this defines the `retry` keyword:
}
]
}
- }
+ }
}
```
@@ -106,7 +106,7 @@ under the topmost **properties** key.
}
},
}
- }
+ }
}
```
diff --git a/doc/development/contributing/merge_request_workflow.md b/doc/development/contributing/merge_request_workflow.md
index 399ce9141d8..eff1d2e671d 100644
--- a/doc/development/contributing/merge_request_workflow.md
+++ b/doc/development/contributing/merge_request_workflow.md
@@ -281,7 +281,7 @@ requirements.
1. The change is tested in a review app where possible and if appropriate.
1. The new feature does not degrade the user experience of the product.
1. The change is evaluated to [limit the impact of far-reaching work](https://about.gitlab.com/handbook/engineering/development/#reducing-the-impact-of-far-reaching-work).
-1. An agreed-upon [rollout plan](https://about.gitlab.com/handbook/engineering/development/processes/rollout-plans/).
+1. An agreed-upon [rollout plan](https://about.gitlab.com/handbook/engineering/development/processes/rollout-plans/).
1. Merged by a project maintainer.
### Production use
@@ -292,7 +292,7 @@ requirements.
1. If there is a performance risk in the change, I have analyzed the performance of the system before and after the change.
1. *If the merge request uses feature flags, per-project or per-group enablement, and a staged rollout:*
- Confirmed to be working on GitLab projects.
- - Confirmed to be working at each stage for all projects added.
+ - Confirmed to be working at each stage for all projects added.
1. Added to the [release post](https://about.gitlab.com/handbook/marketing/blog/release-posts/),
if relevant.
1. Added to [the website](https://gitlab.com/gitlab-com/www-gitlab-com/blob/master/data/features.yml), if relevant.
diff --git a/doc/development/database/avoiding_downtime_in_migrations.md b/doc/development/database/avoiding_downtime_in_migrations.md
index 3cf9ab1ab5c..57d8a1fab78 100644
--- a/doc/development/database/avoiding_downtime_in_migrations.md
+++ b/doc/development/database/avoiding_downtime_in_migrations.md
@@ -77,7 +77,7 @@ bundle exec rails g post_deployment_migration remove_users_updated_at_column
There are two scenarios that you need to consider
to write a migration that removes a column:
-#### A. The removed column has no indexes or constraints that belong to it
+#### A. The removed column has no indexes or constraints that belong to it
In this case, a **transactional migration** can be used. Something as simple as:
diff --git a/doc/development/event_store.md b/doc/development/event_store.md
index afd5640271e..b2cc7f41929 100644
--- a/doc/development/event_store.md
+++ b/doc/development/event_store.md
@@ -320,7 +320,7 @@ RSpec.describe MergeRequests::UpdateHeadPipelineWorker do
it_behaves_like 'subscribes to event' do
let(:event) { pipeline_created_event }
end
-
+
it 'does something' do
# This helper directly executes `perform` ensuring that `handle_event` is called correctly.
consume_event(subscriber: described_class, event: pipeline_created_event)
diff --git a/doc/development/experiment_guide/implementing_experiments.md b/doc/development/experiment_guide/implementing_experiments.md
index 3c33d015108..2618d3183cc 100644
--- a/doc/development/experiment_guide/implementing_experiments.md
+++ b/doc/development/experiment_guide/implementing_experiments.md
@@ -329,7 +329,7 @@ before_action -> { experiment(:pill_color).publish }, only: [:show]
You can then see this surface in the JavaScript console:
```javascript
-window.gl.experiments // => { pill_color: { excluded: false, experiment: "pill_color", key: "ca63ac02", variant: "candidate" } }
+window.gl.experiments // => { pill_color: { excluded: false, experiment: "pill_color", key: "ca63ac02", variant: "candidate" } }
```
### Using experiments in Vue
diff --git a/doc/development/experiment_guide/index.md b/doc/development/experiment_guide/index.md
index b140cce34fc..c8c396d2d60 100644
--- a/doc/development/experiment_guide/index.md
+++ b/doc/development/experiment_guide/index.md
@@ -6,8 +6,8 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Experiment Guide
-Experiments can be conducted by any GitLab team, most often the teams from the
-[Growth Sub-department](https://about.gitlab.com/handbook/engineering/development/growth/).
+Experiments can be conducted by any GitLab team, most often the teams from the
+[Growth Sub-department](https://about.gitlab.com/handbook/engineering/development/growth/).
Experiments are not tied to releases because they primarily target GitLab.com.
Experiments are run as an A/B/n test, and are behind an [experiment feature flag](../feature_flags/#experiment-type)
diff --git a/doc/development/experiment_guide/testing_experiments.md b/doc/development/experiment_guide/testing_experiments.md
index 08ff91a3deb..cbaf492824f 100644
--- a/doc/development/experiment_guide/testing_experiments.md
+++ b/doc/development/experiment_guide/testing_experiments.md
@@ -48,7 +48,7 @@ segmentations using the matchers.
class ExampleExperiment < ApplicationExperiment
control { }
candidate { '_candidate_' }
-
+
exclude { context.actor.first_name == 'Richard' }
segment(variant: :candidate) { context.actor.username == 'jejacks0n' }
end
diff --git a/doc/development/product_qualified_lead_guide/index.md b/doc/development/product_qualified_lead_guide/index.md
index dcd8b33e5c5..02ac833a0de 100644
--- a/doc/development/product_qualified_lead_guide/index.md
+++ b/doc/development/product_qualified_lead_guide/index.md
@@ -21,7 +21,7 @@ A hand-raise PQL is a user who requests to speak to sales from within the produc
1. Enter the credentials on CustomersDot development to Platypus in your `/config/secrets.yml` and restart. Credentials for the Platypus Staging are in the 1Password Growth vault. The URL for staging is `https://staging.ci.nexus.gitlabenvironment.cloud`.
```yaml
- platypus_url: "<%= ENV['PLATYPUS_URL'] %>"
+ platypus_url: "<%= ENV['PLATYPUS_URL'] %>"
platypus_client_id: "<%= ENV['PLATYPUS_CLIENT_ID'] %>"
platypus_client_secret: "<%= ENV['PLATYPUS_CLIENT_SECRET'] %>"
```
diff --git a/doc/development/service_ping/implement.md b/doc/development/service_ping/implement.md
index 27bc4d2e8ca..8021b24461c 100644
--- a/doc/development/service_ping/implement.md
+++ b/doc/development/service_ping/implement.md
@@ -286,7 +286,7 @@ Enabled by default in GitLab 13.7 and later.
Increment event count using an ordinary Redis counter, for a given event name.
API requests are protected by checking for a valid CSRF token.
-
+
```plaintext
POST /usage_data/increment_counter
```
diff --git a/doc/development/testing_guide/end_to_end/best_practices.md b/doc/development/testing_guide/end_to_end/best_practices.md
index bd9896934c7..45f64c9290b 100644
--- a/doc/development/testing_guide/end_to_end/best_practices.md
+++ b/doc/development/testing_guide/end_to_end/best_practices.md
@@ -189,9 +189,9 @@ Attach the `:aggregate_failures` metadata to the example if multiple expectation
it 'searches', :aggregate_failures do
Page::Search::Results.perform do |search|
expect(search).to have_file_in_project(template[:file_name], project.name)
-
+
search.switch_to_code
-
+
expect(search).to have_file_with_content(template[:file_name], content[0..33])
end
end
diff --git a/doc/development/testing_guide/end_to_end/capybara_to_chemlab_migration_guide.md b/doc/development/testing_guide/end_to_end/capybara_to_chemlab_migration_guide.md
index 9c7e0ef73a8..a71e076b57f 100644
--- a/doc/development/testing_guide/end_to_end/capybara_to_chemlab_migration_guide.md
+++ b/doc/development/testing_guide/end_to_end/capybara_to_chemlab_migration_guide.md
@@ -12,7 +12,7 @@ Given the view:
```html
<form id="my-form">
- <label for="first-name">First name</label>
+ <label for="first-name">First name</label>
<input type="text" name="first-name" data-qa-selector="first_name" />
<label for="last-name">Last name</label>
@@ -26,7 +26,7 @@ Given the view:
<label for="password">Password</label>
<input type="password" name="password" data-qa-selector="password" />
-
+
<input type="submit" value="Continue" data-qa-selector="continue"/>
</form>
```
diff --git a/doc/development/testing_guide/end_to_end/running_tests_that_require_special_setup.md b/doc/development/testing_guide/end_to_end/running_tests_that_require_special_setup.md
index 599e1104b72..8a56172918d 100644
--- a/doc/development/testing_guide/end_to_end/running_tests_that_require_special_setup.md
+++ b/doc/development/testing_guide/end_to_end/running_tests_that_require_special_setup.md
@@ -153,7 +153,7 @@ Examples of tests which require a runner:
Example:
```shell
-docker run \
+docker run \
--detach \
--hostname interface_ip_address \
--publish 80:80 \
diff --git a/doc/downgrade_ee_to_ce/index.md b/doc/downgrade_ee_to_ce/index.md
index 865d60fed73..3b9955c5d16 100644
--- a/doc/downgrade_ee_to_ce/index.md
+++ b/doc/downgrade_ee_to_ce/index.md
@@ -87,7 +87,7 @@ GitLab installation to the Community Edition.
To downgrade a source installation, you must replace the current remote of
your GitLab installation with the Community Edition's remote. After that, you
can fetch the latest changes, and checkout the latest stable branch:
-
+
```shell
git remote set-url origin git@gitlab.com:gitlab-org/gitlab-foss.git
git fetch --all
diff --git a/doc/operations/incident_management/incidents.md b/doc/operations/incident_management/incidents.md
index 66d04fce14c..43dbe284d37 100644
--- a/doc/operations/incident_management/incidents.md
+++ b/doc/operations/incident_management/incidents.md
@@ -180,7 +180,7 @@ charts in the **Metrics** tab:
![Incident Metrics tab](img/incident_metrics_tab_v13_8.png)
-When you upload an image, you can associate the image with text or a link to the original graph.
+When you upload an image, you can associate the image with text or a link to the original graph.
![Text link modal](img/incident_metrics_tab_text_link_modal_v14_9.png)
diff --git a/doc/raketasks/backup_restore.md b/doc/raketasks/backup_restore.md
index 7ff03989c61..e3fdb267f40 100644
--- a/doc/raketasks/backup_restore.md
+++ b/doc/raketasks/backup_restore.md
@@ -390,7 +390,7 @@ bundle for each repository. There must be an existing backup to create an increm
- In GitLab 14.9 and 14.10, use the `BACKUP=<timestamp_of_backup>` option to choose the backup to use. The chosen previous backup is overwritten.
- In GitLab 15.0 and later, use the `PREVIOUS_BACKUP=<timestamp_of_backup>` option to choose the backup to use. By default, a backup file is created
- as documented in the [Backup timestamp](#backup-timestamp) section. You can override the `[TIMESTAMP]` portion of the filename by setting the
+ as documented in the [Backup timestamp](#backup-timestamp) section. You can override the `[TIMESTAMP]` portion of the filename by setting the
[`BACKUP` environment variable](#backup-filename).
To create an incremental backup, run:
diff --git a/doc/subscriptions/self_managed/index.md b/doc/subscriptions/self_managed/index.md
index ce49b5a9c05..6270ad935be 100644
--- a/doc/subscriptions/self_managed/index.md
+++ b/doc/subscriptions/self_managed/index.md
@@ -355,10 +355,9 @@ To add seats to a subscription:
1. Review the **Subscription Upgrade Detail**. The system lists the total price for all users on the system and a credit for what you've already paid. You are only be charged for the net change.
1. Select **Confirm Upgrade**.
-The following items are emailed to you:
+A payment receipt is emailed to you, which you can also access in the Customers Portal under [**View invoices**](https://customers.gitlab.com/receipts).
-- A payment receipt. You can also access this information in the Customers Portal under [**View invoices**](https://customers.gitlab.com/receipts).
-- An activation code. [Add this code](../../user/admin_area/license.md) to your instance to use it.
+For subscriptions that use cloud licensing, the additional seats are reflected on your instance immediately and no further action is needed. If you're using a legacy license, you receive an updated license file. [Add this license](../../user/admin_area/license.md) to your instance to use it.
### Renew a subscription
diff --git a/doc/update/index.md b/doc/update/index.md
index 12f838b6093..746dec84748 100644
--- a/doc/update/index.md
+++ b/doc/update/index.md
@@ -419,7 +419,7 @@ and [Helm Chart deployments](https://docs.gitlab.com/charts/). They come with ap
### 14.9.0
-- Database changes made by the upgrade to GitLab 14.9 can take hours or days to complete on larger GitLab instances.
+- Database changes made by the upgrade to GitLab 14.9 can take hours or days to complete on larger GitLab instances.
These [batched background migrations](#batched-background-migrations) update whole database tables to ensure corresponding
records in `namespaces` table for each record in `projects` table.
@@ -433,16 +433,16 @@ and [Helm Chart deployments](https://docs.gitlab.com/charts/). They come with ap
```plaintext
Expected batched background migration for the given configuration to be marked as 'finished', but it is 'active':
```
-
+
Or
```plaintext
Error executing action `run` on resource 'bash[migrate gitlab-rails database]'
================================================================================
-
+
Mixlib::ShellOut::ShellCommandFailed
------------------------------------
- Command execution failed. STDOUT/STDERR suppressed for sensitive resource
+ Command execution failed. STDOUT/STDERR suppressed for sensitive resource
```
- GitLab 14.9.0 includes a
@@ -524,7 +524,7 @@ that may remain stuck permanently in a **pending** state.
- See [LFS objects import and mirror issue in GitLab 14.6.0 to 14.7.2](#lfs-objects-import-and-mirror-issue-in-gitlab-1460-to-1472).
- If upgrading from a version earlier than 14.6.5, 14.7.4, or 14.8.2, please review the [Critical Security Release: 14.8.2, 14.7.4, and 14.6.5](https://about.gitlab.com/releases/2022/02/25/critical-security-release-gitlab-14-8-2-released/) blog post.
Updating to 14.6.5 or later will reset runner registration tokens for your groups and projects.
-
+
### 14.5.0
- When `make` is run, Gitaly builds are now created in `_build/bin` and no longer in the root directory of the source directory. If you
diff --git a/doc/update/package/index.md b/doc/update/package/index.md
index faca633f446..7a506630c74 100644
--- a/doc/update/package/index.md
+++ b/doc/update/package/index.md
@@ -128,7 +128,7 @@ or upgrade command:
1. Install the specific `gitlab-ee` package by using one of the following commands
and replacing `<version>` with the next supported version you would like to install
- (make sure to review the [upgrade path](../index.md#upgrade-paths) to confirm the
+ (make sure to review the [upgrade path](../index.md#upgrade-paths) to confirm the
version you're installing is part of a supported path):
```shell
diff --git a/doc/user/admin_area/settings/rate_limit_on_pipelines_creation.md b/doc/user/admin_area/settings/rate_limit_on_pipelines_creation.md
index 2819a18d361..fce6179f5cf 100644
--- a/doc/user/admin_area/settings/rate_limit_on_pipelines_creation.md
+++ b/doc/user/admin_area/settings/rate_limit_on_pipelines_creation.md
@@ -31,3 +31,4 @@ To limit the number of pipeline requests:
1. Expand **Pipelines Rate Limits**.
1. Under **Max requests per minute**, enter a value greater than `0`.
1. Select **Save changes**.
+1. Enable `ci_enforce_throttle_pipelines_creation` feature flag to enable the rate limit.
diff --git a/doc/user/analytics/index.md b/doc/user/analytics/index.md
index 017a0c46570..6d0b87d29e2 100644
--- a/doc/user/analytics/index.md
+++ b/doc/user/analytics/index.md
@@ -81,7 +81,7 @@ Deployment frequency displays in several charts:
Lead time for changes measures the time to deliver a feature once it has been developed,
as described in [Measuring DevOps Performance](https://devops.com/measuring-devops-performance/).
-Lead time for changes displays in several charts:
+Lead time for changes displays in several charts:
- [Group-level value stream analytics](../group/value_stream_analytics/index.md)
- [Project-level value stream analytics](value_stream_analytics.md)
@@ -89,7 +89,7 @@ Lead time for changes displays in several charts:
### Time to restore service
-Time to restore service measures how long it takes an organization to recover from a failure in production.
+Time to restore service measures how long it takes an organization to recover from a failure in production.
GitLab measures this as the average time required to close the incidents
in the given time period. This assumes:
@@ -99,7 +99,7 @@ one production deployment, and any production deployment is related to no more t
To retrieve metrics for time to restore service, use the [GraphQL](../../api/graphql/reference/index.md) or the [REST](../../api/dora/metrics.md) APIs.
-### Change failure rate
+### Change failure rate
Change failure rate measures the percentage of deployments that cause a failure in production. GitLab measures this as the number
of incidents divided by the number of deployments to a
diff --git a/doc/user/analytics/value_stream_analytics.md b/doc/user/analytics/value_stream_analytics.md
index 039d33a1ad8..a428db75a28 100644
--- a/doc/user/analytics/value_stream_analytics.md
+++ b/doc/user/analytics/value_stream_analytics.md
@@ -119,7 +119,7 @@ The **Lead Time for Changes** metrics display below the **Filter results** text
To view deployment metrics, you must have a
[production environment configured](../../ci/environments/index.md#deployment-tier-of-environments).
-Value stream analytics shows the following deployment metrics for your project:
+Value stream analytics shows the following deployment metrics for your project:
- Deploys: The number of successful deployments in the date range.
- Deployment Frequency: The average number of successful deployments per day in the date range.
diff --git a/doc/user/application_security/coverage_fuzzing/index.md b/doc/user/application_security/coverage_fuzzing/index.md
index a5eca411858..f4404ed688f 100644
--- a/doc/user/application_security/coverage_fuzzing/index.md
+++ b/doc/user/application_security/coverage_fuzzing/index.md
@@ -145,7 +145,7 @@ You can download the JSON report file from the CI/CD pipelines page. For more in
## Corpus registry
> - [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/5017) in GitLab 14.8.
-> - [Generally available](https://gitlab.com/gitlab-org/gitlab/-/issues/347187) in GitLab 14.9. [Feature flags `corpus_management` and `corpus_management_ui`](https://gitlab.com/gitlab-org/gitlab/-/issues/328418) removed.
+> - [Generally available](https://gitlab.com/gitlab-org/gitlab/-/issues/347187) in GitLab 14.9. [Feature flags `corpus_management` and `corpus_management_ui`](https://gitlab.com/gitlab-org/gitlab/-/issues/328418) removed.
The corpus registry is a library of corpuses. Corpuses in a project's registry are available to
all jobs in that project. A project-wide registry is a more efficient way to manage corpuses than
diff --git a/doc/user/application_security/dast/browser_based.md b/doc/user/application_security/dast/browser_based.md
index 4cde1847419..ffcd496e2c3 100644
--- a/doc/user/application_security/dast/browser_based.md
+++ b/doc/user/application_security/dast/browser_based.md
@@ -111,7 +111,7 @@ a page fully loaded. Browser-based scans consider a page loaded when:
1. The [DOMContentLoaded](https://developer.mozilla.org/en-US/docs/Web/API/Window/DOMContentLoaded_event) event has fired.
1. There are no open or outstanding requests that are deemed important, such as JavaScript and CSS. Media files are usually deemed unimportant.
1. Depending on whether the browser executed a navigation, was forcibly transitioned, or action:
-
+
- There are no new Document Object Model (DOM) modification events after the `DAST_BROWSER_NAVIGATION_STABILITY_TIMEOUT`, `DAST_BROWSER_STABILITY_TIMEOUT`, or `DAST_BROWSER_ACTION_STABILITY_TIMEOUT` durations.
After these events have occurred, browser-based scans consider the page loaded and ready, and attempt the next action.
diff --git a/doc/user/application_security/dast/checks/359.1.md b/doc/user/application_security/dast/checks/359.1.md
index af1fdf8a596..076ab2da0d5 100644
--- a/doc/user/application_security/dast/checks/359.1.md
+++ b/doc/user/application_security/dast/checks/359.1.md
@@ -8,8 +8,8 @@ info: To determine the technical writer assigned to the Stage/Group associated w
## Description
-The target application was found to return credit card information in the response. Organizations
-found returning such information may be in violation of industry regulations and could face fines.
+The target application was found to return credit card information in the response. Organizations
+found returning such information may be in violation of industry regulations and could face fines.
## Remediation
@@ -17,7 +17,7 @@ PII such as credit cards should never be directly returned to the user. The majo
the last few digits or characters of the identifier. For example, credit card numbers should
only return the last four digits: `****-****-****-1234`. Ensure this masking is done on the server
and only then send the masked data back to the client. Do not rely on client side JavaScript or other methods
-to mask these values as the data could still be intercepted or unmasked.
+to mask these values as the data could still be intercepted or unmasked.
Additionally, credit card information should never be stored un-encrypted in files or databases.
diff --git a/doc/user/application_security/dast/checks/359.2.md b/doc/user/application_security/dast/checks/359.2.md
index beb99e26097..2c59b5e321f 100644
--- a/doc/user/application_security/dast/checks/359.2.md
+++ b/doc/user/application_security/dast/checks/359.2.md
@@ -8,16 +8,16 @@ info: To determine the technical writer assigned to the Stage/Group associated w
## Description
-The target application was found to return social security number (SSN) information in the response. Organizations
-found returning such information may be in violation of (United States) state or federal laws and may face stiff penalties.
+The target application was found to return social security number (SSN) information in the response. Organizations
+found returning such information may be in violation of (United States) state or federal laws and may face stiff penalties.
## Remediation
-PII such as social security numbers should never be directly returned to the user. The majority of the information
+PII such as social security numbers should never be directly returned to the user. The majority of the information
should masked except the last few digits or characters of the identifier. For example, social security numbers
only be displayed with the last four digits: `***-**-1234`. Ensure this masking is done on the server
and only then send the masked data back to the client. Do not rely on client side JavaScript or other methods
-to mask these values as the data could still be intercepted or unmasked.
+to mask these values as the data could still be intercepted or unmasked.
Additionally, social security numbers should never be stored un-encrypted in files or databases.
diff --git a/doc/user/application_security/index.md b/doc/user/application_security/index.md
index d22949c7285..d4b5c029b26 100644
--- a/doc/user/application_security/index.md
+++ b/doc/user/application_security/index.md
@@ -213,9 +213,9 @@ security issues:
### Migration of existing Vulnerability-Check rules
-If your projects have rules that have a security orchestration project, a new MR with
+If your projects have rules that have a security orchestration project, a new MR with
the existing rule's content is created automatically against the default branch belonging
-to the security orchestration project. To maintain the same security approval rules you
+to the security orchestration project. To maintain the same security approval rules you
had before GitLab 15.0, we recommend merging this new MR.
If your projects have rules without a security orchestration project, a new security orchestration project is created automatically with the content of the existing rule. No additional action is required.
@@ -666,6 +666,3 @@ These security pages can be populated by running the jobs from the manual step o
There is [an issue open to handle this scenario](https://gitlab.com/gitlab-org/gitlab/-/issues/346843).
Please upvote the issue to help with prioritization, and
[contributions are welcomed](https://about.gitlab.com/community/contribute/).
- doc/user/project/merge_requests/approvals/settings.md
-+
-0
diff --git a/doc/user/clusters/agent/gitops.md b/doc/user/clusters/agent/gitops.md
index 6ca9d855b44..3bd48390364 100644
--- a/doc/user/clusters/agent/gitops.md
+++ b/doc/user/clusters/agent/gitops.md
@@ -65,7 +65,7 @@ gitops:
- id: gitlab-org/cluster-integration/gitlab-agent
default_namespace: my-ns
paths:
- # Read all YAML files from this directory.
+ # Read all YAML files from this directory.
- glob: '/team1/app1/*.yaml'
# Read all .yaml files from team2/apps and all subdirectories.
- glob: '/team2/apps/**/*.yaml'
diff --git a/doc/user/group/index.md b/doc/user/group/index.md
index e3487ad73e0..f7271d6b9ee 100644
--- a/doc/user/group/index.md
+++ b/doc/user/group/index.md
@@ -623,7 +623,7 @@ You should consider these security implications before configuring IP address re
names and hierarchies. Only the [group](../../api/groups.md) (including all [group resources](../../api/api_resources.md#group-resources))
APIs and [project](../../api/api_resources.md#project-resources) (including all [project resources](../../api/api_resources.md#project-resources))
APIs are protected by IP address restrictions.
-- **Activities performed by GitLab Runners are not bound by IP restrictions**:
+- **Activities performed by GitLab Runners are not bound by IP restrictions**:
When you register a runner, it is not bound by the IP restrictions. When the runner
requests a new job or an update to a job's state, it is also not bound by
the IP restrictions. But when the running CI/CD job sends Git requests from a
diff --git a/doc/user/infrastructure/clusters/connect/new_gke_cluster.md b/doc/user/infrastructure/clusters/connect/new_gke_cluster.md
index be58b4565a1..7666ee4821e 100644
--- a/doc/user/infrastructure/clusters/connect/new_gke_cluster.md
+++ b/doc/user/infrastructure/clusters/connect/new_gke_cluster.md
@@ -98,7 +98,7 @@ Use CI/CD environment variables to configure your project.
1. Set the variable `BASE64_GOOGLE_CREDENTIALS` to the `base64` encoded JSON file you just created.
1. Set the variable `TF_VAR_gcp_project` to your GCP's `project` name.
1. Set the variable `TF_VAR_agent_token` to the agent token displayed in the previous task.
-1. Set the variable `TF_VAR_kas_address` to the agent server address displayed in the previous task.
+1. Set the variable `TF_VAR_kas_address` to the agent server address displayed in the previous task.
**Optional configuration:**
diff --git a/doc/user/infrastructure/iac/terraform_state.md b/doc/user/infrastructure/iac/terraform_state.md
index f56fe92ec01..eeb65a46f0f 100644
--- a/doc/user/infrastructure/iac/terraform_state.md
+++ b/doc/user/infrastructure/iac/terraform_state.md
@@ -56,7 +56,7 @@ To configure GitLab CI/CD as a backend:
1. In the root directory of your project repository, create a `.gitlab-ci.yml` file. Use
[this file](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Terraform.gitlab-ci.yml)
to populate it.
-
+
1. Push your project to GitLab. This action triggers a pipeline, which
runs the `gitlab-terraform init`, `gitlab-terraform validate`, and
`gitlab-terraform plan` commands.
diff --git a/doc/user/packages/container_registry/reduce_container_registry_data_transfer.md b/doc/user/packages/container_registry/reduce_container_registry_data_transfer.md
index 9dcb4d7127d..8f90f42ad08 100644
--- a/doc/user/packages/container_registry/reduce_container_registry_data_transfer.md
+++ b/doc/user/packages/container_registry/reduce_container_registry_data_transfer.md
@@ -114,8 +114,8 @@ up your builds and reduce the amount of data transferred. For more information,
## Check automation frequency
-We often create automation scripts bundled into container images to perform regular tasks on specific intervals.
-You can reduce the frequency of those intervals in cases where the automation is pulling container images from
+We often create automation scripts bundled into container images to perform regular tasks on specific intervals.
+You can reduce the frequency of those intervals in cases where the automation is pulling container images from
the GitLab Registry to a service outside of GitLab.com.
## Move to GitLab Premium or Ultimate
diff --git a/doc/user/packages/go_proxy/index.md b/doc/user/packages/go_proxy/index.md
index d2edfcb94c5..733fd383a04 100644
--- a/doc/user/packages/go_proxy/index.md
+++ b/doc/user/packages/go_proxy/index.md
@@ -108,7 +108,7 @@ and add the following text. Replace the variables in `< >` with your values.
WARNING:
If you use an environment variable called `NETRC`, Go will use its value
-as a filename and ignore `~/.netrc`. If you intend to use `~/.netrc` in
+as a filename and ignore `~/.netrc`. If you intend to use `~/.netrc` in
the GitLab CI **do not use `NETRC` as an environment variable name**.
```plaintext
diff --git a/doc/user/packages/helm_repository/index.md b/doc/user/packages/helm_repository/index.md
index 73298afc9cd..88ea5afad3c 100644
--- a/doc/user/packages/helm_repository/index.md
+++ b/doc/user/packages/helm_repository/index.md
@@ -78,10 +78,10 @@ For example:
```yaml
image: curlimages/curl:latest
-
+
stages:
- upload
-
+
upload:
stage: upload
script:
diff --git a/doc/user/packages/npm_registry/index.md b/doc/user/packages/npm_registry/index.md
index 1f37e5639c6..bdcbea68568 100644
--- a/doc/user/packages/npm_registry/index.md
+++ b/doc/user/packages/npm_registry/index.md
@@ -397,7 +397,7 @@ If multiple packages have the same name and version, when you install a package,
- Replace `@foo` with your scope.
- Replace `gitlab.example.com` with your domain name.
-
+
For [project-level endpoints](#use-the-gitlab-endpoint-for-npm-packages) run:
```shell
diff --git a/doc/user/permissions.md b/doc/user/permissions.md
index 433274c63b9..a141806c813 100644
--- a/doc/user/permissions.md
+++ b/doc/user/permissions.md
@@ -232,7 +232,7 @@ The following table lists project permissions available for each role:
15. Guest users can only set metadata (for example, labels, assignees, or milestones)
when creating an issue. They cannot change the metadata on existing issues.
16. In GitLab 14.5 or later, Guests are not allowed to [create incidents](../operations/incident_management/incidents.md#incident-creation).
- A guest who created an incident when they had the Reporter role or who is assigned to the incident can modify the title, description and metrics. They can also close and reopen the incident.
+ In GitLab 15.1 and later, a Guest who created an issue that was promoted to an incident cannot edit, close, or reopen their incident.
17. In projects that accept contributions from external members, users can create, edit, and close their own merge requests.
18. Authors and assignees of issues can modify the title and description even if they don't have the Reporter role.
19. Authors and assignees can close and reopen issues even if they don't have the Reporter role.
diff --git a/doc/user/profile/index.md b/doc/user/profile/index.md
index 931fd0be23b..1ec89750c0b 100644
--- a/doc/user/profile/index.md
+++ b/doc/user/profile/index.md
@@ -399,7 +399,7 @@ You can add this URL to your feed reader.
### Reset the user activity feed token
-Feed tokens are sensitive and can reveal information from confidential issues.
+Feed tokens are sensitive and can reveal information from confidential issues.
If you think your feed token has been exposed, you should reset it.
To reset your feed token:
@@ -408,7 +408,7 @@ To reset your feed token:
1. Select **Edit profile**.
1. On the left sidebar, select **Access Tokens**.
1. Scroll down. In the **Feed token** section, select the
- **reset this token** link.
+ **reset this token** link.
1. On the confirmation box, select **OK**.
A new token is generated.
diff --git a/doc/user/project/code_owners.md b/doc/user/project/code_owners.md
index e37ff560080..197a995952a 100644
--- a/doc/user/project/code_owners.md
+++ b/doc/user/project/code_owners.md
@@ -255,7 +255,7 @@ README @group @group/with-nested/subgroup
/docs/* @root-docs
# Include `/**` to specify Code Owners for all subdirectories
-# in a directory. This rule matches `docs/projects/index.md` or
+# in a directory. This rule matches `docs/projects/index.md` or
# `docs/development/index.md`
/docs/**/*.md @root-docs
diff --git a/doc/user/project/integrations/harbor.md b/doc/user/project/integrations/harbor.md
index 2a1b12057aa..a952abf691d 100644
--- a/doc/user/project/integrations/harbor.md
+++ b/doc/user/project/integrations/harbor.md
@@ -31,7 +31,7 @@ GitLab supports integrating Harbor projects at the group or project level. Compl
1. Turn on the **Active** toggle under **Enable Integration**.
1. Provide the Harbor configuration information:
- **Harbor URL**: The base URL of Harbor instance which is being linked to this GitLab project. For example, `https://harbor.example.net`.
- - **Harbor project name**: The project name in the Harbor instance. For example, `testproject`.
+ - **Harbor project name**: The project name in the Harbor instance. For example, `testproject`.
- **Username**: Your username in the Harbor instance, which should meet the requirements in [prerequisites](#prerequisites).
- **Password**: Password of your username.
diff --git a/doc/user/project/integrations/zentao.md b/doc/user/project/integrations/zentao.md
index 67125c3ebbf..32e07c0b6e9 100644
--- a/doc/user/project/integrations/zentao.md
+++ b/doc/user/project/integrations/zentao.md
@@ -12,9 +12,9 @@ info: To determine the technical writer assigned to the Stage/Group associated w
## Configure ZenTao
-This integration requires a ZenTao API secret key.
+This integration requires a ZenTao API secret key.
-Complete these steps in ZenTao:
+Complete these steps in ZenTao:
1. Go to your **Admin** page and select **Develop > Application**.
1. Select **Add Application**.
@@ -32,7 +32,7 @@ Complete these steps in GitLab:
1. Turn on the **Active** toggle under **Enable Integration**.
1. Provide the ZenTao configuration information:
- **ZenTao Web URL**: The base URL of the ZenTao instance web interface you're linking to this GitLab project (for example, `example.zentao.net`).
- - **ZenTao API URL** (optional): The base URL to the ZenTao instance API. Defaults to the Web URL value if not set.
+ - **ZenTao API URL** (optional): The base URL to the ZenTao instance API. Defaults to the Web URL value if not set.
- **ZenTao API token**: Use the key you generated when you [configured ZenTao](#configure-zentao).
- **ZenTao Product ID**: To display issues from a single ZenTao product in a given GitLab project. The Product ID can be found in the ZenTao product page under **Settings > Overview**.
diff --git a/doc/user/project/issues/csv_import.md b/doc/user/project/issues/csv_import.md
index a3f6ee5e61e..2fe3d78194c 100644
--- a/doc/user/project/issues/csv_import.md
+++ b/doc/user/project/issues/csv_import.md
@@ -25,7 +25,7 @@ To import issues:
1. Go to your project's Issues list page.
1. Open the import feature, depending if the project has issues:
- - Existing issues are present: Select the import icon at the top right, next to **Edit issues**.
+ - Existing issues are present: Select the import icon at the top right, next to **Edit issues**.
- Project has no issues: Select **Import CSV** in the middle of the page.
1. Select the file you want to import, and then select **Import issues**.
diff --git a/doc/user/project/merge_requests/accessibility_testing.md b/doc/user/project/merge_requests/accessibility_testing.md
index 612f499bb65..b8907532066 100644
--- a/doc/user/project/merge_requests/accessibility_testing.md
+++ b/doc/user/project/merge_requests/accessibility_testing.md
@@ -46,10 +46,10 @@ To define the `a11y` job for GitLab 12.9 and later:
```yaml
stages:
- accessibility
-
+
variables:
a11y_urls: "https://about.gitlab.com https://gitlab.com/users/sign_in"
-
+
include:
- template: "Verify/Accessibility.gitlab-ci.yml"
```
diff --git a/doc/user/project/merge_requests/approvals/index.md b/doc/user/project/merge_requests/approvals/index.md
index f0ab4d606ad..a91c4c0725c 100644
--- a/doc/user/project/merge_requests/approvals/index.md
+++ b/doc/user/project/merge_requests/approvals/index.md
@@ -103,7 +103,7 @@ Without the approvals, the work cannot merge. Required approvals enable multiple
to determine who should review the work.
- Require an [approval before merging code that causes test coverage to decline](../../../../ci/pipelines/settings.md#coverage-check-approval-rule)
- Users on GitLab Ultimate can also [require approval from a security team](../../../application_security/index.md#security-approvals-in-merge-requests)
- before merging code that could introduce a vulnerability.
+ before merging code that could introduce a vulnerability.
## Related topics
diff --git a/doc/user/project/working_with_projects.md b/doc/user/project/working_with_projects.md
index bfc83aa22f5..87e3c7f3311 100644
--- a/doc/user/project/working_with_projects.md
+++ b/doc/user/project/working_with_projects.md
@@ -73,7 +73,7 @@ To create a project in GitLab:
- Create a [blank project](#create-a-blank-project).
- Create a project from a:
- [built-in template](#create-a-project-from-a-built-in-template).
- - [custom template](#create-a-project-from-a-custom-template).
+ - [custom template](#create-a-project-from-a-custom-template).
- [HIPAA audit protocol template](#create-a-project-from-the-hipaa-audit-protocol-template).
- [Import a project](../../user/project/import/index.md)
from a different repository. Contact your GitLab administrator if this option is not available.
diff --git a/doc/user/search/global_search/advanced_search_syntax.md b/doc/user/search/global_search/advanced_search_syntax.md
index 3aa016f0bff..5604177431c 100644
--- a/doc/user/search/global_search/advanced_search_syntax.md
+++ b/doc/user/search/global_search/advanced_search_syntax.md
@@ -18,7 +18,7 @@ Advanced Search searches default project branches only.
## General search
-<!-- markdownlint-disable -->
+<!-- markdownlint-disable -->
| Use | Description | Example |
|-----|--------------|-----------------------------------------------------------------------------------------------------------------------------------------------|
diff --git a/doc/user/usage_quotas.md b/doc/user/usage_quotas.md
index 21aa93d3f8b..fd658c96184 100644
--- a/doc/user/usage_quotas.md
+++ b/doc/user/usage_quotas.md
@@ -50,7 +50,7 @@ The following storage usage statistics are available to a maintainer:
## Manage your storage usage
-You can use several methods to manage and reduce your usage for some storage types.
+You can use several methods to manage and reduce your usage for some storage types.
For more information, see the following pages:
diff --git a/lib/gitlab/application_rate_limiter.rb b/lib/gitlab/application_rate_limiter.rb
index 41a6cbc2543..dbd9d0e9412 100644
--- a/lib/gitlab/application_rate_limiter.rb
+++ b/lib/gitlab/application_rate_limiter.rb
@@ -42,7 +42,7 @@ module Gitlab
search_rate_limit: { threshold: -> { application_settings.search_rate_limit }, interval: 1.minute },
search_rate_limit_unauthenticated: { threshold: -> { application_settings.search_rate_limit_unauthenticated }, interval: 1.minute },
gitlab_shell_operation: { threshold: 600, interval: 1.minute },
- pipelines_create: { threshold: 25, interval: 1.minute }
+ pipelines_create: { threshold: -> { application_settings.pipeline_limit_per_project_user_sha }, interval: 1.minute }
}.freeze
end
diff --git a/lib/gitlab/ci/pipeline/chain/limit/rate_limit.rb b/lib/gitlab/ci/pipeline/chain/limit/rate_limit.rb
index 17ebf56985b..c6d6c5dc14d 100644
--- a/lib/gitlab/ci/pipeline/chain/limit/rate_limit.rb
+++ b/lib/gitlab/ci/pipeline/chain/limit/rate_limit.rb
@@ -9,8 +9,6 @@ module Gitlab
include Chain::Helpers
def perform!
- return unless throttle_enabled?
-
# We exclude child-pipelines from the rate limit because they represent
# sub-pipelines that would otherwise hit the rate limit due to having the
# same scope (project, user, sha).
@@ -19,7 +17,7 @@ module Gitlab
if rate_limit_throttled?
create_log_entry
- error(throttle_message) unless dry_run?
+ error(throttle_message) if enforce_throttle?
end
end
@@ -51,15 +49,9 @@ module Gitlab
'Too many pipelines created in the last minute. Try again later.'
end
- def throttle_enabled?
- ::Feature.enabled?(
- :ci_throttle_pipelines_creation,
- project)
- end
-
- def dry_run?
+ def enforce_throttle?
::Feature.enabled?(
- :ci_throttle_pipelines_creation_dry_run,
+ :ci_enforce_throttle_pipelines_creation,
project)
end
end
diff --git a/spec/features/commits_spec.rb b/spec/features/commits_spec.rb
index 4b38df175e2..db841ffc627 100644
--- a/spec/features/commits_spec.rb
+++ b/spec/features/commits_spec.rb
@@ -10,7 +10,6 @@ RSpec.describe 'Commits' do
before do
sign_in(user)
stub_ci_pipeline_to_return_yaml_file
- stub_feature_flags(pipeline_tabs_vue: false)
end
let(:creator) { create(:user, developer_projects: [project]) }
@@ -94,7 +93,6 @@ RSpec.describe 'Commits' do
context 'Download artifacts', :js do
before do
- stub_feature_flags(pipeline_tabs_vue: false)
create(:ci_job_artifact, :archive, file: artifacts_file, job: build)
end
@@ -124,7 +122,6 @@ RSpec.describe 'Commits' do
context "when logged as reporter", :js do
before do
- stub_feature_flags(pipeline_tabs_vue: false)
project.add_reporter(user)
create(:ci_job_artifact, :archive, file: artifacts_file, job: build)
visit builds_project_pipeline_path(project, pipeline)
diff --git a/spec/features/issues/issue_detail_spec.rb b/spec/features/issues/issue_detail_spec.rb
index 88709d66887..2af54e51bb7 100644
--- a/spec/features/issues/issue_detail_spec.rb
+++ b/spec/features/issues/issue_detail_spec.rb
@@ -140,13 +140,9 @@ RSpec.describe 'Issue Detail', :js do
end
context 'by non-member author' do
- it 'routes the user to the issue details page when the `issue_type` is set to issue' do
- open_issue_edit_form
-
- page.within('[data-testid="issuable-form"]') do
- update_type_select('Incident', 'Issue')
-
- expect(page).to have_current_path(project_issue_path(project, incident))
+ it 'cannot edit issuable' do
+ page.within('.content') do
+ expect(page).to have_no_button('Edit title and description')
end
end
end
diff --git a/spec/features/projects/pipelines/legacy_pipeline_spec.rb b/spec/features/projects/pipelines/legacy_pipeline_spec.rb
index a29cef393a8..203837fc5d4 100644
--- a/spec/features/projects/pipelines/legacy_pipeline_spec.rb
+++ b/spec/features/projects/pipelines/legacy_pipeline_spec.rb
@@ -1070,4 +1070,93 @@ RSpec.describe 'Pipeline', :js do
end
end
end
+
+ describe 'GET /:project/-/pipelines/:id/builds' do
+ include_context 'pipeline builds'
+
+ let_it_be(:project) { create(:project, :repository) }
+
+ let(:pipeline) { create(:ci_pipeline, project: project, ref: 'master', sha: project.commit.id) }
+
+ before do
+ visit builds_project_pipeline_path(project, pipeline)
+ end
+
+ it 'shows a list of jobs' do
+ expect(page).to have_content('Test')
+ expect(page).to have_content(build_passed.id)
+ expect(page).to have_content('Deploy')
+ expect(page).to have_content(build_failed.id)
+ expect(page).to have_content(build_running.id)
+ expect(page).to have_content(build_external.id)
+ expect(page).to have_content('Retry')
+ expect(page).to have_content('Cancel running')
+ expect(page).to have_button('Play')
+ end
+
+ context 'page tabs' do
+ it 'shows Pipeline, Jobs and DAG tabs with link' do
+ expect(page).to have_link('Pipeline')
+ expect(page).to have_link('Jobs')
+ expect(page).to have_link('Needs')
+ end
+
+ it 'shows counter in Jobs tab' do
+ expect(page.find('.js-builds-counter').text).to eq(pipeline.total_size.to_s)
+ end
+ end
+
+ context 'retrying jobs' do
+ it { expect(page).not_to have_content('retried') }
+
+ context 'when retrying' do
+ before do
+ find('[data-testid="retry"]', match: :first).click
+ end
+
+ it 'does not show a "Retry" button', :sidekiq_might_not_need_inline do
+ expect(page).not_to have_content('Retry')
+ end
+ end
+ end
+
+ context 'canceling jobs' do
+ it { expect(page).not_to have_selector('.ci-canceled') }
+
+ context 'when canceling' do
+ before do
+ click_on 'Cancel running'
+ end
+
+ it 'does not show a "Cancel running" button', :sidekiq_might_not_need_inline do
+ expect(page).not_to have_content('Cancel running')
+ end
+ end
+ end
+
+ context 'playing manual job' do
+ before do
+ within '[data-testid="jobs-tab-table"]' do
+ click_button('Play')
+
+ wait_for_requests
+ end
+ end
+
+ it { expect(build_manual.reload).to be_pending }
+ end
+
+ context 'when user unschedules a delayed job' do
+ before do
+ within '[data-testid="jobs-tab-table"]' do
+ click_button('Unschedule')
+ end
+ end
+
+ it 'unschedules the delayed job and shows play button as a manual job' do
+ expect(page).to have_button('Play')
+ expect(page).not_to have_button('Unschedule')
+ end
+ end
+ end
end
diff --git a/spec/features/projects/pipelines/pipeline_spec.rb b/spec/features/projects/pipelines/pipeline_spec.rb
index 9eda05f695d..d3052bfa02b 100644
--- a/spec/features/projects/pipelines/pipeline_spec.rb
+++ b/spec/features/projects/pipelines/pipeline_spec.rb
@@ -508,8 +508,7 @@ RSpec.describe 'Pipeline', :js do
end
it 'shows counter in Jobs tab' do
- skip('Enable in jobs `pipeline_tabs_vue` MR')
- expect(page.find('.js-builds-counter').text).to eq(pipeline.total_size.to_s)
+ expect(page.find('[data-testid="builds-counter"]').text).to eq(pipeline.total_size.to_s)
end
context 'without permission to access builds' do
@@ -889,7 +888,6 @@ RSpec.describe 'Pipeline', :js do
describe 'GET /:project/-/pipelines/:id/builds' do
before do
- stub_feature_flags(pipeline_tabs_vue: false)
visit builds_project_pipeline_path(project, pipeline)
end
@@ -1042,7 +1040,6 @@ RSpec.describe 'Pipeline', :js do
let(:pipeline) { create(:ci_pipeline, project: project, ref: 'master', sha: project.commit.id) }
before do
- stub_feature_flags(pipeline_tabs_vue: false)
visit builds_project_pipeline_path(project, pipeline)
end
@@ -1066,8 +1063,7 @@ RSpec.describe 'Pipeline', :js do
end
it 'shows counter in Jobs tab' do
- skip('unskip when jobs tab is implemented with ff `pipeline_tabs_vue`')
- expect(page.find('.js-builds-counter').text).to eq(pipeline.total_size.to_s)
+ expect(page.find('[data-testid="builds-counter"]').text).to eq(pipeline.total_size.to_s)
end
end
diff --git a/spec/frontend/mr_popover/__snapshots__/mr_popover_spec.js.snap b/spec/frontend/mr_popover/__snapshots__/mr_popover_spec.js.snap
index 5d84b4660c9..a03d8bf5bf4 100644
--- a/spec/frontend/mr_popover/__snapshots__/mr_popover_spec.js.snap
+++ b/spec/frontend/mr_popover/__snapshots__/mr_popover_spec.js.snap
@@ -17,13 +17,15 @@ exports[`MR Popover loaded state matches the snapshot 1`] = `
<div
class="d-inline-flex align-items-center"
>
- <div
- class="issuable-status-box status-box status-box-open"
+ <gl-badge-stub
+ class="gl-mr-3"
+ size="md"
+ variant="success"
>
Open
- </div>
+ </gl-badge-stub>
<span
class="gl-text-secondary"
diff --git a/spec/frontend/pipelines/components/pipeline_tabs_spec.js b/spec/frontend/pipelines/components/pipeline_tabs_spec.js
index 89002ee47a8..f2b188efea8 100644
--- a/spec/frontend/pipelines/components/pipeline_tabs_spec.js
+++ b/spec/frontend/pipelines/components/pipeline_tabs_spec.js
@@ -1,4 +1,5 @@
import { shallowMount } from '@vue/test-utils';
+import { GlTab } from '@gitlab/ui';
import { extendedWrapper } from 'helpers/vue_test_utils_helper';
import PipelineTabs from '~/pipelines/components/pipeline_tabs.vue';
import PipelineGraphWrapper from '~/pipelines/components/graph/graph_component_wrapper.vue';
@@ -21,8 +22,11 @@ describe('The Pipeline Tabs', () => {
const findPipelineApp = () => wrapper.findComponent(PipelineGraphWrapper);
const findTestsApp = () => wrapper.findComponent(TestReports);
+ const findJobsBadge = () => wrapper.findByTestId('builds-counter');
+
const defaultProvide = {
defaultTabValue: '',
+ totalJobCount: 10,
};
const createComponent = (propsData = {}) => {
@@ -33,7 +37,7 @@ describe('The Pipeline Tabs', () => {
...defaultProvide,
},
stubs: {
- JobsApp: { template: '<div class="jobs" />' },
+ GlTab,
TestReports: { template: '<div id="tests" />' },
},
}),
@@ -58,9 +62,23 @@ describe('The Pipeline Tabs', () => {
${'Jobs'} | ${findJobsTab} | ${findJobsApp}
${'Failed Jobs'} | ${findFailedJobsTab} | ${findFailedJobsApp}
${'Tests'} | ${findTestsTab} | ${findTestsApp}
- `('shows $tabName tab and its associated component', ({ appComponent, tabComponent }) => {
- expect(tabComponent().exists()).toBe(true);
- expect(appComponent().exists()).toBe(true);
+ `(
+ 'shows $tabName tab with its badge and its associated component',
+ ({ appComponent, tabComponent }) => {
+ expect(tabComponent().exists()).toBe(true);
+ expect(appComponent().exists()).toBe(true);
+ },
+ );
+ });
+
+ // We are going to add more tabs tests here as we do each tab MR
+ describe('Tabs badges', () => {
+ it.each`
+ tabName | badgeComponent | badgeText
+ ${'Jobs'} | ${findJobsBadge} | ${String(defaultProvide.totalJobCount)}
+ `('shows badge for $tabName with the correct text', ({ badgeComponent, badgeText }) => {
+ expect(badgeComponent().exists()).toBe(true);
+ expect(badgeComponent().text()).toBe(badgeText);
});
});
});
diff --git a/spec/frontend/vue_shared/components/filtered_search_bar/tokens/label_token_spec.js b/spec/frontend/vue_shared/components/filtered_search_bar/tokens/label_token_spec.js
index f03a2e7934f..51161a1a0ef 100644
--- a/spec/frontend/vue_shared/components/filtered_search_bar/tokens/label_token_spec.js
+++ b/spec/frontend/vue_shared/components/filtered_search_bar/tokens/label_token_spec.js
@@ -77,7 +77,7 @@ describe('LabelToken', () => {
describe('getActiveLabel', () => {
it('returns label object from labels array based on provided `currentValue` param', () => {
- expect(wrapper.vm.getActiveLabel(mockLabels, 'foo label')).toEqual(mockRegularLabel);
+ expect(wrapper.vm.getActiveLabel(mockLabels, 'Foo Label')).toEqual(mockRegularLabel);
});
});
diff --git a/spec/frontend/vue_shared/issuable/show/components/issuable_header_spec.js b/spec/frontend/vue_shared/issuable/show/components/issuable_header_spec.js
index 544db891a13..e00bb184535 100644
--- a/spec/frontend/vue_shared/issuable/show/components/issuable_header_spec.js
+++ b/spec/frontend/vue_shared/issuable/show/components/issuable_header_spec.js
@@ -1,4 +1,4 @@
-import { GlIcon, GlAvatarLabeled } from '@gitlab/ui';
+import { GlBadge, GlIcon, GlAvatarLabeled } from '@gitlab/ui';
import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import IssuableHeader from '~/vue_shared/issuable/show/components/issuable_header.vue';
@@ -69,7 +69,7 @@ describe('IssuableHeader', () => {
describe('template', () => {
it('renders issuable status icon and text', () => {
createComponent();
- const statusBoxEl = wrapper.findByTestId('status');
+ const statusBoxEl = wrapper.findComponent(GlBadge);
const statusIconEl = statusBoxEl.findComponent(GlIcon);
expect(statusBoxEl.exists()).toBe(true);
diff --git a/spec/frontend/vue_shared/issuable/show/components/issuable_title_spec.js b/spec/frontend/vue_shared/issuable/show/components/issuable_title_spec.js
index 11e3302d409..2e418ed3041 100644
--- a/spec/frontend/vue_shared/issuable/show/components/issuable_title_spec.js
+++ b/spec/frontend/vue_shared/issuable/show/components/issuable_title_spec.js
@@ -1,4 +1,4 @@
-import { GlIcon, GlButton, GlIntersectionObserver } from '@gitlab/ui';
+import { GlIcon, GlBadge, GlButton, GlIntersectionObserver } from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
import { nextTick } from 'vue';
import { createMockDirective, getBinding } from 'helpers/vue_mock_directive';
@@ -40,7 +40,7 @@ describe('IssuableTitle', () => {
describe('methods', () => {
describe('handleTitleAppear', () => {
it('sets value of `stickyTitleVisible` prop to false', () => {
- wrapper.find(GlIntersectionObserver).vm.$emit('appear');
+ wrapper.findComponent(GlIntersectionObserver).vm.$emit('appear');
expect(wrapper.vm.stickyTitleVisible).toBe(false);
});
@@ -48,7 +48,7 @@ describe('IssuableTitle', () => {
describe('handleTitleDisappear', () => {
it('sets value of `stickyTitleVisible` prop to true', () => {
- wrapper.find(GlIntersectionObserver).vm.$emit('disappear');
+ wrapper.findComponent(GlIntersectionObserver).vm.$emit('disappear');
expect(wrapper.vm.stickyTitleVisible).toBe(true);
});
@@ -77,7 +77,7 @@ describe('IssuableTitle', () => {
});
it('renders edit button', () => {
- const editButtonEl = wrapper.find(GlButton);
+ const editButtonEl = wrapper.findComponent(GlButton);
const tooltip = getBinding(editButtonEl.element, 'gl-tooltip');
expect(editButtonEl.exists()).toBe(true);
@@ -97,7 +97,13 @@ describe('IssuableTitle', () => {
const stickyHeaderEl = wrapper.find('[data-testid="header"]');
expect(stickyHeaderEl.exists()).toBe(true);
- expect(stickyHeaderEl.find(GlIcon).props('name')).toBe(issuableTitleProps.statusIcon);
+ expect(stickyHeaderEl.findComponent(GlBadge).props('variant')).toBe('success');
+ expect(stickyHeaderEl.findComponent(GlBadge).classes()).toContain(
+ mockIssuableShowProps.statusBadgeClass,
+ );
+ expect(stickyHeaderEl.findComponent(GlIcon).props('name')).toBe(
+ issuableTitleProps.statusIcon,
+ );
expect(stickyHeaderEl.text()).toContain('Open');
expect(stickyHeaderEl.text()).toContain(issuableTitleProps.issuable.title);
});
diff --git a/spec/helpers/projects/pipeline_helper_spec.rb b/spec/helpers/projects/pipeline_helper_spec.rb
index 90cf3cb03f8..a52139710aa 100644
--- a/spec/helpers/projects/pipeline_helper_spec.rb
+++ b/spec/helpers/projects/pipeline_helper_spec.rb
@@ -14,10 +14,12 @@ RSpec.describe Projects::PipelineHelper do
it 'returns pipeline tabs data' do
expect(pipeline_tabs_data).to include({
can_generate_codequality_reports: pipeline.can_generate_codequality_reports?.to_json,
+ full_path: project.full_path,
graphql_resource_etag: graphql_etag_pipeline_path(pipeline),
metrics_path: namespace_project_ci_prometheus_metrics_histograms_path(namespace_id: project.namespace, project_id: project, format: :json),
pipeline_iid: pipeline.iid,
- pipeline_project_path: project.full_path
+ pipeline_project_path: project.full_path,
+ total_job_count: pipeline.total_size
})
end
end
diff --git a/spec/helpers/search_helper_spec.rb b/spec/helpers/search_helper_spec.rb
index 8e2ec014383..4117d577f20 100644
--- a/spec/helpers/search_helper_spec.rb
+++ b/spec/helpers/search_helper_spec.rb
@@ -534,24 +534,26 @@ RSpec.describe SearchHelper do
end
describe '#repository_ref' do
+ using RSpec::Parameterized::TableSyntax
+
let_it_be(:project) { create(:project, :repository) }
- let(:params) { { repository_ref: 'the-repository-ref-param' } }
+ let(:default_branch) { project.default_branch }
+ let(:params) { { repository_ref: ref, project_id: project_id } }
subject { repository_ref(project) }
- it { is_expected.to eq('the-repository-ref-param') }
-
- context 'when the param :repository_ref is not set' do
- let(:params) { { repository_ref: nil } }
-
- it { is_expected.to eq(project.default_branch) }
+ where(:project_id, :ref, :expected_ref) do
+ 123 | 'ref-param' | 'ref-param'
+ 123 | nil | ref(:default_branch)
+ 123 | 111111 | '111111'
+ nil | 'ref-param' | ref(:default_branch)
end
- context 'when the repository_ref param is a number' do
- let(:params) { { repository_ref: 111111 } }
-
- it { is_expected.to eq('111111') }
+ with_them do
+ it 'returns expected_ref' do
+ expect(repository_ref(project)).to eq(expected_ref)
+ end
end
end
diff --git a/spec/lib/gitlab/ci/pipeline/chain/limit/rate_limit_spec.rb b/spec/lib/gitlab/ci/pipeline/chain/limit/rate_limit_spec.rb
index aa8aec2af4a..6ac07d10aba 100644
--- a/spec/lib/gitlab/ci/pipeline/chain/limit/rate_limit_spec.rb
+++ b/spec/lib/gitlab/ci/pipeline/chain/limit/rate_limit_spec.rb
@@ -30,10 +30,7 @@ RSpec.describe ::Gitlab::Ci::Pipeline::Chain::Limit::RateLimit, :freeze_time, :c
context 'when the limit is exceeded' do
before do
- allow(Gitlab::ApplicationRateLimiter).to receive(:rate_limits)
- .and_return(pipelines_create: { threshold: 1, interval: 1.minute })
-
- stub_feature_flags(ci_throttle_pipelines_creation_dry_run: false)
+ stub_application_setting(pipeline_limit_per_project_user_sha: 1)
end
it 'does not persist the pipeline' do
@@ -101,33 +98,9 @@ RSpec.describe ::Gitlab::Ci::Pipeline::Chain::Limit::RateLimit, :freeze_time, :c
end
end
- context 'when ci_throttle_pipelines_creation is disabled' do
- before do
- stub_feature_flags(ci_throttle_pipelines_creation: false)
- end
-
- it 'does not break the chain' do
- perform
-
- expect(step.break?).to be_falsey
- end
-
- it 'does not invalidate the pipeline' do
- perform
-
- expect(pipeline.errors).to be_empty
- end
-
- it 'does not log anything' do
- expect(Gitlab::AppJsonLogger).not_to receive(:info)
-
- perform
- end
- end
-
- context 'when ci_throttle_pipelines_creation_dry_run is enabled' do
+ context 'when ci_enforce_throttle_pipelines_creation is disabled' do
before do
- stub_feature_flags(ci_throttle_pipelines_creation_dry_run: true)
+ stub_feature_flags(ci_enforce_throttle_pipelines_creation: false)
end
it 'does not break the chain' do
diff --git a/spec/models/ci/build_spec.rb b/spec/models/ci/build_spec.rb
index c00509a9b64..74bbe1c50ca 100644
--- a/spec/models/ci/build_spec.rb
+++ b/spec/models/ci/build_spec.rb
@@ -1367,7 +1367,7 @@ RSpec.describe Ci::Build do
before do
allow(Deployments::LinkMergeRequestWorker).to receive(:perform_async)
- allow(Deployments::HooksWorker).to receive(:perform_async)
+ allow(deployment).to receive(:execute_hooks)
end
it 'has deployments record with created status' do
@@ -1423,7 +1423,7 @@ RSpec.describe Ci::Build do
before do
allow(Deployments::UpdateEnvironmentWorker).to receive(:perform_async)
- allow(Deployments::HooksWorker).to receive(:perform_async)
+ allow(deployment).to receive(:execute_hooks)
end
it_behaves_like 'avoid deadlock'
@@ -1509,14 +1509,28 @@ RSpec.describe Ci::Build do
it 'transitions to running and calls webhook' do
freeze_time do
- expect(Deployments::HooksWorker)
- .to receive(:perform_async).with(deployment_id: deployment.id, status_changed_at: Time.current)
+ expect(deployment).to receive(:execute_hooks).with(Time.current)
subject
end
expect(deployment).to be_running
end
+
+ context 'when `deployment_hooks_skip_worker` flag is disabled' do
+ before do
+ stub_feature_flags(deployment_hooks_skip_worker: false)
+ end
+
+ it 'executes Deployments::HooksWorker asynchronously' do
+ freeze_time do
+ expect(Deployments::HooksWorker)
+ .to receive(:perform_async).with(deployment_id: deployment.id, status_changed_at: Time.current)
+
+ subject
+ end
+ end
+ end
end
end
end
diff --git a/spec/models/deployment_spec.rb b/spec/models/deployment_spec.rb
index 409353bdbcf..8096604b965 100644
--- a/spec/models/deployment_spec.rb
+++ b/spec/models/deployment_spec.rb
@@ -137,15 +137,29 @@ RSpec.describe Deployment do
end
end
- it 'executes Deployments::HooksWorker asynchronously' do
+ it 'executes deployment hooks' do
freeze_time do
- expect(Deployments::HooksWorker)
- .to receive(:perform_async).with(deployment_id: deployment.id, status_changed_at: Time.current)
+ expect(deployment).to receive(:execute_hooks).with(Time.current)
deployment.run!
end
end
+ context 'when `deployment_hooks_skip_worker` flag is disabled' do
+ before do
+ stub_feature_flags(deployment_hooks_skip_worker: false)
+ end
+
+ it 'executes Deployments::HooksWorker asynchronously' do
+ freeze_time do
+ expect(Deployments::HooksWorker)
+ .to receive(:perform_async).with(deployment_id: deployment.id, status_changed_at: Time.current)
+
+ deployment.run!
+ end
+ end
+ end
+
it 'executes Deployments::DropOlderDeploymentsWorker asynchronously' do
expect(Deployments::DropOlderDeploymentsWorker)
.to receive(:perform_async).once.with(deployment.id)
@@ -173,14 +187,28 @@ RSpec.describe Deployment do
deployment.succeed!
end
- it 'executes Deployments::HooksWorker asynchronously' do
+ it 'executes deployment hooks' do
freeze_time do
- expect(Deployments::HooksWorker)
- .to receive(:perform_async).with(deployment_id: deployment.id, status_changed_at: Time.current)
+ expect(deployment).to receive(:execute_hooks).with(Time.current)
deployment.succeed!
end
end
+
+ context 'when `deployment_hooks_skip_worker` flag is disabled' do
+ before do
+ stub_feature_flags(deployment_hooks_skip_worker: false)
+ end
+
+ it 'executes Deployments::HooksWorker asynchronously' do
+ freeze_time do
+ expect(Deployments::HooksWorker)
+ .to receive(:perform_async).with(deployment_id: deployment.id, status_changed_at: Time.current)
+
+ deployment.succeed!
+ end
+ end
+ end
end
context 'when deployment failed' do
@@ -202,14 +230,28 @@ RSpec.describe Deployment do
deployment.drop!
end
- it 'executes Deployments::HooksWorker asynchronously' do
+ it 'executes deployment hooks' do
freeze_time do
- expect(Deployments::HooksWorker)
- .to receive(:perform_async).with(deployment_id: deployment.id, status_changed_at: Time.current)
+ expect(deployment).to receive(:execute_hooks).with(Time.current)
deployment.drop!
end
end
+
+ context 'when `deployment_hooks_skip_worker` flag is disabled' do
+ before do
+ stub_feature_flags(deployment_hooks_skip_worker: false)
+ end
+
+ it 'executes Deployments::HooksWorker asynchronously' do
+ freeze_time do
+ expect(Deployments::HooksWorker)
+ .to receive(:perform_async).with(deployment_id: deployment.id, status_changed_at: Time.current)
+
+ deployment.drop!
+ end
+ end
+ end
end
context 'when deployment was canceled' do
@@ -231,14 +273,28 @@ RSpec.describe Deployment do
deployment.cancel!
end
- it 'executes Deployments::HooksWorker asynchronously' do
+ it 'executes deployment hooks' do
freeze_time do
- expect(Deployments::HooksWorker)
- .to receive(:perform_async).with(deployment_id: deployment.id, status_changed_at: Time.current)
+ expect(deployment).to receive(:execute_hooks).with(Time.current)
deployment.cancel!
end
end
+
+ context 'when `deployment_hooks_skip_worker` flag is disabled' do
+ before do
+ stub_feature_flags(deployment_hooks_skip_worker: false)
+ end
+
+ it 'executes Deployments::HooksWorker asynchronously' do
+ freeze_time do
+ expect(Deployments::HooksWorker)
+ .to receive(:perform_async).with(deployment_id: deployment.id, status_changed_at: Time.current)
+
+ deployment.cancel!
+ end
+ end
+ end
end
context 'when deployment was skipped' do
@@ -266,6 +322,12 @@ RSpec.describe Deployment do
deployment.skip!
end
end
+
+ it 'does not execute deployment hooks' do
+ expect(deployment).not_to receive(:execute_hooks)
+
+ deployment.skip!
+ end
end
context 'when deployment is blocked' do
@@ -289,6 +351,12 @@ RSpec.describe Deployment do
deployment.block!
end
+
+ it 'does not execute deployment hooks' do
+ expect(deployment).not_to receive(:execute_hooks)
+
+ deployment.block!
+ end
end
describe 'synching status to Jira' do
@@ -845,11 +913,30 @@ RSpec.describe Deployment do
expect(Deployments::UpdateEnvironmentWorker).to receive(:perform_async)
expect(Deployments::LinkMergeRequestWorker).to receive(:perform_async)
expect(Deployments::ArchiveInProjectWorker).to receive(:perform_async)
- expect(Deployments::HooksWorker).to receive(:perform_async)
expect(deploy.update_status('success')).to eq(true)
end
+ context 'when `deployment_hooks_skip_worker` flag is disabled' do
+ before do
+ stub_feature_flags(deployment_hooks_skip_worker: false)
+ end
+
+ it 'schedules `Deployments::HooksWorker` when finishing a deploy' do
+ expect(Deployments::HooksWorker).to receive(:perform_async)
+
+ deploy.update_status('success')
+ end
+ end
+
+ it 'executes deployment hooks when finishing a deploy' do
+ freeze_time do
+ expect(deploy).to receive(:execute_hooks).with(Time.current)
+
+ deploy.update_status('success')
+ end
+ end
+
it 'updates finished_at when transitioning to a finished status' do
freeze_time do
deploy.update_status('success')
diff --git a/spec/services/ci/create_pipeline_service/rate_limit_spec.rb b/spec/services/ci/create_pipeline_service/rate_limit_spec.rb
index caea165cc6c..fbd8b41de63 100644
--- a/spec/services/ci/create_pipeline_service/rate_limit_spec.rb
+++ b/spec/services/ci/create_pipeline_service/rate_limit_spec.rb
@@ -10,10 +10,7 @@ RSpec.describe Ci::CreatePipelineService, :freeze_time, :clean_gitlab_redis_rate
before do
stub_ci_pipeline_yaml_file(gitlab_ci_yaml)
- stub_feature_flags(ci_throttle_pipelines_creation_dry_run: false)
-
- allow(Gitlab::ApplicationRateLimiter).to receive(:rate_limits)
- .and_return(pipelines_create: { threshold: 1, interval: 1.minute })
+ stub_application_setting(pipeline_limit_per_project_user_sha: 1)
end
context 'when user is under the limit' do
diff --git a/spec/services/ci/create_pipeline_service_spec.rb b/spec/services/ci/create_pipeline_service_spec.rb
index c39a76ad2fc..6f59caaa7e5 100644
--- a/spec/services/ci/create_pipeline_service_spec.rb
+++ b/spec/services/ci/create_pipeline_service_spec.rb
@@ -12,10 +12,6 @@ RSpec.describe Ci::CreatePipelineService do
before do
stub_ci_pipeline_to_return_yaml_file
-
- # Disable rate limiting for pipeline creation
- allow(Gitlab::ApplicationRateLimiter).to receive(:rate_limits)
- .and_return(pipelines_create: { threshold: 0, interval: 1.minute })
end
describe '#execute' do
diff --git a/spec/services/deployments/create_service_spec.rb b/spec/services/deployments/create_service_spec.rb
index 0f2a6ce32e1..f6f4c68a6f1 100644
--- a/spec/services/deployments/create_service_spec.rb
+++ b/spec/services/deployments/create_service_spec.rb
@@ -21,11 +21,34 @@ RSpec.describe Deployments::CreateService do
expect(Deployments::UpdateEnvironmentWorker).to receive(:perform_async)
expect(Deployments::LinkMergeRequestWorker).to receive(:perform_async)
- expect(Deployments::HooksWorker).to receive(:perform_async)
+ expect_next_instance_of(Deployment) do |deployment|
+ expect(deployment).to receive(:execute_hooks)
+ end
expect(service.execute).to be_persisted
end
+ context 'when `deployment_hooks_skip_worker` flag is disabled' do
+ before do
+ stub_feature_flags(deployment_hooks_skip_worker: false)
+ end
+
+ it 'executes Deployments::HooksWorker asynchronously' do
+ service = described_class.new(
+ environment,
+ user,
+ sha: 'b83d6e391c22777fca1ed3012fce84f633d7fed0',
+ ref: 'master',
+ tag: false,
+ status: 'success'
+ )
+
+ expect(Deployments::HooksWorker).to receive(:perform_async)
+
+ service.execute
+ end
+ end
+
it 'does not change the status if no status is given' do
service = described_class.new(
environment,
@@ -37,7 +60,9 @@ RSpec.describe Deployments::CreateService do
expect(Deployments::UpdateEnvironmentWorker).not_to receive(:perform_async)
expect(Deployments::LinkMergeRequestWorker).not_to receive(:perform_async)
- expect(Deployments::HooksWorker).not_to receive(:perform_async)
+ expect_next_instance_of(Deployment) do |deployment|
+ expect(deployment).not_to receive(:execute_hooks)
+ end
expect(service.execute).to be_persisted
end
@@ -55,11 +80,9 @@ RSpec.describe Deployments::CreateService do
it 'does not create a new deployment' do
described_class.new(environment, user, params).execute
- expect(Deployments::UpdateEnvironmentWorker).not_to receive(:perform_async)
- expect(Deployments::LinkMergeRequestWorker).not_to receive(:perform_async)
- expect(Deployments::HooksWorker).not_to receive(:perform_async)
-
- described_class.new(environment.reload, user, params).execute
+ expect do
+ described_class.new(environment.reload, user, params).execute
+ end.not_to change { Deployment.count }
end
end
end
diff --git a/spec/services/deployments/update_environment_service_spec.rb b/spec/services/deployments/update_environment_service_spec.rb
index 0859aa2c9d1..fe246ce9d23 100644
--- a/spec/services/deployments/update_environment_service_spec.rb
+++ b/spec/services/deployments/update_environment_service_spec.rb
@@ -33,7 +33,7 @@ RSpec.describe Deployments::UpdateEnvironmentService do
before do
allow(Deployments::LinkMergeRequestWorker).to receive(:perform_async)
- allow(Deployments::HooksWorker).to receive(:perform_async)
+ allow(deployment).to receive(:execute_hooks)
job.success! # Create/Succeed deployment
end