summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--GITALY_SERVER_VERSION2
-rw-r--r--Gemfile2
-rw-r--r--Gemfile.checksum2
-rw-r--r--Gemfile.lock4
-rw-r--r--app/assets/javascripts/issuable/issuable_form.js50
-rw-r--r--app/controllers/concerns/issuable_collections_action.rb5
-rw-r--r--app/controllers/explore/groups_controller.rb4
-rw-r--r--app/views/dashboard/merge_requests.html.haml2
-rw-r--r--app/views/shared/dashboard/_search_timeout_occurred.html.haml8
-rw-r--r--app/views/shared/issuable/form/_title.html.haml21
-rw-r--r--config/feature_flags/experiment/generic_explore_groups.yml8
-rw-r--r--data/deprecations/15-8-deprecate-slack-notifications-integration.yml29
-rw-r--r--data/deprecations/15-8-deprecate-system-hook-test-endpoint.yml24
-rw-r--r--doc/api/scim.md14
-rw-r--r--doc/development/database/table_partitioning.md95
-rw-r--r--doc/install/aws/gitlab_hybrid_on_aws.md2
-rw-r--r--doc/integration/saml.md7
-rw-r--r--doc/operations/incident_management/linked_resources.md2
-rw-r--r--doc/raketasks/index.md1
-rw-r--r--doc/subscriptions/gitlab_com/index.md2
-rw-r--r--doc/update/deprecations.md36
-rw-r--r--doc/user/application_security/policies/scan-execution-policies.md2
-rw-r--r--doc/user/packages/nuget_repository/index.md2
-rw-r--r--doc/user/project/import/index.md4
-rw-r--r--doc/user/project/merge_requests/drafts.md5
-rw-r--r--locale/gitlab.pot27
-rw-r--r--qa/qa/resource/project.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/4_verify/runner/register_runner_spec.rb2
-rw-r--r--spec/controllers/dashboard_controller_spec.rb31
-rw-r--r--spec/controllers/explore/groups_controller_spec.rb8
-rw-r--r--spec/features/merge_request/user_can_see_draft_toggle_spec.rb47
-rw-r--r--spec/features/merge_request/user_sees_wip_help_message_spec.rb61
-rw-r--r--spec/frontend/issuable/helpers.js18
-rw-r--r--spec/frontend/issuable/issuable_form_spec.js72
-rw-r--r--spec/models/ci/build_spec.rb2
-rw-r--r--spec/models/ci/runner_spec.rb14
-rw-r--r--spec/models/ci/running_build_spec.rb2
-rw-r--r--spec/models/project_spec.rb14
-rw-r--r--spec/requests/api/ci/runners_spec.rb10
-rw-r--r--spec/services/ci/register_job_service_spec.rb96
-rw-r--r--spec/services/ci/update_build_queue_service_spec.rb2
41 files changed, 445 insertions, 296 deletions
diff --git a/GITALY_SERVER_VERSION b/GITALY_SERVER_VERSION
index 436d5acf1ef..5d63e07ea39 100644
--- a/GITALY_SERVER_VERSION
+++ b/GITALY_SERVER_VERSION
@@ -1 +1 @@
-d47724f6e9e18fd7c7c73ec68d89ed874c841502
+e46faa9b41cefbad8dddc2d716ff75a691018ce6
diff --git a/Gemfile b/Gemfile
index e4649d2b7c6..61368292997 100644
--- a/Gemfile
+++ b/Gemfile
@@ -62,7 +62,7 @@ gem 'omniauth-azure-activedirectory-v2', '~> 2.0'
gem 'omniauth-azure-oauth2', '~> 0.0.9', path: 'vendor/gems/omniauth-azure-oauth2' # See gem README.md
gem 'omniauth-cas3', '~> 1.1.4', path: 'vendor/gems/omniauth-cas3' # See vendor/gems/omniauth-cas3/README.md
gem 'omniauth-dingtalk-oauth2', '~> 1.0'
-gem 'omniauth-alicloud', '~> 2.0.0'
+gem 'omniauth-alicloud', '~> 2.0.1'
gem 'omniauth-facebook', '~> 4.0.0'
gem 'omniauth-github', '2.0.1'
gem 'omniauth-gitlab', '~> 4.0.0', path: 'vendor/gems/omniauth-gitlab' # See vendor/gems/omniauth-gitlab/README.md
diff --git a/Gemfile.checksum b/Gemfile.checksum
index e79f87cdad1..c75e1530c47 100644
--- a/Gemfile.checksum
+++ b/Gemfile.checksum
@@ -385,7 +385,7 @@
{"name":"oj","version":"3.13.23","platform":"ruby","checksum":"206dfdc4020ad9974705037f269cfba211d61b7662a58c717cce771829ccef51"},
{"name":"oj-introspect","version":"0.7.1","platform":"ruby","checksum":"ea584e78495a62d5356aece7242bb55455d623ad3deb3cd778e623dd19e050c0"},
{"name":"omniauth","version":"2.1.0","platform":"ruby","checksum":"bff7234f5ec9323622b217c7f26d52f850de0b0e2b8c807c3358fc79fe572300"},
-{"name":"omniauth-alicloud","version":"2.0.0","platform":"ruby","checksum":"8ecf369d51cd5317c1e7c6b80276891f76cff210a534ec654326af5c62265de3"},
+{"name":"omniauth-alicloud","version":"2.0.1","platform":"ruby","checksum":"b14c425bca02b4d0f73e710ceb62c0f1f8533e0c427c1c495d2b40f87b3f48d3"},
{"name":"omniauth-atlassian-oauth2","version":"0.2.0","platform":"ruby","checksum":"eb07574a188ab8a03376ce288bce86bc2dd4a1382ffa5781cb5e2b7bc15d76c9"},
{"name":"omniauth-auth0","version":"2.0.0","platform":"ruby","checksum":"823769be7883b45b2fa94367c2f6a17f7b3b1333986016089c016d45827da545"},
{"name":"omniauth-authentiq","version":"0.3.3","platform":"ruby","checksum":"11b3791085a130782bf14b0088653beeb085638a9548d7110a57d3cbbb54fb4c"},
diff --git a/Gemfile.lock b/Gemfile.lock
index bccbd860e5e..3b65e2b4061 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -979,7 +979,7 @@ GEM
hashie (>= 3.4.6)
rack (>= 2.2.3)
rack-protection
- omniauth-alicloud (2.0.0)
+ omniauth-alicloud (2.0.1)
omniauth-oauth2 (~> 1.8)
omniauth-atlassian-oauth2 (0.2.0)
omniauth (>= 1.1.1)
@@ -1747,7 +1747,7 @@ DEPENDENCIES
oj (~> 3.13.21)
oj-introspect (~> 0.7)
omniauth (~> 2.1.0)
- omniauth-alicloud (~> 2.0.0)
+ omniauth-alicloud (~> 2.0.1)
omniauth-atlassian-oauth2 (~> 0.2.0)
omniauth-auth0 (~> 2.0.0)
omniauth-authentiq (~> 0.3.3)
diff --git a/app/assets/javascripts/issuable/issuable_form.js b/app/assets/javascripts/issuable/issuable_form.js
index 99a3f76ca76..8a094d5d688 100644
--- a/app/assets/javascripts/issuable/issuable_form.js
+++ b/app/assets/javascripts/issuable/issuable_form.js
@@ -60,8 +60,6 @@ export default class IssuableForm {
return;
}
this.form = form;
- this.toggleWip = this.toggleWip.bind(this);
- this.renderWipExplanation = this.renderWipExplanation.bind(this);
this.resetAutosave = this.resetAutosave.bind(this);
this.handleSubmit = this.handleSubmit.bind(this);
// prettier-ignore
@@ -86,6 +84,7 @@ export default class IssuableForm {
this.fallbackKey = getFallbackKey();
this.titleField = this.form.find('input[name*="[title]"]');
this.descriptionField = this.form.find('textarea[name*="[description]"]');
+ this.draftCheck = document.querySelector('input.js-toggle-draft');
if (!(this.titleField.length && this.descriptionField.length)) {
return;
}
@@ -93,8 +92,7 @@ export default class IssuableForm {
this.autosaves = this.initAutosave();
this.form.on('submit', this.handleSubmit);
this.form.on('click', '.btn-cancel, .js-reset-autosave', this.resetAutosave);
- this.form.find('.js-unwrap-on-load').unwrap();
- this.initWip();
+ this.initDraft();
const $issuableDueDate = $('#issuable-due-date');
@@ -160,48 +158,34 @@ export default class IssuableForm {
});
}
- initWip() {
- this.$wipExplanation = this.form.find('.js-wip-explanation');
- this.$noWipExplanation = this.form.find('.js-no-wip-explanation');
- if (!(this.$wipExplanation.length && this.$noWipExplanation.length)) {
- return undefined;
+ initDraft() {
+ if (this.draftCheck) {
+ this.draftCheck.addEventListener('click', () => this.writeDraftStatus());
+ this.titleField.on('keyup blur', () => this.readDraftStatus());
+
+ this.readDraftStatus();
}
- this.form.on('click', '.js-toggle-wip', this.toggleWip);
- this.titleField.on('keyup blur', this.renderWipExplanation);
- return this.renderWipExplanation();
}
- workInProgress() {
+ isMarkedDraft() {
return this.draftRegex.test(this.titleField.val());
}
-
- renderWipExplanation() {
- if (this.workInProgress()) {
- // These strings are not "translatable" (the code is hard-coded to look for them)
- this.$wipExplanation.find('code')[0].textContent =
- 'Draft'; /* eslint-disable-line @gitlab/require-i18n-strings */
- this.$wipExplanation.show();
- return this.$noWipExplanation.hide();
- }
- this.$wipExplanation.hide();
- return this.$noWipExplanation.show();
+ readDraftStatus() {
+ this.draftCheck.checked = this.isMarkedDraft();
}
-
- toggleWip(event) {
- event.preventDefault();
- if (this.workInProgress()) {
- this.removeWip();
+ writeDraftStatus() {
+ if (this.draftCheck.checked) {
+ this.addDraft();
} else {
- this.addWip();
+ this.removeDraft();
}
- return this.renderWipExplanation();
}
- removeWip() {
+ removeDraft() {
return this.titleField.val(this.titleField.val().replace(this.draftRegex, ''));
}
- addWip() {
+ addDraft() {
this.titleField.val(`Draft: ${this.titleField.val()}`);
}
}
diff --git a/app/controllers/concerns/issuable_collections_action.rb b/app/controllers/concerns/issuable_collections_action.rb
index b8249345a54..13298b9065d 100644
--- a/app/controllers/concerns/issuable_collections_action.rb
+++ b/app/controllers/concerns/issuable_collections_action.rb
@@ -2,6 +2,7 @@
module IssuableCollectionsAction
extend ActiveSupport::Concern
+ include GracefulTimeoutHandling
include IssuableCollections
include IssuesCalendar
@@ -33,6 +34,10 @@ module IssuableCollectionsAction
@merge_requests = issuables_collection.page(params[:page])
@issuable_meta_data = Gitlab::IssuableMetadata.new(current_user, @merge_requests).data
+ rescue ActiveRecord::QueryCanceled => exception # rubocop:disable Database/RescueQueryCanceled
+ log_exception(exception)
+
+ @search_timeout_occurred = true
end
# rubocop:enable Gitlab/ModuleWithInstanceVariables
diff --git a/app/controllers/explore/groups_controller.rb b/app/controllers/explore/groups_controller.rb
index ac355b861b3..545fac1433b 100644
--- a/app/controllers/explore/groups_controller.rb
+++ b/app/controllers/explore/groups_controller.rb
@@ -7,8 +7,6 @@ class Explore::GroupsController < Explore::ApplicationController
urgency :low
def index
- user = Feature.enabled?(:generic_explore_groups, current_user, type: :experiment) ? nil : current_user
-
- render_group_tree GroupsFinder.new(user).execute
+ render_group_tree GroupsFinder.new(nil).execute
end
end
diff --git a/app/views/dashboard/merge_requests.html.haml b/app/views/dashboard/merge_requests.html.haml
index c921375edd1..97fb35b28ab 100644
--- a/app/views/dashboard/merge_requests.html.haml
+++ b/app/views/dashboard/merge_requests.html.haml
@@ -19,5 +19,7 @@
- if current_user && @no_filters_set
= render 'shared/dashboard/no_filter_selected'
+- elsif @search_timeout_occurred
+ = render 'shared/dashboard/search_timeout_occurred'
- else
= render 'shared/merge_requests'
diff --git a/app/views/shared/dashboard/_search_timeout_occurred.html.haml b/app/views/shared/dashboard/_search_timeout_occurred.html.haml
new file mode 100644
index 00000000000..4b6331ee986
--- /dev/null
+++ b/app/views/shared/dashboard/_search_timeout_occurred.html.haml
@@ -0,0 +1,8 @@
+.row.empty-state.text-center
+ .col-12
+ .svg-130.gl-mt-3
+ = image_tag 'illustrations/issue-dashboard_results-without-filter.svg'
+ .col-12
+ .text-content
+ %h4
+ = _("Too many results to display. Edit your search or add a filter.")
diff --git a/app/views/shared/issuable/form/_title.html.haml b/app/views/shared/issuable/form/_title.html.haml
index 0f6ef33d532..4d31baee25b 100644
--- a/app/views/shared/issuable/form/_title.html.haml
+++ b/app/views/shared/issuable/form/_title.html.haml
@@ -1,27 +1,18 @@
- issuable = local_assigns.fetch(:issuable)
-- has_wip_commits = local_assigns.fetch(:has_wip_commits)
- form = local_assigns.fetch(:form)
- no_issuable_templates = issuable_templates(ref_project, issuable.to_ability_name).empty?
-- toggle_wip_link_start = '<a href="" class="js-toggle-wip">'
-- toggle_wip_link_end = '</a>'
-- add_wip_text = (_('%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request draft from merging before it\'s ready.') % { link_start: toggle_wip_link_start, link_end: toggle_wip_link_end, draft_snippet: '<code>Draft:</code>'.html_safe }).html_safe
-- remove_wip_text = (_('%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it\'s ready.') % { link_start: toggle_wip_link_start, link_end: toggle_wip_link_end, draft_snippet: '<code>Draft</code>'.html_safe }).html_safe
%div{ data: { testid: 'issue-title-input-field' } }
= form.text_field :title, required: true, aria: { required: true }, maxlength: 255, autofocus: true,
autocomplete: 'off', class: 'form-control pad', dir: 'auto', data: { qa_selector: 'issuable_form_title_field' }
- if issuable.respond_to?(:draft?)
- .form-text.text-muted
- .js-wip-explanation{ style: "display: none;" }
- = remove_wip_text
- .js-no-wip-explanation
- - if has_wip_commits
- = _('It looks like you have some draft commits in this branch.')
- %br
- .invisible
- .js-unwrap-on-load
- = add_wip_text
+ .gl-pt-3
+ = render Pajamas::CheckboxTagComponent.new(name: 'mark_as_draft', checkbox_options: { class: 'js-toggle-draft' }) do |c|
+ = c.label do
+ = s_('MergeRequests|Mark as draft')
+ = c.help_text do
+ = s_('MergeRequests|Drafts cannot be merged until marked ready.')
- if no_issuable_templates && can?(current_user, :push_code, issuable.project)
= render 'shared/issuable/form/default_templates'
diff --git a/config/feature_flags/experiment/generic_explore_groups.yml b/config/feature_flags/experiment/generic_explore_groups.yml
deleted file mode 100644
index d928dcd4189..00000000000
--- a/config/feature_flags/experiment/generic_explore_groups.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: generic_explore_groups
-introduced_by_url: "https://gitlab.com/gitlab-org/gitlab/-/merge_requests/103019"
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/381564
-milestone: '15.6'
-type: experiment
-group: group::source code
-default_enabled: true
diff --git a/data/deprecations/15-8-deprecate-slack-notifications-integration.yml b/data/deprecations/15-8-deprecate-slack-notifications-integration.yml
new file mode 100644
index 00000000000..644b12b3405
--- /dev/null
+++ b/data/deprecations/15-8-deprecate-slack-notifications-integration.yml
@@ -0,0 +1,29 @@
+- title: "Slack Notifications integration" # (required) Clearly explain the change, or planned change. For example, "The `confidential` field for a `Note` is deprecated" or "CI/CD job names will be limited to 250 characters."
+ announcement_milestone: "15.8" # (required) The milestone when this feature was first announced as deprecated.
+ removal_milestone: "16.0" # (required) The milestone when this feature is planned to be removed
+ breaking_change: true # (required) Change to false if this is not a breaking change.
+ reporter: g.hickman # (required) GitLab username of the person reporting the change
+ stage: manage # (required) String value of the stage that the feature was created in. e.g., Growth
+ issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/372411 # (required) Link to the deprecation issue in GitLab
+ body: | # (required) Do not modify this line, instead modify the lines below.
+ As we're consolidating all Slack capabilities into the
+ GitLab for Slack app, we're [deprecating the Slack Notifications
+ integration](https://gitlab.com/gitlab-org/gitlab/-/issues/372411).
+ GitLab.com users can now use the GitLab for Slack app to manage notifications
+ to their Slack workspace. For self-managed users of the Slack Notifications integration,
+ we'll be introducing support in [this epic](https://gitlab.com/groups/gitlab-org/-/epics/1211).
+
+#
+# OPTIONAL END OF SUPPORT FIELDS
+#
+# If an End of Support period applies, the announcement should be shared with GitLab Support
+# in the `#spt_managers` channel in Slack, and mention `@gitlab-com/support` in this MR.
+#
+ end_of_support_milestone: "16.0" # (optional) Use "XX.YY" format. The milestone when support for this feature will end.
+ #
+ # OTHER OPTIONAL FIELDS
+ #
+ tiers: [Free, Silver, Gold] # (optional - may be required in the future) An array of tiers that the feature is available in currently. e.g., [Free, Silver, Gold, Core, Premium, Ultimate]
+ documentation_url: https://docs.gitlab.com/ee/user/project/integrations/slack.html # (optional) This is a link to the current documentation page
+ image_url: # (optional) This is a link to a thumbnail image depicting the feature
+ video_url: # (optional) Use the youtube thumbnail URL with the structure of https://img.youtube.com/vi/UNIQUEID/hqdefault.jpg
diff --git a/data/deprecations/15-8-deprecate-system-hook-test-endpoint.yml b/data/deprecations/15-8-deprecate-system-hook-test-endpoint.yml
new file mode 100644
index 00000000000..afde85f03d9
--- /dev/null
+++ b/data/deprecations/15-8-deprecate-system-hook-test-endpoint.yml
@@ -0,0 +1,24 @@
+- title: "Test system hook endpoint" # (required) Clearly explain the change, or planned change. For example, "The `confidential` field for a `Note` is deprecated" or "The maximum number of characters in a job name will be limited to 250."
+ announcement_milestone: "15.8" # (required) The milestone when this feature was first announced as deprecated.
+ removal_milestone: "16.0" # (required) The milestone when this feature is planned to be removed
+ breaking_change: true # (required) If this deprecation is a breaking change, set this value to true
+ reporter: arturoherrero # (required) GitLab username of the person reporting the deprecation
+ stage: Manage # (required) String value of the stage that the feature was created in. e.g., Growth
+ issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/381572 # (required) Link to the deprecation issue in GitLab
+ body: | # (required) Do not modify this line, instead modify the lines below.
+ The [test system hook](https://docs.gitlab.com/ee/api/system_hooks.html#test-system-hook) endpoint returns dummy data.
+ This endpoint is now deprecated and will be removed from the GitLab codebase.
+#
+# OPTIONAL END OF SUPPORT FIELDS
+#
+# If an End of Support period applies, the announcement should be shared with GitLab Support
+# in the `#spt_managers` channel in Slack, and mention `@gitlab-com/support` in this MR.
+#
+ end_of_support_milestone: "16.0" # (optional) Use "XX.YY" format. The milestone when support for this feature will end.
+ #
+ # OTHER OPTIONAL FIELDS
+ #
+ tiers: [Core, Premium, Ultimate] # (optional - may be required in the future) An array of tiers that the feature is available in currently. e.g., [Free, Silver, Gold, Core, Premium, Ultimate]
+ documentation_url: https://docs.gitlab.com/ee/api/system_hooks.html#test-system-hook # (optional) This is a link to the current documentation page
+ image_url: # (optional) This is a link to a thumbnail image depicting the feature
+ video_url: # (optional) Use the youtube thumbnail URL with the structure of https://img.youtube.com/vi/UNIQUEID/hqdefault.jpg
diff --git a/doc/api/scim.md b/doc/api/scim.md
index be31ddda22d..528eca3b828 100644
--- a/doc/api/scim.md
+++ b/doc/api/scim.md
@@ -33,10 +33,11 @@ Supported attributes:
If successful, returns [`200`](rest/index.md#status-codes) and the following
response attributes:
-| Attribute | Type | Description |
-| ------------ | ------ | ------------------------- |
-| `extern_uid` | string | External UID for the user |
-| `user_id` | string | ID for the user |
+| Attribute | Type | Description |
+| ------------ | ------- | ------------------------- |
+| `extern_uid` | string | External UID for the user |
+| `user_id` | integer | ID for the user |
+| `active` | boolean | Status of the identity |
Example response:
@@ -44,7 +45,8 @@ Example response:
[
{
"extern_uid": "4",
- "user_id": 48
+ "user_id": 48,
+ "active": true
}
]
```
@@ -67,7 +69,7 @@ Fields that can be updated are:
| `id/externalId` | `extern_uid` |
```plaintext
-PATCH groups/:groups_id/scim/:uid
+PATCH /groups/:groups_id/scim/:uid
```
Parameters:
diff --git a/doc/development/database/table_partitioning.md b/doc/development/database/table_partitioning.md
index 30131fc0347..7489154d64a 100644
--- a/doc/development/database/table_partitioning.md
+++ b/doc/development/database/table_partitioning.md
@@ -307,44 +307,12 @@ class PrepareIndexesForPartitioning < Gitlab::Database::Migration[2.1]
end
```
-### Step 3 - Swap primary key
+### Step 3 - Enforce unique constraint
-Swap the primary key including the partitioning key column. For example, in a rails migration:
-
-```ruby
-class PreparePrimaryKeyForPartitioning < Gitlab::Database::Migration[2.1]
- disable_ddl_transaction!
-
- TABLE_NAME = :table_name
- PRIMARY_KEY = :primary_key
- OLD_INDEX_NAME = :old_index_name
- NEW_INDEX_NAME = :new_index_name
-
- def up
- swap_primary_key(TABLE_NAME, PRIMARY_KEY, NEW_INDEX_NAME)
- end
-
- def down
- add_concurrent_index(TABLE_NAME, :id, unique: true, name: OLD_INDEX_NAME)
- add_concurrent_index(TABLE_NAME, [:id, :partition_id], unique: true, name: NEW_INDEX_NAME)
-
- unswap_primary_key(TABLE_NAME, PRIMARY_KEY, OLD_INDEX_NAME)
- end
-end
-```
-
-NOTE:
-Do not forget to set the primary key explicitly in your model as `ActiveRecord` does not support composite primary keys.
-
-```ruby
-class Model < ApplicationRecord
- self.primary_key = :id
-end
-```
-
-### Step 4 - Enforce unique constraint
-
-Enforce unique indexes including the partitioning key column. For example, in a rails migration:
+Change all unique indexes to include the partitioning key column,
+including the primary key index. You can start by adding an unique
+index on `[primary_key_column, :partition_id]`, which will be
+required for the next two steps. For example, in a rails migration:
```ruby
class PrepareUniqueContraintForPartitioning < Gitlab::Database::Migration[2.1]
@@ -355,20 +323,20 @@ class PrepareUniqueContraintForPartitioning < Gitlab::Database::Migration[2.1]
NEW_UNIQUE_INDEX_NAME = :new_index_name
def up
- add_concurrent_index(TABLE_NAME, [:some_column, :partition_id], unique: true, name: NEW_UNIQUE_INDEX_NAME)
+ add_concurrent_index(TABLE_NAME, [:id, :partition_id], unique: true, name: NEW_UNIQUE_INDEX_NAME)
remove_concurrent_index_by_name(TABLE_NAME, OLD_UNIQUE_INDEX_NAME)
end
def down
- add_concurrent_index(TABLE_NAME, :some_column, unique: true, name: OLD_UNIQUE_INDEX_NAME)
+ add_concurrent_index(TABLE_NAME, :id, unique: true, name: OLD_UNIQUE_INDEX_NAME)
remove_concurrent_index_by_name(TABLE_NAME, NEW_UNIQUE_INDEX_NAME)
end
end
```
-### Step 5 - Enforce foreign key constraint
+### Step 4 - Enforce foreign key constraint
Enforce foreign keys including the partitioning key column. For example, in a rails migration:
@@ -380,7 +348,7 @@ class PrepareForeignKeyForPartitioning < Gitlab::Database::Migration[2.1]
TARGET_TABLE_NAME = :target_table_name
COLUMN = :foreign_key_id
TARGET_COLUMN = :id
- CONSTRAINT_NAME = :fk_365d1db505_p
+ FK_NAME = :fk_365d1db505_p
PARTITION_COLUMN = :partition_id
def up
@@ -394,11 +362,14 @@ class PrepareForeignKeyForPartitioning < Gitlab::Database::Migration[2.1]
name: CONSTRAINT_NAME
)
- validate_foreign_key(TARGET_TABLE_NAME, CONSTRAINT_NAME)
+ # This should be done in a separate post migration when dealing with a high traffic table
+ validate_foreign_key(TABLE_NAME, [PARTITION_COLUMN, COLUMN], name: FK_NAME)
end
def down
- drop_constraint(TARGET_TABLE_NAME, CONSTRAINT_NAME)
+ with_lock_retries do
+ remove_foreign_key_if_exists(SOURCE_TABLE_NAME, name: FK_NAME)
+ end
end
end
```
@@ -410,6 +381,42 @@ result in a `Key is still referenced from table ...` error and updating the
partition column on the source table would raise a
`Key is not present in table ...` error.
+### Step 5 - Swap primary key
+
+Swap the primary key including the partitioning key column. This can be done only after
+including the partition key for all references foreign keys. For example, in a rails migration:
+
+```ruby
+class PreparePrimaryKeyForPartitioning < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ TABLE_NAME = :table_name
+ PRIMARY_KEY = :primary_key
+ OLD_INDEX_NAME = :old_index_name
+ NEW_INDEX_NAME = :new_index_name
+
+ def up
+ swap_primary_key(TABLE_NAME, PRIMARY_KEY, NEW_INDEX_NAME)
+ end
+
+ def down
+ add_concurrent_index(TABLE_NAME, :id, unique: true, name: OLD_INDEX_NAME)
+ add_concurrent_index(TABLE_NAME, [:id, :partition_id], unique: true, name: NEW_INDEX_NAME)
+
+ unswap_primary_key(TABLE_NAME, PRIMARY_KEY, OLD_INDEX_NAME)
+ end
+end
+```
+
+NOTE:
+Do not forget to set the primary key explicitly in your model as `ActiveRecord` does not support composite primary keys.
+
+```ruby
+class Model < ApplicationRecord
+ self.primary_key = :id
+end
+```
+
### Step 6 - Create parent table and attach existing table as the initial partition
You can now create the parent table attaching the existing table as the initial
@@ -465,7 +472,7 @@ class ConvertTableToListPartitioning < Gitlab::Database::Migration[2.1]
table_name: TABLE_NAME,
partitioning_column: PARTITION_COLUMN,
parent_table_name: PARENT_TABLE_NAME,
- initial_partitioning_value: FIRST_PARTITION
+ initial_partitioning_value: FIRST_PARTITION,
lock_tables: [TABLE_FK, TABLE_NAME]
)
end
diff --git a/doc/install/aws/gitlab_hybrid_on_aws.md b/doc/install/aws/gitlab_hybrid_on_aws.md
index ef7d4ac0f69..7f45eb96e86 100644
--- a/doc/install/aws/gitlab_hybrid_on_aws.md
+++ b/doc/install/aws/gitlab_hybrid_on_aws.md
@@ -19,7 +19,7 @@ Amazon provides a managed Kubernetes service offering known as [Amazon Elastic K
| [2K Omnibus](../../administration/reference_architectures/2k_users.md) | [2K Baseline](https://gitlab.com/gitlab-org/quality/performance/-/wikis/Benchmarks/Latest/2k) | [2K Cloud Native Hybrid on EKS](#2k-cloud-native-hybrid-on-eks) | GPT Test Results | [1 YR Ec2 Compute Savings + 1 YR RDS & ElastiCache RIs](https://calculator.aws/#/estimate?id=544bcf1162beae6b8130ad257d081cdf9d4504e3)<br />(2 AZ Cost Estimate is in BOM Below) |
| [3K](../../administration/reference_architectures/3k_users.md#cloud-native-hybrid-reference-architecture-with-helm-charts-alternative) | [3k Baseline](https://gitlab.com/gitlab-org/quality/performance/-/wikis/Benchmarks/Latest/3k) | [3K Cloud Native Hybrid on EKS](#3k-cloud-native-hybrid-on-eks) | [3K Full Fixed Scale GPT Test Results](https://gitlab.com/guided-explorations/aws/implementation-patterns/gitlab-cloud-native-hybrid-on-eks/-/blob/master/gitlab-alliances-testing/3K/3k-QuickStart-ARM-RDS-Cache_v13-12-3-ee_2021-07-23_124216/3k-QuickStart-ARM-RDS-Cache_v13-12-3-ee_2021-07-23_124216_results.txt)<br /><br />[3K Elastic Auto Scale GPT Test Results](https://gitlab.com/guided-explorations/aws/implementation-patterns/gitlab-cloud-native-hybrid-on-eks/-/blob/master/gitlab-alliances-testing/3K/3k-QuickStart-AutoScale-ARM-RDS-Cache_v13-12-3-ee_2021-07-23_194200/3k-QuickStart-AutoScale-ARM-RDS-Cache_v13-12-3-ee_2021-07-23_194200_results.txt) | [1 YR Ec2 Compute Savings + 1 YR RDS & ElastiCache RIs](https://calculator.aws/#/estimate?id=f1294fec554e21be999711cddcdab9c5e7f83f14)<br />(2 AZ Cost Estimate is in BOM Below) |
| [5K](../../administration/reference_architectures/5k_users.md#cloud-native-hybrid-reference-architecture-with-helm-charts-alternative) | [5k Baseline](https://gitlab.com/gitlab-org/quality/performance/-/wikis/Benchmarks/Latest/5k) | [5K Cloud Native Hybrid on EKS](#5k-cloud-native-hybrid-on-eks) | [5K Full Fixed Scale GPT Test Results](https://gitlab.com/guided-explorations/aws/implementation-patterns/gitlab-cloud-native-hybrid-on-eks/-/blob/master/gitlab-alliances-testing/5K/5k-QuickStart-ARM-RDS-Redis_v13-12-3-ee_2021-07-23_140128/5k-QuickStart-ARM-RDS-Redis_v13-12-3-ee_2021-07-23_140128_results.txt)<br /><br />[5K AutoScale from 25% GPT Test Results](https://gitlab.com/guided-explorations/aws/implementation-patterns/gitlab-cloud-native-hybrid-on-eks/-/blob/master/gitlab-alliances-testing/5K/5k-QuickStart-AutoScale-From-25Percent-ARM-RDS-Redis_v13-12-3-ee_2021-07-24_102717/5k-QuickStart-AutoScale-From-25Percent-ARM-RDS-Redis_v13-12-3-ee_2021-07-24_102717_results.txt) | [1 YR Ec2 Compute Savings + 1 YR RDS & ElastiCache RIs](https://calculator.aws/#/estimate?id=330ee43c5b14662db5df6e52b34898d181a09e16) |
-| [10K](../../administration/reference_architectures/10k_users.md#cloud-native-hybrid-reference-architecture-with-helm-charts-alternative) | [10k Baseline](https://gitlab.com/gitlab-org/quality/performance/-/wikis/Benchmarks/Latest/10k) | [10K Cloud Native Hybrid on EKS](#10k-cloud-native-hybrid-on-eks) | [10K Full Fixed Scale GPT Test Results](https://gitlab.com/guided-explorations/aws/implementation-patterns/gitlab-cloud-native-hybrid-on-eks/-/blob/master/gitlab-alliances-testing/10K/GL-CloudNative-10k-RDS-Graviton_v13-12-3-ee_2021-07-08_194647/GL-CloudNative-10k-RDS-Graviton_v13-12-3-ee_2021-07-08_194647_results.txt)<br /><br />[10K Elastic Auto Scale GPT Test Results](hhttps://gitlab.com/guided-explorations/aws/implementation-patterns/gitlab-cloud-native-hybrid-on-eks/-/blob/master/gitlab-alliances-testing/10K/GL-CloudNative-10k-AutoScaling-Test_v13-12-3-ee_2021-07-09_115139/GL-CloudNative-10k-AutoScaling-Test_v13-12-3-ee_2021-07-09_115139_results.txt) | [10K 1 YR Ec2 Compute Savings + 1 YR RDS & ElastiCache RIs](https://calculator.aws/#/estimate?id=5ac2e07a22e01c36ee76b5477c5a046cd1bea792) |
+| [10K](../../administration/reference_architectures/10k_users.md#cloud-native-hybrid-reference-architecture-with-helm-charts-alternative) | [10k Baseline](https://gitlab.com/gitlab-org/quality/performance/-/wikis/Benchmarks/Latest/10k) | [10K Cloud Native Hybrid on EKS](#10k-cloud-native-hybrid-on-eks) | [10K Full Fixed Scale GPT Test Results](https://gitlab.com/guided-explorations/aws/implementation-patterns/gitlab-cloud-native-hybrid-on-eks/-/blob/master/gitlab-alliances-testing/10K/GL-CloudNative-10k-RDS-Graviton_v13-12-3-ee_2021-07-08_194647/GL-CloudNative-10k-RDS-Graviton_v13-12-3-ee_2021-07-08_194647_results.txt)<br /><br />[10K Elastic Auto Scale GPT Test Results](https://gitlab.com/guided-explorations/aws/implementation-patterns/gitlab-cloud-native-hybrid-on-eks/-/blob/master/gitlab-alliances-testing/10K/GL-CloudNative-10k-AutoScaling-Test_v13-12-3-ee_2021-07-09_115139/GL-CloudNative-10k-AutoScaling-Test_v13-12-3-ee_2021-07-09_115139_results.txt) | [10K 1 YR Ec2 Compute Savings + 1 YR RDS & ElastiCache RIs](https://calculator.aws/#/estimate?id=5ac2e07a22e01c36ee76b5477c5a046cd1bea792) |
| [50K](../../administration/reference_architectures/50k_users.md#cloud-native-hybrid-reference-architecture-with-helm-charts-alternative) | [50k Baseline](https://gitlab.com/gitlab-org/quality/performance/-/wikis/Benchmarks/Latest/50k) | [50K Cloud Native Hybrid on EKS](#50k-cloud-native-hybrid-on-eks) | [50K Full Fixed Scale GPT Test Results](https://gitlab.com/guided-explorations/aws/implementation-patterns/gitlab-cloud-native-hybrid-on-eks/-/blob/master/gitlab-alliances-testing/50K/50k-Fixed-Scale-Test_v13-12-3-ee_2021-08-13_172819/50k-Fixed-Scale-Test_v13-12-3-ee_2021-08-13_172819_results.txt)<br /><br />[10K Elastic Auto Scale GPT Test Results](https://gitlab.com/guided-explorations/aws/implementation-patterns/gitlab-cloud-native-hybrid-on-eks/-/blob/master/gitlab-alliances-testing/50K/50k-AutoScale-Test_v13-12-3-ee_2021-08-13_192633/50k-AutoScale-Test_v13-12-3-ee_2021-08-13_192633.txt) | [50K 1 YR Ec2 Compute Savings + 1 YR RDS & ElastiCache RIs](https://calculator.aws/#/estimate?id=b9c9d6ac1d4a7848011d2050cef3120931fb7c22) |
\*Cost calculations for actual implementations are a rough guideline with the following considerations:
diff --git a/doc/integration/saml.md b/doc/integration/saml.md
index c42807f33cd..5c3bbdf2201 100644
--- a/doc/integration/saml.md
+++ b/doc/integration/saml.md
@@ -262,13 +262,6 @@ gitlab_rails['omniauth_providers'] = [
]
```
-To allow your users to use SAML to sign up without having to manually create an
-account from either of the providers, add the following values to your configuration.
-
-```ruby
-gitlab_rails['omniauth_allow_single_sign_on'] = ['saml', 'saml1']
-```
-
## Set up identity providers
GitLab support of SAML means you can sign in to GitLab through a wide range
diff --git a/doc/operations/incident_management/linked_resources.md b/doc/operations/incident_management/linked_resources.md
index 96edd41c12f..642a6972bcf 100644
--- a/doc/operations/incident_management/linked_resources.md
+++ b/doc/operations/incident_management/linked_resources.md
@@ -8,7 +8,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/230852) in GitLab 15.3 [with a flag](../../administration/feature_flags.md) named `incident_resource_links_widget`. Disabled by default.
> - [Enabled on GitLab.com](https://gitlab.com/gitlab-org/gitlab/-/issues/364755) in GitLab 15.3.
-> - [Generally available](ihttps://gitlab.com/gitlab-org/gitlab/-/issues/364755) in GitLab 15.5. Feature flag `incident_resource_links_widget` removed.
+> - [Generally available](https://gitlab.com/gitlab-org/gitlab/-/issues/364755) in GitLab 15.5. Feature flag `incident_resource_links_widget` removed.
To help your team members find the important links without having to search through many comments,
you can add linked resources to an incident issue.
diff --git a/doc/raketasks/index.md b/doc/raketasks/index.md
index 0d5a826b0a1..1b8eccc7ae4 100644
--- a/doc/raketasks/index.md
+++ b/doc/raketasks/index.md
@@ -28,7 +28,6 @@ The following Rake tasks are available for use with GitLab:
| [General maintenance](../administration/raketasks/maintenance.md) | General maintenance and self-check tasks. |
| [Geo maintenance](../administration/raketasks/geo.md) | [Geo](../administration/geo/index.md)-related maintenance. |
| [GitHub import](../administration/raketasks/github_import.md) | Retrieve and import repositories from GitHub. |
-| [Import repositories](import.md) | Import bare repositories into your GitLab instance. |
| [Import large project exports](../development/import_project.md#importing-via-a-rake-task) | Import large GitLab [project exports](../user/project/settings/import_export.md). |
| [Integrity checks](../administration/raketasks/check.md) | Check the integrity of repositories, files, LDAP, and more. |
| [LDAP maintenance](../administration/raketasks/ldap.md) | [LDAP](../administration/auth/ldap/index.md)-related tasks. |
diff --git a/doc/subscriptions/gitlab_com/index.md b/doc/subscriptions/gitlab_com/index.md
index 8fce04ec109..ad320632628 100644
--- a/doc/subscriptions/gitlab_com/index.md
+++ b/doc/subscriptions/gitlab_com/index.md
@@ -37,7 +37,7 @@ To subscribe to GitLab SaaS:
1. Create additional users and
[add them to the group](../../user/group/manage.md#add-users-to-a-group). The users in this group, its subgroups, and projects can use
the features of your subscription tier, and they consume a seat in your subscription.
-1. On the left sidebar, select **Billing** and choose a tier.
+1. On the left sidebar, select **Settings > Billing** and choose a tier.
1. Fill out the form to complete your purchase.
## View your GitLab SaaS subscription
diff --git a/doc/update/deprecations.md b/doc/update/deprecations.md
index e4c2f149653..ee6d241ae93 100644
--- a/doc/update/deprecations.md
+++ b/doc/update/deprecations.md
@@ -387,6 +387,26 @@ Alternatives to using the `gitlab:import:repos` Rake task include:
<div class="deprecation removal-160 breaking-change">
+### Slack Notifications integration
+
+End of Support: GitLab <span class="removal-milestone">16.0</span> <span class="support-end-date"></span><br />
+Planned removal: GitLab <span class="removal-milestone">16.0</span> <span class="removal-date"></span>
+
+WARNING:
+This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+Review the details carefully before upgrading.
+
+As we're consolidating all Slack capabilities into the
+GitLab for Slack app, we're [deprecating the Slack Notifications
+integration](https://gitlab.com/gitlab-org/gitlab/-/issues/372411).
+GitLab.com users can now use the GitLab for Slack app to manage notifications
+to their Slack workspace. For self-managed users of the Slack Notifications integration,
+we'll be introducing support in [this epic](https://gitlab.com/groups/gitlab-org/-/epics/1211).
+
+</div>
+
+<div class="deprecation removal-160 breaking-change">
+
### Support for third party registries
Planned removal: GitLab <span class="removal-milestone">16.0</span> <span class="removal-date"></span>
@@ -405,6 +425,22 @@ Moving forward, we'll continue to invest in developing and releasing new feature
<div class="deprecation removal-160 breaking-change">
+### Test system hook endpoint
+
+End of Support: GitLab <span class="removal-milestone">16.0</span> <span class="support-end-date"></span><br />
+Planned removal: GitLab <span class="removal-milestone">16.0</span> <span class="removal-date"></span>
+
+WARNING:
+This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
+Review the details carefully before upgrading.
+
+The [test system hook](https://docs.gitlab.com/ee/api/system_hooks.html#test-system-hook) endpoint returns dummy data.
+This endpoint is now deprecated and will be removed from the GitLab codebase.
+
+</div>
+
+<div class="deprecation removal-160 breaking-change">
+
### The API no longer returns revoked tokens for the agent for Kubernetes
Planned removal: GitLab <span class="removal-milestone">16.0</span> <span class="removal-date"></span>
diff --git a/doc/user/application_security/policies/scan-execution-policies.md b/doc/user/application_security/policies/scan-execution-policies.md
index c9c48c0c926..a14dbb1c00a 100644
--- a/doc/user/application_security/policies/scan-execution-policies.md
+++ b/doc/user/application_security/policies/scan-execution-policies.md
@@ -97,7 +97,7 @@ GitLab supports the following types of CRON syntax for the `cadence` field:
- A weekly cadence of once per week on a specified day and at a specified hour, for example: `0 13 * * 0`
NOTE:
-Other elements of the [CRON syntax]((https://docs.oracle.com/cd/E12058_01/doc/doc.1014/e12030/cron_expressions.htm)) may work in the cadence field if supported by the [cron](https://github.com/robfig/cron) we are using in our implementation, however, GitLab does not officially test or support them.
+Other elements of the [CRON syntax](https://docs.oracle.com/cd/E12058_01/doc/doc.1014/e12030/cron_expressions.htm) may work in the cadence field if supported by the [cron](https://github.com/robfig/cron) we are using in our implementation, however, GitLab does not officially test or support them.
NOTE:
If using the `agents` field, required for `Operational Container Scanning`, the CRON expression is evaluated in [UTC](https://www.timeanddate.com/worldclock/timezone/utc) using the system-time of the Kubernetes-agent pod. If not using the `agents` field, the CRON expression is evaluated in standard [UTC](https://www.timeanddate.com/worldclock/timezone/utc) time from GitLab.com. If you have a self-managed GitLab instance and have [changed the server timezone](../../../administration/timezone.md), the CRON expression is evaluated with the new timezone.
diff --git a/doc/user/packages/nuget_repository/index.md b/doc/user/packages/nuget_repository/index.md
index 540db463f0a..bc19acde6f7 100644
--- a/doc/user/packages/nuget_repository/index.md
+++ b/doc/user/packages/nuget_repository/index.md
@@ -283,7 +283,7 @@ To use the [group-level](#use-the-gitlab-endpoint-for-nuget-packages) Package Re
Prerequisite:
-- Set up the [source](#https://docs.gitlab.com/ee/user/packages/nuget_repository/#add-the-package-registry-as-a-source-for-nuget-packages) with a [project-level endpoint](#use-the-gitlab-endpoint-for-nuget-packages).
+- Set up the [source](#add-the-package-registry-as-a-source-for-nuget-packages) with a [project-level endpoint](#use-the-gitlab-endpoint-for-nuget-packages).
When publishing packages:
diff --git a/doc/user/project/import/index.md b/doc/user/project/import/index.md
index 23397de0735..733e58dd031 100644
--- a/doc/user/project/import/index.md
+++ b/doc/user/project/import/index.md
@@ -47,13 +47,11 @@ You can import projects from:
- [CVS](cvs.md)
- [FogBugz](fogbugz.md)
- [GitHub.com or GitHub Enterprise](github.md)
-- [GitLab.com](gitlab_com.md)
- [Gitea](gitea.md)
- [Perforce](perforce.md)
- [TFVC](tfvc.md)
- [Repository by URL](repo_by_url.md)
-- [Uloading a manifest file (AOSP)](manifest.md)
-- [Phabricator](phabricator.md)
+- [Uploading a manifest file (AOSP)](manifest.md)
- [Jira (issues only)](jira.md)
You can also import any Git repository through HTTP from the **New Project** page. Note that if the
diff --git a/doc/user/project/merge_requests/drafts.md b/doc/user/project/merge_requests/drafts.md
index 0bc9b337e3b..c216514fff4 100644
--- a/doc/user/project/merge_requests/drafts.md
+++ b/doc/user/project/merge_requests/drafts.md
@@ -21,12 +21,13 @@ the **Merge** button until you remove the **Draft** flag:
> - [Removed](https://gitlab.com/gitlab-org/gitlab/-/issues/228685) all support for using **WIP** in GitLab 14.8.
> - **Mark as draft** and **Mark as ready** buttons [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/227421) in GitLab 13.5.
> `/draft` quick action as a toggle [deprecated](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/92654) in GitLab 15.4.
+> - [Changed](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/108073) the draft status to use a checkbox in GitLab 15.8.
There are several ways to flag a merge request as a draft:
- **Viewing a merge request**: In the top right corner of the merge request, select **Mark as draft**.
- **Creating or editing a merge request**: Add `[Draft]`, `Draft:` or `(Draft)` to
- the beginning of the merge request's title, or select **Start the title with Draft:**
+ the beginning of the merge request's title, or select **Mark as draft**
below the **Title** field.
- **Commenting in an existing merge request**: Add the `/draft`
[quick action](../quick_actions.md#issues-merge-requests-and-epics)
@@ -47,7 +48,7 @@ When a merge request is ready to be merged, you can remove the `Draft` flag in s
![Mark as ready](img/draft_blocked_merge_button_v13_10.png)
- **Editing an existing merge request**: Remove `[Draft]`, `Draft:` or `(Draft)`
- from the beginning of the title, or select **Remove the Draft: prefix from the title**
+ from the beginning of the title, or clear **Mark as draft**
below the **Title** field.
- **Commenting in an existing merge request**: Add the `/ready`
[quick action](../quick_actions.md#issues-merge-requests-and-epics)
diff --git a/locale/gitlab.pot b/locale/gitlab.pot
index 5a60905422d..23f7c87a308 100644
--- a/locale/gitlab.pot
+++ b/locale/gitlab.pot
@@ -823,12 +823,6 @@ msgstr ""
msgid "%{linkStart} Learn more%{linkEnd}."
msgstr ""
-msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
-msgstr ""
-
-msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request draft from merging before it's ready."
-msgstr ""
-
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -12731,6 +12725,9 @@ msgstr ""
msgid "DastProfiles|Request headers"
msgstr ""
+msgid "DastProfiles|Retry"
+msgstr ""
+
msgid "DastProfiles|Run the AJAX spider, in addition to the traditional spider, to crawl the target site."
msgstr ""
@@ -12833,6 +12830,12 @@ msgstr ""
msgid "DastProfiles|Username form field"
msgstr ""
+msgid "DastProfiles|Validate"
+msgstr ""
+
+msgid "DastProfiles|Validate site profile"
+msgstr ""
+
msgid "DastProfiles|Validated"
msgstr ""
@@ -23434,9 +23437,6 @@ msgstr ""
msgid "Issue|Title"
msgstr ""
-msgid "It looks like you have some draft commits in this branch."
-msgstr ""
-
msgid "It looks like you're attempting to activate your subscription. Use %{a_start}the Subscription page%{a_end} instead."
msgstr ""
@@ -26331,6 +26331,12 @@ msgstr ""
msgid "MergeRequests|Create issue to resolve thread"
msgstr ""
+msgid "MergeRequests|Drafts cannot be merged until marked ready."
+msgstr ""
+
+msgid "MergeRequests|Mark as draft"
+msgstr ""
+
msgid "MergeRequests|Reference copied"
msgstr ""
@@ -44228,6 +44234,9 @@ msgstr ""
msgid "Too many references. Quick actions are limited to at most %{max_count} user references"
msgstr ""
+msgid "Too many results to display. Edit your search or add a filter."
+msgstr ""
+
msgid "Too many users found. Quick actions are limited to at most %{max_count} users"
msgstr ""
diff --git a/qa/qa/resource/project.rb b/qa/qa/resource/project.rb
index 3f42c6b649e..5603e80e321 100644
--- a/qa/qa/resource/project.rb
+++ b/qa/qa/resource/project.rb
@@ -450,7 +450,7 @@ module QA
parse_body(response)
end
- # Fetch project specific runners
+ # Fetch project runners
#
# @param [Hash] **kwargs optional query arguments, see: https://docs.gitlab.com/ee/api/runners.html#list-projects-runners
# @return [Array]
diff --git a/qa/qa/specs/features/browser_ui/4_verify/runner/register_runner_spec.rb b/qa/qa/specs/features/browser_ui/4_verify/runner/register_runner_spec.rb
index e141bac5e3f..4db935df43d 100644
--- a/qa/qa/specs/features/browser_ui/4_verify/runner/register_runner_spec.rb
+++ b/qa/qa/specs/features/browser_ui/4_verify/runner/register_runner_spec.rb
@@ -15,7 +15,7 @@ module QA
runner.remove_via_api!
end
- it 'user registers a new specific runner', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/348025' do
+ it 'user registers a new project runner', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/348025' do
Flow::Login.sign_in
runner.project.visit!
diff --git a/spec/controllers/dashboard_controller_spec.rb b/spec/controllers/dashboard_controller_spec.rb
index b0a080a768a..1b5a8c0807c 100644
--- a/spec/controllers/dashboard_controller_spec.rb
+++ b/spec/controllers/dashboard_controller_spec.rb
@@ -46,6 +46,37 @@ RSpec.describe DashboardController, feature_category: :code_review_workflow do
describe 'GET merge requests' do
it_behaves_like 'issuables list meta-data', :merge_request, :merge_requests
it_behaves_like 'issuables requiring filter', :merge_requests
+
+ context 'when an ActiveRecord::QueryCanceled is raised' do
+ before do
+ allow_next_instance_of(Gitlab::IssuableMetadata) do |instance|
+ allow(instance).to receive(:data).and_raise(ActiveRecord::QueryCanceled)
+ end
+ end
+
+ it 'sets :search_timeout_occurred' do
+ get :merge_requests, params: { author_id: user.id }
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(assigns(:search_timeout_occurred)).to eq(true)
+ end
+
+ context 'rendering views' do
+ render_views
+
+ it 'shows error message' do
+ get :merge_requests, params: { author_id: user.id }
+
+ expect(response.body).to have_content('Too many results to display. Edit your search or add a filter.')
+ end
+ end
+
+ it 'logs the exception' do
+ expect(Gitlab::ErrorTracking).to receive(:track_exception).and_call_original
+
+ get :merge_requests, params: { author_id: user.id }
+ end
+ end
end
end
diff --git a/spec/controllers/explore/groups_controller_spec.rb b/spec/controllers/explore/groups_controller_spec.rb
index a3bd8102462..d53cb233df9 100644
--- a/spec/controllers/explore/groups_controller_spec.rb
+++ b/spec/controllers/explore/groups_controller_spec.rb
@@ -40,12 +40,4 @@ RSpec.describe Explore::GroupsController do
end
it_behaves_like 'explore groups'
-
- context 'generic_explore_groups flag is disabled' do
- before do
- stub_feature_flags(generic_explore_groups: false)
- end
-
- it_behaves_like 'explore groups'
- end
end
diff --git a/spec/features/merge_request/user_can_see_draft_toggle_spec.rb b/spec/features/merge_request/user_can_see_draft_toggle_spec.rb
new file mode 100644
index 00000000000..0282c954225
--- /dev/null
+++ b/spec/features/merge_request/user_can_see_draft_toggle_spec.rb
@@ -0,0 +1,47 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'Merge request > User sees draft toggle', feature_category: :code_review do
+ let_it_be(:project) { create(:project, :public, :repository) }
+ let(:user) { project.creator }
+
+ before do
+ project.add_maintainer(user)
+ sign_in(user)
+ end
+
+ context 'with draft commits' do
+ it 'shows the draft toggle' do
+ visit project_new_merge_request_path(
+ project,
+ merge_request: {
+ source_project_id: project.id,
+ target_project_id: project.id,
+ source_branch: 'wip',
+ target_branch: 'master'
+ })
+
+ expect(page).to have_css('input[type="checkbox"].js-toggle-draft', count: 1)
+ expect(page).to have_text('Mark as draft')
+ expect(page).to have_text('Drafts cannot be merged until marked ready.')
+ end
+ end
+
+ context 'without draft commits' do
+ it 'shows the draft toggle' do
+ visit project_new_merge_request_path(
+ project,
+ merge_request: {
+ source_project_id: project.id,
+ target_project_id: project.id,
+ source_branch: 'fix',
+ target_branch: 'master'
+ })
+
+ expect(page).to have_css('input[type="checkbox"].js-toggle-draft', count: 1)
+ expect(page).to have_text('Mark as draft')
+ expect(page).to have_text('Drafts cannot be merged until marked ready.')
+ end
+ end
+end
diff --git a/spec/features/merge_request/user_sees_wip_help_message_spec.rb b/spec/features/merge_request/user_sees_wip_help_message_spec.rb
deleted file mode 100644
index fdefe5ffb06..00000000000
--- a/spec/features/merge_request/user_sees_wip_help_message_spec.rb
+++ /dev/null
@@ -1,61 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe 'Merge request > User sees draft help message', feature_category: :code_review_workflow do
- let(:project) { create(:project, :public, :repository) }
- let(:user) { project.creator }
-
- before do
- project.add_maintainer(user)
- sign_in(user)
- end
-
- context 'with draft commits' do
- it 'shows a specific draft hint' do
- visit project_new_merge_request_path(
- project,
- merge_request: {
- source_project_id: project.id,
- target_project_id: project.id,
- source_branch: 'wip',
- target_branch: 'master'
- })
-
- within_wip_explanation do
- expect(page).to have_text(
- 'It looks like you have some draft commits in this branch'
- )
- end
- end
- end
-
- context 'without draft commits' do
- it 'shows the regular draft message' do
- visit project_new_merge_request_path(
- project,
- merge_request: {
- source_project_id: project.id,
- target_project_id: project.id,
- source_branch: 'fix',
- target_branch: 'master'
- })
-
- within_wip_explanation do
- expect(page).not_to have_text(
- 'It looks like you have some draft commits in this branch'
- )
- expect(page).to have_text(
- "Start the title with Draft: to prevent a merge request draft \
-from merging before it's ready."
- )
- end
- end
- end
-
- def within_wip_explanation(&block)
- page.within '.js-no-wip-explanation' do
- yield
- end
- end
-end
diff --git a/spec/frontend/issuable/helpers.js b/spec/frontend/issuable/helpers.js
new file mode 100644
index 00000000000..632d69c2c88
--- /dev/null
+++ b/spec/frontend/issuable/helpers.js
@@ -0,0 +1,18 @@
+export function getSaveableFormChildren(form, exclude = ['input.js-toggle-draft']) {
+ const children = Array.from(form.children);
+ const saveable = children.filter((e) => {
+ const isFiltered = exclude.reduce(
+ ({ isFiltered: filtered, element }, selector) => {
+ return {
+ isFiltered: filtered || element.matches(selector),
+ element,
+ };
+ },
+ { isFiltered: false, element: e },
+ );
+
+ return !isFiltered.isFiltered;
+ });
+
+ return saveable;
+}
diff --git a/spec/frontend/issuable/issuable_form_spec.js b/spec/frontend/issuable/issuable_form_spec.js
index 28ec0e22d8b..3e778e50fb8 100644
--- a/spec/frontend/issuable/issuable_form_spec.js
+++ b/spec/frontend/issuable/issuable_form_spec.js
@@ -4,6 +4,8 @@ import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import IssuableForm from '~/issuable/issuable_form';
import setWindowLocation from 'helpers/set_window_location_helper';
+import { getSaveableFormChildren } from './helpers';
+
jest.mock('~/autosave');
const createIssuable = (form) => {
@@ -18,6 +20,7 @@ describe('IssuableForm', () => {
setHTMLFixture(`
<form>
<input name="[title]" />
+ <input type="checkbox" class="js-toggle-draft" />
<textarea name="[description]"></textarea>
</form>
`);
@@ -99,10 +102,11 @@ describe('IssuableForm', () => {
])('creates $id autosave when $id input exist', ({ id, input, selector }) => {
$form.append(input);
const $input = $form.find(selector);
- const totalAutosaveFormFields = $form.children().length;
createIssuable($form);
- expect(Autosave).toHaveBeenCalledTimes(totalAutosaveFormFields);
+ const children = getSaveableFormChildren($form[0]);
+
+ expect(Autosave).toHaveBeenCalledTimes(children.length);
expect(Autosave).toHaveBeenLastCalledWith(
$input.get(0),
['/', '', id],
@@ -153,12 +157,17 @@ describe('IssuableForm', () => {
});
});
- describe('wip', () => {
+ describe('draft', () => {
+ let titleField;
+ let toggleDraft;
+
beforeEach(() => {
instance = createIssuable($form);
+ titleField = document.querySelector('input[name="[title]"]');
+ toggleDraft = document.querySelector('input.js-toggle-draft');
});
- describe('removeWip', () => {
+ describe('removeDraft', () => {
it.each`
prefix
${'draFT: '}
@@ -169,25 +178,25 @@ describe('IssuableForm', () => {
${' (DrafT)'}
${'draft: [draft] (draft)'}
`('removes "$prefix" from the beginning of the title', ({ prefix }) => {
- instance.titleField.val(`${prefix}The Issuable's Title Value`);
+ titleField.value = `${prefix}The Issuable's Title Value`;
- instance.removeWip();
+ instance.removeDraft();
- expect(instance.titleField.val()).toBe("The Issuable's Title Value");
+ expect(titleField.value).toBe("The Issuable's Title Value");
});
});
- describe('addWip', () => {
+ describe('addDraft', () => {
it("properly adds the work in progress prefix to the Issuable's title", () => {
- instance.titleField.val("The Issuable's Title Value");
+ titleField.value = "The Issuable's Title Value";
- instance.addWip();
+ instance.addDraft();
- expect(instance.titleField.val()).toBe("Draft: The Issuable's Title Value");
+ expect(titleField.value).toBe("Draft: The Issuable's Title Value");
});
});
- describe('workInProgress', () => {
+ describe('isMarkedDraft', () => {
it.each`
title | expected
${'draFT: something is happening'} | ${true}
@@ -195,10 +204,45 @@ describe('IssuableForm', () => {
${'something is happening to drafts'} | ${false}
${'something is happening'} | ${false}
`('returns $expected with "$title"', ({ title, expected }) => {
- instance.titleField.val(title);
+ titleField.value = title;
- expect(instance.workInProgress()).toBe(expected);
+ expect(instance.isMarkedDraft()).toBe(expected);
});
});
+
+ describe('readDraftStatus', () => {
+ it.each`
+ title | checked
+ ${'Draft: my title'} | ${true}
+ ${'my title'} | ${false}
+ `(
+ 'sets the draft checkbox checked status to $checked when the title is $title',
+ ({ title, checked }) => {
+ titleField.value = title;
+
+ instance.readDraftStatus();
+
+ expect(toggleDraft.checked).toBe(checked);
+ },
+ );
+ });
+
+ describe('writeDraftStatus', () => {
+ it.each`
+ checked | title
+ ${true} | ${'Draft: my title'}
+ ${false} | ${'my title'}
+ `(
+ 'updates the title to $title when the draft checkbox checked status is $checked',
+ ({ checked, title }) => {
+ titleField.value = 'my title';
+ toggleDraft.checked = checked;
+
+ instance.writeDraftStatus();
+
+ expect(titleField.value).toBe(title);
+ },
+ );
+ });
});
});
diff --git a/spec/models/ci/build_spec.rb b/spec/models/ci/build_spec.rb
index 7d5e82d5210..6d9fbad7d10 100644
--- a/spec/models/ci/build_spec.rb
+++ b/spec/models/ci/build_spec.rb
@@ -2601,7 +2601,7 @@ RSpec.describe Ci::Build, feature_category: :continuous_integration do
it { is_expected.to be_truthy }
- context "and there are specific runner" do
+ context "and there is a project runner" do
let!(:runner) { create(:ci_runner, :project, projects: [build.project], contacted_at: 1.second.ago) }
it { is_expected.to be_falsey }
diff --git a/spec/models/ci/runner_spec.rb b/spec/models/ci/runner_spec.rb
index b7c7b67b98f..0fde9e5f187 100644
--- a/spec/models/ci/runner_spec.rb
+++ b/spec/models/ci/runner_spec.rb
@@ -259,7 +259,7 @@ RSpec.describe Ci::Runner, feature_category: :runner do
end
describe '.belonging_to_project' do
- it 'returns the specific project runner' do
+ it 'returns the project runner' do
# own
specific_project = create(:project)
specific_runner = create(:ci_runner, :project, projects: [specific_project])
@@ -285,7 +285,7 @@ RSpec.describe Ci::Runner, feature_category: :runner do
subject(:result) { described_class.belonging_to_parent_group_of_project(project_id) }
- it 'returns the specific group runner' do
+ it 'returns the group runner' do
expect(result).to contain_exactly(runner1)
end
@@ -339,7 +339,7 @@ RSpec.describe Ci::Runner, feature_category: :runner do
describe '.owned_or_instance_wide' do
subject { described_class.owned_or_instance_wide(project.id) }
- it 'returns a globally shared, a project specific and a group specific runner' do
+ it 'returns a shared, project and group runner' do
is_expected.to contain_exactly(group_runner, project_runner, shared_runner)
end
end
@@ -352,7 +352,7 @@ RSpec.describe Ci::Runner, feature_category: :runner do
project_runner
end
- it 'returns a globally shared and a group specific runner' do
+ it 'returns a globally shared and a group runner' do
is_expected.to contain_exactly(group_runner, shared_runner)
end
end
@@ -382,7 +382,7 @@ RSpec.describe Ci::Runner, feature_category: :runner do
context 'with group runners disabled' do
let(:group_runners_enabled) { false }
- it 'returns only the project specific runner' do
+ it 'returns only the project runner' do
is_expected.to contain_exactly(project_runner)
end
end
@@ -390,7 +390,7 @@ RSpec.describe Ci::Runner, feature_category: :runner do
context 'with group runners enabled' do
let(:group_runners_enabled) { true }
- it 'returns a project specific and a group specific runner' do
+ it 'returns a project runner and a group runner' do
is_expected.to contain_exactly(group_runner, project_runner)
end
end
@@ -404,7 +404,7 @@ RSpec.describe Ci::Runner, feature_category: :runner do
project_runner
end
- it 'returns a group specific runner' do
+ it 'returns a group runner' do
is_expected.to contain_exactly(group_runner)
end
end
diff --git a/spec/models/ci/running_build_spec.rb b/spec/models/ci/running_build_spec.rb
index 1a5ea044ba3..7f254bd235c 100644
--- a/spec/models/ci/running_build_spec.rb
+++ b/spec/models/ci/running_build_spec.rb
@@ -31,7 +31,7 @@ RSpec.describe Ci::RunningBuild, feature_category: :continuous_integration do
end
end
- context 'when build has been picked by a specific runner' do
+ context 'when build has been picked by a project runner' do
let(:runner) { create(:ci_runner, :project) }
it 'raises an error' do
diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb
index 4ed85844a53..340b859ee5c 100644
--- a/spec/models/project_spec.rb
+++ b/spec/models/project_spec.rb
@@ -2320,7 +2320,7 @@ RSpec.describe Project, factory_default: :keep, feature_category: :projects do
context 'shared runners' do
let(:project) { create(:project, shared_runners_enabled: shared_runners_enabled) }
- let(:specific_runner) { create(:ci_runner, :project, :online, projects: [project]) }
+ let(:project_runner) { create(:ci_runner, :project, :online, projects: [project]) }
let(:shared_runner) { create(:ci_runner, :instance, :online) }
let(:offline_runner) { create(:ci_runner, :instance) }
@@ -2331,8 +2331,8 @@ RSpec.describe Project, factory_default: :keep, feature_category: :projects do
is_expected.to be_falsey
end
- it 'has a specific runner' do
- specific_runner
+ it 'has a project runner' do
+ project_runner
is_expected.to be_truthy
end
@@ -2343,14 +2343,14 @@ RSpec.describe Project, factory_default: :keep, feature_category: :projects do
is_expected.to be_falsey
end
- it 'checks the presence of specific runner' do
- specific_runner
+ it 'checks the presence of project runner' do
+ project_runner
- expect(project.any_online_runners? { |runner| runner == specific_runner }).to be_truthy
+ expect(project.any_online_runners? { |runner| runner == project_runner }).to be_truthy
end
it 'returns false if match cannot be found' do
- specific_runner
+ project_runner
expect(project.any_online_runners? { false }).to be_falsey
end
diff --git a/spec/requests/api/ci/runners_spec.rb b/spec/requests/api/ci/runners_spec.rb
index b07dd388390..ca051386265 100644
--- a/spec/requests/api/ci/runners_spec.rb
+++ b/spec/requests/api/ci/runners_spec.rb
@@ -794,7 +794,7 @@ RSpec.describe API::Ci::Runners, feature_category: :runner_fleet do
end
end
- context 'when runner is specific' do
+ context 'when runner is a project runner' do
it 'return jobs' do
get api("/runners/#{project_runner.id}/jobs", admin)
@@ -947,7 +947,7 @@ RSpec.describe API::Ci::Runners, feature_category: :runner_fleet do
end
end
- context 'when runner is specific' do
+ context 'when runner is a project runner' do
it 'return jobs' do
get api("/runners/#{project_runner.id}/jobs", user)
@@ -1203,7 +1203,7 @@ RSpec.describe API::Ci::Runners, feature_category: :runner_fleet do
context 'authorized user' do
let_it_be(:project_runner2) { create(:ci_runner, :project, projects: [project2]) }
- it 'enables specific runner' do
+ it 'enables project runner' do
expect do
post api("/projects/#{project.id}/runners", user), params: { runner_id: project_runner2.id }
end.to change { project.runners.count }.by(+1)
@@ -1243,7 +1243,7 @@ RSpec.describe API::Ci::Runners, feature_category: :runner_fleet do
context 'when project runner is used' do
let!(:new_project_runner) { create(:ci_runner, :project) }
- it 'enables any specific runner' do
+ it 'enables any project runner' do
expect do
post api("/projects/#{project.id}/runners", admin), params: { runner_id: new_project_runner.id }
end.to change { project.runners.count }.by(+1)
@@ -1255,7 +1255,7 @@ RSpec.describe API::Ci::Runners, feature_category: :runner_fleet do
create(:plan_limits, :default_plan, ci_registered_project_runners: 1)
end
- it 'does not enable specific runner' do
+ it 'does not enable project runner' do
expect do
post api("/projects/#{project.id}/runners", admin), params: { runner_id: new_project_runner.id }
end.not_to change { project.runners.count }
diff --git a/spec/services/ci/register_job_service_spec.rb b/spec/services/ci/register_job_service_spec.rb
index f40f5cc5a62..f834bc2674b 100644
--- a/spec/services/ci/register_job_service_spec.rb
+++ b/spec/services/ci/register_job_service_spec.rb
@@ -9,7 +9,7 @@ module Ci
let_it_be_with_reload(:pipeline) { create(:ci_pipeline, project: project) }
let!(:shared_runner) { create(:ci_runner, :instance) }
- let!(:specific_runner) { create(:ci_runner, :project, projects: [project]) }
+ let!(:project_runner) { create(:ci_runner, :project, projects: [project]) }
let!(:group_runner) { create(:ci_runner, :group, groups: [group]) }
let!(:pending_job) { create(:ci_build, :pending, :queued, pipeline: pipeline) }
@@ -46,32 +46,32 @@ module Ci
pending_job.update!(tag_list: ["linux"])
pending_job.reload
pending_job.create_queuing_entry!
- specific_runner.update!(tag_list: ["linux"])
- expect(execute(specific_runner)).to eq(pending_job)
+ project_runner.update!(tag_list: ["linux"])
+ expect(execute(project_runner)).to eq(pending_job)
end
it "does not pick build with different tag" do
pending_job.update!(tag_list: ["linux"])
pending_job.reload
pending_job.create_queuing_entry!
- specific_runner.update!(tag_list: ["win32"])
- expect(execute(specific_runner)).to be_falsey
+ project_runner.update!(tag_list: ["win32"])
+ expect(execute(project_runner)).to be_falsey
end
it "picks build without tag" do
- expect(execute(specific_runner)).to eq(pending_job)
+ expect(execute(project_runner)).to eq(pending_job)
end
it "does not pick build with tag" do
pending_job.update!(tag_list: ["linux"])
pending_job.reload
pending_job.create_queuing_entry!
- expect(execute(specific_runner)).to be_falsey
+ expect(execute(project_runner)).to be_falsey
end
it "pick build without tag" do
- specific_runner.update!(tag_list: ["win32"])
- expect(execute(specific_runner)).to eq(pending_job)
+ project_runner.update!(tag_list: ["win32"])
+ expect(execute(project_runner)).to eq(pending_job)
end
end
@@ -90,9 +90,9 @@ module Ci
end
end
- context 'for specific runner' do
+ context 'for project runner' do
it 'does not pick a build' do
- expect(execute(specific_runner)).to be_nil
+ expect(execute(project_runner)).to be_nil
expect(pending_job.reload).to be_failed
expect(pending_job.queuing_entry).to be_nil
end
@@ -216,13 +216,13 @@ module Ci
it { expect(Gitlab::Json.parse(response.build_json)['id']).to eq(build.id) }
end
- context 'specific runner' do
- let(:build) { execute(specific_runner) }
+ context 'project runner' do
+ let(:build) { execute(project_runner) }
it { expect(build).to be_kind_of(Build) }
it { expect(build).to be_valid }
it { expect(build).to be_running }
- it { expect(build.runner).to eq(specific_runner) }
+ it { expect(build.runner).to eq(project_runner) }
end
end
@@ -237,13 +237,13 @@ module Ci
it { expect(build).to be_nil }
end
- context 'specific runner' do
- let(:build) { execute(specific_runner) }
+ context 'project runner' do
+ let(:build) { execute(project_runner) }
it { expect(build).to be_kind_of(Build) }
it { expect(build).to be_valid }
it { expect(build).to be_running }
- it { expect(build.runner).to eq(specific_runner) }
+ it { expect(build.runner).to eq(project_runner) }
end
end
@@ -268,7 +268,7 @@ module Ci
end
context 'and uses project runner' do
- let(:build) { execute(specific_runner) }
+ let(:build) { execute(project_runner) }
it 'does not pick a build' do
expect(build).to be_nil
@@ -360,7 +360,7 @@ module Ci
.with(pending_job, anything).and_raise(ActiveRecord::StaleObjectError)
end
- subject { described_class.new(specific_runner).execute }
+ subject { described_class.new(project_runner).execute }
context 'with multiple builds are in queue' do
let!(:other_build) { create(:ci_build, :pending, :queued, pipeline: pipeline) }
@@ -404,13 +404,13 @@ module Ci
end
context 'when access_level of runner is not_protected' do
- let!(:specific_runner) { create(:ci_runner, :project, projects: [project]) }
+ let!(:project_runner) { create(:ci_runner, :project, projects: [project]) }
context 'when a job is protected' do
let!(:pending_job) { create(:ci_build, :pending, :queued, :protected, pipeline: pipeline) }
it 'picks the job' do
- expect(execute(specific_runner)).to eq(pending_job)
+ expect(execute(project_runner)).to eq(pending_job)
end
end
@@ -418,7 +418,7 @@ module Ci
let!(:pending_job) { create(:ci_build, :pending, :queued, pipeline: pipeline) }
it 'picks the job' do
- expect(execute(specific_runner)).to eq(pending_job)
+ expect(execute(project_runner)).to eq(pending_job)
end
end
@@ -430,19 +430,19 @@ module Ci
end
it 'picks the job' do
- expect(execute(specific_runner)).to eq(pending_job)
+ expect(execute(project_runner)).to eq(pending_job)
end
end
end
context 'when access_level of runner is ref_protected' do
- let!(:specific_runner) { create(:ci_runner, :project, :ref_protected, projects: [project]) }
+ let!(:project_runner) { create(:ci_runner, :project, :ref_protected, projects: [project]) }
context 'when a job is protected' do
let!(:pending_job) { create(:ci_build, :pending, :queued, :protected, pipeline: pipeline) }
it 'picks the job' do
- expect(execute(specific_runner)).to eq(pending_job)
+ expect(execute(project_runner)).to eq(pending_job)
end
end
@@ -450,7 +450,7 @@ module Ci
let!(:pending_job) { create(:ci_build, :pending, :queued, pipeline: pipeline) }
it 'does not pick the job' do
- expect(execute(specific_runner)).to be_nil
+ expect(execute(project_runner)).to be_nil
end
end
@@ -462,7 +462,7 @@ module Ci
end
it 'does not pick the job' do
- expect(execute(specific_runner)).to be_nil
+ expect(execute(project_runner)).to be_nil
end
end
end
@@ -471,7 +471,7 @@ module Ci
let(:options) { { artifacts: { reports: { junit: "junit.xml" } } } }
let!(:pending_job) { create(:ci_build, :pending, :queued, pipeline: pipeline, options: options) }
- subject { execute(specific_runner, params) }
+ subject { execute(project_runner, params) }
context 'when feature is missing by runner' do
let(:params) { {} }
@@ -507,10 +507,10 @@ module Ci
let(:dependencies) { %w[test] }
- subject { execute(specific_runner) }
+ subject { execute(project_runner) }
it 'picks a build with a dependency' do
- picked_build = execute(specific_runner)
+ picked_build = execute(project_runner)
expect(picked_build).to be_present
end
@@ -523,7 +523,7 @@ module Ci
let(:dependencies) { %w[test deploy] }
it 'logs build artifacts size' do
- execute(specific_runner)
+ execute(project_runner)
artifacts_size = [pre_stage_job, pre_stage_job_second].sum do |job|
job.job_artifacts_archive.size
@@ -622,7 +622,7 @@ module Ci
context 'when build is degenerated' do
let!(:pending_job) { create(:ci_build, :pending, :queued, :degenerated, pipeline: pipeline) }
- subject { execute(specific_runner, {}) }
+ subject { execute(project_runner, {}) }
it 'does not pick the build and drops the build' do
expect(subject).to be_nil
@@ -642,7 +642,7 @@ module Ci
pending_job.update_columns(options: "string")
end
- subject { execute(specific_runner, {}) }
+ subject { execute(project_runner, {}) }
it 'does drop the build and logs both failures' do
expect(Gitlab::ErrorTracking).to receive(:track_exception)
@@ -668,7 +668,7 @@ module Ci
.and_raise(RuntimeError, 'scheduler error')
end
- subject { execute(specific_runner, {}) }
+ subject { execute(project_runner, {}) }
it 'does drop the build and logs failure' do
expect(Gitlab::ErrorTracking).to receive(:track_exception)
@@ -690,7 +690,7 @@ module Ci
allow_any_instance_of(Ci::PersistentRef).to receive(:create_ref) { raise ArgumentError }
end
- subject { execute(specific_runner, {}) }
+ subject { execute(project_runner, {}) }
it 'picks the build' do
expect(subject).to eq(pending_job)
@@ -701,7 +701,7 @@ module Ci
end
context 'when only some builds can be matched by runner' do
- let!(:specific_runner) { create(:ci_runner, :project, projects: [project], tag_list: %w[matching]) }
+ let!(:project_runner) { create(:ci_runner, :project, projects: [project], tag_list: %w[matching]) }
let!(:pending_job) { create(:ci_build, :pending, :queued, pipeline: pipeline, tag_list: %w[matching]) }
before do
@@ -713,21 +713,21 @@ module Ci
it 'observes queue size of only matching jobs' do
# pending_job + 2 x matching ones
expect(Gitlab::Ci::Queue::Metrics.queue_size_total).to receive(:observe)
- .with({ runner_type: specific_runner.runner_type }, 3)
+ .with({ runner_type: project_runner.runner_type }, 3)
- expect(execute(specific_runner)).to eq(pending_job)
+ expect(execute(project_runner)).to eq(pending_job)
end
it 'observes queue processing time by the runner type' do
expect(Gitlab::Ci::Queue::Metrics.queue_iteration_duration_seconds)
.to receive(:observe)
- .with({ runner_type: specific_runner.runner_type }, anything)
+ .with({ runner_type: project_runner.runner_type }, anything)
expect(Gitlab::Ci::Queue::Metrics.queue_retrieval_duration_seconds)
.to receive(:observe)
- .with({ runner_type: specific_runner.runner_type }, anything)
+ .with({ runner_type: project_runner.runner_type }, anything)
- expect(execute(specific_runner)).to eq(pending_job)
+ expect(execute(project_runner)).to eq(pending_job)
end
end
@@ -739,7 +739,7 @@ module Ci
end
context 'when a build is temporarily locked' do
- let(:service) { described_class.new(specific_runner) }
+ let(:service) { described_class.new(project_runner) }
before do
service.send(:acquire_temporary_lock, pending_job.id)
@@ -777,7 +777,7 @@ module Ci
include_examples 'handles runner assignment'
context 'when a conflicting data is stored in denormalized table' do
- let!(:specific_runner) { create(:ci_runner, :project, projects: [project], tag_list: %w[conflict]) }
+ let!(:project_runner) { create(:ci_runner, :project, projects: [project], tag_list: %w[conflict]) }
let!(:pending_job) { create(:ci_build, :pending, :queued, pipeline: pipeline, tag_list: %w[conflict]) }
before do
@@ -788,7 +788,7 @@ module Ci
expect(pending_job.reload).to be_running
expect(pending_job.queuing_entry).to be_present
- result = described_class.new(specific_runner).execute
+ result = described_class.new(project_runner).execute
expect(result).not_to be_valid
expect(pending_job.reload.queuing_entry).not_to be_present
@@ -918,7 +918,7 @@ module Ci
end
end
- context 'when specific runner is used' do
+ context 'when project runner is used' do
let(:runner) { create(:ci_runner, :project, projects: [project], tag_list: %w(tag1 metrics_shard::shard_tag tag2)) }
let(:expected_shared_runner) { false }
let(:expected_shard) { ::Gitlab::Ci::Queue::Metrics::DEFAULT_METRICS_SHARD }
@@ -933,12 +933,12 @@ module Ci
it 'present sets runner session configuration in the build' do
runner_session_params = { session: { 'url' => 'https://example.com' } }
- expect(execute(specific_runner, runner_session_params).runner_session.attributes)
+ expect(execute(project_runner, runner_session_params).runner_session.attributes)
.to include(runner_session_params[:session])
end
it 'not present it does not configure the runner session' do
- expect(execute(specific_runner).runner_session).to be_nil
+ expect(execute(project_runner).runner_session).to be_nil
end
end
@@ -954,7 +954,7 @@ module Ci
it 'returns 409 conflict' do
expect(Ci::Build.pending.unstarted.count).to eq 3
- result = described_class.new(specific_runner).execute
+ result = described_class.new(project_runner).execute
expect(result).not_to be_valid
expect(result.build).to be_nil
diff --git a/spec/services/ci/update_build_queue_service_spec.rb b/spec/services/ci/update_build_queue_service_spec.rb
index d3f537a1aa0..dd26339831c 100644
--- a/spec/services/ci/update_build_queue_service_spec.rb
+++ b/spec/services/ci/update_build_queue_service_spec.rb
@@ -277,7 +277,7 @@ RSpec.describe Ci::UpdateBuildQueueService do
end
end
- context 'when updating specific runners' do
+ context 'when updating project runners' do
let(:runner) { create(:ci_runner, :project, projects: [project]) }
it_behaves_like 'matching build'