diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2022-02-18 09:45:46 +0000 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2022-02-18 09:45:46 +0000 |
commit | a7b3560714b4d9cc4ab32dffcd1f74a284b93580 (patch) | |
tree | 7452bd5c3545c2fa67a28aa013835fb4fa071baf /qa/qa/specs/features | |
parent | ee9173579ae56a3dbfe5afe9f9410c65bb327ca7 (diff) | |
download | gitlab-ce-a7b3560714b4d9cc4ab32dffcd1f74a284b93580.tar.gz |
Add latest changes from gitlab-org/gitlab@14-8-stable-eev14.8.0-rc42
Diffstat (limited to 'qa/qa/specs/features')
51 files changed, 869 insertions, 1003 deletions
diff --git a/qa/qa/specs/features/api/1_manage/import_github_repo_spec.rb b/qa/qa/specs/features/api/1_manage/import_github_repo_spec.rb index 4bc95395f25..a51d733d484 100644 --- a/qa/qa/specs/features/api/1_manage/import_github_repo_spec.rb +++ b/qa/qa/specs/features/api/1_manage/import_github_repo_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true module QA - RSpec.describe 'Manage', :github, :requires_admin do + RSpec.describe 'Manage', :github, :requires_admin, :reliable do describe 'Project import' do let!(:api_client) { Runtime::API::Client.as_admin } let!(:group) { Resource::Group.fabricate_via_api! { |resource| resource.api_client = api_client } } diff --git a/qa/qa/specs/features/api/1_manage/migration/gitlab_migration_issue_spec.rb b/qa/qa/specs/features/api/1_manage/migration/gitlab_migration_issue_spec.rb index 8a2a382ac45..bb4b0472398 100644 --- a/qa/qa/specs/features/api/1_manage/migration/gitlab_migration_issue_spec.rb +++ b/qa/qa/specs/features/api/1_manage/migration/gitlab_migration_issue_spec.rb @@ -3,12 +3,8 @@ require_relative 'gitlab_project_migration_common' module QA - RSpec.describe 'Manage', :requires_admin do - describe 'Gitlab migration', quarantine: { - only: { job: 'praefect' }, - type: :investigating, - issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/348999' - } do + RSpec.describe 'Manage' do + describe 'Gitlab migration' do include_context 'with gitlab project migration' context 'with project issues' do @@ -40,13 +36,13 @@ module QA testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347608' ) do expect_import_finished + expect(imported_issues.count).to eq(1) aggregate_failures do - expect(imported_issues.count).to eq(1) expect(imported_issue).to eq(source_issue.reload!) expect(imported_comments.count).to eq(1) - expect(imported_comments.first[:body]).to include(source_comment[:body]) + expect(imported_comments.first&.fetch(:body)).to include(source_comment[:body]) end end end diff --git a/qa/qa/specs/features/api/1_manage/migration/gitlab_migration_mr_spec.rb b/qa/qa/specs/features/api/1_manage/migration/gitlab_migration_mr_spec.rb index 9dce9bff3c1..d656ea4dea5 100644 --- a/qa/qa/specs/features/api/1_manage/migration/gitlab_migration_mr_spec.rb +++ b/qa/qa/specs/features/api/1_manage/migration/gitlab_migration_mr_spec.rb @@ -3,12 +3,8 @@ require_relative 'gitlab_project_migration_common' module QA - RSpec.describe 'Manage', :requires_admin do - describe 'Gitlab migration', quarantine: { - only: { job: 'praefect' }, - type: :investigating, - issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/348999' - } do + RSpec.describe 'Manage' do + describe 'Gitlab migration' do include_context 'with gitlab project migration' context 'with merge request' do @@ -33,7 +29,8 @@ module QA let!(:source_comment) { source_mr.add_comment('This is a test comment!') } let(:imported_mrs) { imported_project.merge_requests } - let(:imported_mr_comments) { imported_mr.comments } + let(:imported_mr_comments) { imported_mr.comments.map { |note| note.except(:id, :noteable_id) } } + let(:source_mr_comments) { source_mr.comments.map { |note| note.except(:id, :noteable_id) } } let(:imported_mr) do Resource::MergeRequest.init do |mr| @@ -52,17 +49,12 @@ module QA testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/348478' ) do expect_import_finished + expect(imported_mrs.count).to eq(1) aggregate_failures do - expect(imported_mrs.count).to eq(1) - # TODO: remove custom comparison after member migration is implemented - # https://gitlab.com/gitlab-org/gitlab/-/issues/341886 - expect(imported_mr.comparable.except(:author)).to eq(source_mr.reload!.comparable.except(:author)) + expect(imported_mr).to eq(source_mr.reload!) - expect(imported_mr_comments.count).to eq(1) - expect(imported_mr_comments.first[:body]).to include(source_comment[:body]) - # Comment will have mention of original user since members are not migrated yet - expect(imported_mr_comments.first[:body]).to include(other_user.name) + expect(imported_mr_comments).to eq(source_mr_comments) end end end diff --git a/qa/qa/specs/features/api/1_manage/migration/gitlab_migration_project_spec.rb b/qa/qa/specs/features/api/1_manage/migration/gitlab_migration_project_spec.rb index a0c758c99e6..421dbe56a99 100644 --- a/qa/qa/specs/features/api/1_manage/migration/gitlab_migration_project_spec.rb +++ b/qa/qa/specs/features/api/1_manage/migration/gitlab_migration_project_spec.rb @@ -3,12 +3,8 @@ require_relative 'gitlab_project_migration_common' module QA - RSpec.describe 'Manage', :requires_admin do - describe 'Gitlab migration', quarantine: { - only: { job: 'praefect' }, - type: :investigating, - issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/348999' - } do + RSpec.describe 'Manage' do + describe 'Gitlab migration' do include_context 'with gitlab project migration' context 'with uninitialized project' do diff --git a/qa/qa/specs/features/api/1_manage/migration/gitlab_project_migration_common.rb b/qa/qa/specs/features/api/1_manage/migration/gitlab_project_migration_common.rb index 827ebc1f5e2..b7f0a10c525 100644 --- a/qa/qa/specs/features/api/1_manage/migration/gitlab_project_migration_common.rb +++ b/qa/qa/specs/features/api/1_manage/migration/gitlab_project_migration_common.rb @@ -1,7 +1,13 @@ # frozen_string_literal: true module QA - RSpec.shared_context 'with gitlab project migration' do + # Disable on staging until bulk_import_projects toggle is on by default + # Otherwise tests running in parallel can disable feature in the middle of other test + RSpec.shared_context 'with gitlab project migration', :requires_admin, except: { subdomain: :staging }, quarantine: { + only: { job: 'praefect' }, + type: :investigating, + issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/348999' + } do let(:source_project_with_readme) { false } let(:import_wait_duration) { { max_duration: 300, sleep_interval: 2 } } let(:admin_api_client) { Runtime::API::Client.as_admin } diff --git a/qa/qa/specs/features/api/1_manage/project_access_token_spec.rb b/qa/qa/specs/features/api/1_manage/project_access_token_spec.rb index 13a795ca976..6480b880400 100644 --- a/qa/qa/specs/features/api/1_manage/project_access_token_spec.rb +++ b/qa/qa/specs/features/api/1_manage/project_access_token_spec.rb @@ -78,11 +78,6 @@ module QA @different_project.remove_via_api! end end - - after(:all) do - @project_access_token.remove_via_api! - @project_access_token.project.remove_via_api! - end end end end diff --git a/qa/qa/specs/features/api/1_manage/user_access_termination_spec.rb b/qa/qa/specs/features/api/1_manage/user_access_termination_spec.rb index 6a31d173440..fe6c89f4ee4 100644 --- a/qa/qa/specs/features/api/1_manage/user_access_termination_spec.rb +++ b/qa/qa/specs/features/api/1_manage/user_access_termination_spec.rb @@ -31,44 +31,50 @@ module QA end it 'is not allowed to push code via the CLI', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347863' do - expect do - Resource::Repository::Push.fabricate! do |push| - push.repository_http_uri = @project.repository_http_location.uri - push.file_name = 'test.txt' - push.file_content = "# This is a test project named #{@project.name}" - push.commit_message = 'Add test.txt' - push.branch_name = "new_branch_#{SecureRandom.hex(8)}" - push.user = @user - end - end.to raise_error(QA::Support::Run::CommandError, /You are not allowed to push code to this project/) + QA::Support::Retrier.retry_on_exception(max_attempts: 5, sleep_interval: 2) do + expect do + Resource::Repository::Push.fabricate! do |push| + push.repository_http_uri = @project.repository_http_location.uri + push.file_name = 'test.txt' + push.file_content = "# This is a test project named #{@project.name}" + push.commit_message = 'Add test.txt' + push.branch_name = "new_branch_#{SecureRandom.hex(8)}" + push.user = @user + end + end.to raise_error(QA::Support::Run::CommandError, /You are not allowed to push code to this project/) + end end it 'is not allowed to create a file via the API', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347864' do - expect do - Resource::File.fabricate_via_api! do |file| - file.api_client = @user_api_client - file.project = @project - file.branch = "new_branch_#{SecureRandom.hex(8)}" - file.commit_message = 'Add new file' - file.name = 'test.txt' - file.content = "New file" - end - end.to raise_error(Resource::ApiFabricator::ResourceFabricationFailedError, /403 Forbidden/) + QA::Support::Retrier.retry_on_exception(max_attempts: 5, sleep_interval: 2) do + expect do + Resource::File.fabricate_via_api! do |file| + file.api_client = @user_api_client + file.project = @project + file.branch = "new_branch_#{SecureRandom.hex(8)}" + file.commit_message = 'Add new file' + file.name = 'test.txt' + file.content = "New file" + end + end.to raise_error(Resource::ApiFabricator::ResourceFabricationFailedError, /403 Forbidden/) + end end it 'is not allowed to commit via the API', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347865' do - expect do - Resource::Repository::Commit.fabricate_via_api! do |commit| - commit.api_client = @user_api_client - commit.project = @project - commit.branch = "new_branch_#{SecureRandom.hex(8)}" - commit.start_branch = @project.default_branch - commit.commit_message = 'Add new file' - commit.add_files([ - { file_path: 'test.txt', content: 'new file' } - ]) - end - end.to raise_error(Resource::ApiFabricator::ResourceFabricationFailedError, /403 Forbidden - You are not allowed to push into this branch/) + QA::Support::Retrier.retry_on_exception(max_attempts: 5, sleep_interval: 2) do + expect do + Resource::Repository::Commit.fabricate_via_api! do |commit| + commit.api_client = @user_api_client + commit.project = @project + commit.branch = "new_branch_#{SecureRandom.hex(8)}" + commit.start_branch = @project.default_branch + commit.commit_message = 'Add new file' + commit.add_files([ + { file_path: 'test.txt', content: 'new file' } + ]) + end + end.to raise_error(Resource::ApiFabricator::ResourceFabricationFailedError, /403 Forbidden - You are not allowed to push into this branch/) + end end end diff --git a/qa/qa/specs/features/api/3_create/gitaly/automatic_failover_and_recovery_spec.rb b/qa/qa/specs/features/api/3_create/gitaly/automatic_failover_and_recovery_spec.rb index 6a9be19efdd..55ae0d215cf 100644 --- a/qa/qa/specs/features/api/3_create/gitaly/automatic_failover_and_recovery_spec.rb +++ b/qa/qa/specs/features/api/3_create/gitaly/automatic_failover_and_recovery_spec.rb @@ -9,37 +9,30 @@ module QA project = nil let(:intial_commit_message) { 'Initial commit' } - let(:first_added_commit_message) { 'pushed to primary gitaly node' } - let(:second_added_commit_message) { 'commit to failover node' } + let(:first_added_commit_message) { 'first_added_commit_message to primary gitaly node' } + let(:second_added_commit_message) { 'second_added_commit_message to failover node' } before(:context) do - # Reset the cluster in case previous tests left it in a bad state praefect_manager.start_all_nodes project = Resource::Project.fabricate! do |project| project.name = "gitaly_cluster" project.initialize_with_readme = true end - end - - after do - praefect_manager.start_all_nodes + # We need to ensure that the the project is replicated to all nodes before proceeding with this test + praefect_manager.wait_for_replication(project.id) end it 'automatically fails over', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347830' do - # Create a new project with a commit and wait for it to replicate - - # make sure that our project is published to the 'primary' node + # stop other nodes, so we can control which node the commit is sent to praefect_manager.stop_secondary_node praefect_manager.stop_tertiary_node - praefect_manager.wait_for_secondary_node_health_check_failure - praefect_manager.wait_for_tertiary_node_health_check_failure Resource::Repository::ProjectPush.fabricate! do |push| push.project = project push.commit_message = first_added_commit_message push.new_branch = false - push.file_content = "This should exist on all nodes" + push.file_content = 'This file created on gitaly1 while gitaly2/gitaly3 not running' end praefect_manager.start_all_nodes @@ -56,7 +49,7 @@ module QA commit.add_files([ { file_path: "file-#{SecureRandom.hex(8)}", - content: 'This should exist on one node before reconciliation' + content: 'This is created on gitaly2/gitaly3 while gitaly1 is unavailable' } ]) end diff --git a/qa/qa/specs/features/api/3_create/gitaly/praefect_dataloss_spec.rb b/qa/qa/specs/features/api/3_create/gitaly/praefect_dataloss_spec.rb new file mode 100644 index 00000000000..6e2a34afb3e --- /dev/null +++ b/qa/qa/specs/features/api/3_create/gitaly/praefect_dataloss_spec.rb @@ -0,0 +1,57 @@ +# frozen_string_literal: true + +module QA + RSpec.describe 'Create' do + context 'Praefect dataloss commands', :orchestrated, :gitaly_cluster do + let(:praefect_manager) { Service::PraefectManager.new } + + let(:project) do + Resource::Project.fabricate! do |project| + project.name = 'gitaly_cluster-dataloss-project' + project.initialize_with_readme = true + end + end + + before do + praefect_manager.start_all_nodes + end + + it 'confirms that changes are synced across all storages', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/352691' do + expect { praefect_manager.praefect_dataloss_information(project.id) } + .to(eventually_include('All repositories are fully available on all assigned storages!') + .within(max_duration: 60)) + end + + it 'identifies how many changes are not in sync across storages', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/352692' do + # Ensure our test repository is replicated and in a consistent state prior to test + praefect_manager.wait_for_project_synced_across_all_storages(project.id) + + # testing for gitaly2 'out of sync' + praefect_manager.stop_secondary_node + + number_of_changes = 3 + 1.upto(number_of_changes) do |i| + Resource::Repository::Commit.fabricate_via_api! do |commit| + commit.project = project + commit.branch = "newbranch-#{SecureRandom.hex(8)}" + commit.start_branch = project.default_branch + commit.commit_message = 'Add new file' + commit.add_files([ + { file_path: "new_file-#{SecureRandom.hex(8)}.txt", content: 'new file' } + ]) + end + end + + # testing for gitaly3 'in sync' but marked unhealthy + praefect_manager.stop_tertiary_node + + project_data_loss = praefect_manager.praefect_dataloss_information(project.id) + aggregate_failures "validate dataloss identified" do + expect(project_data_loss).to include('gitaly1, assigned host') + expect(project_data_loss).to include("gitaly2 is behind by #{number_of_changes} changes or less, assigned host, unhealthy") + expect(project_data_loss).to include('gitaly3, assigned host, unhealthy') + end + end + end + end +end diff --git a/qa/qa/specs/features/api/3_create/gitaly/praefect_replication_queue_spec.rb b/qa/qa/specs/features/api/3_create/gitaly/praefect_replication_queue_spec.rb index e7e23124312..d066953d12e 100644 --- a/qa/qa/specs/features/api/3_create/gitaly/praefect_replication_queue_spec.rb +++ b/qa/qa/specs/features/api/3_create/gitaly/praefect_replication_queue_spec.rb @@ -4,7 +4,7 @@ require 'parallel' module QA RSpec.describe 'Create' do - context 'Gitaly Cluster replication queue', :orchestrated, :gitaly_cluster, :skip_live_env, quarantine: { issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/346453', type: :flaky } do + context 'Gitaly Cluster replication queue', :orchestrated, :gitaly_cluster, :skip_live_env do let(:praefect_manager) { Service::PraefectManager.new } let(:project) do Resource::Project.fabricate! do |project| @@ -15,12 +15,10 @@ module QA before do praefect_manager.start_all_nodes - praefect_manager.start_praefect end after do praefect_manager.start_all_nodes - praefect_manager.start_praefect praefect_manager.clear_replication_queue end diff --git a/qa/qa/specs/features/api/3_create/integrations/webhook_events_spec.rb b/qa/qa/specs/features/api/3_create/integrations/webhook_events_spec.rb new file mode 100644 index 00000000000..7a277d754c9 --- /dev/null +++ b/qa/qa/specs/features/api/3_create/integrations/webhook_events_spec.rb @@ -0,0 +1,129 @@ +# frozen_string_literal: true + +module QA + RSpec.describe 'Create' do + describe 'WebHooks integration', :requires_admin, :integrations, :orchestrated do + before(:context) do + toggle_local_requests(true) + end + + after(:context) do + Vendor::Smocker::SmockerApi.teardown! + end + + let(:session) { SecureRandom.hex(5) } + + it 'sends a push event', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/348945' do + setup_webhook(push: true) do |webhook, smocker| + Resource::Repository::ProjectPush.fabricate! do |project_push| + project_push.project = webhook.project + end + + wait_until do + !smocker.history(session).empty? + end + + events = smocker.history(session).map(&:as_hook_event) + aggregate_failures do + expect(events.size).to be(1), "Should have 1 event: \n#{events.map(&:raw).join("\n")}" + expect(events[0].project_name).to eql(webhook.project.name) + expect(events[0].push?).to be(true), "Not push event: \n#{events[0].raw}" + end + end + end + + it 'sends a merge request event', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/349720' do + setup_webhook(merge_requests: true) do |webhook, smocker| + Resource::MergeRequest.fabricate_via_api! do |merge_request| + merge_request.project = webhook.project + end + + wait_until do + !smocker.history(session).empty? + end + + events = smocker.history(session).map(&:as_hook_event) + aggregate_failures do + expect(events.size).to be(1), "Should have 1 event: \n#{events.map(&:raw).join("\n")}" + expect(events[0].project_name).to eql(webhook.project.name) + expect(events[0].mr?).to be(true), "Not MR event: \n#{events[0].raw}" + end + end + end + + it 'sends a wiki page event', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/349722' do + setup_webhook(wiki_page: true) do |webhook, smocker| + Resource::Wiki::ProjectPage.fabricate_via_api! do |page| + page.project = webhook.project + end + + wait_until do + !smocker.history(session).empty? + end + + events = smocker.history(session).map(&:as_hook_event) + aggregate_failures do + expect(events.size).to be(1), "Should have 1 event: \n#{events.map(&:raw).join("\n")}" + expect(events[0].project_name).to eql(webhook.project.name) + expect(events[0].wiki?).to be(true), "Not wiki event: \n#{events[0].raw}" + end + end + end + + it 'sends an issues and note event', 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/349723' do + setup_webhook(issues: true, note: true) do |webhook, smocker| + issue = Resource::Issue.fabricate_via_api! do |issue_init| + issue_init.project = webhook.project + end + + Resource::ProjectIssueNote.fabricate_via_api! do |note| + note.project = issue.project + note.issue = issue + end + + wait_until do + smocker.history(session).size > 1 + end + + events = smocker.history(session).map(&:as_hook_event) + aggregate_failures do + issue_event = events.find(&:issue?) + note_event = events.find(&:note?) + + expect(events.size).to be(2), "Should have 2 events: \n#{events.map(&:raw).join("\n")}" + expect(issue_event).not_to be(nil), "Not issue event: \n#{events[0].raw}" + expect(note_event).not_to be(nil), "Not note event: \n#{events[1].raw}" + end + end + end + + private + + def setup_webhook(**event_args) + Vendor::Smocker::SmockerApi.init(wait: 10) do |smocker| + smocker.register(session: session) + + webhook = Resource::ProjectWebHook.fabricate_via_api! do |hook| + hook.url = smocker.url + + event_args.each do |event, bool| + hook.send("#{event}_events=", bool) + end + end + + yield(webhook, smocker) + + smocker.reset + end + end + + def toggle_local_requests(on) + Runtime::ApplicationSettings.set_application_settings(allow_local_requests_from_web_hooks_and_services: on) + end + + def wait_until(timeout = 120, &block) + Support::Waiter.wait_until(max_duration: timeout, reload_page: false, raise_on_failure: false, &block) + end + end + end +end diff --git a/qa/qa/specs/features/api/3_create/merge_request/push_options_mwps_spec.rb b/qa/qa/specs/features/api/3_create/merge_request/push_options_mwps_spec.rb index 83dcb163d56..6eb3060fb59 100644 --- a/qa/qa/specs/features/api/3_create/merge_request/push_options_mwps_spec.rb +++ b/qa/qa/specs/features/api/3_create/merge_request/push_options_mwps_spec.rb @@ -68,9 +68,10 @@ module QA mr.iid = merge_request[:iid] end - expect(merge_request.state).to eq('opened') - expect(merge_request.merge_status).to eq('checking') - expect(merge_request.merge_when_pipeline_succeeds).to be true + aggregate_failures do + expect(merge_request.state).to eq('opened') + expect(merge_request.merge_when_pipeline_succeeds).to be true + end end it 'merges when pipeline succeeds', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347842' do diff --git a/qa/qa/specs/features/browser_ui/14_non_devops/service_ping_default_enabled_spec.rb b/qa/qa/specs/features/browser_ui/14_non_devops/service_ping_default_enabled_spec.rb index ecc59aa7cc8..bb4e0d71710 100644 --- a/qa/qa/specs/features/browser_ui/14_non_devops/service_ping_default_enabled_spec.rb +++ b/qa/qa/specs/features/browser_ui/14_non_devops/service_ping_default_enabled_spec.rb @@ -2,7 +2,7 @@ module QA RSpec.describe 'Service ping default enabled' do - context 'When using default enabled from gitlab.yml config', :requires_admin do + context 'When using default enabled from gitlab.yml config', :requires_admin, except: { job: 'review-qa-*' } do before do Flow::Login.sign_in_as_admin @@ -10,7 +10,7 @@ module QA Page::Admin::Menu.perform(&:go_to_metrics_and_profiling_settings) end - it 'has service ping toggle enabled' do + it 'has service ping toggle enabled', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/348335' do Page::Admin::Settings::MetricsAndProfiling.perform do |setting| setting.expand_usage_statistics do |page| expect(page).not_to have_disabled_usage_data_checkbox diff --git a/qa/qa/specs/features/browser_ui/14_non_devops/service_ping_disabled_spec.rb b/qa/qa/specs/features/browser_ui/14_non_devops/service_ping_disabled_spec.rb index 309369265c9..cab8bd367f5 100644 --- a/qa/qa/specs/features/browser_ui/14_non_devops/service_ping_disabled_spec.rb +++ b/qa/qa/specs/features/browser_ui/14_non_devops/service_ping_disabled_spec.rb @@ -10,7 +10,7 @@ module QA Page::Admin::Menu.perform(&:go_to_metrics_and_profiling_settings) end - it 'has service ping toggle is disabled' do + it 'has service ping toggle is disabled', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/348340' do Page::Admin::Settings::MetricsAndProfiling.perform do |settings| settings.expand_usage_statistics do |usage_statistics| expect(usage_statistics).to have_disabled_usage_data_checkbox diff --git a/qa/qa/specs/features/browser_ui/1_manage/group/gitlab_migration_group_spec.rb b/qa/qa/specs/features/browser_ui/1_manage/group/gitlab_migration_group_spec.rb index a18e22f52f1..a1b9e232e3d 100644 --- a/qa/qa/specs/features/browser_ui/1_manage/group/gitlab_migration_group_spec.rb +++ b/qa/qa/specs/features/browser_ui/1_manage/group/gitlab_migration_group_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true module QA - describe 'Manage', :requires_admin do + describe 'Manage', :requires_admin, :reliable do describe 'Gitlab migration' do let!(:admin_api_client) { Runtime::API::Client.as_admin } let!(:user) do diff --git a/qa/qa/specs/features/browser_ui/1_manage/group/transfer_group_spec.rb b/qa/qa/specs/features/browser_ui/1_manage/group/transfer_group_spec.rb index 881bc5bc7c3..2db93ac60ea 100644 --- a/qa/qa/specs/features/browser_ui/1_manage/group/transfer_group_spec.rb +++ b/qa/qa/specs/features/browser_ui/1_manage/group/transfer_group_spec.rb @@ -31,7 +31,7 @@ module QA testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347692' do Page::Group::Menu.perform(&:click_group_general_settings_item) Page::Group::Settings::General.perform do |general| - general.transfer_group(target_group.path) + general.transfer_group(target_group.path, sub_group_for_transfer.path) sub_group_for_transfer.sandbox = target_group sub_group_for_transfer.reload! diff --git a/qa/qa/specs/features/browser_ui/1_manage/login/register_spec.rb b/qa/qa/specs/features/browser_ui/1_manage/login/register_spec.rb index 098c0b3ba63..5487ecff028 100644 --- a/qa/qa/specs/features/browser_ui/1_manage/login/register_spec.rb +++ b/qa/qa/specs/features/browser_ui/1_manage/login/register_spec.rb @@ -64,7 +64,9 @@ module QA Page::Profile::Accounts::Show.perform do |show| show.delete_account(user.password) end - Support::Waiter.wait_until { !user.exists? } + + # TODO: Remove retry_on_exception once https://gitlab.com/gitlab-org/gitlab/-/issues/24294 is resolved + Support::Waiter.wait_until(retry_on_exception: true, sleep_interval: 3) { !user.exists? } end it 'allows recreating with same credentials', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347868' do diff --git a/qa/qa/specs/features/browser_ui/1_manage/project/add_project_member_spec.rb b/qa/qa/specs/features/browser_ui/1_manage/project/add_project_member_spec.rb index 895027a588d..bfb810b5c2b 100644 --- a/qa/qa/specs/features/browser_ui/1_manage/project/add_project_member_spec.rb +++ b/qa/qa/specs/features/browser_ui/1_manage/project/add_project_member_spec.rb @@ -1,11 +1,7 @@ # frozen_string_literal: true module QA - RSpec.describe 'Manage', :requires_admin, quarantine: { - issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/350598', - type: :needs_update, - only: { subdomain: :staging } - } do + RSpec.describe 'Manage', :requires_admin do describe 'Add project member' do before do Runtime::Feature.enable(:invite_members_group_modal) @@ -25,7 +21,7 @@ module QA Page::Project::Menu.perform(&:click_members) Page::Project::Members.perform do |members| members.add_member(user.username) - + members.search_member(user.username) expect(members).to have_content("@#{user.username}") end end diff --git a/qa/qa/specs/features/browser_ui/1_manage/project/create_project_badge_spec.rb b/qa/qa/specs/features/browser_ui/1_manage/project/create_project_badge_spec.rb new file mode 100644 index 00000000000..2933d580957 --- /dev/null +++ b/qa/qa/specs/features/browser_ui/1_manage/project/create_project_badge_spec.rb @@ -0,0 +1,51 @@ +# frozen_string_literal: true + +module QA + RSpec.describe 'Manage' do + describe 'Create project badge' do + let(:badge_name) { "project-badge-#{SecureRandom.hex(8)}" } + let(:expected_badge_link_url) { "#{Runtime::Scenario.gitlab_address}/#{project.path_with_namespace}" } + let(:expected_badge_image_url) { "#{Runtime::Scenario.gitlab_address}/#{project.path_with_namespace}/badges/main/pipeline.svg" } + let(:project) do + Resource::Project.fabricate_via_api! do |project| + project.name = 'badge-test-project' + project.initialize_with_readme = true + end + end + + before do + Flow::Login.sign_in + project.visit! + end + + it 'creates project badge successfully', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/350065' do + Resource::ProjectBadge.fabricate! do |badge| + badge.name = badge_name + end + + Page::Project::Settings::Main.perform do |project_settings| + expect(project_settings).to have_notice('New badge added.') + end + + Page::Component::Badges.perform do |badges| + aggregate_failures do + expect(badges).to have_badge(badge_name) + expect(badges).to have_visible_badge_image_link(expected_badge_link_url) + expect(badges.asset_exists?(expected_badge_image_url)).to be_truthy + end + end + + project.visit! + + Page::Project::Show.perform do |project| + expect(project).to have_visible_badge_image_link(expected_badge_link_url) + expect(project.asset_exists?(expected_badge_image_url)).to be_truthy + end + end + + after do + project&.remove_via_api! + end + end + end +end diff --git a/qa/qa/specs/features/browser_ui/1_manage/project/protected_tags_spec.rb b/qa/qa/specs/features/browser_ui/1_manage/project/protected_tags_spec.rb index 714c4a2da67..4f9ba579730 100644 --- a/qa/qa/specs/features/browser_ui/1_manage/project/protected_tags_spec.rb +++ b/qa/qa/specs/features/browser_ui/1_manage/project/protected_tags_spec.rb @@ -21,8 +21,8 @@ module QA let(:tag_message) { 'Version 0.0.1' } let(:tag_release_notes) { 'Release It!' } - shared_examples 'successful tag creation' do |user| - it "can be created by #{user}" do + shared_examples 'successful tag creation' do |user, testcase| + it "can be created by #{user}", testcase: testcase do Flow::Login.sign_in(as: send(user)) create_tag_for_project(project, tag_name, tag_message, tag_release_notes) @@ -36,8 +36,8 @@ module QA end end - shared_examples 'unsuccessful tag creation' do |user| - it "cannot be created by an unauthorized #{user}" do + shared_examples 'unsuccessful tag creation' do |user, testcase| + it "cannot be created by an unauthorized #{user}", testcase: testcase do Flow::Login.sign_in(as: send(user)) create_tag_for_project(project, tag_name, tag_message, tag_release_notes) @@ -54,8 +54,8 @@ module QA add_members_to_project(project) end - it_behaves_like 'successful tag creation', :developer_user - it_behaves_like 'successful tag creation', :maintainer_user + it_behaves_like 'successful tag creation', :developer_user, 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347930' + it_behaves_like 'successful tag creation', :maintainer_user, 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347929' end context 'when protected' do @@ -69,8 +69,8 @@ module QA Page::Main::Menu.perform(&:sign_out) end - it_behaves_like 'unsuccessful tag creation', :developer_user - it_behaves_like 'successful tag creation', :maintainer_user + it_behaves_like 'unsuccessful tag creation', :developer_user, 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347927' + it_behaves_like 'successful tag creation', :maintainer_user, 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347928' end def create_tag_for_project(project, name, message, release_notes) diff --git a/qa/qa/specs/features/browser_ui/1_manage/user/follow_user_activity_spec.rb b/qa/qa/specs/features/browser_ui/1_manage/user/follow_user_activity_spec.rb index 87b51edef08..11cf4f60a80 100644 --- a/qa/qa/specs/features/browser_ui/1_manage/user/follow_user_activity_spec.rb +++ b/qa/qa/specs/features/browser_ui/1_manage/user/follow_user_activity_spec.rb @@ -5,21 +5,27 @@ module QA describe 'User', :requires_admin do let(:admin_api_client) { Runtime::API::Client.as_admin } - let(:user) do + let(:followed_user_api_client) { Runtime::API::Client.new(:gitlab, user: followed_user) } + + let(:followed_user) do Resource::User.fabricate_via_api! do |user| + user.name = "followed_user_#{SecureRandom.hex(8)}" user.api_client = admin_api_client end end - let(:user_api_client) do - Runtime::API::Client.new(:gitlab, user: user) + let(:following_user) do + Resource::User.fabricate_via_api! do |user| + user.name = "following_user_#{SecureRandom.hex(8)}" + user.api_client = admin_api_client + end end let(:group) do group = QA::Resource::Group.fabricate_via_api! do |group| group.path = "group_for_follow_user_activity_#{SecureRandom.hex(8)}" end - group.add_member(user, Resource::Members::AccessLevel::MAINTAINER) + group.add_member(followed_user, Resource::Members::AccessLevel::MAINTAINER) group end @@ -27,7 +33,7 @@ module QA Resource::Project.fabricate_via_api! do |project| project.name = 'project-for-tags' project.initialize_with_readme = true - project.api_client = user_api_client + project.api_client = followed_user_api_client project.group = group end end @@ -35,14 +41,14 @@ module QA let(:merge_request) do Resource::MergeRequest.fabricate_via_api! do |mr| mr.project = project - mr.api_client = user_api_client + mr.api_client = followed_user_api_client end end let(:issue) do Resource::Issue.fabricate_via_api! do |issue| issue.project = project - issue.api_client = user_api_client + issue.api_client = followed_user_api_client end end @@ -51,19 +57,19 @@ module QA project_issue_note.project = project project_issue_note.issue = issue project_issue_note.body = 'This is a comment' - project_issue_note.api_client = user_api_client + project_issue_note.api_client = followed_user_api_client end end before do # Create both tokens before logging in the first time so that we don't need to log out in the middle of the test admin_api_client.personal_access_token - user_api_client.personal_access_token + followed_user_api_client.personal_access_token end it 'can be followed and their activity seen', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347678' do - Flow::Login.sign_in - page.visit Runtime::Scenario.gitlab_address + "/#{user.username}" + Flow::Login.sign_in(as: following_user) + page.visit Runtime::Scenario.gitlab_address + "/#{followed_user.username}" Page::User::Show.perform(&:click_follow_user_link) expect(page).to have_text("No activities found") @@ -76,7 +82,7 @@ module QA Page::Main::Menu.perform(&:click_user_profile_link) Page::User::Show.perform do |show| show.click_following_link - show.click_user_link(user.username) + show.click_user_link(followed_user.username) aggregate_failures do expect(show).to have_activity('created project') @@ -88,9 +94,10 @@ module QA end after do - project.api_client = admin_api_client - project.remove_via_api! - user.remove_via_api! + project&.api_client = admin_api_client + project&.remove_via_api! + followed_user&.remove_via_api! + following_user&.remove_via_api! end end end diff --git a/qa/qa/specs/features/browser_ui/2_plan/milestone/assign_milestone_spec.rb b/qa/qa/specs/features/browser_ui/2_plan/milestone/assign_milestone_spec.rb index c908b1c46a1..d3662884952 100644 --- a/qa/qa/specs/features/browser_ui/2_plan/milestone/assign_milestone_spec.rb +++ b/qa/qa/specs/features/browser_ui/2_plan/milestone/assign_milestone_spec.rb @@ -31,8 +31,8 @@ module QA Flow::Login.sign_in end - shared_examples 'milestone assigned to existing issue' do - it 'is assigned to an existing issue' do + shared_examples 'milestone assigned to existing issue' do |testcase| + it 'is assigned to an existing issue', testcase: testcase do issue.visit! Page::Project::Issue::Show.perform do |existing_issue| @@ -43,8 +43,8 @@ module QA end end - shared_examples 'milestone assigned to new issue' do - it 'is assigned to a new issue' do + shared_examples 'milestone assigned to new issue' do |testcase| + it 'is assigned to a new issue', testcase: testcase do Resource::Issue.fabricate_via_browser_ui! do |new_issue| new_issue.project = project new_issue.milestone = milestone @@ -65,8 +65,8 @@ module QA end end - it_behaves_like 'milestone assigned to existing issue' - it_behaves_like 'milestone assigned to new issue' + it_behaves_like 'milestone assigned to existing issue', 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347964' + it_behaves_like 'milestone assigned to new issue', 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347965' end context 'Project milestone' do @@ -78,8 +78,8 @@ module QA end end - it_behaves_like 'milestone assigned to existing issue' - it_behaves_like 'milestone assigned to new issue' + it_behaves_like 'milestone assigned to existing issue', 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347962' + it_behaves_like 'milestone assigned to new issue', 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347963' end end end diff --git a/qa/qa/specs/features/browser_ui/3_create/design_management/add_design_content_spec.rb b/qa/qa/specs/features/browser_ui/3_create/design_management/add_design_content_spec.rb index 5f896c7bf10..b7284f972ef 100644 --- a/qa/qa/specs/features/browser_ui/3_create/design_management/add_design_content_spec.rb +++ b/qa/qa/specs/features/browser_ui/3_create/design_management/add_design_content_spec.rb @@ -12,7 +12,7 @@ module QA Flow::Login.sign_in end - it 'user adds a design and annotates it', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347822' do + it 'user adds a design and annotates it', quarantine: { issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/352746', type: :investigating }, testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347822' do issue.visit! Page::Project::Issue::Show.perform do |issue| diff --git a/qa/qa/specs/features/browser_ui/3_create/merge_request/merge_when_pipeline_succeeds_spec.rb b/qa/qa/specs/features/browser_ui/3_create/merge_request/merge_when_pipeline_succeeds_spec.rb index 9a771919c11..85270791f0f 100644 --- a/qa/qa/specs/features/browser_ui/3_create/merge_request/merge_when_pipeline_succeeds_spec.rb +++ b/qa/qa/specs/features/browser_ui/3_create/merge_request/merge_when_pipeline_succeeds_spec.rb @@ -20,6 +20,18 @@ module QA end before do + Flow::Login.sign_in + end + + after do + runner&.remove_via_api! + project&.remove_via_api! + end + + it 'merges after pipeline succeeds' do + transient_test = repeat > 1 + + # Push a new pipeline config file Resource::Repository::Commit.fabricate_via_api! do |commit| commit.project = project commit.commit_message = 'Add .gitlab-ci.yml' @@ -30,7 +42,7 @@ module QA content: <<~EOF test: tags: ["runner-for-#{project.name}"] - script: sleep 20 + script: sleep 30 only: - merge_requests EOF @@ -39,17 +51,8 @@ module QA ) end - Flow::Login.sign_in - end - - after do - runner&.remove_via_api! - project&.remove_via_api! - end - - it 'merges after pipeline succeeds' do repeat.times do |i| - QA::Runtime::Logger.info("Transient bug test - Trial #{i}") if repeat > 1 + QA::Runtime::Logger.info("Transient bug test - Trial #{i}") if transient_test branch_name = "mr-test-#{SecureRandom.hex(6)}-#{i}" @@ -68,19 +71,54 @@ module QA merge_request.no_preparation = true end + # Load the page so that the browser is as prepared as possible to display the pipeline in progress when we + # start it. merge_request.visit! + # Push a new file to trigger a new pipeline + Resource::Repository::Commit.fabricate_via_api! do |commit| + commit.project = project + commit.commit_message = 'Add new file' + commit.branch = branch_name + commit.add_files( + [ + { + file_path: "#{branch_name}-file.md", + content: "file content" + } + ] + ) + end + Page::MergeRequest::Show.perform do |mr| - mr.merge_when_pipeline_succeeds! + mr.refresh + + # Part of the challenge with this test is that the MR widget has many components that could be displayed + # and many errors states that those components could encounter. Most of the time few of those + # possible components will be relevant, so it would be inefficient for this test to check for each of + # them. Instead, we fail on anything but the expected state. + # + # The following method allows us to handle and ignore states (as we find them) that users could safely ignore. + mr.wait_until_ready_to_merge(transient_test: transient_test) + + mr.retry_until(reload: true, message: 'Wait until ready to click MWPS') do + merge_request.reload! + + # Click the MWPS button if we can + break mr.merge_when_pipeline_succeeds! if mr.has_element?(:merge_button, text: 'Merge when pipeline succeeds') + + # But fail if the button is missing because the pipeline is complete + raise "The pipeline already finished before we could click MWPS" if mr.wait_until { project.pipelines.first }[:status] == 'success' - Support::Waiter.wait_until(sleep_interval: 5) do - merge_request = merge_request.reload! - merge_request.state == 'merged' + # Otherwise, if this is not a transient test reload the page and retry + next false unless transient_test end aggregate_failures do - expect(merge_request.merge_when_pipeline_succeeds).to be_truthy - expect(mr.merged?).to be_truthy, "Expected content 'The changes were merged' but it did not appear." + expect { mr.merged? }.to eventually_be_truthy.within(max_duration: 60), "Expected content 'The changes were merged' but it did not appear." + expect(merge_request.reload!.merge_when_pipeline_succeeds).to be_truthy + expect(merge_request.state).to eq('merged') + expect(project.pipelines.last[:status]).to eq('success') end end end diff --git a/qa/qa/specs/features/browser_ui/3_create/repository/add_file_template_spec.rb b/qa/qa/specs/features/browser_ui/3_create/repository/add_file_template_spec.rb index 3da73c8fa72..107d72a9724 100644 --- a/qa/qa/specs/features/browser_ui/3_create/repository/add_file_template_spec.rb +++ b/qa/qa/specs/features/browser_ui/3_create/repository/add_file_template_spec.rb @@ -18,30 +18,34 @@ module QA file_name: '.gitignore', name: 'Android', api_path: 'gitignores', - api_key: 'Android' + api_key: 'Android', + testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347659' }, { file_name: '.gitlab-ci.yml', name: 'Julia', api_path: 'gitlab_ci_ymls', - api_key: 'Julia' + api_key: 'Julia', + testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347658' }, { file_name: 'Dockerfile', name: 'Python', api_path: 'dockerfiles', - api_key: 'Python' + api_key: 'Python', + testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347660' }, { file_name: 'LICENSE', name: 'Mozilla Public License 2.0', api_path: 'licenses', - api_key: 'mpl-2.0' + api_key: 'mpl-2.0', + testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347657' } ] templates.each do |template| - it "user adds #{template[:file_name]} via file template #{template[:name]}" do + it "user adds #{template[:file_name]} via file template #{template[:name]}", testcase: template[:testcase] do content = fetch_template_from_api(template[:api_path], template[:api_key]) Flow::Login.sign_in diff --git a/qa/qa/specs/features/browser_ui/3_create/repository/push_to_canary_gitaly_spec.rb b/qa/qa/specs/features/browser_ui/3_create/repository/push_to_canary_gitaly_spec.rb new file mode 100644 index 00000000000..78abdb94dfe --- /dev/null +++ b/qa/qa/specs/features/browser_ui/3_create/repository/push_to_canary_gitaly_spec.rb @@ -0,0 +1,31 @@ +# frozen_string_literal: true + +module QA + RSpec.describe 'Create', only: { subdomain: %i[staging staging-canary] } do + describe 'Git push to canary Gitaly node over HTTP' do + it 'pushes to a project using a canary specific Gitaly repository storage', :smoke, :requires_admin, testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/351116' do + Flow::Login.sign_in_as_admin + + project = Resource::Project.fabricate_via_api! do |storage_project| + storage_project.name = 'canary-specific-repository-storage' + storage_project.repository_storage = 'nfs-file-cny01' # TODO: move to ENV var + end + + Resource::Repository::Push.fabricate! do |push| + push.repository_http_uri = project.repository_http_location.uri + push.file_name = 'README.md' + push.file_content = "# This is a test project named #{project.name}" + push.commit_message = 'Add README.md' + push.new_branch = true + end + + project.visit! + + Page::Project::Show.perform do |project_page| + expect(project_page).to have_file('README.md') + expect(project_page).to have_readme_content("This is a test project named #{project.name}") + end + end + end + end +end diff --git a/qa/qa/specs/features/browser_ui/3_create/snippet/add_comment_to_snippet_spec.rb b/qa/qa/specs/features/browser_ui/3_create/snippet/add_comment_to_snippet_spec.rb index 6ab50ba56f2..1a7c64a363f 100644 --- a/qa/qa/specs/features/browser_ui/3_create/snippet/add_comment_to_snippet_spec.rb +++ b/qa/qa/specs/features/browser_ui/3_create/snippet/add_comment_to_snippet_spec.rb @@ -28,8 +28,8 @@ module QA project_snippet&.remove_via_api! end - shared_examples 'comments on snippets' do |snippet_type| - it "adds, edits, and deletes a comment on a #{snippet_type}" do + shared_examples 'comments on snippets' do |snippet_type, testcase| + it "adds, edits, and deletes a comment on a #{snippet_type}", testcase: testcase do send(snippet_type) Page::Main::Menu.perform(&:sign_out) @@ -49,8 +49,8 @@ module QA end end - it_behaves_like 'comments on snippets', :personal_snippet - it_behaves_like 'comments on snippets', :project_snippet + it_behaves_like 'comments on snippets', :personal_snippet, 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347816' + it_behaves_like 'comments on snippets', :project_snippet, 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347817' def create_comment Page::Dashboard::Snippet::Show.perform do |snippet| diff --git a/qa/qa/specs/features/browser_ui/3_create/snippet/add_file_to_snippet_spec.rb b/qa/qa/specs/features/browser_ui/3_create/snippet/add_file_to_snippet_spec.rb index 72d83eadde9..8f05446ff70 100644 --- a/qa/qa/specs/features/browser_ui/3_create/snippet/add_file_to_snippet_spec.rb +++ b/qa/qa/specs/features/browser_ui/3_create/snippet/add_file_to_snippet_spec.rb @@ -28,8 +28,8 @@ module QA project_snippet&.remove_via_api! end - shared_examples 'adding file to snippet' do |snippet_type| - it "adds second file to an existing #{snippet_type} to make it multi-file" do + shared_examples 'adding file to snippet' do |snippet_type, testcase| + it "adds second file to an existing #{snippet_type} to make it multi-file", testcase: testcase do send(snippet_type).visit! Page::Dashboard::Snippet::Show.perform(&:click_edit_button) @@ -52,8 +52,8 @@ module QA end end - it_behaves_like 'adding file to snippet', :personal_snippet - it_behaves_like 'adding file to snippet', :project_snippet + it_behaves_like 'adding file to snippet', :personal_snippet, 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347845' + it_behaves_like 'adding file to snippet', :project_snippet, 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347846' end end end diff --git a/qa/qa/specs/features/browser_ui/3_create/snippet/copy_snippet_file_contents_spec.rb b/qa/qa/specs/features/browser_ui/3_create/snippet/copy_snippet_file_contents_spec.rb index 29ddbb22a01..0b63d9a1edb 100644 --- a/qa/qa/specs/features/browser_ui/3_create/snippet/copy_snippet_file_contents_spec.rb +++ b/qa/qa/specs/features/browser_ui/3_create/snippet/copy_snippet_file_contents_spec.rb @@ -59,8 +59,8 @@ module QA project_snippet&.remove_via_api! end - shared_examples 'copying snippet file contents' do |snippet_type| - it "copies file contents of a multi-file #{snippet_type} to a comment and verifies them" do + shared_examples 'copying snippet file contents' do |snippet_type, testcase| + it "copies file contents of a multi-file #{snippet_type} to a comment and verifies them", testcase: testcase do send(snippet_type).visit! files.each do |files| @@ -73,8 +73,8 @@ module QA end end - it_behaves_like 'copying snippet file contents', :personal_snippet - it_behaves_like 'copying snippet file contents', :project_snippet + it_behaves_like 'copying snippet file contents', :personal_snippet, 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347849' + it_behaves_like 'copying snippet file contents', :project_snippet, 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347848' end end end diff --git a/qa/qa/specs/features/browser_ui/3_create/snippet/create_personal_snippet_spec.rb b/qa/qa/specs/features/browser_ui/3_create/snippet/create_personal_snippet_spec.rb index dc66e0c5a9f..e04f580dc15 100644 --- a/qa/qa/specs/features/browser_ui/3_create/snippet/create_personal_snippet_spec.rb +++ b/qa/qa/specs/features/browser_ui/3_create/snippet/create_personal_snippet_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true module QA - RSpec.describe 'Create' do # convert back to a smoke test once proved to be stable + RSpec.describe 'Create', :smoke do describe 'Personal snippet creation' do let(:snippet) do Resource::Snippet.fabricate_via_browser_ui! do |snippet| diff --git a/qa/qa/specs/features/browser_ui/3_create/snippet/delete_file_from_snippet_spec.rb b/qa/qa/specs/features/browser_ui/3_create/snippet/delete_file_from_snippet_spec.rb index 014c0ca4d48..b6092ef0c4c 100644 --- a/qa/qa/specs/features/browser_ui/3_create/snippet/delete_file_from_snippet_spec.rb +++ b/qa/qa/specs/features/browser_ui/3_create/snippet/delete_file_from_snippet_spec.rb @@ -36,8 +36,8 @@ module QA project_snippet&.remove_via_api! end - shared_examples 'deleting file from snippet' do |snippet_type| - it "deletes second file from an existing #{snippet_type} to make it single-file" do + shared_examples 'deleting file from snippet' do |snippet_type, testcase| + it "deletes second file from an existing #{snippet_type} to make it single-file", testcase: testcase do send(snippet_type).visit! Page::Dashboard::Snippet::Show.perform(&:click_edit_button) @@ -58,8 +58,8 @@ module QA end end - it_behaves_like 'deleting file from snippet', :personal_snippet - it_behaves_like 'deleting file from snippet', :project_snippet + it_behaves_like 'deleting file from snippet', :personal_snippet, 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347728' + it_behaves_like 'deleting file from snippet', :project_snippet, 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347727' end end end diff --git a/qa/qa/specs/features/browser_ui/3_create/snippet/snippet_index_page_spec.rb b/qa/qa/specs/features/browser_ui/3_create/snippet/snippet_index_page_spec.rb index d922950335f..97e42edfd01 100644 --- a/qa/qa/specs/features/browser_ui/3_create/snippet/snippet_index_page_spec.rb +++ b/qa/qa/specs/features/browser_ui/3_create/snippet/snippet_index_page_spec.rb @@ -56,8 +56,8 @@ module QA project_snippet_with_multiple_files.remove_via_api! end - shared_examples 'displaying details on index page' do |snippet_type| - it "shows correct details of #{snippet_type} including file number" do + shared_examples 'displaying details on index page' do |snippet_type, testcase| + it "shows correct details of #{snippet_type} including file number", testcase: testcase do send(snippet_type) Page::Main::Menu.perform do |menu| menu.go_to_menu_dropdown_option(:snippets_link) @@ -73,10 +73,10 @@ module QA end end - it_behaves_like 'displaying details on index page', :personal_snippet_with_single_file - it_behaves_like 'displaying details on index page', :personal_snippet_with_multiple_files - it_behaves_like 'displaying details on index page', :project_snippet_with_single_file - it_behaves_like 'displaying details on index page', :project_snippet_with_multiple_files + it_behaves_like 'displaying details on index page', :personal_snippet_with_single_file, 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347717' + it_behaves_like 'displaying details on index page', :personal_snippet_with_multiple_files, 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347720' + it_behaves_like 'displaying details on index page', :project_snippet_with_single_file, 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347718' + it_behaves_like 'displaying details on index page', :project_snippet_with_multiple_files, 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347719' end end end diff --git a/qa/qa/specs/features/browser_ui/3_create/web_ide/add_file_template_spec.rb b/qa/qa/specs/features/browser_ui/3_create/web_ide/add_file_template_spec.rb index 70c9c9beeb8..19dd868744f 100644 --- a/qa/qa/specs/features/browser_ui/3_create/web_ide/add_file_template_spec.rb +++ b/qa/qa/specs/features/browser_ui/3_create/web_ide/add_file_template_spec.rb @@ -18,30 +18,34 @@ module QA file_name: '.gitignore', name: 'Android', api_path: 'gitignores', - api_key: 'Android' + api_key: 'Android', + testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347752' }, { file_name: '.gitlab-ci.yml', name: 'Julia', api_path: 'gitlab_ci_ymls', - api_key: 'Julia' + api_key: 'Julia', + testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347753' }, { file_name: 'Dockerfile', name: 'Python', api_path: 'dockerfiles', - api_key: 'Python' + api_key: 'Python', + testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347750' }, { file_name: 'LICENSE', name: 'Mozilla Public License 2.0', api_path: 'licenses', - api_key: 'mpl-2.0' + api_key: 'mpl-2.0', + testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347751' } ] templates.each do |template| - it "user adds #{template[:file_name]} via file template #{template[:name]}" do + it "user adds #{template[:file_name]} via file template #{template[:name]}", testcase: template[:testcase] do content = fetch_template_from_api(template[:api_path], template[:api_key]) Flow::Login.sign_in diff --git a/qa/qa/specs/features/browser_ui/3_create/web_ide/open_fork_in_web_ide_spec.rb b/qa/qa/specs/features/browser_ui/3_create/web_ide/open_fork_in_web_ide_spec.rb index 758aae9f729..96e85139e78 100644 --- a/qa/qa/specs/features/browser_ui/3_create/web_ide/open_fork_in_web_ide_spec.rb +++ b/qa/qa/specs/features/browser_ui/3_create/web_ide/open_fork_in_web_ide_spec.rb @@ -11,7 +11,7 @@ module QA end context 'when a user does not have permissions to commit to the project' do - let(:user) { Resource::User.fabricate_or_use(Runtime::Env.gitlab_qa_username_1, Runtime::Env.gitlab_qa_password_1) } + let(:user) { Resource::User.fabricate_or_use(Runtime::Env.gitlab_qa_username_2, Runtime::Env.gitlab_qa_password_2) } context 'when no fork is present' do it 'suggests to create a fork when a user clicks Web IDE in the main project', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347823' do @@ -45,6 +45,10 @@ module QA submit_merge_request_upstream end + + after do + fork_project.project.remove_via_api! + end end def submit_merge_request_upstream diff --git a/qa/qa/specs/features/browser_ui/3_create/wiki/content_editor_spec.rb b/qa/qa/specs/features/browser_ui/3_create/wiki/content_editor_spec.rb index 67eee66b3d6..b45624381c8 100644 --- a/qa/qa/specs/features/browser_ui/3_create/wiki/content_editor_spec.rb +++ b/qa/qa/specs/features/browser_ui/3_create/wiki/content_editor_spec.rb @@ -1,13 +1,12 @@ # frozen_string_literal: true module QA - RSpec.describe 'Create', :requires_admin, quarantine: { issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/350220', type: :investigating } do # remove :requires_admin once the ff is enabled by default in https://gitlab.com/gitlab-org/gitlab/-/issues/345398 + RSpec.describe 'Create' do context 'Content Editor' do let(:initial_wiki) { Resource::Wiki::ProjectPage.fabricate_via_api! } let(:page_title) { 'Content Editor Page' } let(:heading_text) { 'My New Heading' } let(:image_file_name) { 'testfile.png' } - let!(:toggle) { Runtime::Feature.enabled?(:wiki_switch_between_content_editor_raw_markdown) } before do Flow::Login.sign_in @@ -24,7 +23,7 @@ module QA Page::Project::Wiki::Edit.perform do |edit| edit.set_title(page_title) - edit.use_new_editor(toggle) + edit.use_new_editor edit.add_heading('Heading 1', heading_text) edit.upload_image(File.absolute_path(File.join('qa', 'fixtures', 'designs', image_file_name))) end diff --git a/qa/qa/specs/features/browser_ui/4_verify/pipeline/pass_dotenv_variables_to_downstream_via_bridge_spec.rb b/qa/qa/specs/features/browser_ui/4_verify/pipeline/pass_dotenv_variables_to_downstream_via_bridge_spec.rb index 22bb5fed84c..0bc3fb7b829 100644 --- a/qa/qa/specs/features/browser_ui/4_verify/pipeline/pass_dotenv_variables_to_downstream_via_bridge_spec.rb +++ b/qa/qa/specs/features/browser_ui/4_verify/pipeline/pass_dotenv_variables_to_downstream_via_bridge_spec.rb @@ -25,7 +25,7 @@ module QA Resource::Runner.fabricate! do |runner| runner.name = executor runner.tags = [executor] - runner.token = group.sandbox.runners_token + runner.token = group.reload!.runners_token end end diff --git a/qa/qa/specs/features/browser_ui/4_verify/pipeline/run_pipeline_with_manual_jobs_spec.rb b/qa/qa/specs/features/browser_ui/4_verify/pipeline/run_pipeline_with_manual_jobs_spec.rb new file mode 100644 index 00000000000..7a2c2b4ae90 --- /dev/null +++ b/qa/qa/specs/features/browser_ui/4_verify/pipeline/run_pipeline_with_manual_jobs_spec.rb @@ -0,0 +1,98 @@ +# frozen_string_literal: true + +module QA + RSpec.describe 'Verify', :runner, quarantine: { + type: :flaky, + issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/351994' + } do + describe 'Run pipeline with manual jobs' do + let(:project) do + Resource::Project.fabricate_via_api! do |project| + project.name = 'pipeline-with-manual-job' + project.description = 'Project for pipeline with manual job' + end + end + + let!(:runner) do + Resource::Runner.fabricate! do |runner| + runner.project = project + runner.name = "qa-runner-#{SecureRandom.hex(3)}" + end + end + + let!(:ci_file) do + Resource::Repository::Commit.fabricate_via_api! do |commit| + commit.project = project + commit.commit_message = 'Add .gitlab-ci.yml' + commit.add_files( + [ + { + file_path: '.gitlab-ci.yml', + content: <<~YAML + stages: + - Stage1 + - Stage2 + - Stage3 + + Prep: + stage: Stage1 + script: exit 0 + when: manual + + Build: + stage: Stage2 + needs: ['Prep'] + script: exit 0 + parallel: 6 + + Test: + stage: Stage3 + needs: ['Build'] + script: exit 0 + + Deploy: + stage: Stage3 + needs: ['Test'] + script: exit 0 + parallel: 6 + YAML + } + ] + ) + end + end + + before do + Flow::Login.sign_in + project.visit! + Flow::Pipeline.visit_latest_pipeline(pipeline_condition: 'skipped') + end + + after do + runner&.remove_via_api! + project&.remove_via_api! + end + + it 'does not leave any job in skipped state', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/349158' do + Page::Project::Pipeline::Show.perform do |show| + show.click_job_action('Prep') # Trigger pipeline manually + + show.wait_until(max_duration: 300, sleep_interval: 2, reload: false) do + project.pipelines.last[:status] == 'success' + end + + aggregate_failures do + expect(show).to have_build('Test', status: :success) + + show.click_job_dropdown('Build') + expect(show).not_to have_skipped_job_in_group + + show.click_job_dropdown('Build') # Close Build dropdown + show.click_job_dropdown('Deploy') + expect(show).not_to have_skipped_job_in_group + end + end + end + end + end +end diff --git a/qa/qa/specs/features/browser_ui/5_package/dependency_proxy/dependency_proxy_spec.rb b/qa/qa/specs/features/browser_ui/5_package/dependency_proxy/dependency_proxy_spec.rb index 5e0f1911811..9a5a5416d5c 100644 --- a/qa/qa/specs/features/browser_ui/5_package/dependency_proxy/dependency_proxy_spec.rb +++ b/qa/qa/specs/features/browser_ui/5_package/dependency_proxy/dependency_proxy_spec.rb @@ -3,6 +3,8 @@ module QA RSpec.describe 'Package', :orchestrated, :registry, only: { pipeline: :main } do describe 'Dependency Proxy' do + using RSpec::Parameterized::TableSyntax + let(:project) do Resource::Project.fabricate_via_api! do |project| project.name = 'dependency-proxy-project' @@ -40,12 +42,13 @@ module QA runner.remove_via_api! end - where(:docker_client_version) do - %w[docker:19.03.12 docker:20.10] + where(:case_name, :docker_client_version, :testcase) do + 'using docker:19.03.12' | 'docker:19.03.12' | 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347605' + 'using docker:20.10' | 'docker:20.10' | 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347604' end with_them do - it "pulls an image using the dependency proxy" do + it "pulls an image using the dependency proxy", testcase: params[:testcase] do Support::Retrier.retry_on_exception(max_attempts: 3, sleep_interval: 2) do Resource::Repository::Commit.fabricate_via_api! do |commit| commit.project = project @@ -58,7 +61,7 @@ module QA image: "#{docker_client_version}" services: - name: "#{docker_client_version}-dind" - command: ["--insecure-registry=gitlab.test:80"] + command: ["--insecure-registry=gitlab.test:80"] before_script: - apk add curl jq grep - echo $CI_DEPENDENCY_PROXY_SERVER diff --git a/qa/qa/specs/features/browser_ui/5_package/package_registry/composer_registry_spec.rb b/qa/qa/specs/features/browser_ui/5_package/package_registry/composer_registry_spec.rb index 92e4d64fee4..2da0f6a0cf8 100644 --- a/qa/qa/specs/features/browser_ui/5_package/package_registry/composer_registry_spec.rb +++ b/qa/qa/specs/features/browser_ui/5_package/package_registry/composer_registry_spec.rb @@ -32,55 +32,22 @@ module QA "#{uri.scheme}://#{uri.host}:#{uri.port}" end - let(:composer_json_file) do - <<~EOF - { - "name": "#{project.path_with_namespace}/#{package.name}", - "description": "Library XY", - "type": "library", - "license": "GPL-3.0-only", - "authors": [ - { - "name": "John Doe", - "email": "john@example.com" - } - ], - "require": {} - } - EOF - end - - let(:gitlab_ci_yaml) do - <<~YAML - publish: - image: curlimages/curl:latest - stage: build - variables: - URL: "$CI_SERVER_PROTOCOL://$CI_SERVER_HOST:$CI_SERVER_PORT/api/v4/projects/$CI_PROJECT_ID/packages/composer?job_token=$CI_JOB_TOKEN" - script: - - version=$([[ -z "$CI_COMMIT_TAG" ]] && echo "branch=$CI_COMMIT_REF_NAME" || echo "tag=$CI_COMMIT_TAG") - - insecure=$([ "$CI_SERVER_PROTOCOL" = "http" ] && echo "--insecure" || echo "") - - response=$(curl -s -w "%{http_code}" $insecure --data $version $URL) - - code=$(echo "$response" | tail -n 1) - - body=$(echo "$response" | head -n 1) - tags: - - "runner-for-#{project.name}" - YAML - end - before do Flow::Login.sign_in Support::Retrier.retry_on_exception(max_attempts: 3, sleep_interval: 2) do Resource::Repository::Commit.fabricate_via_api! do |commit| + composer_yaml = ERB.new(read_fixture('package_managers/composer', 'composer_upload_package.yaml.erb')).result(binding) + composer_json = ERB.new(read_fixture('package_managers/composer', 'composer.json.erb')).result(binding) + commit.project = project - commit.commit_message = 'Add .gitlab-ci.yml' + commit.commit_message = 'Add files' commit.add_files([{ file_path: '.gitlab-ci.yml', - content: gitlab_ci_yaml + content: composer_yaml }, { file_path: 'composer.json', - content: composer_json_file + content: composer_json }] ) end diff --git a/qa/qa/specs/features/browser_ui/5_package/package_registry/conan_repository_spec.rb b/qa/qa/specs/features/browser_ui/5_package/package_registry/conan_repository_spec.rb index 15578cd5e6b..22495796605 100644 --- a/qa/qa/specs/features/browser_ui/5_package/package_registry/conan_repository_spec.rb +++ b/qa/qa/specs/features/browser_ui/5_package/package_registry/conan_repository_spec.rb @@ -46,25 +46,13 @@ module QA Support::Retrier.retry_on_exception(max_attempts: 3, sleep_interval: 2) do Resource::Repository::Commit.fabricate_via_api! do |commit| + conan_yaml = ERB.new(read_fixture('package_managers/conan', 'conan_upload_install_package.yaml.erb')).result(binding) + commit.project = project commit.commit_message = 'Add .gitlab-ci.yml' commit.add_files([{ file_path: '.gitlab-ci.yml', - content: - <<~YAML - image: conanio/gcc7 - - test_package: - stage: deploy - script: - - "conan remote add gitlab #{gitlab_address_with_port}/api/v4/projects/#{project.id}/packages/conan" - - "conan new #{package.name}/0.1 -t" - - "conan create . mycompany/stable" - - "CONAN_LOGIN_USERNAME=ci_user CONAN_PASSWORD=${CI_JOB_TOKEN} conan upload #{package.name}/0.1@mycompany/stable --all --remote=gitlab" - - "conan install #{package.name}/0.1@mycompany/stable --remote=gitlab" - tags: - - "runner-for-#{project.name}" - YAML + content: conan_yaml }]) end end @@ -90,8 +78,10 @@ module QA Page::Project::Packages::Show.perform(&:click_delete) Page::Project::Packages::Index.perform do |index| - expect(index).to have_content("Package deleted successfully") - expect(index).not_to have_package(package.name) + aggregate_failures 'package deletion' do + expect(index).to have_content("Package deleted successfully") + expect(index).not_to have_package(package.name) + end end end end diff --git a/qa/qa/specs/features/browser_ui/5_package/package_registry/generic_repository_spec.rb b/qa/qa/specs/features/browser_ui/5_package/package_registry/generic_repository_spec.rb index ded90607d67..71acc3a8f92 100644 --- a/qa/qa/specs/features/browser_ui/5_package/package_registry/generic_repository_spec.rb +++ b/qa/qa/specs/features/browser_ui/5_package/package_registry/generic_repository_spec.rb @@ -3,6 +3,8 @@ module QA RSpec.describe 'Package', :orchestrated, :packages, :object_storage do describe 'Generic Repository' do + include Runtime::Fixtures + let(:project) do Resource::Project.fabricate_via_api! do |project| project.name = 'generic-package-project' @@ -25,29 +27,6 @@ module QA end end - let(:gitlab_ci_yaml) do - <<~YAML - image: curlimages/curl:latest - - stages: - - upload - - download - - upload: - stage: upload - script: - - 'curl --header "JOB-TOKEN: $CI_JOB_TOKEN" --upload-file file.txt ${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/#{package.name}/0.0.1/file.txt' - tags: - - "runner-for-#{project.name}" - download: - stage: download - script: - - 'wget --header="JOB-TOKEN: $CI_JOB_TOKEN" ${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/#{package.name}/0.0.1/file.txt -O file_downloaded.txt' - tags: - - "runner-for-#{project.name}" - YAML - end - let(:file_txt) do <<~EOF Hello, world! @@ -59,11 +38,13 @@ module QA Support::Retrier.retry_on_exception(max_attempts: 3, sleep_interval: 2) do Resource::Repository::Commit.fabricate_via_api! do |commit| + generic_packages_yaml = ERB.new(read_fixture('package_managers/generic', 'generic_upload_install_package.yaml.erb')).result(binding) + commit.project = project - commit.commit_message = 'Add .gitlab-ci.yml' + commit.commit_message = 'Add files' commit.add_files([{ file_path: '.gitlab-ci.yml', - content: gitlab_ci_yaml + content: generic_packages_yaml }, { file_path: 'file.txt', @@ -100,21 +81,11 @@ module QA package.remove_via_api! end - it 'uploads a generic package, downloads and deletes it', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/348017' do + it 'uploads a generic package and downloads it', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/348017' do Page::Project::Menu.perform(&:click_packages_link) Page::Project::Packages::Index.perform do |index| expect(index).to have_package(package.name) - index.click_package(package.name) - end - - Page::Project::Packages::Show.perform(&:click_delete) - - Page::Project::Packages::Index.perform do |index| - aggregate_failures 'package deletion' do - expect(index).to have_content("Package deleted successfully") - expect(index).to have_no_package(package.name) - end end end end diff --git a/qa/qa/specs/features/browser_ui/5_package/package_registry/helm_registry_spec.rb b/qa/qa/specs/features/browser_ui/5_package/package_registry/helm_registry_spec.rb index 92d0f547764..d2e816f9bf9 100644 --- a/qa/qa/specs/features/browser_ui/5_package/package_registry/helm_registry_spec.rb +++ b/qa/qa/specs/features/browser_ui/5_package/package_registry/helm_registry_spec.rb @@ -3,6 +3,7 @@ module QA RSpec.describe 'Package', :orchestrated, :packages, :object_storage do describe 'Helm Registry' do + using RSpec::Parameterized::TableSyntax include Runtime::Fixtures include_context 'packages registry qa scenario' @@ -10,140 +11,105 @@ module QA let(:package_version) { '1.3.7' } let(:package_type) { 'helm' } - let(:package_gitlab_ci_file) do - { - file_path: '.gitlab-ci.yml', - content: - <<~YAML - deploy: - image: alpine:3 - script: - - apk add helm --repository=http://dl-cdn.alpinelinux.org/alpine/edge/testing - - apk add curl - - helm create #{package_name} - - cp ./Chart.yaml #{package_name} - - helm package #{package_name} - - http_code=$(curl --write-out "%{http_code}" --request POST --form 'chart=@#{package_name}-#{package_version}.tgz' --user #{username}:#{access_token} ${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/helm/api/stable/charts --output /dev/null --silent) - - '[ $http_code = "201" ]' - only: - - "#{package_project.default_branch}" - tags: - - "runner-for-#{package_project.group.name}" - YAML - } + where(:case_name, :authentication_token_type, :testcase) do + 'using personal access token' | :personal_access_token | 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347586' + 'using ci job token' | :ci_job_token | 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347587' + 'using project deploy token' | :project_deploy_token | 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347588' end - let(:package_chart_yaml_file) do - { - file_path: "Chart.yaml", - content: - <<~EOF - apiVersion: v2 - name: #{package_name} - description: GitLab QA helm package - type: application - version: #{package_version} - appVersion: "1.16.0" - EOF - } - end - - let(:client_gitlab_ci_file) do - { - file_path: '.gitlab-ci.yml', - content: - <<~YAML - pull: - image: alpine:3 - script: - - apk add helm --repository=http://dl-cdn.alpinelinux.org/alpine/edge/testing - - helm repo add --username #{username} --password #{access_token} gitlab_qa ${CI_API_V4_URL}/projects/#{package_project.id}/packages/helm/stable - - helm repo update - - helm pull gitlab_qa/#{package_name} - only: - - "#{client_project.default_branch}" - tags: - - "runner-for-#{client_project.group.name}" - YAML - } - end - - %i[personal_access_token ci_job_token project_deploy_token].each do |authentication_token_type| - context "using a #{authentication_token_type}" do - let(:username) do - case authentication_token_type - when :personal_access_token - Runtime::User.username - when :ci_job_token - 'gitlab-ci-token' - when :project_deploy_token - project_deploy_token.username - end + with_them do + let(:username) do + case authentication_token_type + when :personal_access_token + Runtime::User.username + when :ci_job_token + 'gitlab-ci-token' + when :project_deploy_token + project_deploy_token.username end + end - let(:access_token) do - case authentication_token_type - when :personal_access_token - personal_access_token - when :ci_job_token - '${CI_JOB_TOKEN}' - when :project_deploy_token - project_deploy_token.token - end + let(:access_token) do + case authentication_token_type + when :personal_access_token + personal_access_token + when :ci_job_token + '${CI_JOB_TOKEN}' + when :project_deploy_token + project_deploy_token.token end + end - it "pushes and pulls a helm chart" do - Support::Retrier.retry_on_exception(max_attempts: 3, sleep_interval: 2) do - Resource::Repository::Commit.fabricate_via_api! do |commit| - commit.project = package_project - commit.commit_message = 'Add .gitlab-ci.yml' - commit.add_files([package_gitlab_ci_file, package_chart_yaml_file]) - end + it "pushes and pulls a helm chart", testcase: params[:testcase] do + Support::Retrier.retry_on_exception(max_attempts: 3, sleep_interval: 2) do + Resource::Repository::Commit.fabricate_via_api! do |commit| + helm_upload_yaml = ERB.new(read_fixture('package_managers/helm', 'helm_upload_package.yaml.erb')).result(binding) + helm_chart_yaml = ERB.new(read_fixture('package_managers/helm', 'Chart.yaml.erb')).result(binding) + + commit.project = package_project + commit.commit_message = 'Add .gitlab-ci.yml' + commit.add_files([ + { + file_path: '.gitlab-ci.yml', + content: helm_upload_yaml + }, + { + file_path: 'Chart.yaml', + content: helm_chart_yaml + } + ]) end + end - package_project.visit! + package_project.visit! - Flow::Pipeline.visit_latest_pipeline + Flow::Pipeline.visit_latest_pipeline - Page::Project::Pipeline::Show.perform do |pipeline| - pipeline.click_job('deploy') - end + Page::Project::Pipeline::Show.perform do |pipeline| + pipeline.click_job('deploy') + end - Page::Project::Job::Show.perform do |job| - expect(job).to be_successful(timeout: 800) - end + Page::Project::Job::Show.perform do |job| + expect(job).to be_successful(timeout: 800) + end - Page::Project::Menu.perform(&:click_packages_link) + Page::Project::Menu.perform(&:click_packages_link) - Page::Project::Packages::Index.perform do |index| - expect(index).to have_package(package_name) + Page::Project::Packages::Index.perform do |index| + expect(index).to have_package(package_name) - index.click_package(package_name) - end + index.click_package(package_name) + end - Page::Project::Packages::Show.perform do |show| - expect(show).to have_package_info(package_name, package_version) - end + Page::Project::Packages::Show.perform do |show| + expect(show).to have_package_info(package_name, package_version) + end - Support::Retrier.retry_on_exception(max_attempts: 3, sleep_interval: 2) do - Resource::Repository::Commit.fabricate_via_api! do |commit| - commit.project = client_project - commit.commit_message = 'Add .gitlab-ci.yml' - commit.add_files([client_gitlab_ci_file]) - end + Support::Retrier.retry_on_exception(max_attempts: 3, sleep_interval: 2) do + Resource::Repository::Commit.fabricate_via_api! do |commit| + helm_install_yaml = ERB.new(read_fixture('package_managers/helm', 'helm_install_package.yaml.erb')).result(binding) + + commit.project = client_project + commit.commit_message = 'Add .gitlab-ci.yml' + commit.add_files([ + { + file_path: '.gitlab-ci.yml', + content: helm_install_yaml + } + ]) end + end - client_project.visit! + client_project.visit! - Flow::Pipeline.visit_latest_pipeline + Flow::Pipeline.visit_latest_pipeline - Page::Project::Pipeline::Show.perform do |pipeline| - pipeline.click_job('pull') - end + Page::Project::Pipeline::Show.perform do |pipeline| + pipeline.click_job('pull') + end - Page::Project::Job::Show.perform do |job| - expect(job).to be_successful(timeout: 800) - end + Page::Project::Job::Show.perform do |job| + expect(job).to be_successful(timeout: 800) end end end diff --git a/qa/qa/specs/features/browser_ui/5_package/package_registry/maven_gradle_repository_spec.rb b/qa/qa/specs/features/browser_ui/5_package/package_registry/maven_gradle_repository_spec.rb index 57e1aa6a087..45693ecee41 100644 --- a/qa/qa/specs/features/browser_ui/5_package/package_registry/maven_gradle_repository_spec.rb +++ b/qa/qa/specs/features/browser_ui/5_package/package_registry/maven_gradle_repository_spec.rb @@ -13,80 +13,10 @@ module QA let(:package_version) { '1.3.7' } let(:package_type) { 'maven_gradle' } - let(:package_gitlab_ci_file) do - { - file_path: '.gitlab-ci.yml', - content: - <<~YAML - deploy: - image: gradle:6.5-jdk11 - script: - - 'gradle publish' - only: - - "#{package_project.default_branch}" - tags: - - "runner-for-#{package_project.group.name}" - YAML - } - end - - let(:package_build_gradle_file) do - { - file_path: 'build.gradle', - content: - <<~EOF - plugins { - id 'java' - id 'maven-publish' - } - - publishing { - publications { - library(MavenPublication) { - groupId '#{group_id}' - artifactId '#{artifact_id}' - version '#{package_version}' - from components.java - } - } - repositories { - maven { - url "#{gitlab_address_with_port}/api/v4/projects/#{package_project.id}/packages/maven" - credentials(HttpHeaderCredentials) { - name = "Private-Token" - value = "#{personal_access_token}" - } - authentication { - header(HttpHeaderAuthentication) - } - } - } - } - EOF - } - end - - let(:client_gitlab_ci_file) do - { - file_path: '.gitlab-ci.yml', - content: - <<~YAML - build: - image: gradle:6.5-jdk11 - script: - - 'gradle build' - only: - - "#{client_project.default_branch}" - tags: - - "runner-for-#{client_project.group.name}" - YAML - } - end - - where(:authentication_token_type, :maven_header_name) do - :personal_access_token | 'Private-Token' - :ci_job_token | 'Job-Token' - :project_deploy_token | 'Deploy-Token' + where(:case_name, :authentication_token_type, :maven_header_name, :testcase) do + 'using personal access token' | :personal_access_token | 'Private-Token' | 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347601' + 'using ci job token' | :ci_job_token | 'Job-Token' | 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347603' + 'using project deploy token' | :project_deploy_token | 'Deploy-Token' | 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347602' end with_them do @@ -101,49 +31,24 @@ module QA end end - let(:client_build_gradle_file) do - { - file_path: 'build.gradle', - content: - <<~EOF - plugins { - id 'java' - id 'application' - } - - repositories { - jcenter() - maven { - url "#{gitlab_address_with_port}/api/v4/projects/#{package_project.id}/packages/maven" - name "GitLab" - credentials(HttpHeaderCredentials) { - name = '#{maven_header_name}' - value = #{token} - } - authentication { - header(HttpHeaderAuthentication) - } - } - } - - dependencies { - implementation group: '#{group_id}', name: '#{artifact_id}', version: '#{package_version}' - testImplementation 'junit:junit:4.12' - } - - application { - mainClassName = 'gradle_maven_app.App' - } - EOF - } - end - - it "pushes and pulls a maven package via gradle using #{params[:authentication_token_type]}" do + it 'pushes and pulls a maven package via gradle', testcase: params[:testcase] do Support::Retrier.retry_on_exception(max_attempts: 3, sleep_interval: 2) do Resource::Repository::Commit.fabricate_via_api! do |commit| + gradle_upload_yaml = ERB.new(read_fixture('package_managers/maven', 'gradle_upload_package.yaml.erb')).result(binding) + build_upload_gradle = ERB.new(read_fixture('package_managers/maven', 'build_upload.gradle.erb')).result(binding) + commit.project = package_project commit.commit_message = 'Add .gitlab-ci.yml' - commit.add_files([package_gitlab_ci_file, package_build_gradle_file]) + commit.add_files([ + { + file_path: '.gitlab-ci.yml', + content: gradle_upload_yaml + }, + { + file_path: 'build.gradle', + content: build_upload_gradle + } + ]) end end @@ -173,9 +78,21 @@ module QA Support::Retrier.retry_on_exception(max_attempts: 3, sleep_interval: 2) do Resource::Repository::Commit.fabricate_via_api! do |commit| + gradle_install_yaml = ERB.new(read_fixture('package_managers/maven', 'gradle_install_package.yaml.erb')).result(binding) + build_install_gradle = ERB.new(read_fixture('package_managers/maven', 'build_install.gradle.erb')).result(binding) + commit.project = client_project - commit.commit_message = 'Add .gitlab-ci.yml' - commit.add_files([client_gitlab_ci_file, client_build_gradle_file]) + commit.commit_message = 'Add files' + commit.add_files([ + { + file_path: '.gitlab-ci.yml', + content: gradle_install_yaml + }, + { + file_path: 'build.gradle', + content: build_install_gradle + } + ]) end end diff --git a/qa/qa/specs/features/browser_ui/5_package/package_registry/maven_repository_spec.rb b/qa/qa/specs/features/browser_ui/5_package/package_registry/maven_repository_spec.rb index e6591b6adb9..b4ebb9dd475 100644 --- a/qa/qa/specs/features/browser_ui/5_package/package_registry/maven_repository_spec.rb +++ b/qa/qa/specs/features/browser_ui/5_package/package_registry/maven_repository_spec.rb @@ -13,121 +13,6 @@ module QA let(:package_version) { '1.3.7' } let(:package_type) { 'maven' } - let(:package_gitlab_ci_file) do - { - file_path: '.gitlab-ci.yml', - content: - <<~YAML - deploy: - image: maven:3.6-jdk-11 - script: - - 'mvn deploy -s settings.xml' - only: - - "#{package_project.default_branch}" - tags: - - "runner-for-#{package_project.group.name}" - YAML - } - end - - let(:package_pom_file) do - { - file_path: 'pom.xml', - content: <<~XML - <project> - <groupId>#{group_id}</groupId> - <artifactId>#{artifact_id}</artifactId> - <version>#{package_version}</version> - <modelVersion>4.0.0</modelVersion> - <repositories> - <repository> - <id>#{package_project.name}</id> - <url>#{gitlab_address_with_port}/api/v4/groups/#{package_project.group.id}/-/packages/maven</url> - </repository> - </repositories> - <distributionManagement> - <repository> - <id>#{package_project.name}</id> - <url>#{gitlab_address_with_port}/api/v4/projects/#{package_project.id}/packages/maven</url> - </repository> - <snapshotRepository> - <id>#{package_project.name}</id> - <url>#{gitlab_address_with_port}/api/v4/projects/#{package_project.id}/packages/maven</url> - </snapshotRepository> - </distributionManagement> - </project> - XML - } - end - - let(:client_gitlab_ci_file) do - { - file_path: '.gitlab-ci.yml', - content: - <<~YAML - install: - image: maven:3.6-jdk-11 - script: - - "mvn install -s settings.xml" - only: - - "#{client_project.default_branch}" - tags: - - "runner-for-#{client_project.group.name}" - YAML - } - end - - let(:client_pom_file) do - { - file_path: 'pom.xml', - content: <<~XML - <project> - <groupId>#{group_id}</groupId> - <artifactId>maven_client</artifactId> - <version>1.0</version> - <modelVersion>4.0.0</modelVersion> - <repositories> - <repository> - <id>#{package_project.name}</id> - <url>#{gitlab_address_with_port}/api/v4/groups/#{package_project.group.id}/-/packages/maven</url> - </repository> - </repositories> - <dependencies> - <dependency> - <groupId>#{group_id}</groupId> - <artifactId>#{artifact_id}</artifactId> - <version>#{package_version}</version> - </dependency> - </dependencies> - </project> - XML - } - end - - let(:settings_xml_with_pat) do - { - file_path: 'settings.xml', - content: <<~XML - <settings xmlns="http://maven.apache.org/SETTINGS/1.1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.1.0 http://maven.apache.org/xsd/settings-1.1.0.xsd"> - <servers> - <server> - <id>#{package_project.name}</id> - <configuration> - <httpHeaders> - <property> - <name>Private-Token</name> - <value>#{personal_access_token}</value> - </property> - </httpHeaders> - </configuration> - </server> - </servers> - </settings> - XML - } - end - where(:authentication_token_type, :maven_header_name) do :personal_access_token | 'Private-Token' :ci_job_token | 'Job-Token' @@ -146,39 +31,28 @@ module QA end end - let(:settings_xml) do - { - file_path: 'settings.xml', - content: <<~XML - <settings xmlns="http://maven.apache.org/SETTINGS/1.1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.1.0 http://maven.apache.org/xsd/settings-1.1.0.xsd"> - <servers> - <server> - <id>#{package_project.name}</id> - <configuration> - <httpHeaders> - <property> - <name>#{maven_header_name}</name> - <value>#{token}</value> - </property> - </httpHeaders> - </configuration> - </server> - </servers> - </settings> - XML - } - end - it "pushes and pulls a maven package via maven using #{params[:authentication_token_type]}" do Support::Retrier.retry_on_exception(max_attempts: 3, sleep_interval: 2) do Resource::Repository::Commit.fabricate_via_api! do |commit| + maven_upload_package_yaml = ERB.new(read_fixture('package_managers/maven', 'maven_upload_package.yaml.erb')).result(binding) + package_pom_xml = ERB.new(read_fixture('package_managers/maven', 'package_pom.xml.erb')).result(binding) + settings_xml = ERB.new(read_fixture('package_managers/maven', 'settings.xml.erb')).result(binding) + commit.project = package_project - commit.commit_message = 'Add .gitlab-ci.yml' + commit.commit_message = 'Add files' commit.add_files([ - package_gitlab_ci_file, - package_pom_file, - settings_xml + { + file_path: '.gitlab-ci.yml', + content: maven_upload_package_yaml + }, + { + file_path: 'pom.xml', + content: package_pom_xml + }, + { + file_path: 'settings.xml', + content: settings_xml + } ]) end end @@ -209,12 +83,25 @@ module QA Support::Retrier.retry_on_exception(max_attempts: 3, sleep_interval: 2) do Resource::Repository::Commit.fabricate_via_api! do |commit| + maven_install_package_yaml = ERB.new(read_fixture('package_managers/maven', 'maven_install_package.yaml.erb')).result(binding) + client_pom_xml = ERB.new(read_fixture('package_managers/maven', 'client_pom.xml.erb')).result(binding) + settings_xml = ERB.new(read_fixture('package_managers/maven', 'settings.xml.erb')).result(binding) + commit.project = client_project - commit.commit_message = 'Add .gitlab-ci.yml' + commit.commit_message = 'Add files' commit.add_files([ - client_gitlab_ci_file, - client_pom_file, - settings_xml + { + file_path: '.gitlab-ci.yml', + content: maven_install_package_yaml + }, + { + file_path: 'pom.xml', + content: client_pom_xml + }, + { + file_path: 'settings.xml', + content: settings_xml + } ]) end end @@ -278,7 +165,19 @@ module QA end def create_duplicated_package - with_fixtures([package_pom_file, settings_xml_with_pat]) do |dir| + settings_xml_with_pat = ERB.new(read_fixture('package_managers/maven', 'settings_with_pat.xml.erb')).result(binding) + package_pom_xml = ERB.new(read_fixture('package_managers/maven', 'package_pom.xml.erb')).result(binding) + + with_fixtures([ + { + file_path: 'pom.xml', + content: package_pom_xml + }, + { + file_path: 'settings.xml', + content: settings_xml_with_pat + } + ]) do |dir| Service::DockerRun::Maven.new(dir).publish! end @@ -294,12 +193,25 @@ module QA def push_duplicated_package Support::Retrier.retry_on_exception(max_attempts: 3, sleep_interval: 2) do Resource::Repository::Commit.fabricate_via_api! do |commit| + maven_upload_package_yaml = ERB.new(read_fixture('package_managers/maven', 'maven_upload_package.yaml.erb')).result(binding) + package_pom_xml = ERB.new(read_fixture('package_managers/maven', 'package_pom.xml.erb')).result(binding) + settings_xml = ERB.new(read_fixture('package_managers/maven', 'settings.xml.erb')).result(binding) + commit.project = client_project commit.commit_message = 'Add .gitlab-ci.yml' commit.add_files([ - package_gitlab_ci_file, - package_pom_file, - settings_xml + { + file_path: '.gitlab-ci.yml', + content: maven_upload_package_yaml + }, + { + file_path: 'pom.xml', + content: package_pom_xml + }, + { + file_path: 'settings.xml', + content: settings_xml + } ]) end end diff --git a/qa/qa/specs/features/browser_ui/5_package/package_registry/npm/npm_instance_level_spec.rb b/qa/qa/specs/features/browser_ui/5_package/package_registry/npm/npm_instance_level_spec.rb index 70b31c1beca..04aaefbaf5c 100644 --- a/qa/qa/specs/features/browser_ui/5_package/package_registry/npm/npm_instance_level_spec.rb +++ b/qa/qa/specs/features/browser_ui/5_package/package_registry/npm/npm_instance_level_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true module QA - RSpec.describe 'Package Registry', :orchestrated, :packages, :object_storage do + RSpec.describe 'Package Registry', :orchestrated, :reliable, :packages, :object_storage do describe 'npm instance level endpoint' do using RSpec::Parameterized::TableSyntax include Runtime::Fixtures @@ -50,79 +50,10 @@ module QA runner.name = "qa-runner-#{Time.now.to_i}" runner.tags = ["runner-for-#{project.group.name}"] runner.executor = :docker - runner.token = project.group.runners_token + runner.token = project.group.reload!.runners_token end end - let(:gitlab_ci_deploy_yaml) do - { - file_path: '.gitlab-ci.yml', - content: - <<~YAML - image: node:latest - - stages: - - deploy - - deploy: - stage: deploy - script: - - echo "//${CI_SERVER_HOST}/api/v4/projects/${CI_PROJECT_ID}/packages/npm/:_authToken=#{auth_token}">.npmrc - - npm publish - only: - - "#{project.default_branch}" - tags: - - "runner-for-#{project.group.name}" - YAML - } - end - - let(:gitlab_ci_install_yaml) do - { - file_path: '.gitlab-ci.yml', - content: - <<~YAML - image: node:latest - - stages: - - install - - install: - stage: install - script: - - "npm config set @#{registry_scope}:registry #{gitlab_address_with_port}/api/v4/packages/npm/" - - "npm install #{package.name}" - cache: - key: ${CI_BUILD_REF_NAME} - paths: - - node_modules/ - artifacts: - paths: - - node_modules/ - only: - - "#{another_project.default_branch}" - tags: - - "runner-for-#{another_project.group.name}" - YAML - } - end - - let(:package_json) do - { - file_path: 'package.json', - content: <<~JSON - { - "name": "#{package.name}", - "version": "1.0.0", - "description": "Example package for GitLab npm registry", - "publishConfig": { - "@#{registry_scope}:registry": "#{gitlab_address_with_port}/api/v4/projects/#{project.id}/packages/npm/" - } - } - JSON - } - end - let(:package) do Resource::Package.init do |package| package.name = "@#{registry_scope}/#{project.name}-#{SecureRandom.hex(8)}" @@ -137,10 +68,10 @@ module QA another_project.remove_via_api! end - where(:authentication_token_type, :token_name) do - :personal_access_token | 'Personal Access Token' - :ci_job_token | 'CI Job Token' - :project_deploy_token | 'Deploy Token' + where(:case_name, :authentication_token_type, :token_name, :testcase) do + 'using personal access token' | :personal_access_token | 'Personal Access Token' | 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347600' + 'using ci job token' | :ci_job_token | 'CI Job Token' | 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347599' + 'using project deploy token' | :project_deploy_token | 'Deploy Token' | 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347598' end with_them do @@ -155,14 +86,23 @@ module QA end end - it "push and pull a npm package via CI using a #{params[:token_name]}" do + it 'push and pull a npm package via CI', testcase: params[:testcase] do Support::Retrier.retry_on_exception(max_attempts: 3, sleep_interval: 2) do + npm_upload_yaml = ERB.new(read_fixture('package_managers/npm', 'npm_upload_package_instance.yaml.erb')).result(binding) + package_json = ERB.new(read_fixture('package_managers/npm', 'package_instance.json.erb')).result(binding) + Resource::Repository::Commit.fabricate_via_api! do |commit| commit.project = project - commit.commit_message = 'Add .gitlab-ci.yml' + commit.commit_message = 'Add files' commit.add_files([ - gitlab_ci_deploy_yaml, - package_json + { + file_path: '.gitlab-ci.yml', + content: npm_upload_yaml + }, + { + file_path: 'package.json', + content: package_json + } ]) end end @@ -180,10 +120,15 @@ module QA Support::Retrier.retry_on_exception(max_attempts: 3, sleep_interval: 2) do Resource::Repository::Commit.fabricate_via_api! do |commit| + npm_install_yaml = ERB.new(read_fixture('package_managers/npm', 'npm_install_package_instance.yaml.erb')).result(binding) + commit.project = another_project commit.commit_message = 'Add .gitlab-ci.yml' commit.add_files([ - gitlab_ci_install_yaml + { + file_path: '.gitlab-ci.yml', + content: npm_install_yaml + } ]) end end @@ -217,13 +162,6 @@ module QA Page::Project::Packages::Show.perform do |show| expect(show).to have_package_info(package.name, "1.0.0") - - show.click_delete - end - - Page::Project::Packages::Index.perform do |index| - expect(index).to have_content("Package deleted successfully") - expect(index).not_to have_package(package.name) end end end diff --git a/qa/qa/specs/features/browser_ui/5_package/package_registry/npm/npm_project_level_spec.rb b/qa/qa/specs/features/browser_ui/5_package/package_registry/npm/npm_project_level_spec.rb index e25a742493b..cad1802f3e9 100644 --- a/qa/qa/specs/features/browser_ui/5_package/package_registry/npm/npm_project_level_spec.rb +++ b/qa/qa/specs/features/browser_ui/5_package/package_registry/npm/npm_project_level_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true module QA - RSpec.describe 'Package Registry', :orchestrated, :packages, :object_storage do + RSpec.describe 'Package Registry', :orchestrated, :reliable, :packages, :object_storage do describe 'npm project level endpoint' do using RSpec::Parameterized::TableSyntax include Runtime::Fixtures @@ -46,62 +46,6 @@ module QA end end - let(:gitlab_ci_yaml) do - { - file_path: '.gitlab-ci.yml', - content: - <<~YAML - image: node:latest - - stages: - - deploy - - install - - deploy: - stage: deploy - script: - - echo "//${CI_SERVER_HOST}/api/v4/projects/${CI_PROJECT_ID}/packages/npm/:_authToken=#{auth_token}">.npmrc - - npm publish - only: - - "#{project.default_branch}" - tags: - - "runner-for-#{project.name}" - install: - stage: install - script: - - "npm config set @#{registry_scope}:registry #{gitlab_address_with_port}/api/v4/projects/${CI_PROJECT_ID}/packages/npm/" - - "npm install #{package.name}" - cache: - key: ${CI_BUILD_REF_NAME} - paths: - - node_modules/ - artifacts: - paths: - - node_modules/ - only: - - "#{project.default_branch}" - tags: - - "runner-for-#{project.name}" - YAML - } - end - - let(:package_json) do - { - file_path: 'package.json', - content: <<~JSON - { - "name": "#{package.name}", - "version": "1.0.0", - "description": "Example package for GitLab npm registry", - "publishConfig": { - "@#{registry_scope}:registry": "#{gitlab_address_with_port}/api/v4/projects/#{project.id}/packages/npm/" - } - } - JSON - } - end - let(:package) do Resource::Package.init do |package| package.name = "@#{registry_scope}/mypackage-#{SecureRandom.hex(8)}" @@ -115,10 +59,10 @@ module QA project.remove_via_api! end - where(:authentication_token_type, :token_name) do - :personal_access_token | 'Personal Access Token' - :ci_job_token | 'CI Job Token' - :project_deploy_token | 'Deploy Token' + where(:case_name, :authentication_token_type, :token_name, :testcase) do + 'using personal access token' | :personal_access_token | 'Personal Access Token' | 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347592' + 'using ci job token' | :ci_job_token | 'CI Job Token' | 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347594' + 'using project deploy token' | :project_deploy_token | 'Deploy Token' | 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347593' end with_them do @@ -133,13 +77,22 @@ module QA end end - it "push and pull a npm package via CI using a #{params[:token_name]}" do + it 'push and pull a npm package via CI', testcase: params[:testcase] do Resource::Repository::Commit.fabricate_via_api! do |commit| + npm_upload_install_yaml = ERB.new(read_fixture('package_managers/npm', 'npm_upload_install_package_project.yaml.erb')).result(binding) + package_json = ERB.new(read_fixture('package_managers/npm', 'package_project.json.erb')).result(binding) + commit.project = project commit.commit_message = 'Add .gitlab-ci.yml' commit.add_files([ - gitlab_ci_yaml, - package_json + { + file_path: '.gitlab-ci.yml', + content: npm_upload_install_yaml + }, + { + file_path: 'package.json', + content: package_json + } ]) end @@ -182,13 +135,6 @@ module QA Page::Project::Packages::Show.perform do |show| expect(show).to have_package_info(package.name, "1.0.0") - - show.click_delete - end - - Page::Project::Packages::Index.perform do |index| - expect(index).to have_content("Package deleted successfully") - expect(index).not_to have_package(package.name) end end end diff --git a/qa/qa/specs/features/browser_ui/5_package/package_registry/nuget_repository_spec.rb b/qa/qa/specs/features/browser_ui/5_package/package_registry/nuget_repository_spec.rb index d63bf486f11..24f83bc19fb 100644 --- a/qa/qa/specs/features/browser_ui/5_package/package_registry/nuget_repository_spec.rb +++ b/qa/qa/specs/features/browser_ui/5_package/package_registry/nuget_repository_spec.rb @@ -5,6 +5,7 @@ module QA describe 'NuGet Repository' do using RSpec::Parameterized::TableSyntax include Runtime::Fixtures + let(:project) do Resource::Project.fabricate_via_api! do |project| project.name = 'nuget-package-project' @@ -53,7 +54,7 @@ module QA runner.name = "qa-runner-#{Time.now.to_i}" runner.tags = ["runner-for-#{project.group.name}"] runner.executor = :docker - runner.token = project.group.runners_token + runner.token = project.group.reload!.runners_token end end @@ -62,10 +63,10 @@ module QA package.remove_via_api! end - where(:authentication_token_type, :token_name) do - :personal_access_token | 'Personal Access Token' - :ci_job_token | 'CI Job Token' - :group_deploy_token | 'Deploy Token' + where(:case_name, :authentication_token_type, :token_name, :testcase) do + 'using personal access token' | :personal_access_token | 'Personal Access Token' | 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347597' + 'using ci job token' | :ci_job_token | 'CI Job Token' | 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347595' + 'using group deploy token' | :group_deploy_token | 'Deploy Token' | 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347596' end with_them do @@ -91,36 +92,19 @@ module QA end end - it "publishes a nuget package at the project level, installs and deletes it at the group level using a #{params[:token_name]}" do + it 'publishes a nuget package at the project endpoint and installs it from the group endpoint', testcase: params[:testcase] do Flow::Login.sign_in Support::Retrier.retry_on_exception(max_attempts: 3, sleep_interval: 2) do Resource::Repository::Commit.fabricate_via_api! do |commit| + nuget_upload_yaml = ERB.new(read_fixture('package_managers/nuget', 'nuget_upload_package.yaml.erb')).result(binding) commit.project = project commit.commit_message = 'Add .gitlab-ci.yml' commit.update_files( [ { file_path: '.gitlab-ci.yml', - content: <<~YAML - image: mcr.microsoft.com/dotnet/sdk:5.0 - - stages: - - deploy - - deploy: - stage: deploy - script: - - dotnet restore -p:Configuration=Release - - dotnet build -c Release - - dotnet pack -c Release -p:PackageID=#{package.name} - - dotnet nuget add source "$CI_SERVER_URL/api/v4/projects/$CI_PROJECT_ID/packages/nuget/index.json" --name gitlab --username #{auth_token_username} --password #{auth_token_password} --store-password-in-clear-text - - dotnet nuget push "bin/Release/*.nupkg" --source gitlab - rules: - - if: '$CI_COMMIT_BRANCH == "#{project.default_branch}"' - tags: - - "runner-for-#{project.group.name}" - YAML + content: nuget_upload_yaml } ] ) @@ -142,6 +126,8 @@ module QA Support::Retrier.retry_on_exception(max_attempts: 3, sleep_interval: 2) do Resource::Repository::Commit.fabricate_via_api! do |commit| + nuget_install_yaml = ERB.new(read_fixture('package_managers/nuget', 'nuget_install_package.yaml.erb')).result(binding) + commit.project = another_project commit.commit_message = 'Add new csproj file' commit.add_files( @@ -165,23 +151,7 @@ module QA [ { file_path: '.gitlab-ci.yml', - content: <<~YAML - image: mcr.microsoft.com/dotnet/sdk:5.0 - - stages: - - install - - install: - stage: install - script: - - dotnet nuget locals all --clear - - dotnet nuget add source "$CI_SERVER_URL/api/v4/groups/#{another_project.group.id}/-/packages/nuget/index.json" --name gitlab --username #{auth_token_username} --password #{auth_token_password} --store-password-in-clear-text - - "dotnet add otherdotnet.csproj package #{package.name} --version 1.0.0" - only: - - "#{another_project.default_branch}" - tags: - - "runner-for-#{project.group.name}" - YAML + content: nuget_install_yaml } ] ) @@ -204,14 +174,6 @@ module QA Page::Project::Packages::Index.perform do |index| expect(index).to have_package(package.name) - index.click_package(package.name) - end - - Page::Project::Packages::Show.perform(&:click_delete) - - Page::Project::Packages::Index.perform do |index| - expect(index).to have_content('Package deleted successfully') - expect(index).not_to have_package(package.name) end end end diff --git a/qa/qa/specs/features/browser_ui/5_package/package_registry/pypi_repository_spec.rb b/qa/qa/specs/features/browser_ui/5_package/package_registry/pypi_repository_spec.rb index 2e7bd8fc5d7..a0c2eca5bd2 100644 --- a/qa/qa/specs/features/browser_ui/5_package/package_registry/pypi_repository_spec.rb +++ b/qa/qa/specs/features/browser_ui/5_package/package_registry/pypi_repository_spec.rb @@ -4,6 +4,7 @@ module QA RSpec.describe 'Package', :orchestrated, :packages, :object_storage do describe 'PyPI Repository' do include Runtime::Fixtures + let(:project) do Resource::Project.fabricate_via_api! do |project| project.name = 'pypi-package-project' @@ -36,56 +37,18 @@ module QA Support::Retrier.retry_on_exception(max_attempts: 3, sleep_interval: 2) do Resource::Repository::Commit.fabricate_via_api! do |commit| + pypi_yaml = ERB.new(read_fixture('package_managers/pypi', 'pypi_upload_install_package.yaml.erb')).result(binding) + pypi_setup_file = ERB.new(read_fixture('package_managers/pypi', 'setup.py.erb')).result(binding) + commit.project = project - commit.commit_message = 'Add .gitlab-ci.yml' + commit.commit_message = 'Add files' commit.add_files([{ file_path: '.gitlab-ci.yml', - content: - <<~YAML - image: python:latest - stages: - - run - - install - - run: - stage: run - script: - - pip install twine - - python setup.py sdist bdist_wheel - - "TWINE_PASSWORD=${CI_JOB_TOKEN} TWINE_USERNAME=gitlab-ci-token python -m twine upload --repository-url #{gitlab_address_with_port}/api/v4/projects/${CI_PROJECT_ID}/packages/pypi dist/*" - tags: - - "runner-for-#{project.name}" - install: - stage: install - script: - - "pip install #{package.name} --no-deps --index-url #{uri.scheme}://#{personal_access_token}:#{personal_access_token}@#{gitlab_host_with_port}/api/v4/projects/${CI_PROJECT_ID}/packages/pypi/simple --trusted-host #{gitlab_host_with_port}" - tags: - - "runner-for-#{project.name}" - - YAML + content: pypi_yaml }, { file_path: 'setup.py', - content: - <<~EOF - import setuptools - - setuptools.setup( - name="#{package.name}", - version="0.0.1", - author="Example Author", - author_email="author@example.com", - description="A small example package", - packages=setuptools.find_packages(), - classifiers=[ - "Programming Language :: Python :: 3", - "License :: OSI Approved :: MIT License", - "Operating System :: OS Independent", - ], - python_requires='>=3.6', - ) - EOF - + content: pypi_setup_file }]) end end @@ -119,21 +82,11 @@ module QA end context 'when at the project level' do - it 'publishes and installs a pypi package and deletes it', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/348015' do + it 'publishes and installs a pypi package', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/348015' do Page::Project::Menu.perform(&:click_packages_link) Page::Project::Packages::Index.perform do |index| expect(index).to have_package(package.name) - index.click_package(package.name) - end - - Page::Project::Packages::Show.perform(&:click_delete) - - Page::Project::Packages::Index.perform do |index| - aggregate_failures do - expect(index).to have_content("Package deleted successfully") - expect(index).not_to have_package(package.name) - end end end end diff --git a/qa/qa/specs/features/browser_ui/5_package/package_registry/rubygems_registry_spec.rb b/qa/qa/specs/features/browser_ui/5_package/package_registry/rubygems_registry_spec.rb index 062d2b49deb..b2208dc644c 100644 --- a/qa/qa/specs/features/browser_ui/5_package/package_registry/rubygems_registry_spec.rb +++ b/qa/qa/specs/features/browser_ui/5_package/package_registry/rubygems_registry_spec.rb @@ -43,35 +43,21 @@ module QA project.remove_via_api! end - it 'publishes and deletes a Ruby gem', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347649' do + it 'publishes a Ruby gem', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347649' do Flow::Login.sign_in Support::Retrier.retry_on_exception(max_attempts: 3, sleep_interval: 2) do Resource::Repository::Commit.fabricate_via_api! do |commit| + rubygem_upload_yaml = ERB.new(read_fixture('package_managers/rubygems', 'rubygems_upload_package.yaml.erb')).result(binding) + rubygem_package_gemspec = ERB.new(read_fixture('package_managers/rubygems', 'package.gemspec.erb')).result(binding) + commit.project = project commit.commit_message = 'Add package files' commit.add_files( [ { file_path: '.gitlab-ci.yml', - content: - <<~YAML - image: ruby - - test_package: - stage: deploy - before_script: - - mkdir ~/.gem - - echo "---" > ~/.gem/credentials - - | - echo "#{gitlab_address_with_port}/api/v4/projects/${CI_PROJECT_ID}/packages/rubygems: '${CI_JOB_TOKEN}'" >> ~/.gem/credentials - - chmod 0600 ~/.gem/credentials - script: - - gem build #{package.name} - - gem push #{package.name}-0.0.1.gem --host #{gitlab_address_with_port}/api/v4/projects/${CI_PROJECT_ID}/packages/rubygems - tags: - - "runner-for-#{project.name}" - YAML + content: rubygem_upload_yaml }, { file_path: 'lib/hello_gem.rb', @@ -86,49 +72,7 @@ module QA }, { file_path: "#{package.name}.gemspec", - content: - <<~RUBY - # frozen_string_literal: true - - Gem::Specification.new do |s| - s.name = '#{package.name}' - s.authors = ['Tanuki Steve', 'Hal 9000'] - s.author = 'Tanuki Steve' - s.version = '0.0.1' - s.date = '2011-09-29' - s.summary = 'this is a test package' - s.files = ['lib/hello_gem.rb'] - s.require_paths = ['lib'] - - s.description = 'A test package for GitLab.' - s.email = 'tanuki@not_real.com' - s.homepage = 'https://gitlab.com/ruby-co/my-package' - s.license = 'MIT' - - s.metadata = { - 'bug_tracker_uri' => 'https://gitlab.com/ruby-co/my-package/issues', - 'changelog_uri' => 'https://gitlab.com/ruby-co/my-package/CHANGELOG.md', - 'documentation_uri' => 'https://gitlab.com/ruby-co/my-package/docs', - 'mailing_list_uri' => 'https://gitlab.com/ruby-co/my-package/mailme', - 'source_code_uri' => 'https://gitlab.com/ruby-co/my-package' - } - - s.bindir = 'bin' - s.platform = Gem::Platform::RUBY - s.post_install_message = 'Installed, thank you!' - s.rdoc_options = ['--main'] - s.required_ruby_version = '>= 2.7.0' - s.required_rubygems_version = '>= 1.8.11' - s.requirements = 'A high powered server or calculator' - s.rubygems_version = '1.8.09' - - s.add_dependency 'dependency_1', '~> 1.2.3' - s.add_dependency 'dependency_2', '3.0.0' - s.add_dependency 'dependency_3', '>= 1.0.0' - s.add_dependency 'dependency_4' - end - - RUBY + content: rubygem_package_gemspec } ] ) @@ -150,14 +94,6 @@ module QA Page::Project::Packages::Index.perform do |index| expect(index).to have_package(package.name) - index.click_package(package.name) - end - - Page::Project::Packages::Show.perform(&:click_delete) - - Page::Project::Packages::Index.perform do |index| - expect(index).to have_content("Package deleted successfully") - expect(index).not_to have_package(package.name) end end end diff --git a/qa/qa/specs/features/browser_ui/6_release/deploy_key/clone_using_deploy_key_spec.rb b/qa/qa/specs/features/browser_ui/6_release/deploy_key/clone_using_deploy_key_spec.rb index f4a5c715684..c86f75e0b16 100644 --- a/qa/qa/specs/features/browser_ui/6_release/deploy_key/clone_using_deploy_key_spec.rb +++ b/qa/qa/specs/features/browser_ui/6_release/deploy_key/clone_using_deploy_key_spec.rb @@ -33,13 +33,13 @@ module QA end keys = [ - [Runtime::Key::RSA, 8192], - [Runtime::Key::ECDSA, 521], - [Runtime::Key::ED25519] + ['https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/348022', Runtime::Key::RSA, 8192], + ['https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/348021', Runtime::Key::ECDSA, 521], + ['https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/348020', Runtime::Key::ED25519] ] - keys.each do |(key_class, bits)| - it "user sets up a deploy key with #{key_class}(#{bits}) to clone code using pipelines" do + keys.each do |(testcase, key_class, bits)| + it "user sets up a deploy key with #{key_class}(#{bits}) to clone code using pipelines", testcase: testcase do key = key_class.new(*bits) Resource::DeployKey.fabricate_via_browser_ui! do |resource| diff --git a/qa/qa/specs/features/browser_ui/7_configure/auto_devops/auto_devops_templates_spec.rb b/qa/qa/specs/features/browser_ui/7_configure/auto_devops/auto_devops_templates_spec.rb index 2538f249010..718dc9860fb 100644 --- a/qa/qa/specs/features/browser_ui/7_configure/auto_devops/auto_devops_templates_spec.rb +++ b/qa/qa/specs/features/browser_ui/7_configure/auto_devops/auto_devops_templates_spec.rb @@ -3,6 +3,8 @@ module QA RSpec.describe 'Configure' do describe 'AutoDevOps Templates', only: { subdomain: :staging } do + using RSpec::Parameterized::TableSyntax + # specify jobs to be disabled in the pipeline. # CANARY_ENABLED will allow the pipeline to be # blocked by a manual job, rather than fail @@ -17,8 +19,8 @@ module QA ] end - where(:template) do - %w[express] + where(:case_name, :template, :testcase) do + 'using express template' | 'express' | 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/348075' end with_them do @@ -45,7 +47,7 @@ module QA Flow::Login.sign_in end - it 'works with Auto DevOps' do + it 'works with Auto DevOps', testcase: params[:testcase] do %w[build code_quality test].each do |job| pipeline.visit! |