diff --git a/qa/qa/fixtures/package_managers/maven/gradle/gradle_upload_install_package.yaml.erb b/qa/qa/fixtures/package_managers/maven/gradle/gradle_upload_install_package.yaml.erb index 35f4dba6130e019fd0d1b46788805de852f9c45c..0bba7e3f19c4376b34e57dcb51ced57d3c8e34a5 100644 --- a/qa/qa/fixtures/package_managers/maven/gradle/gradle_upload_install_package.yaml.erb +++ b/qa/qa/fixtures/package_managers/maven/gradle/gradle_upload_install_package.yaml.erb @@ -6,7 +6,11 @@ publish: stage: publish image: gradle:6.5-jdk11 script: - - 'gradle -PToken=<%= token %> publish' + - echo "Starting Gradle publish job..." + - echo "Token: $Token" + - echo "Project ID: <%= project.id %>" + - 'gradle -PToken=<%= token %> publish --info' + - echo "Gradle publish completed" only: - "<%= project.default_branch %>" tags: @@ -16,7 +20,11 @@ install: stage: install image: gradle:6.5-jdk11 script: - - 'gradle -PToken=<%= token %> build' + - echo "Starting Gradle install job..." + - echo "Token: $Token" + - echo "Project ID: <%= project.id %>" + - 'gradle -PToken=<%= token %> build --info' + - echo "Gradle install completed" only: - "<%= project.default_branch %>" tags: 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 index 4610749ed9d0d826b7fd07e80f08b61604d6efe2..7c9aa02f9af57e5262f3cebf3f9f4dea225cdaa4 100644 --- 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 @@ -13,8 +13,9 @@ module QA let(:package_version) { '1.3.7' } let(:package_type) { 'maven' } - let(:group_deploy_token) do - create(:group_deploy_token, + # Shared resources that don't change between test cases + before do + @group_deploy_token = create(:group_deploy_token, name: 'maven-group-deploy-token', group: package_project.group, scopes: %w[ @@ -22,10 +23,71 @@ module QA read_package_registry write_package_registry ]) + Runtime::ApplicationSettings.set_application_settings(enforce_ci_inbound_job_token_scope_enabled: false) end - before do - Runtime::ApplicationSettings.set_application_settings(enforce_ci_inbound_job_token_scope_enabled: false) + # Helper methods to access shared resources + def group_deploy_token + @group_deploy_token # rubocop:disable RSpec/InstanceVariable -- QA specs use before(:all) for shared setup + end + + # Add comprehensive cleanup to prevent test interference + after do + # Clean up any packages created during tests to prevent interference + begin + package_project.visit! + Page::Project::Menu.perform(&:go_to_package_registry) + Page::Project::Packages::Index.perform do |index| + if index.has_package?(package_name) + index.click_package(package_name) + Page::Project::Packages::Show.perform(&:click_delete) + end + end + rescue StandardError => e + QA::Runtime::Logger.warn("Failed to cleanup package #{package_name}: #{e.message}") + end + + # Clean up group settings to prevent interference between tests + begin + package_project.group.visit! + Page::Group::Menu.perform(&:go_to_package_settings) + # Reset to default state (disabled) + Page::Group::Settings::PackageRegistries.perform(&:set_allow_duplicates_disabled) + rescue StandardError => e + QA::Runtime::Logger.warn("Failed to cleanup group settings: #{e.message}") + end + + # Clean up CI variables to prevent conflicts + begin + # Remove CI variables that might have been set + package_project.visit! + Page::Project::Menu.perform(&:go_to_ci_cd_settings) + Page::Project::Settings::CiCd.perform do |settings| + settings.expand_variables do |variables| + # Try to remove PERSONAL_ACCESS_TOKEN and GROUP_DEPLOY_TOKEN if they exist + %w[PERSONAL_ACCESS_TOKEN GROUP_DEPLOY_TOKEN].each do |var_name| + variables.remove_variable(var_name) if variables.has_variable?(var_name) + rescue StandardError => e + QA::Runtime::Logger.warn("Failed to remove CI variable #{var_name}: #{e.message}") + end + end + end + + client_project.visit! + Page::Project::Menu.perform(&:go_to_ci_cd_settings) + Page::Project::Settings::CiCd.perform do |settings| + settings.expand_variables do |variables| + # Try to remove PERSONAL_ACCESS_TOKEN and GROUP_DEPLOY_TOKEN if they exist + %w[PERSONAL_ACCESS_TOKEN GROUP_DEPLOY_TOKEN].each do |var_name| + variables.remove_variable(var_name) if variables.has_variable?(var_name) + rescue StandardError => e + QA::Runtime::Logger.warn("Failed to remove CI variable #{var_name}: #{e.message}") + end + end + end + rescue StandardError => e + QA::Runtime::Logger.warn("Failed to cleanup CI variables: #{e.message}") + end end context 'without duplication setting' do diff --git a/qa/qa/specs/features/browser_ui/5_package/package_registry/maven_gradle_repository_spec.rb b/qa/qa/specs/features/browser_ui/5_package/package_registry/maven_gradle_repository_spec.rb index b8ef9b06a49d092764433eb7ab4bf2620f0407a6..7eb99cf2d7b076fe4363af438942f5c6cfba4add 100644 --- a/qa/qa/specs/features/browser_ui/5_package/package_registry/maven_gradle_repository_spec.rb +++ b/qa/qa/specs/features/browser_ui/5_package/package_registry/maven_gradle_repository_spec.rb @@ -12,13 +12,40 @@ module QA include Runtime::Fixtures include Support::Helpers::MaskToken - let(:personal_access_token) { Runtime::User::Store.default_api_client.personal_access_token } - let(:group_id) { 'com.gitlab.qa' } + # Only share truly immutable resources + before(:all) do + @personal_access_token = Runtime::User::Store.default_api_client.personal_access_token + @group_id = 'com.gitlab.qa' + @package_type = 'maven_gradle' + @gitlab_address_with_port = Support::GitlabAddress.address_with_port + end + + # Helper methods to access shared resources + def personal_access_token + @personal_access_token # rubocop:disable RSpec/InstanceVariable -- QA specs use before(:all) for shared setup + end + + def group_id + @group_id # rubocop:disable RSpec/InstanceVariable -- QA specs use before(:all) for shared setup + end + + def package_type + @package_type # rubocop:disable RSpec/InstanceVariable -- QA specs use before(:all) for shared setup + end + + def gitlab_address_with_port + @gitlab_address_with_port # rubocop:disable RSpec/InstanceVariable -- QA specs use before(:all) for shared setup + end + + # Keep per-test resources to maintain isolation + let(:project) do + create(:project, :private, :with_readme, name: "maven_gradle_project_#{SecureRandom.hex(4)}") + end + let(:artifact_id) { "maven_gradle-#{SecureRandom.hex(8)}" } - let(:package_name) { "#{group_id}/#{artifact_id}".tr('.', '/') } + let(:package_name) { "com.gitlab.qa/#{artifact_id}".tr('.', '/') } let(:package_version) { '1.3.7' } - let(:package_type) { 'maven_gradle' } - let(:project) { create(:project, :private, :with_readme, name: "#{package_type}_project") } + let!(:runner) do create(:project_runner, name: "qa-runner-#{SecureRandom.hex(6)}", @@ -27,10 +54,6 @@ module QA project: project) end - let(:gitlab_address_with_port) do - Support::GitlabAddress.address_with_port - end - let(:project_deploy_token) do create(:project_deploy_token, name: 'package-deploy-token', @@ -53,6 +76,30 @@ module QA Flow::Login.sign_in_unless_signed_in end + # Add cleanup to prevent test interference and resource leaks + after do + # Clean up runner (standard pattern in package registry tests) + begin + runner.remove_via_api! + rescue StandardError => e + QA::Runtime::Logger.warn("Failed to cleanup runner: #{e.message}") + end + + # Clean up any packages created during tests to prevent interference + begin + project.visit! + Page::Project::Menu.perform(&:go_to_package_registry) + Page::Project::Packages::Index.perform do |index| + if index.has_package?(package_name) + index.click_package(package_name) + Page::Project::Packages::Show.perform(&:click_delete) + end + end + rescue StandardError => e + QA::Runtime::Logger.warn("Failed to cleanup package #{package_name}: #{e.message}") + end + end + where(:case_name, :authentication_token_type, :maven_header_name, :testcase) do 'using personal access token' | :personal_access_token | 'Private-Token' | 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347601' 'using ci job token' | :ci_job_token | 'Job-Token' | 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347603' @@ -85,11 +132,21 @@ module QA project.visit! Flow::Pipeline.wait_for_pipeline_creation_via_api(project: project) + # Wait for the publish job to be available before trying to visit it + Support::Waiter.wait_until(message: 'Wait for publish job to be available', max_duration: 60) do + project.has_job?('publish') + end + project.visit_job('publish') Page::Project::Job::Show.perform do |job| expect(job).to be_successful(timeout: 800) end + # Wait for the install job to be available before trying to visit it + Support::Waiter.wait_until(message: 'Wait for install job to be available', max_duration: 60) do + project.has_job?('install') + end + project.visit_job('install') Page::Project::Job::Show.perform do |job| expect(job).to be_successful(timeout: 800) @@ -103,7 +160,7 @@ module QA end Page::Project::Packages::Show.perform do |show| - expect(show).to have_package_info(name: nil, version: package_version) + expect(show).to have_package_info(name: nil, version: '1.3.7') end end end