diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2020-11-26 18:09:30 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2020-11-26 18:09:30 +0300 |
commit | 2eaa60e4555bb11ad5c0af905217f0fa61cf7cc9 (patch) | |
tree | 0b0096203355150802fb8f7f4fe208b41b5bed68 /qa | |
parent | 142890d5bbefa7b1e1b30f263f9ad67d9d496d29 (diff) |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'qa')
-rw-r--r-- | qa/qa.rb | 6 | ||||
-rw-r--r-- | qa/qa/page/project/settings/services/jenkins.rb | 54 | ||||
-rw-r--r-- | qa/qa/specs/features/browser_ui/3_create/jenkins/jenkins_build_status_spec.rb | 156 |
3 files changed, 212 insertions, 4 deletions
@@ -307,14 +307,12 @@ module QA module Services autoload :Jira, 'qa/page/project/settings/services/jira' + autoload :Jenkins, 'qa/page/project/settings/services/jenkins' + autoload :Prometheus, 'qa/page/project/settings/services/prometheus' end autoload :Operations, 'qa/page/project/settings/operations' autoload :Incidents, 'qa/page/project/settings/incidents' autoload :Integrations, 'qa/page/project/settings/integrations' - - module Services - autoload :Prometheus, 'qa/page/project/settings/services/prometheus' - end end module SubMenus diff --git a/qa/qa/page/project/settings/services/jenkins.rb b/qa/qa/page/project/settings/services/jenkins.rb new file mode 100644 index 00000000000..3d7da8d0161 --- /dev/null +++ b/qa/qa/page/project/settings/services/jenkins.rb @@ -0,0 +1,54 @@ +# frozen_string_literal: true + +module QA + module Page + module Project + module Settings + module Services + class Jenkins < QA::Page::Base + view 'app/assets/javascripts/integrations/edit/components/dynamic_field.vue' do + element :jenkins_url_field, ':data-qa-selector="`${fieldId}_field`"' # rubocop:disable QA/ElementWithPattern + element :project_name_field, ':data-qa-selector="`${fieldId}_field`"' # rubocop:disable QA/ElementWithPattern + element :username_field, ':data-qa-selector="`${fieldId}_field`"' # rubocop:disable QA/ElementWithPattern + element :password_field, ':data-qa-selector="`${fieldId}_field`"' # rubocop:disable QA/ElementWithPattern + end + + view 'app/assets/javascripts/integrations/edit/components/integration_form.vue' do + element :save_changes_button + end + + def setup_service_with(jenkins_url:, project_name:) + set_jenkins_url(jenkins_url) + set_project_name(project_name) + set_username('admin') + set_password('password') + click_save_changes_button + end + + private + + def set_jenkins_url(jenkins_url) + fill_element(:jenkins_url_field, jenkins_url) + end + + def set_project_name(project_name) + fill_element(:project_name_field, project_name) + end + + def set_username(username) + fill_element(:username_field, username) + end + + def set_password(password) + fill_element(:password_field, password) + end + + def click_save_changes_button + click_element :save_changes_button + end + end + end + end + end + end +end diff --git a/qa/qa/specs/features/browser_ui/3_create/jenkins/jenkins_build_status_spec.rb b/qa/qa/specs/features/browser_ui/3_create/jenkins/jenkins_build_status_spec.rb new file mode 100644 index 00000000000..2889875cf24 --- /dev/null +++ b/qa/qa/specs/features/browser_ui/3_create/jenkins/jenkins_build_status_spec.rb @@ -0,0 +1,156 @@ +# frozen_string_literal: true +require 'securerandom' + +module QA + RSpec.describe 'Create', :requires_admin, :skip_live_env, quarantine: { issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/195179', type: :flaky } do + describe 'Jenkins integration' do + let(:project_name) { "project_with_jenkins_#{SecureRandom.hex(4)}" } + + let(:project) do + Resource::Project.fabricate_via_api! do |project| + project.name = project_name + project.initialize_with_readme = true + project.auto_devops_enabled = false + end + end + + before do + jenkins_server = run_jenkins_server + + Vendor::Jenkins::Page::Base.host = jenkins_server.host_address + + Runtime::Env.personal_access_token ||= fabricate_personal_access_token + + allow_requests_to_local_networks + + setup_jenkins + end + + it 'integrates and displays build status for MR pipeline in GitLab', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/719' do + login_to_gitlab + + setup_project_integration_with_jenkins + + expect(page).to have_text("Jenkins CI activated.") + + QA::Support::Retrier.retry_on_exception do + Resource::Repository::ProjectPush.fabricate! do |push| + push.project = project + push.branch_name = 'master' + push.new_branch = false + push.file_name = "file_#{SecureRandom.hex(4)}.txt" + end + + Vendor::Jenkins::Page::LastJobConsole.perform do |job_console| + job_console.job_name = project_name + + job_console.visit! + + Support::Waiter.wait_until(sleep_interval: 2, reload_page: page) do + job_console.has_successful_build? && job_console.no_failed_status_update? + end + end + + project.visit! + + Flow::Pipeline.visit_latest_pipeline + + Page::Project::Pipeline::Show.perform do |show| + expect(show).to have_build('jenkins', status: :success, wait: 15) + end + end + end + + after do + remove_jenkins_server + end + + def setup_jenkins + Vendor::Jenkins::Page::Login.perform do |login_page| + login_page.visit! + login_page.login + end + + token_description = "token-#{SecureRandom.hex(8)}" + + Vendor::Jenkins::Page::NewCredentials.perform do |new_credentials| + new_credentials.visit_and_set_gitlab_api_token(Runtime::Env.personal_access_token, token_description) + end + + Vendor::Jenkins::Page::Configure.perform do |configure| + configure.visit_and_setup_gitlab_connection(patch_host_name(Runtime::Scenario.gitlab_address, 'gitlab'), token_description) do + configure.click_test_connection + expect(configure).to have_success + end + end + + Vendor::Jenkins::Page::NewJob.perform do |new_job| + new_job.visit_and_create_new_job_with_name(project_name) + end + + Vendor::Jenkins::Page::ConfigureJob.perform do |configure_job| + configure_job.job_name = project_name + configure_job.configure(scm_url: patch_host_name(project.repository_http_location.git_uri, 'gitlab')) + end + end + + def run_jenkins_server + Service::DockerRun::Jenkins.new.tap do |runner| + runner.pull + runner.register! + end + end + + def remove_jenkins_server + Service::DockerRun::Jenkins.new.remove! + end + + def fabricate_personal_access_token + login_to_gitlab + + token = Resource::PersonalAccessToken.fabricate!.access_token + Page::Main::Menu.perform(&:sign_out) + token + end + + def login_to_gitlab + Flow::Login.sign_in + end + + def patch_host_name(host_name, container_name) + return host_name unless host_name.include?('localhost') + + ip_address = `docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' #{container_name}`.strip + host_name.gsub('localhost', ip_address) + end + + def setup_project_integration_with_jenkins + project.visit! + + Page::Project::Menu.perform(&:click_project) + Page::Project::Menu.perform(&:go_to_integrations_settings) + Page::Project::Settings::Integrations.perform(&:click_jenkins_ci_link) + + QA::Page::Project::Settings::Services::Jenkins.perform do |jenkins| + jenkins.setup_service_with(jenkins_url: patch_host_name(Vendor::Jenkins::Page::Base.host, 'jenkins-server'), + project_name: project_name) + end + end + + def allow_requests_to_local_networks + Page::Main::Menu.perform(&:sign_out_if_signed_in) + Flow::Login.sign_in_as_admin + Page::Main::Menu.perform(&:go_to_admin_area) + Page::Admin::Menu.perform(&:go_to_network_settings) + + Page::Admin::Settings::Network.perform do |network| + network.expand_outbound_requests do |outbound_requests| + outbound_requests.allow_requests_to_local_network_from_services + end + end + + Page::Main::Menu.perform(&:sign_out) + end + end + end +end |