diff --git a/CHANGELOG b/CHANGELOG index 1f778c69c96f7de3d32fd11c9c4f906f4ea20ec3..f6d39b28c3bcc866d8e15883a81104a262d6c827 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -26,6 +26,7 @@ v 8.10.0 (unreleased) - Add a new column `artifacts_size` to table `ci_builds` !4964 - Let Workhorse serve format-patch diffs - Display tooltip for mentioned users and groups !5261 (winniehell) + - Allow build email service to be tested - Added day name to contribution calendar tooltips - Make images fit to the size of the viewport !4810 - Fix check for New Branch button on Issue page !4630 (winniehell) diff --git a/app/controllers/projects/services_controller.rb b/app/controllers/projects/services_controller.rb index 739681f4085b8e4594c3e2f47183760340dd4cec..1b91882048e3626313b6344abaf272ad66fc3857 100644 --- a/app/controllers/projects/services_controller.rb +++ b/app/controllers/projects/services_controller.rb @@ -45,8 +45,9 @@ class Projects::ServicesController < Projects::ApplicationController end def test - data = Gitlab::PushDataBuilder.build_sample(project, current_user) + data = @service.test_data(project, current_user) outcome = @service.test(data) + if outcome[:success] message = { notice: 'We sent a request to the provided URL' } else diff --git a/app/mailers/emails/builds.rb b/app/mailers/emails/builds.rb index 2f86d1be57625ee969cebef8b1e15c70b862ad91..3853af6201ac9509fc963581f2e586ba91efa727 100644 --- a/app/mailers/emails/builds.rb +++ b/app/mailers/emails/builds.rb @@ -6,6 +6,7 @@ module Emails add_project_headers add_build_headers('failed') + mail(to: to, subject: subject("Build failed for #{@project.name}", @build.short_sha)) end diff --git a/app/models/project_services/builds_email_service.rb b/app/models/project_services/builds_email_service.rb index 54da4d74fc5b21f7f45fcab78d25a1009da9c180..5e166471077ca69cf939591f81f74d9d8fca78b4 100644 --- a/app/models/project_services/builds_email_service.rb +++ b/app/models/project_services/builds_email_service.rb @@ -42,6 +42,19 @@ class BuildsEmailService < Service end end + def can_test? + project.builds.count > 0 + end + + def disabled_title + "Please setup a build on your repository." + end + + def test_data(project = nil, user = nil) + build = project.builds.last + Gitlab::BuildDataBuilder.build(build) + end + def fields [ { type: 'textarea', name: 'recipients', placeholder: 'Emails separated by comma' }, @@ -50,6 +63,20 @@ class BuildsEmailService < Service ] end + def test(data) + begin + # bypass build status verification when testing + data[:build_status] = "failed" + data[:build_allow_failure] = false + + result = execute(data) + rescue StandardError => error + return { success: false, result: error } + end + + { success: true, result: result } + end + def should_build_be_notified?(data) case data[:build_status] when 'success' diff --git a/app/models/service.rb b/app/models/service.rb index d7a32c282679221a095f523ee0b6bdb08e2517c3..5432f8c7ab43ebb648fda1ab30a183da61972e84 100644 --- a/app/models/service.rb +++ b/app/models/service.rb @@ -76,6 +76,10 @@ class Service < ActiveRecord::Base [] end + def test_data(project, user) + Gitlab::PushDataBuilder.build_sample(project, user) + end + def supported_events %w(push tag_push issue merge_request wiki_page) end @@ -94,6 +98,11 @@ class Service < ActiveRecord::Base !project.empty_repo? end + # reason why service cannot be tested + def disabled_title + "Please setup a project repository." + end + # Provide convenient accessor methods # for each serialized property. # Also keep track of updated properties in a similar way as ActiveModel::Dirty diff --git a/app/views/projects/services/_form.html.haml b/app/views/projects/services/_form.html.haml index 1f13ea28b4e14243597fbe9517e3e2ad2c35c9fb..166dc4a01fc3dadb96714fa1723018ecd6f28b4d 100644 --- a/app/views/projects/services/_form.html.haml +++ b/app/views/projects/services/_form.html.haml @@ -12,5 +12,5 @@ - if @service.valid? && @service.activated? - disabled = @service.can_test? ? '':'disabled' - = link_to 'Test settings', test_namespace_project_service_path(@project.namespace, @project, @service.to_param), class: "btn #{disabled}" + = link_to 'Test settings', test_namespace_project_service_path(@project.namespace, @project, @service), class: "btn #{disabled}", title: @service.disabled_title = link_to "Cancel", namespace_project_services_path(@project.namespace, @project), class: "btn btn-cancel" diff --git a/spec/models/project_services/builds_email_service_spec.rb b/spec/models/project_services/builds_email_service_spec.rb index 236df8f047df335a682329594893cde6110c1311..ca2cd8aa551f7727cb045a1a83ca5da0275fe6a7 100644 --- a/spec/models/project_services/builds_email_service_spec.rb +++ b/spec/models/project_services/builds_email_service_spec.rb @@ -23,6 +23,44 @@ describe BuildsEmailService do end end + describe '#test_data' do + let(:build) { create(:ci_build) } + let(:project) { build.project } + let(:user) { create(:user) } + + before { project.team << [user, :developer] } + + it 'builds test data' do + data = subject.test_data(project) + + expect(data[:object_kind]).to eq("build") + end + end + + describe '#test' do + it 'sends email' do + data = Gitlab::BuildDataBuilder.build(create(:ci_build)) + subject.recipients = 'test@gitlab.com' + + expect(BuildEmailWorker).to receive(:perform_async) + + subject.test(data) + end + + context 'notify only failed builds is true' do + it 'sends email' do + data = Gitlab::BuildDataBuilder.build(create(:ci_build)) + data[:build_status] = "success" + subject.recipients = 'test@gitlab.com' + + expect(subject).not_to receive(:notify_only_broken_builds) + expect(BuildEmailWorker).to receive(:perform_async) + + subject.test(data) + end + end + end + describe '#execute' do it 'sends email' do subject.recipients = 'test@gitlab.com'