From 41fe97390ceddf945f3d967b8fdb3de4c66b7dea Mon Sep 17 00:00:00 2001 From: GitLab Bot Date: Fri, 18 Mar 2022 20:02:30 +0000 Subject: Add latest changes from gitlab-org/gitlab@14-9-stable-ee --- .../api/1_manage/import_github_repo_spec.rb | 55 ++-- .../api/1_manage/import_large_github_repo_spec.rb | 243 ++++++++++------ .../migration/gitlab_migration_group_spec.rb | 41 +-- .../migration/gitlab_migration_members_spec.rb | 74 +++++ .../migration/gitlab_migration_pipeline_spec.rb | 59 ++++ .../migration/gitlab_project_migration_common.rb | 16 +- .../features/api/1_manage/rate_limits_spec.rb | 42 ++- qa/qa/specs/features/api/1_manage/users_spec.rb | 2 +- .../api/3_create/gitaly/praefect_dataloss_spec.rb | 47 +++ .../features/api/3_create/repository/files_spec.rb | 8 + .../features/api/4_verify/remove_runner_spec.rb | 36 +++ .../1_manage/group/transfer_group_spec.rb | 51 ---- .../1_manage/group/transfer_project_spec.rb | 2 +- .../browser_ui/1_manage/login/2fa_recovery_spec.rb | 1 - .../1_manage/login/log_in_with_2fa_spec.rb | 1 - .../1_manage/project/add_project_member_spec.rb | 6 +- .../1_manage/project/import_github_repo_spec.rb | 6 +- .../project/invite_group_to_project_spec.rb | 9 +- .../project/personal_project_permissions_spec.rb | 98 +++++++ .../1_manage/project/protected_tags_spec.rb | 13 +- .../1_manage/project/view_project_activity_spec.rb | 5 +- .../1_manage/user/user_access_termination_spec.rb | 2 +- .../email/trigger_email_notification_spec.rb | 3 +- .../2_plan/issue/check_mentions_for_xss_spec.rb | 4 +- .../browser_ui/2_plan/issue/mentions_spec.rb | 4 +- .../2_plan/issue/real_time_assignee_spec.rb | 12 +- .../2_plan/milestone/assign_milestone_spec.rb | 4 +- .../repository/move_project_create_fork_spec.rb | 1 - .../push_mirroring_lfs_over_http_spec.rb | 7 +- .../repository/push_mirroring_over_http_spec.rb | 5 +- .../3_create/repository/push_over_ssh_spec.rb | 2 +- .../3_create/repository/ssh_key_support_spec.rb | 2 +- .../clone_push_pull_personal_snippet_spec.rb | 2 +- .../clone_push_pull_project_snippet_spec.rb | 2 +- .../snippet/create_personal_snippet_spec.rb | 4 +- ...te_personal_snippet_with_multiple_files_spec.rb | 2 +- .../snippet/create_project_snippet_spec.rb | 2 +- ...ate_project_snippet_with_multiple_files_spec.rb | 2 +- .../3_create/web_ide/open_fork_in_web_ide_spec.rb | 5 +- .../3_create/web_ide/web_terminal_spec.rb | 2 + ...e_local_config_file_paths_with_wildcard_spec.rb | 2 +- ...ipeline_editor_can_create_merge_request_spec.rb | 53 ++++ .../4_verify/pipeline/pipeline_editor_lint_spec.rb | 2 +- .../pipeline/run_pipeline_via_web_only_spec.rb | 2 +- .../container_registry_omnibus_spec.rb | 149 ++++++---- .../maven/maven_group_level_spec.rb | 314 +++++++++++++++++++++ .../maven/maven_project_level_spec.rb | 219 ++++++++++++++ .../package_registry/maven_repository_spec.rb | 233 --------------- .../nuget/nuget_group_level_spec.rb | 182 ++++++++++++ .../nuget/nuget_project_level_spec.rb | 164 +++++++++++ .../package_registry/nuget_repository_spec.rb | 182 ------------ .../6_release/deploy_key/add_deploy_key_spec.rb | 4 +- .../deploy_key/clone_using_deploy_key_spec.rb | 2 +- .../auto_devops/auto_devops_templates_spec.rb | 2 +- .../create_project_with_auto_devops_spec.rb | 10 + 55 files changed, 1655 insertions(+), 747 deletions(-) create mode 100644 qa/qa/specs/features/api/1_manage/migration/gitlab_migration_members_spec.rb create mode 100644 qa/qa/specs/features/api/1_manage/migration/gitlab_migration_pipeline_spec.rb create mode 100644 qa/qa/specs/features/api/4_verify/remove_runner_spec.rb delete mode 100644 qa/qa/specs/features/browser_ui/1_manage/group/transfer_group_spec.rb create mode 100644 qa/qa/specs/features/browser_ui/1_manage/project/personal_project_permissions_spec.rb create mode 100644 qa/qa/specs/features/browser_ui/4_verify/pipeline/pipeline_editor_can_create_merge_request_spec.rb create mode 100644 qa/qa/specs/features/browser_ui/5_package/package_registry/maven/maven_group_level_spec.rb create mode 100644 qa/qa/specs/features/browser_ui/5_package/package_registry/maven/maven_project_level_spec.rb delete mode 100644 qa/qa/specs/features/browser_ui/5_package/package_registry/maven_repository_spec.rb create mode 100644 qa/qa/specs/features/browser_ui/5_package/package_registry/nuget/nuget_group_level_spec.rb create mode 100644 qa/qa/specs/features/browser_ui/5_package/package_registry/nuget/nuget_project_level_spec.rb delete mode 100644 qa/qa/specs/features/browser_ui/5_package/package_registry/nuget_repository_spec.rb (limited to 'qa/qa/specs/features') 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 a51d733d484..c39db63f64d 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 @@ -2,7 +2,7 @@ module QA RSpec.describe 'Manage', :github, :requires_admin, :reliable do - describe 'Project import' do + describe 'Project import', issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/353583' do let!(:api_client) { Runtime::API::Client.as_admin } let!(:group) { Resource::Group.fabricate_via_api! { |resource| resource.api_client = api_client } } let!(:user) do @@ -17,7 +17,7 @@ module QA project.name = 'imported-project' project.group = group project.github_personal_access_token = Runtime::Env.github_access_token - project.github_repository_path = 'gitlab-qa-github/test-project' + project.github_repository_path = 'gitlab-qa-github/import-test' project.api_client = api_client end end @@ -31,11 +31,13 @@ module QA end it 'imports Github repo via api', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347670' do - imported_project # import the project + imported_project.reload! # import the project - expect { imported_project.reload!.import_status }.to eventually_eq('finished').within(max_duration: 90) + expect { imported_project.project_import_status[:import_status] }.to eventually_eq('finished') + .within(max_duration: 90, sleep_interval: 1) aggregate_failures do + verify_status_data verify_repository_import verify_commits_import verify_labels_import @@ -46,15 +48,29 @@ module QA end end + def verify_status_data + stats = imported_project.project_import_status.dig(:stats, :imported) + expect(stats).to include( + # issue: 2, + label: 9, + milestone: 1, + note: 3, + pull_request: 1, + pull_request_review: 1, + diff_note: 1, + release: 1 + ) + end + def verify_repository_import expect(imported_project.api_response).to include( - description: 'A new repo for test', + description: 'Project for github import test', import_error: nil ) end def verify_commits_import - expect(imported_project.commits.length).to eq(20) + expect(imported_project.commits.length).to eq(2) end def verify_labels_import @@ -62,7 +78,6 @@ module QA expect(labels).to include( { name: 'bug', color: '#d73a4a' }, - { name: 'custom new label', color: '#fc8f91' }, { name: 'documentation', color: '#0075ca' }, { name: 'duplicate', color: '#cfd3d7' }, { name: 'enhancement', color: '#a2eeef' }, @@ -79,10 +94,10 @@ module QA expect(issues.length).to eq(1) expect(issues.first).to include( - title: 'This is a sample issue', - description: "*Created by: gitlab-qa-github*\n\nThis is a sample first comment", - labels: ['custom new label', 'good first issue', 'help wanted'], - user_notes_count: 1 + title: 'Test issue', + description: "*Created by: gitlab-qa-github*\n\nTest issue description", + labels: ['good first issue', 'help wanted', 'question'], + user_notes_count: 2 ) end @@ -90,7 +105,7 @@ module QA milestones = imported_project.milestones expect(milestones.length).to eq(1) - expect(milestones.first).to include(title: 'v1.0', description: nil, state: 'active') + expect(milestones.first).to include(title: '0.0.1', description: nil, state: 'active') end def verify_wikis_import @@ -111,20 +126,20 @@ module QA expect(merge_requests.length).to eq(1) expect(merge_request.api_resource).to include( - title: 'Improve readme', + title: 'Test pull request', state: 'opened', target_branch: 'main', - source_branch: 'improve-readme', - labels: %w[bug documentation], + source_branch: 'gitlab-qa-github-patch-1', + labels: %w[documentation], description: <<~DSC.strip - *Created by: gitlab-qa-github*\n\nThis improves the README file a bit.\r\n\r\nTODO:\r\n\r\n \r\n\r\n- [ ] Do foo\r\n- [ ] Make bar\r\n - [ ] Think about baz + *Created by: gitlab-qa-github*\n\nTest pull request body DSC ) - expect(mr_comments).to eq( + expect(mr_comments).to match_array( [ - "*Created by: gitlab-qa-github*\n\n[PR comment by @sliaquat] Nice work! ", - "*Created by: gitlab-qa-github*\n\n[Single diff comment] Nice addition", - "*Created by: gitlab-qa-github*\n\n[Single diff comment] Good riddance" + "*Created by: gitlab-qa-github*\n\n**Review:** Commented\n\nGood but needs some improvement", + "*Created by: gitlab-qa-github*\n\n```suggestion:-0+0\nProject for GitHub import test to GitLab\r\n```", + "*Created by: gitlab-qa-github*\n\nSome test PR comment" ] ) end diff --git a/qa/qa/specs/features/api/1_manage/import_large_github_repo_spec.rb b/qa/qa/specs/features/api/1_manage/import_large_github_repo_spec.rb index c46de0ac514..84eda023576 100644 --- a/qa/qa/specs/features/api/1_manage/import_large_github_repo_spec.rb +++ b/qa/qa/specs/features/api/1_manage/import_large_github_repo_spec.rb @@ -3,11 +3,16 @@ # rubocop:disable Rails/Pluck module QA # Only executes in custom job/pipeline + # https://gitlab.com/gitlab-org/manage/import/import-github-performance + # RSpec.describe 'Manage', :github, :requires_admin, only: { job: 'large-github-import' } do describe 'Project import' do let(:logger) { Runtime::Logger.logger } let(:differ) { RSpec::Support::Differ.new(color: true) } + let(:created_by_pattern) { /\*Created by: \S+\*\n\n/ } + let(:suggestion_pattern) { /suggestion:-\d+\+\d+/ } + let(:api_client) { Runtime::API::Client.as_admin } let(:user) do @@ -19,46 +24,57 @@ module QA let(:github_repo) { ENV['QA_LARGE_GH_IMPORT_REPO'] || 'rspec/rspec-core' } let(:import_max_duration) { ENV['QA_LARGE_GH_IMPORT_DURATION'] ? ENV['QA_LARGE_GH_IMPORT_DURATION'].to_i : 7200 } let(:github_client) do - Octokit.middleware = Faraday::RackBuilder.new do |builder| - builder.response(:logger, logger, headers: false, bodies: false) - end - Octokit::Client.new( access_token: ENV['QA_LARGE_GH_IMPORT_GH_TOKEN'] || Runtime::Env.github_access_token, auto_paginate: true ) end - let(:gh_branches) { github_client.branches(github_repo).map(&:name) } - let(:gh_commits) { github_client.commits(github_repo).map(&:sha) } let(:gh_repo) { github_client.repository(github_repo) } + let(:gh_branches) do + logger.debug("= Fetching branches =") + github_client.branches(github_repo).map(&:name) + end + + let(:gh_commits) do + logger.debug("= Fetching commits =") + github_client.commits(github_repo).map(&:sha) + end + let(:gh_labels) do + logger.debug("= Fetching labels =") github_client.labels(github_repo).map { |label| { name: label.name, color: "##{label.color}" } } end let(:gh_milestones) do + logger.debug("= Fetching milestones =") github_client .list_milestones(github_repo, state: 'all') .map { |ms| { title: ms.title, description: ms.description } } end let(:gh_all_issues) do + logger.debug("= Fetching issues and prs =") github_client.list_issues(github_repo, state: 'all') end let(:gh_prs) do gh_all_issues.select(&:pull_request).each_with_object({}) do |pr, hash| - hash[pr.title] = { + hash[pr.number] = { + url: pr.html_url, + title: pr.title, body: pr.body || '', - comments: [*gh_pr_comments[pr.html_url], *gh_issue_comments[pr.html_url]].compact.sort + comments: [*gh_pr_comments[pr.html_url], *gh_issue_comments[pr.html_url]].compact } end end let(:gh_issues) do gh_all_issues.reject(&:pull_request).each_with_object({}) do |issue, hash| - hash[issue.title] = { + hash[issue.number] = { + url: issue.html_url, + title: issue.title, body: issue.body || '', comments: gh_issue_comments[issue.html_url] } @@ -66,12 +82,14 @@ module QA end let(:gh_issue_comments) do + logger.debug("= Fetching issue comments =") github_client.issues_comments(github_repo).each_with_object(Hash.new { |h, k| h[k] = [] }) do |c, hash| hash[c.html_url.gsub(/\#\S+/, "")] << c.body # use base html url as key end end let(:gh_pr_comments) do + logger.debug("= Fetching pr comments =") github_client.pull_requests_comments(github_repo).each_with_object(Hash.new { |h, k| h[k] = [] }) do |c, hash| hash[c.html_url.gsub(/\#\S+/, "")] << c.body # use base html url as key end @@ -97,25 +115,34 @@ module QA "data", { import_time: @import_time, + reported_stats: @stats, github: { project_name: github_repo, - branches: gh_branches, - commits: gh_commits, - labels: gh_labels, - milestones: gh_milestones, - prs: gh_prs, - issues: gh_issues + branches: gh_branches.length, + commits: gh_commits.length, + labels: gh_labels.length, + milestones: gh_milestones.length, + prs: gh_prs.length, + pr_comments: gh_prs.sum { |_k, v| v[:comments].length }, + issues: gh_issues.length, + issue_comments: gh_issues.sum { |_k, v| v[:comments].length } }, gitlab: { project_name: imported_project.path_with_namespace, - branches: gl_branches, - commits: gl_commits, - labels: gl_labels, - milestones: gl_milestones, - mrs: mrs, - issues: gl_issues + branches: gl_branches.length, + commits: gl_commits.length, + labels: gl_labels.length, + milestones: gl_milestones.length, + mrs: mrs.length, + mr_comments: mrs.sum { |_k, v| v[:comments].length }, + issues: gl_issues.length, + issue_comments: gl_issues.sum { |_k, v| v[:comments].length } + }, + not_imported: { + mrs: @mr_diff, + issues: @issue_diff } - }.to_json + } ) end @@ -125,15 +152,25 @@ module QA ) do start = Time.now - Runtime::Logger.info("Importing project '#{imported_project.full_path}'") # import the project and log path - fetch_github_objects # fetch all objects right after import has started + # import the project and log gitlab path + Runtime::Logger.info("== Importing project '#{github_repo}' in to '#{imported_project.reload!.full_path}' ==") + # fetch all objects right after import has started + fetch_github_objects import_status = lambda do - imported_project.reload!.import_status.tap do |status| - raise "Import of '#{imported_project.name}' failed!" if status == 'failed' + imported_project.project_import_status.yield_self do |status| + @stats = status.dig(:stats, :imported) + + # fail fast if import explicitly failed + raise "Import of '#{imported_project.name}' failed!" if status[:import_status] == 'failed' + + status[:import_status] end end + + logger.info("== Waiting for import to be finished ==") expect(import_status).to eventually_eq('finished').within(max_duration: import_max_duration, sleep_interval: 30) + @import_time = Time.now - start aggregate_failures do @@ -149,22 +186,22 @@ module QA # # @return [void] def fetch_github_objects - logger.debug("== Fetching objects for github repo: '#{github_repo}' ==") + logger.info("== Fetching github repo objects ==") gh_repo gh_branches gh_commits - gh_prs - gh_issues gh_labels gh_milestones + gh_prs + gh_issues end # Verify repository imported correctly # # @return [void] def verify_repository_import - logger.debug("== Verifying repository import ==") + logger.info("== Verifying repository import ==") expect(imported_project.description).to eq(gh_repo.description) # check via include, importer creates more branches # https://gitlab.com/gitlab-org/gitlab/-/issues/332711 @@ -172,82 +209,109 @@ module QA expect(gl_commits).to match_array(gh_commits) end - # Verify imported merge requests and mr issues + # Verify imported labels # # @return [void] - def verify_merge_requests_import - logger.debug("== Verifying merge request import ==") - verify_mrs_or_issues('mr') + def verify_labels_import + logger.info("== Verifying label import ==") + # check via include, additional labels can be inherited from parent group + expect(gl_labels).to include(*gh_labels) end - # Verify imported issues and issue comments + # Verify milestones import # # @return [void] - def verify_issues_import - logger.debug("== Verifying issue import ==") - verify_mrs_or_issues('issue') + def verify_milestones_import + logger.info("== Verifying milestones import ==") + expect(gl_milestones).to match_array(gh_milestones) end - # Verify imported labels + # Verify imported merge requests and mr issues # # @return [void] - def verify_labels_import - logger.debug("== Verifying label import ==") - # check via include, additional labels can be inherited from parent group - expect(gl_labels).to include(*gh_labels) + def verify_merge_requests_import + logger.info("== Verifying merge request import ==") + @mr_diff = verify_mrs_or_issues('mr') end - # Verify milestones import + # Verify imported issues and issue comments # # @return [void] - def verify_milestones_import - logger.debug("== Verifying milestones import ==") - expect(gl_milestones).to match_array(gh_milestones) + def verify_issues_import + logger.info("== Verifying issue import ==") + @issue_diff = verify_mrs_or_issues('issue') end private - # Verify imported mrs or issues + # Verify imported mrs or issues and return missing items # # @param [String] type verification object, 'mrs' or 'issues' - # @return [void] + # @return [Hash] def verify_mrs_or_issues(type) - msg = ->(title) { "expected #{type} with title '#{title}' to have" } - # Compare length to have easy to read overview how many objects are missing + # expected = type == 'mr' ? mrs : gl_issues actual = type == 'mr' ? gh_prs : gh_issues count_msg = "Expected to contain same amount of #{type}s. Gitlab: #{expected.length}, Github: #{actual.length}" expect(expected.length).to eq(actual.length), count_msg - logger.debug("= Comparing #{type}s =") - actual.each do |title, actual_item| - print "." # indicate that it is still going but don't spam the output with newlines + missing_comments = verify_comments(type, actual, expected) - expected_item = expected[title] + { + "#{type}s": (actual.keys - expected.keys).map { |it| actual[it].slice(:title, :url) }, + "#{type}_comments": missing_comments + } + end + + # Verify imported comments + # + # @param [String] type verification object, 'mrs' or 'issues' + # @param [Hash] actual + # @param [Hash] expected + # @return [Hash] + def verify_comments(type, actual, expected) + actual.each_with_object([]) do |(key, actual_item), missing_comments| + expected_item = expected[key] + title = actual_item[:title] + msg = "expected #{type} with title '#{title}' to have" # Print title in the error message to see which object is missing - expect(expected_item).to be_truthy, "#{msg.call(title)} been imported" + # + expect(expected_item).to be_truthy, "#{msg} been imported" next unless expected_item # Print difference in the description + # expected_body = expected_item[:body] actual_body = actual_item[:body] body_msg = <<~MSG - #{msg.call(title)} same description. diff:\n#{differ.diff(expected_item[:body], actual_item[:body])} + #{msg} same description. diff:\n#{differ.diff(expected_body, actual_body)} MSG - expect(expected_body).to include(actual_body), body_msg + expect(expected_body).to eq(actual_body), body_msg # Print amount difference first + # expected_comments = expected_item[:comments] actual_comments = actual_item[:comments] comment_count_msg = <<~MSG - #{msg.call(title)} same amount of comments. Gitlab: #{expected_comments.length}, Github: #{actual_comments.length} + #{msg} same amount of comments. Gitlab: #{expected_comments.length}, Github: #{actual_comments.length} MSG expect(expected_comments.length).to eq(actual_comments.length), comment_count_msg expect(expected_comments).to match_array(actual_comments) + + # Save missing comments + # + comment_diff = actual_comments - expected_comments + next if comment_diff.empty? + + missing_comments << { + title: title, + github_url: actual_item[:url], + gitlab_url: expected_item[:url], + missing_comments: comment_diff + } end - puts # print newline after last print to make output pretty end # Imported project branches @@ -297,22 +361,27 @@ module QA @mrs ||= begin logger.debug("= Fetching merge requests =") imported_mrs = imported_project.merge_requests(auto_paginate: true, attempts: 2) - logger.debug("= Transforming merge request objects for comparison =") - imported_mrs.each_with_object({}) do |mr, hash| + + logger.debug("= Fetching merge request comments =") + Parallel.map(imported_mrs, in_threads: 4) do |mr| resource = Resource::MergeRequest.init do |resource| resource.project = imported_project resource.iid = mr[:iid] resource.api_client = api_client end - hash[mr[:title]] = { - body: mr[:description], - comments: resource.comments(auto_paginate: true, attempts: 2) + logger.debug("Fetching comments for mr '#{mr[:title]}'") + [mr[:iid], { + url: mr[:web_url], + title: mr[:title], + body: sanitize_description(mr[:description]) || '', + comments: resource + .comments(auto_paginate: true, attempts: 2) # remove system notes .reject { |c| c[:system] || c[:body].match?(/^(\*\*Review:\*\*)|(\*Merged by:).*/) } - .map { |c| sanitize(c[:body]) } - } - end + .map { |c| sanitize_comment(c[:body]) } + }] + end.to_h end end @@ -323,37 +392,51 @@ module QA @gl_issues ||= begin logger.debug("= Fetching issues =") imported_issues = imported_project.issues(auto_paginate: true, attempts: 2) - logger.debug("= Transforming issue objects for comparison =") - imported_issues.each_with_object({}) do |issue, hash| + + logger.debug("= Fetching issue comments =") + Parallel.map(imported_issues, in_threads: 4) do |issue| resource = Resource::Issue.init do |issue_resource| issue_resource.project = imported_project issue_resource.iid = issue[:iid] issue_resource.api_client = api_client end - hash[issue[:title]] = { - body: issue[:description], - comments: resource.comments(auto_paginate: true, attempts: 2).map { |c| sanitize(c[:body]) } - } - end + logger.debug("Fetching comments for issue '#{issue[:title]}'") + [issue[:iid], { + url: issue[:web_url], + title: issue[:title], + body: sanitize_description(issue[:description]) || '', + comments: resource + .comments(auto_paginate: true, attempts: 2) + .map { |c| sanitize_comment(c[:body]) } + }] + end.to_h end end - # Remove added prefixes by importer + # Remove added prefixes and legacy diff format from comments + # + # @param [String] body + # @return [String] + def sanitize_comment(body) + body.gsub(created_by_pattern, "").gsub(suggestion_pattern, "suggestion\r") + end + + # Remove created by prefix from descripion # # @param [String] body # @return [String] - def sanitize(body) - body.gsub(/\*Created by: \S+\*\n\n/, "") + def sanitize_description(body) + body&.gsub(created_by_pattern, "") end # Save json as file # # @param [String] name - # @param [String] json + # @param [Hash] json # @return [void] def save_json(name, json) - File.open("tmp/#{name}.json", "w") { |file| file.write(json) } + File.open("tmp/#{name}.json", "w") { |file| file.write(JSON.pretty_generate(json)) } end end end diff --git a/qa/qa/specs/features/api/1_manage/migration/gitlab_migration_group_spec.rb b/qa/qa/specs/features/api/1_manage/migration/gitlab_migration_group_spec.rb index a6655471591..f721b3326a0 100644 --- a/qa/qa/specs/features/api/1_manage/migration/gitlab_migration_group_spec.rb +++ b/qa/qa/specs/features/api/1_manage/migration/gitlab_migration_group_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true module QA - RSpec.describe 'Manage', :requires_admin do + RSpec.describe 'Manage', :reliable, :requires_admin do describe 'Gitlab migration' do let(:import_wait_duration) { { max_duration: 300, sleep_interval: 2 } } let(:admin_api_client) { Runtime::API::Client.as_admin } @@ -55,9 +55,9 @@ module QA after do |example| # Checking for failures in the test currently makes test very flaky due to catching unrelated failures - # Just log in case of failure until cause of network errors is found - # See: https://gitlab.com/gitlab-org/gitlab/-/issues/346500 - Runtime::Logger.warn(import_failures) if example.exception && !import_failures.empty? + # Log failures for easier debugging + Runtime::Logger.warn("Import failures: #{import_failures}") if example.exception && !import_failures.empty? + ensure user.remove_via_api! end @@ -147,39 +147,6 @@ module QA end end end - - context 'with group members' do - let(:member) do - Resource::User.fabricate_via_api! do |usr| - usr.api_client = admin_api_client - usr.hard_delete_on_api_removal = true - end - end - - before do - member.set_public_email - source_group.add_member(member, Resource::Members::AccessLevel::DEVELOPER) - - imported_group # trigger import - end - - after do - member.remove_via_api! - end - - it( - 'adds members for imported group', - testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347609' - ) do - expect { imported_group.import_status }.to eventually_eq('finished').within(import_wait_duration) - - imported_member = imported_group.reload!.members.find { |usr| usr.username == member.username } - aggregate_failures do - expect(imported_member).not_to be_nil - expect(imported_member.access_level).to eq(Resource::Members::AccessLevel::DEVELOPER) - end - end - end end end end diff --git a/qa/qa/specs/features/api/1_manage/migration/gitlab_migration_members_spec.rb b/qa/qa/specs/features/api/1_manage/migration/gitlab_migration_members_spec.rb new file mode 100644 index 00000000000..704325d9235 --- /dev/null +++ b/qa/qa/specs/features/api/1_manage/migration/gitlab_migration_members_spec.rb @@ -0,0 +1,74 @@ +# frozen_string_literal: true + +require_relative 'gitlab_project_migration_common' + +module QA + RSpec.describe 'Manage' do + describe 'Gitlab migration' do + include_context 'with gitlab project migration' + + let(:member) do + Resource::User.fabricate_via_api! do |usr| + usr.api_client = admin_api_client + usr.hard_delete_on_api_removal = true + end + end + + let(:imported_group_member) do + imported_group.reload!.list_members.find { |usr| usr['username'] == member.username } + end + + let(:imported_project_member) do + imported_project.reload!.list_members.find { |usr| usr['username'] == member.username } + end + + before do + member.set_public_email + end + + after do + member.remove_via_api! + end + + context 'with group member' do + before do + source_group.add_member(member, Resource::Members::AccessLevel::DEVELOPER) + end + + it( + 'member retains indirect membership in imported project', + testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/354416' + ) do + expect_import_finished + + aggregate_failures do + expect(imported_project_member).to be_nil + expect(imported_group_member&.fetch('access_level')).to eq( + Resource::Members::AccessLevel::DEVELOPER + ) + end + end + end + + context 'with project member' do + before do + source_project.add_member(member, Resource::Members::AccessLevel::DEVELOPER) + end + + it( + 'member retains direct membership in imported project', + testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/354417' + ) do + expect_import_finished + + aggregate_failures do + expect(imported_group_member).to be_nil + expect(imported_project_member&.fetch('access_level')).to eq( + Resource::Members::AccessLevel::DEVELOPER + ) + end + end + end + end + end +end diff --git a/qa/qa/specs/features/api/1_manage/migration/gitlab_migration_pipeline_spec.rb b/qa/qa/specs/features/api/1_manage/migration/gitlab_migration_pipeline_spec.rb new file mode 100644 index 00000000000..484c32956e3 --- /dev/null +++ b/qa/qa/specs/features/api/1_manage/migration/gitlab_migration_pipeline_spec.rb @@ -0,0 +1,59 @@ +# frozen_string_literal: true + +require_relative 'gitlab_project_migration_common' + +module QA + RSpec.describe 'Manage' do + describe 'Gitlab migration' do + include_context 'with gitlab project migration' + + context 'with ci pipeline' do + let!(:source_project_with_readme) { true } + + let(:source_pipelines) do + source_project.pipelines.map do |pipeline| + pipeline.except(:id, :web_url, :project_id) + end + end + + let(:imported_pipelines) do + imported_project.pipelines.map do |pipeline| + pipeline.except(:id, :web_url, :project_id) + end + end + + before do + Resource::Repository::Commit.fabricate_via_api! do |commit| + commit.api_client = api_client + commit.project = source_project + commit.commit_message = 'Add .gitlab-ci.yml' + commit.add_files( + [ + { + file_path: '.gitlab-ci.yml', + content: <<~YML + test-success: + script: echo 'OK' + YML + } + ] + ) + end + + Support::Waiter.wait_until(max_duration: 10, sleep_interval: 1) do + !source_project.pipelines.empty? + end + end + + it( + 'successfully imports ci pipeline', + testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/354650' + ) do + expect_import_finished + + expect(imported_pipelines).to eq(source_pipelines) + end + end + end + end +end 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 b7f0a10c525..70f19e9f3d7 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,13 +1,9 @@ # frozen_string_literal: true module QA - # Disable on staging until bulk_import_projects toggle is on by default + # Disable on live envs 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 + RSpec.shared_context 'with gitlab project migration', :requires_admin, :skip_live_env 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 } @@ -79,13 +75,11 @@ module QA end after do |example| - # Checking for failures in the test currently makes test very flaky - # Just log in case of failure until cause of network errors is found + # Checking for failures in the test currently makes test very flaky due to catching unrelated failures + # Log failures for easier debugging Runtime::Logger.warn("Import failures: #{import_failures}") if example.exception && !import_failures.empty? - - user.remove_via_api! ensure - Runtime::Feature.disable(:bulk_import_projects) + user.remove_via_api! end end end diff --git a/qa/qa/specs/features/api/1_manage/rate_limits_spec.rb b/qa/qa/specs/features/api/1_manage/rate_limits_spec.rb index 17ffb901e5a..fc221c963b1 100644 --- a/qa/qa/specs/features/api/1_manage/rate_limits_spec.rb +++ b/qa/qa/specs/features/api/1_manage/rate_limits_spec.rb @@ -1,19 +1,41 @@ # frozen_string_literal: true -require 'airborne' - module QA - RSpec.describe 'Manage with IP rate limits', :requires_admin, :skip_live_env do - describe 'Users API' do - let(:api_client) { Runtime::API::Client.new(:gitlab, ip_limits: true) } - let(:request) { Runtime::API::Request.new(api_client, '/users') } + RSpec.describe 'Manage', :requires_admin, :skip_live_env, except: { job: 'review-qa-*' } do + describe 'rate limits' do + let(:rate_limited_user) { Resource::User.fabricate_via_api! } + let(:api_client) { Runtime::API::Client.new(:gitlab, user: rate_limited_user) } + let!(:request) { Runtime::API::Request.new(api_client, '/users') } + + after do + rate_limited_user.remove_via_api! + end + + it 'throttles authenticated api requests by user', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347881' do + with_application_settings( + throttle_authenticated_api_requests_per_period: 5, + throttle_authenticated_api_period_in_seconds: 60, + throttle_authenticated_api_enabled: true + ) do + 5.times do + res = RestClient.get request.url + expect(res.code).to be(200) + end - it 'GET /users', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347881' do - 5.times do - get request.url - expect_status(200) + expect { RestClient.get request.url }.to raise_error do |e| + expect(e.class).to be(RestClient::TooManyRequests) + end end end end + + private + + def with_application_settings(**hargs) + QA::Runtime::ApplicationSettings.set_application_settings(**hargs) + yield + ensure + QA::Runtime::ApplicationSettings.restore_application_settings(*hargs.keys) + end end end diff --git a/qa/qa/specs/features/api/1_manage/users_spec.rb b/qa/qa/specs/features/api/1_manage/users_spec.rb index 53587209bfb..531419e8d0f 100644 --- a/qa/qa/specs/features/api/1_manage/users_spec.rb +++ b/qa/qa/specs/features/api/1_manage/users_spec.rb @@ -4,7 +4,7 @@ require 'airborne' module QA RSpec.describe 'Manage' do - describe 'Users API' do + describe 'Users API', :reliable do let(:api_client) { Runtime::API::Client.new(:gitlab) } let(:request) { Runtime::API::Request.new(api_client, '/users') } 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 index 6e2a34afb3e..5b02cc4646c 100644 --- 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 @@ -52,6 +52,53 @@ module QA expect(project_data_loss).to include('gitaly3, assigned host, unhealthy') end end + + it 'allows admin resolve scenario where data cannot be recovered', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/352708' do + # Ensure everything is in sync before begining test + praefect_manager.wait_for_project_synced_across_all_storages(project.id) + + Resource::Repository::Commit.fabricate_via_api! do |commit| + commit.project = project + commit.commit_message = 'accept-dataloss-1' + commit.add_files([ + { file_path: "new_file-#{SecureRandom.hex(8)}.txt", content: 'Add a commit to gitaly1,gitaly2,gitaly3' } + ]) + end + + praefect_manager.wait_for_replication_to_node(project.id, praefect_manager.primary_node) + praefect_manager.stop_primary_node + Resource::Repository::Commit.fabricate_via_api! do |commit| + commit.project = project + commit.commit_message = 'accept-dataloss-2' + commit.add_files([ + { file_path: "new_file-#{SecureRandom.hex(8)}.txt", content: 'Add a commit to gitaly2,gitaly3' } + ]) + end + + praefect_manager.wait_for_replication_to_node(project.id, praefect_manager.secondary_node) + praefect_manager.stop_secondary_node + Resource::Repository::Commit.fabricate_via_api! do |commit| + commit.project = project + commit.commit_message = 'accept-dataloss-3' + commit.add_files([ + { file_path: "new_file-#{SecureRandom.hex(8)}.txt", content: 'Add a commit to gitaly3' } + ]) + end + + # Confirms that they want to accept dataloss, using gitaly2 as authoritative storage to use as a base + praefect_manager.accept_dataloss_for_project(project.id, praefect_manager.secondary_node) + + # Restart nodes, and allow replication to apply dataloss changes + praefect_manager.start_all_nodes + praefect_manager.wait_for_project_synced_across_all_storages(project.id) + + # Validate that gitaly2 was accepted as the authorative storage + aggregate_failures "validate correct set of commits available" do + expect(project.commits.map { |commit| commit[:message].chomp }).to include('accept-dataloss-1') + expect(project.commits.map { |commit| commit[:message].chomp }).to include('accept-dataloss-2') + expect(project.commits.map { |commit| commit[:message].chomp }).not_to include('accept-dataloss-3') + end + end end end end diff --git a/qa/qa/specs/features/api/3_create/repository/files_spec.rb b/qa/qa/specs/features/api/3_create/repository/files_spec.rb index 48608094f5e..4d28937fbf8 100644 --- a/qa/qa/specs/features/api/3_create/repository/files_spec.rb +++ b/qa/qa/specs/features/api/3_create/repository/files_spec.rb @@ -104,6 +104,14 @@ module QA expect(response.headers[:content_disposition]).not_to include("inline") expect(response.headers[:content_type]).to include("image/svg+xml") end + + delete_project_request = Runtime::API::Request.new(@api_client, "/projects/#{sanitized_project_path}") + delete delete_project_request.url + + expect_status(202) + expect(json_body).to match( + a_hash_including(message: '202 Accepted') + ) end end end diff --git a/qa/qa/specs/features/api/4_verify/remove_runner_spec.rb b/qa/qa/specs/features/api/4_verify/remove_runner_spec.rb new file mode 100644 index 00000000000..0d10783735b --- /dev/null +++ b/qa/qa/specs/features/api/4_verify/remove_runner_spec.rb @@ -0,0 +1,36 @@ +# frozen_string_literal: true + +module QA + RSpec.describe 'Verify', :runner do + describe 'Runner removal' do + include Support::API + + let(:api_client) { Runtime::API::Client.new(:gitlab) } + let(:executor) { "qa-runner-#{Time.now.to_i}" } + let(:runner_tags) { ['runner-registration-e2e-test'] } + let!(:runner) do + Resource::Runner.fabricate! do |runner| + runner.name = executor + runner.tags = runner_tags + end + end + + before do + sleep 5 # Runner should register within 5 seconds + end + + # Removing a runner via the UI is covered by `spec/features/runners_spec.rb`` + it 'removes the runner', quarantine: { issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/355302', type: :investigating } do + expect(runner.project.runners.size).to eq(1) + expect(runner.project.runners.first[:description]).to eq(executor) + + request = Runtime::API::Request.new(api_client, "runners/#{runner.project.runners.first[:id]}") + response = delete(request.url) + expect(response.code).to eq(Support::API::HTTP_STATUS_NO_CONTENT) + expect(response.body).to be_empty + + expect(runner.project.runners).to be_empty + end + end + end +end 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 deleted file mode 100644 index 2db93ac60ea..00000000000 --- a/qa/qa/specs/features/browser_ui/1_manage/group/transfer_group_spec.rb +++ /dev/null @@ -1,51 +0,0 @@ -# frozen_string_literal: true - -module QA - RSpec.describe 'Manage' do - describe 'Subgroup transfer' do - let(:source_group) do - Resource::Group.fabricate_via_api! do |group| - group.path = "source-group-for-transfer_#{SecureRandom.hex(8)}" - end - end - - let!(:target_group) do - Resource::Group.fabricate_via_api! do |group| - group.path = "target-group-for-transfer_#{SecureRandom.hex(8)}" - end - end - - let(:sub_group_for_transfer) do - Resource::Group.fabricate_via_api! do |group| - group.path = "subgroup-for-transfer_#{SecureRandom.hex(8)}" - group.sandbox = source_group - end - end - - before do - Flow::Login.sign_in - sub_group_for_transfer.visit! - end - - it 'transfers a subgroup to another group', - 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, sub_group_for_transfer.path) - - sub_group_for_transfer.sandbox = target_group - sub_group_for_transfer.reload! - end - - expect(page).to have_text("Group '#{sub_group_for_transfer.path}' was successfully transferred.") - expect(page.driver.current_url).to include(sub_group_for_transfer.full_path) - end - - after do - source_group&.remove_via_api! - target_group&.remove_via_api! - sub_group_for_transfer&.remove_via_api! - end - end - end -end diff --git a/qa/qa/specs/features/browser_ui/1_manage/group/transfer_project_spec.rb b/qa/qa/specs/features/browser_ui/1_manage/group/transfer_project_spec.rb index ffd7a7dfb6c..7b60adae836 100644 --- a/qa/qa/specs/features/browser_ui/1_manage/group/transfer_project_spec.rb +++ b/qa/qa/specs/features/browser_ui/1_manage/group/transfer_project_spec.rb @@ -2,7 +2,7 @@ module QA RSpec.describe 'Manage' do - describe 'Project transfer between groups' do + describe 'Project transfer between groups', :reliable do let(:source_group) do Resource::Group.fabricate_via_api! do |group| group.path = 'source-group' diff --git a/qa/qa/specs/features/browser_ui/1_manage/login/2fa_recovery_spec.rb b/qa/qa/specs/features/browser_ui/1_manage/login/2fa_recovery_spec.rb index 5ba80489652..c86a649f179 100644 --- a/qa/qa/specs/features/browser_ui/1_manage/login/2fa_recovery_spec.rb +++ b/qa/qa/specs/features/browser_ui/1_manage/login/2fa_recovery_spec.rb @@ -29,7 +29,6 @@ module QA end before do - Runtime::Feature.enable(:invite_members_group_modal, group: group) group.add_member(developer_user, Resource::Members::AccessLevel::DEVELOPER) end diff --git a/qa/qa/specs/features/browser_ui/1_manage/login/log_in_with_2fa_spec.rb b/qa/qa/specs/features/browser_ui/1_manage/login/log_in_with_2fa_spec.rb index ca0ce0d5775..64614ed654f 100644 --- a/qa/qa/specs/features/browser_ui/1_manage/login/log_in_with_2fa_spec.rb +++ b/qa/qa/specs/features/browser_ui/1_manage/login/log_in_with_2fa_spec.rb @@ -31,7 +31,6 @@ module QA let(:two_fa_expected_text) { /The group settings for.*require you to enable Two-Factor Authentication for your account.*You need to do this before/ } before do - Runtime::Feature.enable(:invite_members_group_modal, group: group) group.add_member(developer_user, Resource::Members::AccessLevel::DEVELOPER) end 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 bfb810b5c2b..90fbff3261e 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,12 +1,8 @@ # frozen_string_literal: true module QA - RSpec.describe 'Manage', :requires_admin do + RSpec.describe 'Manage', :reliable do describe 'Add project member' do - before do - Runtime::Feature.enable(:invite_members_group_modal) - end - it 'user adds project member', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347887' do Flow::Login.sign_in diff --git a/qa/qa/specs/features/browser_ui/1_manage/project/import_github_repo_spec.rb b/qa/qa/specs/features/browser_ui/1_manage/project/import_github_repo_spec.rb index 72867333d16..d803f5e473c 100644 --- a/qa/qa/specs/features/browser_ui/1_manage/project/import_github_repo_spec.rb +++ b/qa/qa/specs/features/browser_ui/1_manage/project/import_github_repo_spec.rb @@ -1,9 +1,9 @@ # frozen_string_literal: true module QA - RSpec.describe 'Manage', :github, :requires_admin do + RSpec.describe 'Manage', :reliable, :github, :requires_admin do describe 'Project import' do - let(:github_repo) { 'gitlab-qa-github/test-project' } + let(:github_repo) { 'gitlab-qa-github/import-test' } let(:api_client) { Runtime::API::Client.as_admin } let(:group) { Resource::Group.fabricate_via_api! { |resource| resource.api_client = api_client } } let(:user) do @@ -55,7 +55,7 @@ module QA Page::Project::Show.perform do |project| aggregate_failures do expect(project).to have_content(imported_project.name) - expect(project).to have_content('This test project is used for automated GitHub import by GitLab QA.') + expect(project).to have_content('Project for github import test') end end end diff --git a/qa/qa/specs/features/browser_ui/1_manage/project/invite_group_to_project_spec.rb b/qa/qa/specs/features/browser_ui/1_manage/project/invite_group_to_project_spec.rb index 6997447411a..dd27e85af3c 100644 --- a/qa/qa/specs/features/browser_ui/1_manage/project/invite_group_to_project_spec.rb +++ b/qa/qa/specs/features/browser_ui/1_manage/project/invite_group_to_project_spec.rb @@ -2,7 +2,7 @@ module QA # Tagging with issue for a transient invite group modal search bug, but does not require quarantine at this time - RSpec.describe 'Manage', :requires_admin, :transient, issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/349379' do + RSpec.describe 'Manage', :transient, issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/349379' do describe 'Invite group' do shared_examples 'invites group to project' do it 'verifies group is added and members can access project with correct access level' do @@ -16,6 +16,8 @@ module QA Flow::Login.sign_in(as: @user) Page::Dashboard::Projects.perform do |projects| + projects.filter_by_name(project.name) + expect(projects).to have_project_with_access_role(project.name, 'Developer') end @@ -28,7 +30,6 @@ module QA end before(:context) do - Runtime::Feature.enable(:invite_members_group_modal) @user = Resource::User.fabricate_or_use(Runtime::Env.gitlab_qa_username_1, Runtime::Env.gitlab_qa_password_1) end @@ -79,10 +80,6 @@ module QA project&.remove_via_api! group&.remove_via_api! end - - after(:context) do - Runtime::Feature.disable(:invite_members_group_modal) - end end end end diff --git a/qa/qa/specs/features/browser_ui/1_manage/project/personal_project_permissions_spec.rb b/qa/qa/specs/features/browser_ui/1_manage/project/personal_project_permissions_spec.rb new file mode 100644 index 00000000000..2aefa1c39ed --- /dev/null +++ b/qa/qa/specs/features/browser_ui/1_manage/project/personal_project_permissions_spec.rb @@ -0,0 +1,98 @@ +# frozen_string_literal: true + +module QA + RSpec.describe 'Manage' do + describe 'Personal project permissions' do + let!(:owner) { Resource::User.fabricate_or_use(Runtime::Env.gitlab_qa_username_1, Runtime::Env.gitlab_qa_password_1) } + + let!(:owner_api_client) { Runtime::API::Client.new(:gitlab, user: owner) } + + let!(:project) do + Resource::Project.fabricate_via_api! do |project| + project.api_client = owner_api_client + project.name = 'qa-owner-personal-project' + project.personal_namespace = owner.username + end + end + + after do + project&.remove_via_api! + end + + context 'when user is added as Owner' do + let(:issue) do + Resource::Issue.fabricate_via_api! do |issue| + issue.api_client = owner_api_client + issue.project = project + issue.title = 'Test Owner deletes issue' + end + end + + before do + Flow::Login.sign_in(as: owner) + end + + it "has Owner role with Owner permissions", testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/352542' do + Page::Dashboard::Projects.perform do |projects| + projects.filter_by_name(project.name) + + expect(projects).to have_project_with_access_role(project.name, 'Owner') + end + + expect_owner_permissions_allow_delete_issue + end + end + + context 'when user is added as Maintainer' do + let(:maintainer) { Resource::User.fabricate_or_use(Runtime::Env.gitlab_qa_username_2, Runtime::Env.gitlab_qa_password_2) } + + let(:issue) do + Resource::Issue.fabricate_via_api! do |issue| + issue.api_client = owner_api_client + issue.project = project + issue.title = 'Test Maintainer deletes issue' + end + end + + before do + project.add_member(maintainer, Resource::Members::AccessLevel::MAINTAINER) + Flow::Login.sign_in(as: maintainer) + end + + it "has Maintainer role without Owner permissions", testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/352607' do + Page::Dashboard::Projects.perform do |projects| + projects.filter_by_name(project.name) + + expect(projects).to have_project_with_access_role(project.name, 'Maintainer') + end + + expect_maintainer_permissions_do_not_allow_delete_issue + end + end + + private + + def expect_owner_permissions_allow_delete_issue + expect do + issue.visit! + + Page::Project::Issue::Show.perform(&:delete_issue) + + Page::Project::Issue::Index.perform do |index| + expect(index).not_to have_issue(issue) + end + end.not_to raise_error + end + + def expect_maintainer_permissions_do_not_allow_delete_issue + expect do + issue.visit! + + Page::Project::Issue::Show.perform do |issue| + expect(issue).not_to have_delete_issue_button + end + end.not_to raise_error + 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 4f9ba579730..f6448fea2d4 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 @@ -2,8 +2,7 @@ module QA RSpec.describe 'Manage' do - # TODO: Remove :requires_admin meta when the `Runtime::Feature.enable` method call is removed - describe 'Repository tags', :requires_admin do + describe 'Repository tags', :reliable do let(:project) do Resource::Project.fabricate_via_api! do |project| project.name = 'project-for-tags' @@ -11,12 +10,14 @@ module QA end end - before do - Runtime::Feature.enable(:invite_members_group_modal, project: project) + let(:developer_user) do + Resource::User.fabricate_or_use(Runtime::Env.gitlab_qa_username_1, Runtime::Env.gitlab_qa_password_1) + end + + let(:maintainer_user) do + Resource::User.fabricate_or_use(Runtime::Env.gitlab_qa_username_2, Runtime::Env.gitlab_qa_password_2) end - let(:developer_user) { Resource::User.fabricate_or_use(Runtime::Env.gitlab_qa_username_1, Runtime::Env.gitlab_qa_password_1) } - let(:maintainer_user) { Resource::User.fabricate_or_use(Runtime::Env.gitlab_qa_username_2, Runtime::Env.gitlab_qa_password_2) } let(:tag_name) { 'v0.0.1' } let(:tag_message) { 'Version 0.0.1' } let(:tag_release_notes) { 'Release It!' } diff --git a/qa/qa/specs/features/browser_ui/1_manage/project/view_project_activity_spec.rb b/qa/qa/specs/features/browser_ui/1_manage/project/view_project_activity_spec.rb index 1be73d92a8c..88f4996ff03 100644 --- a/qa/qa/specs/features/browser_ui/1_manage/project/view_project_activity_spec.rb +++ b/qa/qa/specs/features/browser_ui/1_manage/project/view_project_activity_spec.rb @@ -2,8 +2,9 @@ module QA RSpec.describe 'Manage' do - describe 'Project activity' do - it 'user creates an event in the activity page upon Git push', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347879' do + describe 'Project activity', :reliable do + it 'user creates an event in the activity page upon Git push', + testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347879' do Flow::Login.sign_in project = Resource::Repository::ProjectPush.fabricate! do |push| diff --git a/qa/qa/specs/features/browser_ui/1_manage/user/user_access_termination_spec.rb b/qa/qa/specs/features/browser_ui/1_manage/user/user_access_termination_spec.rb index 58dcd922255..8462f5db30b 100644 --- a/qa/qa/specs/features/browser_ui/1_manage/user/user_access_termination_spec.rb +++ b/qa/qa/specs/features/browser_ui/1_manage/user/user_access_termination_spec.rb @@ -2,7 +2,7 @@ module QA RSpec.describe 'Manage' do - describe 'User', :requires_admin do + describe 'User', :requires_admin, :reliable do let(:admin_api_client) { Runtime::API::Client.as_admin } let!(:user) do diff --git a/qa/qa/specs/features/browser_ui/2_plan/email/trigger_email_notification_spec.rb b/qa/qa/specs/features/browser_ui/2_plan/email/trigger_email_notification_spec.rb index 4350b8f0d3e..0d706aef6ab 100644 --- a/qa/qa/specs/features/browser_ui/2_plan/email/trigger_email_notification_spec.rb +++ b/qa/qa/specs/features/browser_ui/2_plan/email/trigger_email_notification_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true module QA - RSpec.describe 'Plan', :orchestrated, :smtp, :requires_admin do + RSpec.describe 'Plan', :orchestrated, :smtp do describe 'Email Notification' do include Support::API @@ -16,7 +16,6 @@ module QA end before do - Runtime::Feature.enable(:invite_members_group_modal) Flow::Login.sign_in end diff --git a/qa/qa/specs/features/browser_ui/2_plan/issue/check_mentions_for_xss_spec.rb b/qa/qa/specs/features/browser_ui/2_plan/issue/check_mentions_for_xss_spec.rb index c2b42de6701..1ba110a9602 100644 --- a/qa/qa/specs/features/browser_ui/2_plan/issue/check_mentions_for_xss_spec.rb +++ b/qa/qa/specs/features/browser_ui/2_plan/issue/check_mentions_for_xss_spec.rb @@ -4,7 +4,7 @@ module QA RSpec.describe 'Plan', :reliable do let!(:user) do Resource::User.fabricate_via_api! do |user| - user.name = "eve { + docker_client_version: 'docker:18.09.9', + authentication_token_type: :personal_access_token, + token_name: 'Personal Access Token', + testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/348499' + }, + 'using docker:18.09.9 and a project deploy token' => { + docker_client_version: 'docker:18.09.9', + authentication_token_type: :project_deploy_token, + token_name: 'Deploy Token', + testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/348852' + }, + 'using docker:18.09.9 and a ci job token' => { + docker_client_version: 'docker:18.09.9', + authentication_token_type: :ci_job_token, + token_name: 'Job Token', + testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/348765' + }, + 'using docker:19.03.12 and a personal access token' => { + docker_client_version: 'docker:19.03.12', + authentication_token_type: :personal_access_token, + token_name: 'Personal Access Token', + testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/348507' + }, + 'using docker:19.03.12 and a project deploy token' => { + docker_client_version: 'docker:19.03.12', + authentication_token_type: :project_deploy_token, + token_name: 'Deploy Token', + testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/348859' + }, + 'using docker:19.03.12 and a ci job token' => { + docker_client_version: 'docker:19.03.12', + authentication_token_type: :ci_job_token, + token_name: 'Job Token', + testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/348654' + }, + 'using docker:20.10 and a personal access token' => { + docker_client_version: 'docker:20.10', + authentication_token_type: :personal_access_token, + token_name: 'Personal Access Token', + testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/348754' + }, + 'using docker:20.10 and a project deploy token' => { + docker_client_version: 'docker:20.10', + authentication_token_type: :project_deploy_token, + token_name: 'Deploy Token', + testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/348856' + }, + 'using docker:20.10 and a ci job token' => { + docker_client_version: 'docker:20.10', + authentication_token_type: :ci_job_token, + token_name: 'Job Token', + testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/348766' + } + } end with_them do @@ -78,57 +129,51 @@ module QA end end - where(:docker_client_version) do - %w[docker:18.09.9 docker:19.03.12 docker:20.10] - end - - with_them do - it "pushes image and deletes tag", :registry do - Support::Retrier.retry_on_exception(max_attempts: 3, sleep_interval: 2) 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 - build: - image: "#{docker_client_version}" - stage: build - services: - - name: "#{docker_client_version}-dind" - command: ["--insecure-registry=gitlab.test:5050"] - variables: - IMAGE_TAG: $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG - script: - - docker login -u #{auth_user} -p #{auth_token} gitlab.test:5050 - - docker build -t $IMAGE_TAG . - - docker push $IMAGE_TAG - tags: - - "runner-for-#{project.name}" - YAML - }]) - end + it "pushes image and deletes tag", :registry, 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 + commit.commit_message = 'Add .gitlab-ci.yml' + commit.add_files([{ + file_path: '.gitlab-ci.yml', + content: + <<~YAML + build: + image: "#{docker_client_version}" + stage: build + services: + - name: "#{docker_client_version}-dind" + command: ["--insecure-registry=gitlab.test:5050"] + variables: + IMAGE_TAG: $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG + script: + - docker login -u #{auth_user} -p #{auth_token} gitlab.test:5050 + - docker build -t $IMAGE_TAG . + - docker push $IMAGE_TAG + tags: + - "runner-for-#{project.name}" + YAML + }]) end + end - Flow::Pipeline.visit_latest_pipeline + Flow::Pipeline.visit_latest_pipeline - Page::Project::Pipeline::Show.perform do |pipeline| - pipeline.click_job('build') - end + Page::Project::Pipeline::Show.perform do |pipeline| + pipeline.click_job('build') + 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(&:go_to_container_registry) + Page::Project::Menu.perform(&:go_to_container_registry) - Page::Project::Registry::Show.perform do |registry| - expect(registry).to have_registry_repository(project.path_with_namespace) + Page::Project::Registry::Show.perform do |registry| + expect(registry).to have_registry_repository(project.path_with_namespace) - registry.click_on_image(project.path_with_namespace) - expect(registry).to have_tag('master') - end + registry.click_on_image(project.path_with_namespace) + expect(registry).to have_tag('master') end end end @@ -156,7 +201,7 @@ module QA apk add --no-cache openssl true | openssl s_client -showcerts -connect gitlab.test:5050 > /usr/local/share/ca-certificates/gitlab.test.crt update-ca-certificates - dockerd-entrypoint.sh || exit + dockerd-entrypoint.sh || exit variables: IMAGE_TAG: $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG script: diff --git a/qa/qa/specs/features/browser_ui/5_package/package_registry/maven/maven_group_level_spec.rb b/qa/qa/specs/features/browser_ui/5_package/package_registry/maven/maven_group_level_spec.rb new file mode 100644 index 00000000000..9ef5b8c84fa --- /dev/null +++ b/qa/qa/specs/features/browser_ui/5_package/package_registry/maven/maven_group_level_spec.rb @@ -0,0 +1,314 @@ +# frozen_string_literal: true + +module QA + RSpec.describe 'Package', :orchestrated, :packages, :object_storage do + describe 'Maven group level endpoint' do + include Runtime::Fixtures + include_context 'packages registry qa scenario' + + let(:group_id) { 'com.gitlab.qa' } + let(:artifact_id) { "maven-#{SecureRandom.hex(8)}" } + let(:package_name) { "#{group_id}/#{artifact_id}".tr('.', '/') } + let(:package_version) { '1.3.7' } + let(:package_type) { 'maven' } + + context 'via maven' do + where do + { + 'using a personal access token' => { + authentication_token_type: :personal_access_token, + maven_header_name: 'Private-Token', + testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347582' + }, + 'using a project deploy token' => { + authentication_token_type: :project_deploy_token, + maven_header_name: 'Deploy-Token', + testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347585' + }, + 'using a ci job token' => { + authentication_token_type: :ci_job_token, + maven_header_name: 'Job-Token', + testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347579' + } + } + end + + with_them do + let(:token) do + case authentication_token_type + when :personal_access_token + personal_access_token + when :ci_job_token + '${env.CI_JOB_TOKEN}' + when :project_deploy_token + project_deploy_token.token + end + end + + it 'pushes and pulls a maven package', testcase: params[:testcase] 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 files' + commit.add_files([ + { + 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 + + package_project.visit! + + Flow::Pipeline.visit_latest_pipeline + + 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::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 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| + 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 files' + commit.add_files([ + { + 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 + + client_project.visit! + + Flow::Pipeline.visit_latest_pipeline + + Page::Project::Pipeline::Show.perform do |pipeline| + pipeline.click_job('install') + end + + Page::Project::Job::Show.perform do |job| + expect(job).to be_successful(timeout: 800) + end + end + end + end + + context 'duplication setting' do + before do + package_project.group.visit! + + Page::Group::Menu.perform(&:go_to_package_settings) + end + + context 'when disabled' do + where do + { + 'using a personal access token' => { + authentication_token_type: :personal_access_token, + maven_header_name: 'Private-Token', + testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347581' + }, + 'using a project deploy token' => { + authentication_token_type: :project_deploy_token, + maven_header_name: 'Deploy-Token', + testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347584' + }, + 'using a ci job token' => { + authentication_token_type: :ci_job_token, + maven_header_name: 'Job-Token', + testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347578' + } + } + end + + with_them do + let(:token) do + case authentication_token_type + when :personal_access_token + personal_access_token + when :ci_job_token + '${env.CI_JOB_TOKEN}' + when :project_deploy_token + project_deploy_token.token + end + end + + before do + Page::Group::Settings::PackageRegistries.perform(&:set_allow_duplicates_disabled) + end + + it 'prevents users from publishing group level Maven packages duplicates', testcase: params[:testcase] do + create_duplicated_package + + push_duplicated_package + + client_project.visit! + + show_latest_deploy_job + + Page::Project::Job::Show.perform do |job| + expect(job).not_to be_successful(timeout: 800) + end + end + end + end + + context 'when enabled' do + where do + { + 'using a personal access token' => { + authentication_token_type: :personal_access_token, + maven_header_name: 'Private-Token', + testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347580' + }, + 'using a project deploy token' => { + authentication_token_type: :project_deploy_token, + maven_header_name: 'Deploy-Token', + testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347583' + }, + 'using a ci job token' => { + authentication_token_type: :ci_job_token, + maven_header_name: 'Job-Token', + testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347577' + } + } + end + + with_them do + let(:token) do + case authentication_token_type + when :personal_access_token + personal_access_token + when :ci_job_token + '${env.CI_JOB_TOKEN}' + when :project_deploy_token + project_deploy_token.token + end + end + + before do + Page::Group::Settings::PackageRegistries.perform(&:set_allow_duplicates_enabled) + end + + it 'allows users to publish group level Maven packages duplicates', testcase: params[:testcase] do + create_duplicated_package + + push_duplicated_package + + show_latest_deploy_job + + Page::Project::Job::Show.perform do |job| + expect(job).to be_successful(timeout: 800) + end + end + end + end + + def create_duplicated_package + 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 + + package_project.visit! + + Page::Project::Menu.perform(&:click_packages_link) + + Page::Project::Packages::Index.perform do |index| + expect(index).to have_package(package_name) + end + end + + 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([ + { + 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 + end + + def show_latest_deploy_job + client_project.visit! + + Flow::Pipeline.visit_latest_pipeline + + Page::Project::Pipeline::Show.perform do |pipeline| + pipeline.click_job('deploy') + end + end + end + end + end +end diff --git a/qa/qa/specs/features/browser_ui/5_package/package_registry/maven/maven_project_level_spec.rb b/qa/qa/specs/features/browser_ui/5_package/package_registry/maven/maven_project_level_spec.rb new file mode 100644 index 00000000000..d79f65764d4 --- /dev/null +++ b/qa/qa/specs/features/browser_ui/5_package/package_registry/maven/maven_project_level_spec.rb @@ -0,0 +1,219 @@ +# frozen_string_literal: true + +module QA + RSpec.describe 'Package', :orchestrated, :packages, :object_storage do + describe 'Maven project level endpoint' do + let(:group_id) { 'com.gitlab.qa' } + let(:artifact_id) { "maven-#{SecureRandom.hex(8)}" } + let(:package_name) { "#{group_id}/#{artifact_id}".tr('.', '/') } + let(:package_version) { '1.3.7' } + let(:package_type) { 'maven' } + let(:personal_access_token) { Runtime::Env.personal_access_token } + + let(:package_project) do + Resource::Project.fabricate_via_api! do |project| + project.name = "#{package_type}_package_project" + project.initialize_with_readme = true + project.visibility = :private + end + end + + let(:package) do + Resource::Package.init do |package| + package.name = package_name + package.project = package_project + end + end + + let(:runner) do + Resource::Runner.fabricate! do |runner| + runner.name = "qa-runner-#{Time.now.to_i}" + runner.tags = ["runner-for-#{package_project.name}"] + runner.executor = :docker + runner.project = package_project + end + end + + let(:gitlab_address_with_port) do + uri = URI.parse(Runtime::Scenario.gitlab_address) + "#{uri.scheme}://#{uri.host}:#{uri.port}" + end + + let(:project_deploy_token) do + Resource::ProjectDeployToken.fabricate_via_api! do |deploy_token| + deploy_token.name = 'package-deploy-token' + deploy_token.project = package_project + deploy_token.scopes = %w[ + read_repository + read_package_registry + write_package_registry + ] + end + end + + let(:gitlab_ci_file) do + { + file_path: '.gitlab-ci.yml', + content: + <<~YAML + deploy-and-install: + image: maven:3.6-jdk-11 + script: + - 'mvn deploy -s settings.xml' + - 'mvn install -s settings.xml' + only: + - "#{package_project.default_branch}" + tags: + - "runner-for-#{package_project.name}" + YAML + } + end + + let(:pom_file) do + { + file_path: 'pom.xml', + content: <<~XML + + #{group_id} + #{artifact_id} + #{package_version} + 4.0.0 + + + #{package_project.name} + #{gitlab_address_with_port}/api/v4/projects/#{package_project.id}/-/packages/maven + + + + + #{package_project.name} + #{gitlab_address_with_port}/api/v4/projects/#{package_project.id}/packages/maven + + + #{package_project.name} + #{gitlab_address_with_port}/api/v4/projects/#{package_project.id}/packages/maven + + + + XML + } + end + + before do + Flow::Login.sign_in_unless_signed_in + runner + end + + after do + runner.remove_via_api! + package.remove_via_api! + package_project.remove_via_api! + end + + where do + { + 'using a personal access token' => { + authentication_token_type: :personal_access_token, + maven_header_name: 'Private-Token', + testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/354347' + }, + 'using a project deploy token' => { + authentication_token_type: :project_deploy_token, + maven_header_name: 'Deploy-Token', + testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/354348' + }, + 'using a ci job token' => { + authentication_token_type: :ci_job_token, + maven_header_name: 'Job-Token', + testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/354349' + } + } + end + + with_them do + let(:token) do + case authentication_token_type + when :personal_access_token + personal_access_token + when :ci_job_token + '${env.CI_JOB_TOKEN}' + when :project_deploy_token + project_deploy_token.token + end + end + + let(:settings_xml) do + { + file_path: 'settings.xml', + content: <<~XML + + + + #{package_project.name} + + + + #{maven_header_name} + #{token} + + + + + + + XML + } + end + + it 'pushes and pulls a maven package via maven', 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 = package_project + commit.commit_message = 'Add .gitlab-ci.yml' + commit.add_files([ + gitlab_ci_file, + pom_file, + settings_xml + ]) + end + end + + package_project.visit! + + Flow::Pipeline.visit_latest_pipeline + + 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) + + job.click_element(:pipeline_path) + end + + Page::Project::Pipeline::Show.perform do |pipeline| + pipeline.click_job('install') + 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::Packages::Index.perform do |index| + expect(index).to have_package(package_name) + + index.click_package(package_name) + end + + Page::Project::Packages::Show.perform do |show| + expect(show).to have_package_info(package_name, package_version) + end + end + end + end + 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 deleted file mode 100644 index b4ebb9dd475..00000000000 --- a/qa/qa/specs/features/browser_ui/5_package/package_registry/maven_repository_spec.rb +++ /dev/null @@ -1,233 +0,0 @@ -# frozen_string_literal: true - -module QA - RSpec.describe 'Package', :orchestrated, :packages, :object_storage do - describe 'Maven Repository' do - using RSpec::Parameterized::TableSyntax - include Runtime::Fixtures - include_context 'packages registry qa scenario' - - let(:group_id) { 'com.gitlab.qa' } - let(:artifact_id) { "maven-#{SecureRandom.hex(8)}" } - let(:package_name) { "#{group_id}/#{artifact_id}".tr('.', '/') } - let(:package_version) { '1.3.7' } - let(:package_type) { 'maven' } - - where(:authentication_token_type, :maven_header_name) do - :personal_access_token | 'Private-Token' - :ci_job_token | 'Job-Token' - :project_deploy_token | 'Deploy-Token' - end - - with_them do - let(:token) do - case authentication_token_type - when :personal_access_token - personal_access_token - when :ci_job_token - '${env.CI_JOB_TOKEN}' - when :project_deploy_token - project_deploy_token.token - end - 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 files' - commit.add_files([ - { - 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 - - package_project.visit! - - Flow::Pipeline.visit_latest_pipeline - - 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::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 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| - 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 files' - commit.add_files([ - { - 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 - - client_project.visit! - - Flow::Pipeline.visit_latest_pipeline - - Page::Project::Pipeline::Show.perform do |pipeline| - pipeline.click_job('install') - end - - Page::Project::Job::Show.perform do |job| - expect(job).to be_successful(timeout: 800) - end - end - - context 'duplication setting' do - before do - package_project.group.visit! - - Page::Group::Menu.perform(&:go_to_package_settings) - end - - context 'when disabled' do - before do - Page::Group::Settings::PackageRegistries.perform(&:set_allow_duplicates_disabled) - end - - it "prevents users from publishing group level Maven packages duplicates using #{params[:authentication_token_type]}" do - create_duplicated_package - - push_duplicated_package - - client_project.visit! - - show_latest_deploy_job - - Page::Project::Job::Show.perform do |job| - expect(job).not_to be_successful(timeout: 800) - end - end - end - - context 'when enabled' do - before do - Page::Group::Settings::PackageRegistries.perform(&:set_allow_duplicates_enabled) - end - - it "allows users to publish group level Maven packages duplicates using #{params[:authentication_token_type]}" do - create_duplicated_package - - push_duplicated_package - - show_latest_deploy_job - - Page::Project::Job::Show.perform do |job| - expect(job).to be_successful(timeout: 800) - end - end - end - - def create_duplicated_package - 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 - - package_project.visit! - - Page::Project::Menu.perform(&:click_packages_link) - - Page::Project::Packages::Index.perform do |index| - expect(index).to have_package(package_name) - end - end - - 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([ - { - 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 - end - - def show_latest_deploy_job - client_project.visit! - - Flow::Pipeline.visit_latest_pipeline - - Page::Project::Pipeline::Show.perform do |pipeline| - pipeline.click_job('deploy') - end - end - end - end - end - end -end diff --git a/qa/qa/specs/features/browser_ui/5_package/package_registry/nuget/nuget_group_level_spec.rb b/qa/qa/specs/features/browser_ui/5_package/package_registry/nuget/nuget_group_level_spec.rb new file mode 100644 index 00000000000..b0a6555a16b --- /dev/null +++ b/qa/qa/specs/features/browser_ui/5_package/package_registry/nuget/nuget_group_level_spec.rb @@ -0,0 +1,182 @@ +# frozen_string_literal: true + +module QA + RSpec.describe 'Package', :orchestrated, :packages, :object_storage do + describe 'NuGet group level endpoint' do + using RSpec::Parameterized::TableSyntax + include Runtime::Fixtures + + let(:project) do + Resource::Project.fabricate_via_api! do |project| + project.name = 'nuget-package-project' + project.template_name = 'dotnetcore' + project.visibility = :private + end + end + + let(:personal_access_token) do + unless Page::Main::Menu.perform(&:signed_in?) + Flow::Login.sign_in + end + + Resource::PersonalAccessToken.fabricate! + end + + let(:group_deploy_token) do + Resource::GroupDeployToken.fabricate_via_api! do |deploy_token| + deploy_token.name = 'nuget-group-deploy-token' + deploy_token.group = project.group + deploy_token.scopes = %w[ + read_repository + read_package_registry + write_package_registry + ] + end + end + + let(:package) do + Resource::Package.init do |package| + package.name = "dotnetcore-#{SecureRandom.hex(8)}" + package.project = project + end + end + + let(:another_project) do + Resource::Project.fabricate_via_api! do |another_project| + another_project.name = 'nuget-package-install-project' + another_project.template_name = 'dotnetcore' + another_project.group = project.group + end + end + + let!(:runner) do + Resource::Runner.fabricate! do |runner| + runner.name = "qa-runner-#{Time.now.to_i}" + runner.tags = ["runner-for-#{project.group.name}"] + runner.executor = :docker + runner.token = project.group.reload!.runners_token + end + end + + after do + runner.remove_via_api! + package.remove_via_api! + end + + 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 + let(:auth_token_password) do + case authentication_token_type + when :personal_access_token + "\"#{personal_access_token.token}\"" + when :ci_job_token + '${CI_JOB_TOKEN}' + when :group_deploy_token + "\"#{group_deploy_token.token}\"" + end + end + + let(:auth_token_username) do + case authentication_token_type + when :personal_access_token + "\"#{personal_access_token.user.username}\"" + when :ci_job_token + 'gitlab-ci-token' + when :group_deploy_token + "\"#{group_deploy_token.username}\"" + end + end + + 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: nuget_upload_yaml + } + ] + ) + end + end + + project.visit! + Flow::Pipeline.visit_latest_pipeline + + 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 + + another_project.visit! + + 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( + [ + { + file_path: 'otherdotnet.csproj', + content: <<~EOF + + + + Exe + net5.0 + + + + EOF + } + ] + ) + commit.update_files( + [ + { + file_path: '.gitlab-ci.yml', + content: nuget_install_yaml + } + ] + ) + end + end + + Flow::Pipeline.visit_latest_pipeline + + Page::Project::Pipeline::Show.perform do |pipeline| + pipeline.click_job('install') + end + + Page::Project::Job::Show.perform do |job| + expect(job).to be_successful(timeout: 800) + end + + project.group.visit! + + Page::Group::Menu.perform(&:go_to_group_packages) + + Page::Project::Packages::Index.perform do |index| + expect(index).to have_package(package.name) + end + end + end + end + end +end diff --git a/qa/qa/specs/features/browser_ui/5_package/package_registry/nuget/nuget_project_level_spec.rb b/qa/qa/specs/features/browser_ui/5_package/package_registry/nuget/nuget_project_level_spec.rb new file mode 100644 index 00000000000..4cac055634e --- /dev/null +++ b/qa/qa/specs/features/browser_ui/5_package/package_registry/nuget/nuget_project_level_spec.rb @@ -0,0 +1,164 @@ +# frozen_string_literal: true + +module QA + RSpec.describe 'Package', :orchestrated, :packages, :object_storage do + describe 'NuGet project level endpoint' do + let(:project) do + Resource::Project.fabricate_via_api! do |project| + project.name = 'nuget-package-project' + project.template_name = 'dotnetcore' + project.visibility = :private + end + end + + let(:personal_access_token) do + unless Page::Main::Menu.perform(&:signed_in?) + Flow::Login.sign_in + end + + Resource::PersonalAccessToken.fabricate! + end + + let(:project_deploy_token) do + Resource::ProjectDeployToken.fabricate_via_api! do |deploy_token| + deploy_token.name = 'package-deploy-token' + deploy_token.project = project + deploy_token.scopes = %w[ + read_repository + read_package_registry + write_package_registry + ] + end + end + + let(:package) do + Resource::Package.init do |package| + package.name = "dotnetcore-#{SecureRandom.hex(8)}" + package.project = project + end + end + + let!(:runner) do + Resource::Runner.fabricate! do |runner| + runner.name = "qa-runner-#{Time.now.to_i}" + runner.tags = ["runner-for-#{project.name}"] + runner.executor = :docker + runner.project = project + end + end + + after do + runner.remove_via_api! + package.remove_via_api! + project.remove_via_api! + end + + where do + { + 'using a personal access token' => { + authentication_token_type: :personal_access_token, + maven_header_name: 'Private-Token', + testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/354351' + }, + 'using a project deploy token' => { + authentication_token_type: :project_deploy_token, + maven_header_name: 'Deploy-Token', + testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/354352' + }, + 'using a ci job token' => { + authentication_token_type: :ci_job_token, + maven_header_name: 'Job-Token', + testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/354353' + } + } + end + + with_them do + let(:auth_token_password) do + case authentication_token_type + when :personal_access_token + "\"#{personal_access_token.token}\"" + when :ci_job_token + '${CI_JOB_TOKEN}' + when :project_deploy_token + "\"#{project_deploy_token.token}\"" + end + end + + let(:auth_token_username) do + case authentication_token_type + when :personal_access_token + "\"#{personal_access_token.user.username}\"" + when :ci_job_token + 'gitlab-ci-token' + when :project_deploy_token + "\"#{project_deploy_token.username}\"" + end + end + + it 'publishes a nuget package and installs', 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| + commit.project = project + commit.commit_message = 'Add files' + commit.update_files( + [ + { + file_path: '.gitlab-ci.yml', + content: <<~YAML + deploy-and-install: + image: mcr.microsoft.com/dotnet/sdk:5.0 + 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 + - "dotnet add dotnetcore.csproj package #{package.name} --version 1.0.0" + rules: + - if: '$CI_COMMIT_BRANCH == "#{project.default_branch}"' + tags: + - "runner-for-#{project.name}" + YAML + }, + { + file_path: 'dotnetcore.csproj', + content: <<~EOF + + + + Exe + net5.0 + + + + EOF + } + ] + ) + end + end + + project.visit! + Flow::Pipeline.visit_latest_pipeline + + Page::Project::Pipeline::Show.perform do |pipeline| + pipeline.click_job('deploy-and-install') + 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::Packages::Index.perform do |index| + expect(index).to have_package(package.name) + end + end + end + 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 deleted file mode 100644 index 24f83bc19fb..00000000000 --- a/qa/qa/specs/features/browser_ui/5_package/package_registry/nuget_repository_spec.rb +++ /dev/null @@ -1,182 +0,0 @@ -# frozen_string_literal: true - -module QA - RSpec.describe 'Package', :orchestrated, :packages, :object_storage do - 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' - project.template_name = 'dotnetcore' - project.visibility = :private - end - end - - let(:personal_access_token) do - unless Page::Main::Menu.perform(&:signed_in?) - Flow::Login.sign_in - end - - Resource::PersonalAccessToken.fabricate! - end - - let(:group_deploy_token) do - Resource::GroupDeployToken.fabricate_via_api! do |deploy_token| - deploy_token.name = 'nuget-group-deploy-token' - deploy_token.group = project.group - deploy_token.scopes = %w[ - read_repository - read_package_registry - write_package_registry - ] - end - end - - let(:package) do - Resource::Package.init do |package| - package.name = "dotnetcore-#{SecureRandom.hex(8)}" - package.project = project - end - end - - let(:another_project) do - Resource::Project.fabricate_via_api! do |another_project| - another_project.name = 'nuget-package-install-project' - another_project.template_name = 'dotnetcore' - another_project.group = project.group - end - end - - let!(:runner) do - Resource::Runner.fabricate! do |runner| - runner.name = "qa-runner-#{Time.now.to_i}" - runner.tags = ["runner-for-#{project.group.name}"] - runner.executor = :docker - runner.token = project.group.reload!.runners_token - end - end - - after do - runner.remove_via_api! - package.remove_via_api! - end - - 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 - let(:auth_token_password) do - case authentication_token_type - when :personal_access_token - "\"#{personal_access_token.token}\"" - when :ci_job_token - '${CI_JOB_TOKEN}' - when :group_deploy_token - "\"#{group_deploy_token.token}\"" - end - end - - let(:auth_token_username) do - case authentication_token_type - when :personal_access_token - "\"#{personal_access_token.user.username}\"" - when :ci_job_token - 'gitlab-ci-token' - when :group_deploy_token - "\"#{group_deploy_token.username}\"" - end - end - - 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: nuget_upload_yaml - } - ] - ) - end - end - - project.visit! - Flow::Pipeline.visit_latest_pipeline - - 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 - - another_project.visit! - - 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( - [ - { - file_path: 'otherdotnet.csproj', - content: <<~EOF - - - - Exe - net5.0 - - - - EOF - } - ] - ) - commit.update_files( - [ - { - file_path: '.gitlab-ci.yml', - content: nuget_install_yaml - } - ] - ) - end - end - - Flow::Pipeline.visit_latest_pipeline - - Page::Project::Pipeline::Show.perform do |pipeline| - pipeline.click_job('install') - end - - Page::Project::Job::Show.perform do |job| - expect(job).to be_successful(timeout: 800) - end - - project.group.visit! - - Page::Group::Menu.perform(&:go_to_group_packages) - - Page::Project::Packages::Index.perform do |index| - expect(index).to have_package(package.name) - end - end - end - end - end -end diff --git a/qa/qa/specs/features/browser_ui/6_release/deploy_key/add_deploy_key_spec.rb b/qa/qa/specs/features/browser_ui/6_release/deploy_key/add_deploy_key_spec.rb index 260c812420c..1661fec03be 100644 --- a/qa/qa/specs/features/browser_ui/6_release/deploy_key/add_deploy_key_spec.rb +++ b/qa/qa/specs/features/browser_ui/6_release/deploy_key/add_deploy_key_spec.rb @@ -2,7 +2,7 @@ module QA RSpec.describe 'Release' do - describe 'Deploy key creation' do + describe 'Deploy key creation', :skip_fips_env do it 'user adds a deploy key', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/348023' do Flow::Login.sign_in @@ -10,7 +10,7 @@ module QA deploy_key_title = 'deploy key title' deploy_key_value = key.public_key - deploy_key = Resource::DeployKey.fabricate! do |resource| + deploy_key = Resource::DeployKey.fabricate_via_browser_ui! do |resource| resource.title = deploy_key_title resource.key = deploy_key_value 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 c86f75e0b16..ff8dc686991 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 @@ -4,7 +4,7 @@ require 'digest/sha1' module QA RSpec.describe 'Release', :runner do - describe 'Git clone using a deploy key' do + describe 'Git clone using a deploy key', :skip_fips_env do let(:runner_name) { "qa-runner-#{SecureRandom.hex(4)}" } let(:repository_location) { project.repository_ssh_location } 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 718dc9860fb..980c6da2576 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 @@ -56,7 +56,7 @@ module QA end Page::Project::Job::Show.perform do |show| - expect(show).to have_passed(timeout: 360) + expect(show).to have_passed(timeout: 800) end end end diff --git a/qa/qa/specs/features/browser_ui/7_configure/auto_devops/create_project_with_auto_devops_spec.rb b/qa/qa/specs/features/browser_ui/7_configure/auto_devops/create_project_with_auto_devops_spec.rb index 70321dcafe4..e0cd5a52bfb 100644 --- a/qa/qa/specs/features/browser_ui/7_configure/auto_devops/create_project_with_auto_devops_spec.rb +++ b/qa/qa/specs/features/browser_ui/7_configure/auto_devops/create_project_with_auto_devops_spec.rb @@ -10,6 +10,7 @@ module QA end before do + set_kube_ingress_base_domain(project) disable_optional_jobs(project) end @@ -73,6 +74,15 @@ module QA private + def set_kube_ingress_base_domain(project) + Resource::CiVariable.fabricate_via_api! do |resource| + resource.project = project + resource.key = 'KUBE_INGRESS_BASE_DOMAIN' + resource.value = 'example.com' + resource.masked = false + end + end + def disable_optional_jobs(project) %w[ CODE_QUALITY_DISABLED LICENSE_MANAGEMENT_DISABLED -- cgit v1.2.1