Merge branch 'zj-chat-notification-default-branch' into 'master'
Allow chat notifications only for the default branch Closes #28565 and #18088 See merge request !10158
This commit is contained in:
commit
fcde4d2dd1
6 changed files with 58 additions and 25 deletions
|
@ -6,7 +6,7 @@ class ChatNotificationService < Service
|
|||
default_value_for :category, 'chat'
|
||||
|
||||
prop_accessor :webhook, :username, :channel
|
||||
boolean_accessor :notify_only_broken_pipelines
|
||||
boolean_accessor :notify_only_broken_pipelines, :notify_only_default_branch
|
||||
|
||||
validates :webhook, presence: true, url: true, if: :activated?
|
||||
|
||||
|
@ -17,6 +17,7 @@ class ChatNotificationService < Service
|
|||
if properties.nil?
|
||||
self.properties = {}
|
||||
self.notify_only_broken_pipelines = true
|
||||
self.notify_only_default_branch = true
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -29,6 +30,19 @@ class ChatNotificationService < Service
|
|||
pipeline wiki_page]
|
||||
end
|
||||
|
||||
def fields
|
||||
default_fields + build_event_channels
|
||||
end
|
||||
|
||||
def default_fields
|
||||
[
|
||||
{ type: 'text', name: 'webhook', placeholder: "e.g. #{webhook_placeholder}" },
|
||||
{ type: 'text', name: 'username', placeholder: 'e.g. GitLab' },
|
||||
{ type: 'checkbox', name: 'notify_only_broken_pipelines' },
|
||||
{ type: 'checkbox', name: 'notify_only_default_branch' },
|
||||
]
|
||||
end
|
||||
|
||||
def execute(data)
|
||||
return unless supported_events.include?(data[:object_kind])
|
||||
return unless webhook.present?
|
||||
|
@ -123,6 +137,17 @@ class ChatNotificationService < Service
|
|||
end
|
||||
|
||||
def should_pipeline_be_notified?(data)
|
||||
notify_for_ref?(data) && notify_for_pipeline?(data)
|
||||
end
|
||||
|
||||
def notify_for_ref?(data)
|
||||
return true if data[:object_attributes][:tag]
|
||||
return true unless notify_only_default_branch
|
||||
|
||||
data[:object_attributes][:ref] == project.default_branch
|
||||
end
|
||||
|
||||
def notify_for_pipeline?(data)
|
||||
case data[:object_attributes][:status]
|
||||
when 'success'
|
||||
!notify_only_broken_pipelines?
|
||||
|
|
|
@ -22,19 +22,11 @@ class MattermostService < ChatNotificationService
|
|||
</ol>'
|
||||
end
|
||||
|
||||
def fields
|
||||
default_fields + build_event_channels
|
||||
end
|
||||
|
||||
def default_fields
|
||||
[
|
||||
{ type: 'text', name: 'webhook', placeholder: 'e.g. http://mattermost_host/hooks/…' },
|
||||
{ type: 'text', name: 'username', placeholder: 'e.g. GitLab' },
|
||||
{ type: 'checkbox', name: 'notify_only_broken_pipelines' },
|
||||
]
|
||||
end
|
||||
|
||||
def default_channel_placeholder
|
||||
"Channel handle (e.g. town-square)"
|
||||
end
|
||||
|
||||
def webhook_placeholder
|
||||
'http://mattermost.example.com/hooks/…'
|
||||
end
|
||||
end
|
||||
|
|
|
@ -21,19 +21,11 @@ class SlackService < ChatNotificationService
|
|||
</ol>'
|
||||
end
|
||||
|
||||
def fields
|
||||
default_fields + build_event_channels
|
||||
end
|
||||
|
||||
def default_fields
|
||||
[
|
||||
{ type: 'text', name: 'webhook', placeholder: 'e.g. https://hooks.slack.com/services/…' },
|
||||
{ type: 'text', name: 'username', placeholder: 'e.g. GitLab' },
|
||||
{ type: 'checkbox', name: 'notify_only_broken_pipelines' },
|
||||
]
|
||||
end
|
||||
|
||||
def default_channel_placeholder
|
||||
"Channel name (e.g. general)"
|
||||
end
|
||||
|
||||
def webhook_placeholder
|
||||
'https://hooks.slack.com/services/…'
|
||||
end
|
||||
end
|
||||
|
|
|
@ -0,0 +1,4 @@
|
|||
---
|
||||
title: Only send chat notifications for the default branch
|
||||
merge_request:
|
||||
author:
|
|
@ -34,6 +34,7 @@ feature 'Admin updates settings', feature: true do
|
|||
fill_in 'Username', with: 'test_user'
|
||||
fill_in 'service_push_channel', with: '#test_channel'
|
||||
page.check('Notify only broken pipelines')
|
||||
page.check('Notify only default branch')
|
||||
|
||||
check_all_events
|
||||
click_on 'Save'
|
||||
|
|
|
@ -324,5 +324,24 @@ RSpec.shared_examples 'slack or mattermost notifications' do
|
|||
it_behaves_like 'call Slack/Mattermost API'
|
||||
end
|
||||
end
|
||||
|
||||
context 'only notify for the default branch' do
|
||||
context 'when enabled' do
|
||||
let(:pipeline) do
|
||||
create(:ci_pipeline, project: project, status: 'failed', ref: 'not-the-default-branch')
|
||||
end
|
||||
|
||||
before do
|
||||
chat_service.notify_only_default_branch = true
|
||||
end
|
||||
|
||||
it 'does not call the Slack/Mattermost API for pipeline events' do
|
||||
data = Gitlab::DataBuilder::Pipeline.build(pipeline)
|
||||
result = chat_service.execute(data)
|
||||
|
||||
expect(result).to be_falsy
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
Loading…
Reference in a new issue