diff --git a/app/views/projects/_merge_request_merge_options_settings.html.haml b/app/views/projects/_merge_request_merge_options_settings.html.haml index 047b4dafbfc40fe406c5dc13f58232febcc3f514..8951f2ed22fb34d95bc05ffcc6a61a0cf48fb538 100644 --- a/app/views/projects/_merge_request_merge_options_settings.html.haml +++ b/app/views/projects/_merge_request_merge_options_settings.html.haml @@ -4,6 +4,7 @@ %b= s_('ProjectSettings|Merge options') %p.text-secondary= s_('ProjectSettings|Additional merge request capabilities that influence how and when merges will be performed') = render_if_exists 'projects/merge_pipelines_settings', form: form + = render_if_exists 'projects/merge_trains_settings', form: form .form-check.mb-2 = form.check_box :resolve_outdated_diff_discussions, class: 'form-check-input' = form.label :resolve_outdated_diff_discussions, class: 'form-check-label' do diff --git a/db/migrate/20201112195322_reseed_merge_trains_enabled.rb b/db/migrate/20201112195322_reseed_merge_trains_enabled.rb new file mode 100644 index 0000000000000000000000000000000000000000..777c59d16b1fe178fbff2482feae28c1d8a82cf9 --- /dev/null +++ b/db/migrate/20201112195322_reseed_merge_trains_enabled.rb @@ -0,0 +1,19 @@ +# frozen_string_literal: true + +class ReseedMergeTrainsEnabled < ActiveRecord::Migration[6.0] + include Gitlab::Database::MigrationHelpers + + DOWNTIME = false + + disable_ddl_transaction! + + def up + update_column_in_batches(:project_ci_cd_settings, :merge_trains_enabled, true) do |table, query| + query.where(table[:merge_pipelines_enabled].eq(true)) + end + end + + def down + # no-op + end +end diff --git a/db/schema_migrations/20201112195322 b/db/schema_migrations/20201112195322 new file mode 100644 index 0000000000000000000000000000000000000000..ba4c7e9d50f2380cb7edb2598f5765f410390159 --- /dev/null +++ b/db/schema_migrations/20201112195322 @@ -0,0 +1 @@ +644bf793b3b62330bfb1f4dc406e6dd01cbcf4651ebfd2873fb551c757c8a3b4 \ No newline at end of file diff --git a/doc/ci/merge_request_pipelines/pipelines_for_merged_results/index.md b/doc/ci/merge_request_pipelines/pipelines_for_merged_results/index.md index 2330bdb4c7cd0a9e6e462c4be7bbd0ba4d04af3d..9c6fbba1337672f7f5605cbaaf8adef4e389210d 100644 --- a/doc/ci/merge_request_pipelines/pipelines_for_merged_results/index.md +++ b/doc/ci/merge_request_pipelines/pipelines_for_merged_results/index.md @@ -56,7 +56,7 @@ To enable pipelines for merged results for your project: 1. [Configure your CI/CD configuration file](../index.md#configuring-pipelines-for-merge-requests) so that the pipeline or individual jobs run for merge requests. 1. Visit your project's **Settings > General** and expand **Merge requests**. -1. Check **Enable merge trains and pipelines for merged results**. +1. Check **Enable merged results pipelines.**. 1. Click **Save changes**. CAUTION: **Caution:** diff --git a/doc/ci/merge_request_pipelines/pipelines_for_merged_results/merge_trains/index.md b/doc/ci/merge_request_pipelines/pipelines_for_merged_results/merge_trains/index.md index c5d9901164536bdd3c81bd808220e8cc8c466916..d4099cdeafd90fb7581ad791620d93ab3f26ee54 100644 --- a/doc/ci/merge_request_pipelines/pipelines_for_merged_results/merge_trains/index.md +++ b/doc/ci/merge_request_pipelines/pipelines_for_merged_results/merge_trains/index.md @@ -82,9 +82,13 @@ To enable merge trains for your project: 1. If you are on a self-managed GitLab instance, ensure the [feature flag](#merge-trains-feature-flag) is set correctly. 1. [Configure your CI/CD configuration file](../../index.md#configuring-pipelines-for-merge-requests) so that the pipeline or individual jobs run for merge requests. -1. Visit your project's **Settings > General** and expand **Merge requests**. -1. Check **Enable merge trains and pipelines for merged results**. -1. Click **Save changes**. +1. Visit your project's **Settings > General** and expand **Merge requests** +1. Check **Enable merged results pipelines.** (if not enabled) +1. Check **Enable merge trains.** +1. Click **Save changes** + +In GitLab 13.5 and earlier, there is only one checkbox, named +**Enable merge trains and pipelines for merged results**. CAUTION: **Caution:** If you select the check box but don't configure your CI/CD to use @@ -200,10 +204,13 @@ for more information. ### Merge Trains feature flag **(PREMIUM ONLY)** -Merge trains are automatically enabled when [pipelines for merged results](../index.md#pipelines-for-merged-results) -are enabled. To use pipelines for merged results without using merge trains, you must -enable a [feature flag](../../../../user/feature_flags.md) that blocks the merge trains -feature. +In [GitLab 13.6 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/244831), +you can [enable or disable merge trains in the project settings](#enable-merge-trains). + +In GitLab 13.5 and earlier, merge trains are automatically enabled when +[pipelines for merged results](../index.md#pipelines-for-merged-results) are enabled. +To use pipelines for merged results without using merge trains, you can enable a +[feature flag](../../../../user/feature_flags.md) that blocks the merge trains feature. [GitLab administrators with access to the GitLab Rails console](../../../../administration/feature_flags.md) can enable the feature flag to disable merge trains: diff --git a/ee/app/controllers/ee/projects_controller.rb b/ee/app/controllers/ee/projects_controller.rb index b65a32350fa5d1a82bfabce0f456892bf062d0d5..7c9fddfec79c51e0edb2f51f1973844a241ea21c 100644 --- a/ee/app/controllers/ee/projects_controller.rb +++ b/ee/app/controllers/ee/projects_controller.rb @@ -88,9 +88,8 @@ def project_params_ee group_with_project_templates_id ] - if allow_merge_pipelines_params? - attrs << %i[merge_pipelines_enabled] - end + attrs << %i[merge_pipelines_enabled] if allow_merge_pipelines_params? + attrs << %i[merge_trains_enabled] if allow_merge_trains_params? attrs += merge_request_rules_params @@ -144,6 +143,10 @@ def allow_merge_pipelines_params? project&.feature_available?(:merge_pipelines) end + def allow_merge_trains_params? + project&.feature_available?(:merge_trains) + end + def compliance_framework_params return [] unless current_user.can?(:admin_compliance_framework, project) diff --git a/ee/app/models/ee/project.rb b/ee/app/models/ee/project.rb index 9b6070e580686dcf587a1c97ec907132456e74ad..f54279b7b4cc019c99f2efde8a0453db8707c023 100644 --- a/ee/app/models/ee/project.rb +++ b/ee/app/models/ee/project.rb @@ -186,7 +186,8 @@ def lock_for_confirmation!(id) to: :import_state, prefix: :mirror, allow_nil: true delegate :merge_pipelines_enabled, :merge_pipelines_enabled=, :merge_pipelines_enabled?, :merge_pipelines_were_disabled?, to: :ci_cd_settings - delegate :merge_trains_enabled?, to: :ci_cd_settings + delegate :merge_trains_enabled, :merge_trains_enabled=, :merge_trains_enabled?, to: :ci_cd_settings + delegate :auto_rollback_enabled, :auto_rollback_enabled=, :auto_rollback_enabled?, to: :ci_cd_settings delegate :closest_gitlab_subscription, to: :namespace delegate :jira_vulnerabilities_integration_enabled?, to: :jira_service, allow_nil: true diff --git a/ee/app/models/ee/project_ci_cd_setting.rb b/ee/app/models/ee/project_ci_cd_setting.rb index 766e1487201bceafd3dea9e0166a7bc2bfb2eb31..46fc61ddec2e15ca9ce83a7961c59ecbf2c7621d 100644 --- a/ee/app/models/ee/project_ci_cd_setting.rb +++ b/ee/app/models/ee/project_ci_cd_setting.rb @@ -14,9 +14,10 @@ def merge_pipelines_enabled? # This feature flag is never meant to be enabled for the entire instance. # See more context in https://gitlab.com/gitlab-org/gitlab/issues/200037 def merge_trains_enabled? - return false if ::Feature.enabled?(:disable_merge_trains, project) - - merge_pipelines_enabled? && project.feature_available?(:merge_trains) + super && + merge_pipelines_enabled? && + project.feature_available?(:merge_trains) && + !merge_trains_disabled?(project) end def merge_pipelines_were_disabled? @@ -26,5 +27,11 @@ def merge_pipelines_were_disabled? def auto_rollback_enabled? super && ::Gitlab::Ci::Features.auto_rollback_available?(project) end + + private + + def merge_trains_disabled?(project) + ::Feature.enabled?(:disable_merge_trains, project) + end end end diff --git a/ee/app/views/projects/_merge_pipelines_settings.html.haml b/ee/app/views/projects/_merge_pipelines_settings.html.haml index 112bbfaea0d59db9271a4c730e4f8058a1e14a43..5dfa50a0271c6e280c125648849cf5799968a331 100644 --- a/ee/app/views/projects/_merge_pipelines_settings.html.haml +++ b/ee/app/views/projects/_merge_pipelines_settings.html.haml @@ -3,10 +3,11 @@ .form-check.builds-feature = form.check_box :merge_pipelines_enabled, class: 'form-check-input js-merge-options-merge-pipelines', data: { qa_selector: 'merged_results_pipeline_checkbox' } = form.label :merge_pipelines_enabled, class: 'form-check-label' do - = s_('ProjectSettings|Enable merge trains and pipelines for merged results') + = s_('ProjectSettings|Enable merged results pipelines.') .text-secondary.mb-2 - = s_('ProjectSettings|Pipelines for merge requests must be enabled in the CI/CD configuration file, or pipelines could be unresolvable or dropped') + = s_('ProjectSettings|If pipelines for merge requests are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches.') = link_to sprite_icon('question-o'), help_page_path('ci/merge_request_pipelines/index.md', anchor: 'configuring-pipelines-for-merge-requests'), - target: '_blank' + target: '_blank', + rel: 'noopener noreferer' diff --git a/ee/app/views/projects/_merge_trains_settings.html.haml b/ee/app/views/projects/_merge_trains_settings.html.haml new file mode 100644 index 0000000000000000000000000000000000000000..af187b89d66879ab556c69dfa01a0fb1f7b82705 --- /dev/null +++ b/ee/app/views/projects/_merge_trains_settings.html.haml @@ -0,0 +1,13 @@ +- return unless merge_trains_available? + +.form-check + = form.check_box :merge_trains_enabled, class: 'form-check-input' + = form.label :merge_trains_enabled, class: 'form-check-label' do + = s_('ProjectSettings|Enable merge trains.') + .text-secondary.mb-2 + = s_('ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge.') + = link_to sprite_icon('question-o'), + help_page_path('ci/merge_request_pipelines/pipelines_for_merged_results/merge_trains/index.md', + anchor: 'merge-trains'), + target: '_blank', + rel: 'noopener noreferer' diff --git a/ee/changelogs/unreleased/244831-split-pipelines-for-merged-results-and-merge-train-check-boxes.yml b/ee/changelogs/unreleased/244831-split-pipelines-for-merged-results-and-merge-train-check-boxes.yml new file mode 100644 index 0000000000000000000000000000000000000000..19b29eeb86d2b9ab394364c21ec121192403200e --- /dev/null +++ b/ee/changelogs/unreleased/244831-split-pipelines-for-merged-results-and-merge-train-check-boxes.yml @@ -0,0 +1,5 @@ +--- +title: Split 'Pipelines for merged results' and 'Merge Train' check boxes +merge_request: 46357 +author: +type: changed diff --git a/ee/spec/controllers/projects_controller_spec.rb b/ee/spec/controllers/projects_controller_spec.rb index 87327a424ea46c74301db7f3065c9eb6833e395d..0e276f793c9d5e976374ed5b2e14abecec68a186 100644 --- a/ee/spec/controllers/projects_controller_spec.rb +++ b/ee/spec/controllers/projects_controller_spec.rb @@ -6,7 +6,7 @@ let_it_be(:user) { create(:user) } let_it_be(:group) { create(:group) } - let(:project) { create(:project) } + let_it_be(:project, reload: true) { create(:project) } let_it_be(:public_project) { create(:project, :public, :repository, namespace: group) } @@ -311,6 +311,48 @@ end end + context 'when merge_trains_enabled param is specified' do + let(:params) { { merge_trains_enabled: true } } + + let(:request) do + put :update, params: { namespace_id: project.namespace, id: project, project: params } + end + + before do + stub_licensed_features(merge_pipelines: true, merge_trains: true) + end + + it 'updates the attribute' do + request + + expect(project.merge_trains_enabled).to be_truthy + end + + context 'when feature flag is disabled' do + before do + stub_feature_flags(merge_trains: false) + end + + it 'does not update the attribute' do + request + + expect(project.merge_trains_enabled).to be_falsy + end + end + + context 'when license is not sufficient' do + before do + stub_licensed_features(merge_trains: false) + end + + it 'does not update the attribute' do + request + + expect(project.merge_trains_enabled).to be_falsy + end + end + end + context 'when auto_rollback_enabled param is specified' do let(:params) { { auto_rollback_enabled: true } } diff --git a/ee/spec/features/merge_request/user_merges_immediately_spec.rb b/ee/spec/features/merge_request/user_merges_immediately_spec.rb index 7875658725f59fbc3c238ef4d77ad0efdf6b9d23..886aea05fc50cbd40c9ce85c88dcd30219f336c2 100644 --- a/ee/spec/features/merge_request/user_merges_immediately_spec.rb +++ b/ee/spec/features/merge_request/user_merges_immediately_spec.rb @@ -18,7 +18,7 @@ before_all do project.add_maintainer(user) - project.update!(merge_pipelines_enabled: true) + project.update!(merge_pipelines_enabled: true, merge_trains_enabled: true) merge_request.all_pipelines.first.succeed! merge_request.update_head_pipeline end diff --git a/ee/spec/features/merge_trains/two_merge_requests_on_train_spec.rb b/ee/spec/features/merge_trains/two_merge_requests_on_train_spec.rb index 2bcaa939c3eef527fcf70e00f67583eb0fd16308..972118837123e3c8001ae79696642f1a446cf137 100644 --- a/ee/spec/features/merge_trains/two_merge_requests_on_train_spec.rb +++ b/ee/spec/features/merge_trains/two_merge_requests_on_train_spec.rb @@ -32,7 +32,7 @@ project.add_maintainer(maintainer_1) project.add_maintainer(maintainer_2) stub_licensed_features(merge_pipelines: true, merge_trains: true) - project.update!(merge_pipelines_enabled: true) + project.update!(merge_pipelines_enabled: true, merge_trains_enabled: true) stub_ci_pipeline_yaml_file(YAML.dump(ci_yaml)) head_pipeline = double('Ci::Pipeline') diff --git a/ee/spec/features/merge_trains/user_adds_merge_request_to_merge_train_spec.rb b/ee/spec/features/merge_trains/user_adds_merge_request_to_merge_train_spec.rb index 9a03490f05eb12d7973d0048b61cc89e00637924..21d7448a5b750e8b48ede2595f30dc0401162729 100644 --- a/ee/spec/features/merge_trains/user_adds_merge_request_to_merge_train_spec.rb +++ b/ee/spec/features/merge_trains/user_adds_merge_request_to_merge_train_spec.rb @@ -20,7 +20,7 @@ stub_feature_flags(disable_merge_trains: false) stub_licensed_features(merge_pipelines: true, merge_trains: true) project.add_maintainer(user) - project.update!(merge_pipelines_enabled: true) + project.update!(merge_pipelines_enabled: true, merge_trains_enabled: true) merge_request.all_pipelines.first.succeed! merge_request.update_head_pipeline stub_ci_pipeline_yaml_file(YAML.dump(ci_yaml)) diff --git a/ee/spec/features/merge_trains/user_adds_to_merge_train_when_pipeline_succeeds_spec.rb b/ee/spec/features/merge_trains/user_adds_to_merge_train_when_pipeline_succeeds_spec.rb index 724f139eb422f3bc2a9b01f8191fae6d3ddfa35a..6fffa77908bf588a8648f1187b88f7b30559c7d5 100644 --- a/ee/spec/features/merge_trains/user_adds_to_merge_train_when_pipeline_succeeds_spec.rb +++ b/ee/spec/features/merge_trains/user_adds_to_merge_train_when_pipeline_succeeds_spec.rb @@ -18,7 +18,8 @@ stub_feature_flags(disable_merge_trains: false) stub_licensed_features(merge_pipelines: true, merge_trains: true) project.add_maintainer(user) - project.update!(merge_pipelines_enabled: true) + project.update!(merge_pipelines_enabled: true, merge_trains_enabled: true) + merge_request.update_head_pipeline sign_in(user) diff --git a/ee/spec/features/projects/settings/user_manages_merge_pipelines_spec.rb b/ee/spec/features/projects/settings/user_manages_merge_pipelines_spec.rb index 566a47981d7c61b3d6e483198b0b0b7624968d4d..f1f4be779cc80e3505c0970f79d52af899bd3891 100644 --- a/ee/spec/features/projects/settings/user_manages_merge_pipelines_spec.rb +++ b/ee/spec/features/projects/settings/user_manages_merge_pipelines_spec.rb @@ -23,7 +23,7 @@ before do visit edit_project_path(project) - check('Enable merge trains and pipelines for merged results') + check('Enable merged results pipelines.') end it 'sees enabled merge pipeline checkbox' do diff --git a/ee/spec/features/projects/settings/user_manages_merge_trains_spec.rb b/ee/spec/features/projects/settings/user_manages_merge_trains_spec.rb new file mode 100644 index 0000000000000000000000000000000000000000..be03debaa379b9f5d90e2424a2a08ef2bb831b4d --- /dev/null +++ b/ee/spec/features/projects/settings/user_manages_merge_trains_spec.rb @@ -0,0 +1,53 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe 'User manages merge trains option', :js do + let_it_be(:project) { create(:project) } + let_it_be(:user) { create(:user) } + + before do + stub_licensed_features(merge_pipelines: true, merge_trains: true) + + project.add_maintainer(user) + sign_in(user) + end + + it 'sees unchecked merge trains checkbox' do + visit edit_project_path(project) + + expect(page.find('#project_merge_trains_enabled')).not_to be_checked + end + + context 'when user enabled the checkbox' do + before do + visit edit_project_path(project) + + check('Enable merge trains.') + end + + it 'sees enabled merge trains checkbox' do + expect(page.find('#project_merge_trains_enabled')).to be_checked + end + end + + context 'when license is insufficient' do + before do + stub_licensed_features(merge_pipelines: false, merge_trains: false) + end + + it 'does not see the checkbox' do + expect(page).not_to have_css('#project_merge_trains_enabled') + end + end + + context 'when feature flag is disabled' do + before do + stub_feature_flags(merge_pipelines: false, merge_trains: false) + end + + it 'does not see the checkbox' do + expect(page).not_to have_css('#project_merge_trains_enabled') + end + end +end diff --git a/ee/spec/models/project_ci_cd_setting_spec.rb b/ee/spec/models/project_ci_cd_setting_spec.rb index 53082defe0ab1ffb5acf28aa6b5bde13333cf251..b19fcf789d1fa74bbff7a25b3edd64cf24898ed8 100644 --- a/ee/spec/models/project_ci_cd_setting_spec.rb +++ b/ee/spec/models/project_ci_cd_setting_spec.rb @@ -3,6 +3,8 @@ require 'spec_helper' RSpec.describe ProjectCiCdSetting do + using RSpec::Parameterized::TableSyntax + before do stub_feature_flags(disable_merge_trains: false) end @@ -47,25 +49,30 @@ end describe '#merge_trains_enabled?' do - subject { project.merge_trains_enabled? } + subject(:result) { project.merge_trains_enabled? } let(:project) { create(:project) } - context 'when Merge trains (EEP) is available' do - before do - stub_licensed_features(merge_pipelines: true, merge_trains: true) - project.merge_pipelines_enabled = true - end - - it { is_expected.to be_truthy } + where(:merge_pipelines_enabled, :merge_trains_enabled, :feature_available, :expected_result) do + true | true | true | true + true | false | true | false + false | false | true | false + false | true | true | false + true | true | false | false + true | false | false | false + false | false | false | false end - context 'when Merge trains (EEP) is unavailable' do + with_them do before do - stub_licensed_features(merge_trains: false) + stub_licensed_features(merge_pipelines: feature_available, merge_trains: feature_available) end - it { is_expected.to be_falsy } + it 'returns merge trains availability' do + project.update!(merge_pipelines_enabled: merge_pipelines_enabled, merge_trains_enabled: merge_trains_enabled) + + expect(result).to eq(expected_result) + end end end diff --git a/ee/spec/serializers/merge_request_poll_widget_entity_spec.rb b/ee/spec/serializers/merge_request_poll_widget_entity_spec.rb index 2e80517bd8a1c0b20f54fd38d811caa1f5e775f2..7087b25be9b8529289b83e765c4bc9ccb5db5f4c 100644 --- a/ee/spec/serializers/merge_request_poll_widget_entity_spec.rb +++ b/ee/spec/serializers/merge_request_poll_widget_entity_spec.rb @@ -24,7 +24,7 @@ before do stub_licensed_features(merge_pipelines: true, merge_trains: true) - project.update!(merge_pipelines_enabled: true) + project.update!(merge_pipelines_enabled: true, merge_trains_enabled: true) end it 'has merge train entity' do diff --git a/ee/spec/services/auto_merge/add_to_merge_train_when_pipeline_succeeds_service_spec.rb b/ee/spec/services/auto_merge/add_to_merge_train_when_pipeline_succeeds_service_spec.rb index 30a7f28925735d9675ef3a4d8c13e3e485cadd67..c817ef0d96b57dd203fe66ab31b7e9792f2109c4 100644 --- a/ee/spec/services/auto_merge/add_to_merge_train_when_pipeline_succeeds_service_spec.rb +++ b/ee/spec/services/auto_merge/add_to_merge_train_when_pipeline_succeeds_service_spec.rb @@ -16,11 +16,11 @@ let(:pipeline) { merge_request.reload.all_pipelines.first } before do + project.add_maintainer(user) + project.update!(merge_pipelines_enabled: true, merge_trains_enabled: true) stub_feature_flags(ci_disallow_to_create_merge_request_pipelines_in_target_project: false) stub_feature_flags(disable_merge_trains: false) stub_licensed_features(merge_trains: true, merge_pipelines: true) - project.add_maintainer(user) - project.update!(merge_pipelines_enabled: true) allow(AutoMergeProcessWorker).to receive(:perform_async) { } merge_request.update_head_pipeline end diff --git a/ee/spec/services/auto_merge/merge_train_service_spec.rb b/ee/spec/services/auto_merge/merge_train_service_spec.rb index 255bbc43090caa681b273c9b661e585875f2a0a1..ade9e6d5a7cdc74dc33b2642e56ab13fa092d2ba 100644 --- a/ee/spec/services/auto_merge/merge_train_service_spec.rb +++ b/ee/spec/services/auto_merge/merge_train_service_spec.rb @@ -17,13 +17,13 @@ before do project.add_maintainer(user) + project.update!(merge_pipelines_enabled: true, merge_trains_enabled: true) allow(AutoMergeProcessWorker).to receive(:perform_async) { } stub_feature_flags(ci_disallow_to_create_merge_request_pipelines_in_target_project: false) stub_feature_flags(disable_merge_trains: false) stub_licensed_features(merge_trains: true, merge_pipelines: true) - project.update!(merge_pipelines_enabled: true) end describe '#execute' do @@ -349,7 +349,15 @@ 2.times { is_expected.to be_truthy } end - context 'when merge trains project option is disabled' do + context 'when merge trains flag is disabled' do + before do + project.update!(merge_trains_enabled: false) + end + + it { is_expected.to be_falsy } + end + + context 'when merge train ci setting is disabled' do before do stub_feature_flags(disable_merge_trains: true) end diff --git a/ee/spec/services/merge_trains/check_status_service_spec.rb b/ee/spec/services/merge_trains/check_status_service_spec.rb index a107b2b1e6385a94841de5a7374244dac871bda3..5dac93ddc8507b4833077e7512aa6da60a742704 100644 --- a/ee/spec/services/merge_trains/check_status_service_spec.rb +++ b/ee/spec/services/merge_trains/check_status_service_spec.rb @@ -11,7 +11,7 @@ before do stub_feature_flags(disable_merge_trains: false) stub_licensed_features(merge_pipelines: true, merge_trains: true) - project.update!(merge_pipelines_enabled: true) + project.update!(merge_pipelines_enabled: true, merge_trains_enabled: true) end describe '#execute' do diff --git a/ee/spec/services/merge_trains/create_pipeline_service_spec.rb b/ee/spec/services/merge_trains/create_pipeline_service_spec.rb index 3f94ca5148b310f8742455b60eaa4296357e02b7..bd6550ba6b281a53a4857c87a37a06bb21987499 100644 --- a/ee/spec/services/merge_trains/create_pipeline_service_spec.rb +++ b/ee/spec/services/merge_trains/create_pipeline_service_spec.rb @@ -9,11 +9,11 @@ let(:previous_ref) { 'refs/heads/master' } before do + project.add_maintainer(maintainer) + project.update!(merge_pipelines_enabled: true, merge_trains_enabled: true) stub_feature_flags(ci_disallow_to_create_merge_request_pipelines_in_target_project: false) stub_feature_flags(disable_merge_trains: false) - project.add_maintainer(maintainer) stub_licensed_features(merge_pipelines: true, merge_trains: true) - project.update!(merge_pipelines_enabled: true) end describe '#execute' do @@ -35,7 +35,7 @@ end end - context 'when merge trains option is disabled' do + context 'when merge trains flag is disabled' do before do stub_feature_flags(disable_merge_trains: true) end @@ -45,6 +45,16 @@ end end + context 'when merge trains setting is disabled' do + before do + project.update!(merge_trains_enabled: false) + end + + it_behaves_like 'returns an error' do + let(:expected_reason) { 'merge trains is disabled' } + end + end + context 'when merge request is not on a merge train' do let!(:merge_request) do create(:merge_request, diff --git a/ee/spec/services/merge_trains/refresh_merge_request_service_spec.rb b/ee/spec/services/merge_trains/refresh_merge_request_service_spec.rb index 17aae941ebfe7eaa9ae39f6dfcf26f6b546508df..e96526f14e50008b78d564840fc2248f9ed11825 100644 --- a/ee/spec/services/merge_trains/refresh_merge_request_service_spec.rb +++ b/ee/spec/services/merge_trains/refresh_merge_request_service_spec.rb @@ -12,7 +12,7 @@ stub_feature_flags(disable_merge_trains: false) project.add_maintainer(maintainer) stub_licensed_features(merge_pipelines: true, merge_trains: true) - project.update!(merge_pipelines_enabled: true) + project.update!(merge_pipelines_enabled: true, merge_trains_enabled: true) end describe '#execute' do @@ -96,6 +96,20 @@ end end + context 'when merge trains not enabled' do + before do + project.update!(merge_trains_enabled: false) + end + + it_behaves_like 'drops the merge request from the merge train' do + let(:expected_reason) { 'project disabled merge trains' } + end + + after do + project.update!(merge_pipelines_enabled: true) + end + end + context 'when merge request is not under a mergeable state' do before do merge_request.update!(title: merge_request.wip_title) diff --git a/locale/gitlab.pot b/locale/gitlab.pot index 9b14d4951a88915978dcbb921b5fe4dd8f4496b4..8f9b809c5ecd2ac9be9b9dec3c16d80b43f46977 100644 --- a/locale/gitlab.pot +++ b/locale/gitlab.pot @@ -21222,7 +21222,10 @@ msgstr "" msgid "ProjectSettings|Enable 'Delete source branch' option by default" msgstr "" -msgid "ProjectSettings|Enable merge trains and pipelines for merged results" +msgid "ProjectSettings|Enable merge trains." +msgstr "" + +msgid "ProjectSettings|Enable merged results pipelines." msgstr "" msgid "ProjectSettings|Encourage" @@ -21264,6 +21267,9 @@ msgstr "" msgid "ProjectSettings|Global" msgstr "" +msgid "ProjectSettings|If pipelines for merge requests are enabled in the CI/CD configuration file, pipelines validate the combined results of the source and target branches." +msgstr "" + msgid "ProjectSettings|Internal" msgstr "" @@ -21324,9 +21330,6 @@ msgstr "" msgid "ProjectSettings|Pipelines" msgstr "" -msgid "ProjectSettings|Pipelines for merge requests must be enabled in the CI/CD configuration file, or pipelines could be unresolvable or dropped" -msgstr "" - msgid "ProjectSettings|Pipelines must succeed" msgstr "" @@ -21423,6 +21426,9 @@ msgstr "" msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access" msgstr "" +msgid "ProjectSettings|When approved for merge, merge requests are queued and pipelines validate the combined results of the source and target branches before merge." +msgstr "" + msgid "ProjectSettings|When conflicts arise the user is given the option to rebase" msgstr "" diff --git a/spec/migrations/reseed_merge_trains_enabled_spec.rb b/spec/migrations/reseed_merge_trains_enabled_spec.rb new file mode 100644 index 0000000000000000000000000000000000000000..71ef0b47da91d192abad9f300c24f1b893f3b51a --- /dev/null +++ b/spec/migrations/reseed_merge_trains_enabled_spec.rb @@ -0,0 +1,26 @@ +# frozen_string_literal: true + +require 'spec_helper' +require Rails.root.join('db', 'migrate', '20201112195322_reseed_merge_trains_enabled.rb') + +RSpec.describe ReseedMergeTrainsEnabled do + describe 'migrate' do + let(:project_ci_cd_settings) { table(:project_ci_cd_settings) } + let(:projects) { table(:projects) } + let(:namespaces) { table(:namespaces) } + + context 'when on Gitlab.com' do + before do + namespace = namespaces.create!(name: 'hello', path: 'hello/') + project1 = projects.create!(namespace_id: namespace.id) + project2 = projects.create!(namespace_id: namespace.id) + project_ci_cd_settings.create!(project_id: project1.id, merge_pipelines_enabled: true) + project_ci_cd_settings.create!(project_id: project2.id, merge_pipelines_enabled: false) + end + + it 'updates merge_trains_enabled to true for where merge_pipelines_enabled is true' do + expect { migrate! }.to change(project_ci_cd_settings.where(merge_trains_enabled: true), :count).by(1) + end + end + end +end