summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStan Hu <stanhu@gmail.com>2015-02-19 05:02:57 +0000
committerDouwe Maan <douwe@gitlab.com>2015-03-03 11:14:31 +0100
commitafe5d7d209a4088d71e35d6382e6523b89f94ebe (patch)
treea3432580bee64e1c9f30b0815426c31e3220d021
parent2f4656b5c7e2a9b351237432e76a7b928a1684b1 (diff)
downloadgitlab-ce-afe5d7d209a4088d71e35d6382e6523b89f94ebe.tar.gz
Issue #595: Support Slack notifications upon issue and merge request events
1) Adds a DB migration for all services to toggle on push, issue, and merge events. 2) Upon an issue or merge request event, fire service hooks. 3) Slack service supports custom messages for each of these events. Other services not supported at the moment. 4) Label merge request hooks with their corresponding actions.
-rw-r--r--CHANGELOG3
-rw-r--r--app/controllers/projects/services_controller.rb3
-rw-r--r--app/models/project.rb5
-rw-r--r--app/models/project_services/asana_service.rb7
-rw-r--r--app/models/project_services/assembla_service.rb11
-rw-r--r--app/models/project_services/bamboo_service.rb9
-rw-r--r--app/models/project_services/buildbox_service.rb7
-rw-r--r--app/models/project_services/campfire_service.rb7
-rw-r--r--app/models/project_services/ci_service.rb4
-rw-r--r--app/models/project_services/emails_on_push_service.rb7
-rw-r--r--app/models/project_services/flowdock_service.rb7
-rw-r--r--app/models/project_services/gemnasium_service.rb7
-rw-r--r--app/models/project_services/gitlab_ci_service.rb4
-rw-r--r--app/models/project_services/gitlab_issue_tracker_service.rb4
-rw-r--r--app/models/project_services/hipchat_service.rb7
-rw-r--r--app/models/project_services/issue_tracker_service.rb7
-rw-r--r--app/models/project_services/jira_service.rb4
-rw-r--r--app/models/project_services/pivotaltracker_service.rb7
-rw-r--r--app/models/project_services/pushover_service.rb7
-rw-r--r--app/models/project_services/redmine_service.rb4
-rw-r--r--app/models/project_services/slack_message.rb110
-rw-r--r--app/models/project_services/slack_messages/slack_base_message.rb31
-rw-r--r--app/models/project_services/slack_messages/slack_issue_message.rb56
-rw-r--r--app/models/project_services/slack_messages/slack_merge_message.rb54
-rw-r--r--app/models/project_services/slack_messages/slack_push_message.rb110
-rw-r--r--app/models/project_services/slack_service.rb38
-rw-r--r--app/models/project_services/teamcity_service.rb11
-rw-r--r--app/models/service.rb14
-rw-r--r--app/services/git_push_service.rb2
-rw-r--r--app/services/issues/base_service.rb12
-rw-r--r--app/services/merge_requests/base_service.rb16
-rw-r--r--app/views/projects/services/_form.html.haml32
-rw-r--r--db/migrate/20150219004514_add_events_to_services.rb8
-rw-r--r--db/schema.rb8
-rw-r--r--lib/gitlab/push_data_builder.rb1
-rw-r--r--spec/models/project_services/assembla_service_spec.rb20
-rw-r--r--spec/models/project_services/buildbox_service_spec.rb20
-rw-r--r--spec/models/project_services/flowdock_service_spec.rb20
-rw-r--r--spec/models/project_services/gemnasium_service_spec.rb20
-rw-r--r--spec/models/project_services/gitlab_ci_service_spec.rb20
-rw-r--r--spec/models/project_services/pushover_service_spec.rb20
-rw-r--r--spec/models/project_services/slack_messages/slack_issue_message_spec.rb55
-rw-r--r--spec/models/project_services/slack_messages/slack_merge_message_spec.rb50
-rw-r--r--spec/models/project_services/slack_messages/slack_push_message_spec.rb (renamed from spec/models/project_services/slack_message_spec.rb)4
-rw-r--r--spec/models/project_services/slack_service_spec.rb59
-rw-r--r--spec/models/service_spec.rb4
-rw-r--r--spec/services/git_push_service_spec.rb1
47 files changed, 722 insertions, 195 deletions
diff --git a/CHANGELOG b/CHANGELOG
index 6a28772097e..8011817d0ae 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,4 +1,7 @@
Please view this file on the master branch, on stable branches it's out of date.
+v 7.9.0 (unreleased)
+ - Added issue and merge request events to Slack service (Stan Hu)
+ - Fix broken access control for note attachments (Hannes Rosenögger)
v 7.9.0 (unreleased)
- Move labels/milestones tabs to sidebar
diff --git a/app/controllers/projects/services_controller.rb b/app/controllers/projects/services_controller.rb
index 82aad329c1a..087579de106 100644
--- a/app/controllers/projects/services_controller.rb
+++ b/app/controllers/projects/services_controller.rb
@@ -51,7 +51,8 @@ class Projects::ServicesController < Projects::ApplicationController
:user_key, :device, :priority, :sound, :bamboo_url, :username, :password,
:build_key, :server, :teamcity_url, :build_type,
:description, :issues_url, :new_issue_url, :restrict_to_branch, :channel,
- :colorize_messages, :channels
+ :colorize_messages, :channels,
+ :push_events, :issues_events, :merge_requests_events, :tag_push_events
)
end
end
diff --git a/app/models/project.rb b/app/models/project.rb
index 907f331d8f1..c45338bf4eb 100644
--- a/app/models/project.rb
+++ b/app/models/project.rb
@@ -479,8 +479,9 @@ class Project < ActiveRecord::Base
end
end
- def execute_services(data)
- services.select(&:active).each do |service|
+ def execute_services(data, hooks_scope = :push_hooks)
+ # Call only service hooks that are active for this scope
+ services.send(hooks_scope).each do |service|
service.async_execute(data)
end
end
diff --git a/app/models/project_services/asana_service.rb b/app/models/project_services/asana_service.rb
index 66b72572b9c..2b530390aeb 100644
--- a/app/models/project_services/asana_service.rb
+++ b/app/models/project_services/asana_service.rb
@@ -11,6 +11,10 @@
# active :boolean default(FALSE), not null
# properties :text
# template :boolean default(FALSE)
+# push_events :boolean default(TRUE)
+# issues_events :boolean default(TRUE)
+# merge_requests_events :boolean default(TRUE)
+# tag_push_events :boolean default(TRUE)
#
require 'asana'
@@ -62,6 +66,9 @@ automatically inspected. Leave blank to include all branches.'
end
def execute(push)
+ object_kind = push[:object_kind]
+ return unless object_kind == "push"
+
Asana.configure do |client|
client.api_key = api_key
end
diff --git a/app/models/project_services/assembla_service.rb b/app/models/project_services/assembla_service.rb
index cf7598f35eb..01c647c1705 100644
--- a/app/models/project_services/assembla_service.rb
+++ b/app/models/project_services/assembla_service.rb
@@ -11,6 +11,10 @@
# active :boolean default(FALSE), not null
# properties :text
# template :boolean default(FALSE)
+# push_events :boolean default(TRUE)
+# issues_events :boolean default(TRUE)
+# merge_requests_events :boolean default(TRUE)
+# tag_push_events :boolean default(TRUE)
#
class AssemblaService < Service
@@ -38,8 +42,11 @@ class AssemblaService < Service
]
end
- def execute(push)
+ def execute(data)
+ object_kind = data[:object_kind]
+ return unless object_kind == "push"
+
url = "https://atlas.assembla.com/spaces/#{subdomain}/github_tool?secret_key=#{token}"
- AssemblaService.post(url, body: { payload: push }.to_json, headers: { 'Content-Type' => 'application/json' })
+ AssemblaService.post(url, body: { payload: data }.to_json, headers: { 'Content-Type' => 'application/json' })
end
end
diff --git a/app/models/project_services/bamboo_service.rb b/app/models/project_services/bamboo_service.rb
index df68803152f..6ff52af040d 100644
--- a/app/models/project_services/bamboo_service.rb
+++ b/app/models/project_services/bamboo_service.rb
@@ -11,6 +11,10 @@
# active :boolean default(FALSE), not null
# properties :text
# template :boolean default(FALSE)
+# push_events :boolean default(TRUE)
+# issues_events :boolean default(TRUE)
+# merge_requests_events :boolean default(TRUE)
+# tag_push_events :boolean default(TRUE)
#
class BambooService < CiService
@@ -118,7 +122,10 @@ class BambooService < CiService
end
end
- def execute(_data)
+ def execute(data)
+ object_kind = data[:object_kind]
+ return unless object_kind == "push"
+
# Bamboo requires a GET and does not take any data.
self.class.get("#{bamboo_url}/updateAndBuild.action?buildKey=#{build_key}",
verify: false)
diff --git a/app/models/project_services/buildbox_service.rb b/app/models/project_services/buildbox_service.rb
index 058c890ae45..201bfc560a3 100644
--- a/app/models/project_services/buildbox_service.rb
+++ b/app/models/project_services/buildbox_service.rb
@@ -11,6 +11,10 @@
# active :boolean default(FALSE), not null
# properties :text
# template :boolean default(FALSE)
+# push_events :boolean default(TRUE)
+# issues_events :boolean default(TRUE)
+# merge_requests_events :boolean default(TRUE)
+# tag_push_events :boolean default(TRUE)
#
require "addressable/uri"
@@ -33,6 +37,9 @@ class BuildboxService < CiService
end
def execute(data)
+ object_kind = data[:object_kind]
+ return unless object_kind == "push"
+
service_hook.execute(data)
end
diff --git a/app/models/project_services/campfire_service.rb b/app/models/project_services/campfire_service.rb
index 14b6b87a0b7..41ab6c56ad8 100644
--- a/app/models/project_services/campfire_service.rb
+++ b/app/models/project_services/campfire_service.rb
@@ -11,6 +11,10 @@
# active :boolean default(FALSE), not null
# properties :text
# template :boolean default(FALSE)
+# push_events :boolean default(TRUE)
+# issues_events :boolean default(TRUE)
+# merge_requests_events :boolean default(TRUE)
+# tag_push_events :boolean default(TRUE)
#
class CampfireService < Service
@@ -38,6 +42,9 @@ class CampfireService < Service
end
def execute(push_data)
+ object_kind = push_data[:object_kind]
+ return unless object_kind == "push"
+
room = gate.find_room_by_name(self.room)
return true unless room
diff --git a/app/models/project_services/ci_service.rb b/app/models/project_services/ci_service.rb
index 5a26c25b3c3..e58d6d7a233 100644
--- a/app/models/project_services/ci_service.rb
+++ b/app/models/project_services/ci_service.rb
@@ -11,6 +11,10 @@
# active :boolean default(FALSE), not null
# properties :text
# template :boolean default(FALSE)
+# push_events :boolean
+# issues_events :boolean
+# merge_requests_events :boolean
+# tag_push_events :boolean
#
# Base class for CI services
diff --git a/app/models/project_services/emails_on_push_service.rb b/app/models/project_services/emails_on_push_service.rb
index 86693ad0c7e..28be15c3b35 100644
--- a/app/models/project_services/emails_on_push_service.rb
+++ b/app/models/project_services/emails_on_push_service.rb
@@ -11,6 +11,10 @@
# active :boolean default(FALSE), not null
# properties :text
# template :boolean default(FALSE)
+# push_events :boolean
+# issues_events :boolean
+# merge_requests_events :boolean
+# tag_push_events :boolean
#
class EmailsOnPushService < Service
@@ -30,6 +34,9 @@ class EmailsOnPushService < Service
end
def execute(push_data)
+ object_kind = push_data[:object_kind]
+ return unless object_kind == "push"
+
EmailsOnPushWorker.perform_async(project_id, recipients, push_data)
end
diff --git a/app/models/project_services/flowdock_service.rb b/app/models/project_services/flowdock_service.rb
index 13e2dfceb1a..9cc0e367882 100644
--- a/app/models/project_services/flowdock_service.rb
+++ b/app/models/project_services/flowdock_service.rb
@@ -11,6 +11,10 @@
# active :boolean default(FALSE), not null
# properties :text
# template :boolean default(FALSE)
+# push_events :boolean
+# issues_events :boolean
+# merge_requests_events :boolean
+# tag_push_events :boolean
#
require "flowdock-git-hook"
@@ -38,6 +42,9 @@ class FlowdockService < Service
end
def execute(push_data)
+ object_kind = push_data[:object_kind]
+ return unless object_kind == "push"
+
Flowdock::Git.post(
push_data[:ref],
push_data[:before],
diff --git a/app/models/project_services/gemnasium_service.rb b/app/models/project_services/gemnasium_service.rb
index a2c87ae88f1..130c9eaeb4b 100644
--- a/app/models/project_services/gemnasium_service.rb
+++ b/app/models/project_services/gemnasium_service.rb
@@ -11,6 +11,10 @@
# active :boolean default(FALSE), not null
# properties :text
# template :boolean default(FALSE)
+# push_events :boolean
+# issues_events :boolean
+# merge_requests_events :boolean
+# tag_push_events :boolean
#
require "gemnasium/gitlab_service"
@@ -39,6 +43,9 @@ class GemnasiumService < Service
end
def execute(push_data)
+ object_kind = push_data[:object_kind]
+ return unless object_kind == "push"
+
Gemnasium::GitlabService.execute(
ref: push_data[:ref],
before: push_data[:before],
diff --git a/app/models/project_services/gitlab_ci_service.rb b/app/models/project_services/gitlab_ci_service.rb
index f4b463e8199..a64b24b5ef1 100644
--- a/app/models/project_services/gitlab_ci_service.rb
+++ b/app/models/project_services/gitlab_ci_service.rb
@@ -11,6 +11,10 @@
# active :boolean default(FALSE), not null
# properties :text
# template :boolean default(FALSE)
+# push_events :boolean
+# issues_events :boolean
+# merge_requests_events :boolean
+# tag_push_events :boolean
#
class GitlabCiService < CiService
diff --git a/app/models/project_services/gitlab_issue_tracker_service.rb b/app/models/project_services/gitlab_issue_tracker_service.rb
index 05c048e4e45..00f8d430fd5 100644
--- a/app/models/project_services/gitlab_issue_tracker_service.rb
+++ b/app/models/project_services/gitlab_issue_tracker_service.rb
@@ -11,6 +11,10 @@
# active :boolean default(FALSE), not null
# properties :text
# template :boolean default(FALSE)
+# push_events :boolean default(TRUE)
+# issues_events :boolean default(TRUE)
+# merge_requests_events :boolean default(TRUE)
+# tag_push_events :boolean default(TRUE)
#
class GitlabIssueTrackerService < IssueTrackerService
diff --git a/app/models/project_services/hipchat_service.rb b/app/models/project_services/hipchat_service.rb
index 003e06a4c80..462478812a1 100644
--- a/app/models/project_services/hipchat_service.rb
+++ b/app/models/project_services/hipchat_service.rb
@@ -11,6 +11,10 @@
# active :boolean default(FALSE), not null
# properties :text
# template :boolean default(FALSE)
+# push_events :boolean
+# issues_events :boolean
+# merge_requests_events :boolean
+# tag_push_events :boolean
#
class HipchatService < Service
@@ -41,6 +45,9 @@ class HipchatService < Service
end
def execute(push_data)
+ object_kind = push_data.fetch(:object_kind)
+ return unless object_kind == "push"
+
gate[room].send('GitLab', create_message(push_data))
end
diff --git a/app/models/project_services/issue_tracker_service.rb b/app/models/project_services/issue_tracker_service.rb
index c991a34ecdb..0d9e5c13992 100644
--- a/app/models/project_services/issue_tracker_service.rb
+++ b/app/models/project_services/issue_tracker_service.rb
@@ -11,6 +11,10 @@
# active :boolean default(FALSE), not null
# properties :text
# template :boolean default(FALSE)
+# push_events :boolean default(TRUE)
+# issues_events :boolean default(TRUE)
+# merge_requests_events :boolean default(TRUE)
+# tag_push_events :boolean default(TRUE)
#
class IssueTrackerService < Service
@@ -66,6 +70,9 @@ class IssueTrackerService < Service
end
def execute(data)
+ object_kind = data[:object_kind]
+ return unless object_kind == "push"
+
message = "#{self.type} was unable to reach #{self.project_url}. Check the url and try again."
result = false
diff --git a/app/models/project_services/jira_service.rb b/app/models/project_services/jira_service.rb
index 4c056605ea8..20611eeb60c 100644
--- a/app/models/project_services/jira_service.rb
+++ b/app/models/project_services/jira_service.rb
@@ -11,6 +11,10 @@
# active :boolean default(FALSE), not null
# properties :text
# template :boolean default(FALSE)
+# push_events :boolean default(TRUE)
+# issues_events :boolean default(TRUE)
+# merge_requests_events :boolean default(TRUE)
+# tag_push_events :boolean default(TRUE)
#
class JiraService < IssueTrackerService
diff --git a/app/models/project_services/pivotaltracker_service.rb b/app/models/project_services/pivotaltracker_service.rb
index 287812c57a5..4bb2a978ed1 100644
--- a/app/models/project_services/pivotaltracker_service.rb
+++ b/app/models/project_services/pivotaltracker_service.rb
@@ -11,6 +11,10 @@
# active :boolean default(FALSE), not null
# properties :text
# template :boolean default(FALSE)
+# push_events :boolean default(TRUE)
+# issues_events :boolean default(TRUE)
+# merge_requests_events :boolean default(TRUE)
+# tag_push_events :boolean default(TRUE)
#
class PivotaltrackerService < Service
@@ -38,6 +42,9 @@ class PivotaltrackerService < Service
end
def execute(push)
+ object_kind = push[:object_kind]
+ return unless object_kind == "push"
+
url = 'https://www.pivotaltracker.com/services/v5/source_commits'
push[:commits].each do |commit|
message = {
diff --git a/app/models/project_services/pushover_service.rb b/app/models/project_services/pushover_service.rb
index 3a3af59390a..4aa7e0afa77 100644
--- a/app/models/project_services/pushover_service.rb
+++ b/app/models/project_services/pushover_service.rb
@@ -11,6 +11,10 @@
# active :boolean default(FALSE), not null
# properties :text
# template :boolean default(FALSE)
+# push_events :boolean default(TRUE)
+# issues_events :boolean default(TRUE)
+# merge_requests_events :boolean default(TRUE)
+# tag_push_events :boolean default(TRUE)
#
class PushoverService < Service
@@ -77,6 +81,9 @@ class PushoverService < Service
end
def execute(push_data)
+ object_kind = push_data[:object_kind]
+ return unless object_kind == "push"
+
ref = push_data[:ref].gsub('refs/heads/', '')
before = push_data[:before]
after = push_data[:after]
diff --git a/app/models/project_services/redmine_service.rb b/app/models/project_services/redmine_service.rb
index e1dc10415e0..f96eae2daa1 100644
--- a/app/models/project_services/redmine_service.rb
+++ b/app/models/project_services/redmine_service.rb
@@ -11,6 +11,10 @@
# active :boolean default(FALSE), not null
# properties :text
# template :boolean default(FALSE)
+# push_events :boolean default(TRUE)
+# issues_events :boolean default(TRUE)
+# merge_requests_events :boolean default(TRUE)
+# tag_push_events :boolean default(TRUE)
#
class RedmineService < IssueTrackerService
diff --git a/app/models/project_services/slack_message.rb b/app/models/project_services/slack_message.rb
deleted file mode 100644
index 6c6446db45f..00000000000
--- a/app/models/project_services/slack_message.rb
+++ /dev/null
@@ -1,110 +0,0 @@
-require 'slack-notifier'
-
-class SlackMessage
- attr_reader :after
- attr_reader :before
- attr_reader :commits
- attr_reader :project_name
- attr_reader :project_url
- attr_reader :ref
- attr_reader :username
-
- def initialize(params)
- @after = params.fetch(:after)
- @before = params.fetch(:before)
- @commits = params.fetch(:commits, [])
- @project_name = params.fetch(:project_name)
- @project_url = params.fetch(:project_url)
- @ref = params.fetch(:ref).gsub('refs/heads/', '')
- @username = params.fetch(:user_name)
- end
-
- def pretext
- format(message)
- end
-
- def attachments
- return [] if new_branch? || removed_branch?
-
- commit_message_attachments
- end
-
- private
-
- def message
- if new_branch?
- new_branch_message
- elsif removed_branch?
- removed_branch_message
- else
- push_message
- end
- end
-
- def format(string)
- Slack::Notifier::LinkFormatter.format(string)
- end
-
- def new_branch_message
- "#{username} pushed new branch #{branch_link} to #{project_link}"
- end
-
- def removed_branch_message
- "#{username} removed branch #{ref} from #{project_link}"
- end
-
- def push_message
- "#{username} pushed to branch #{branch_link} of #{project_link} (#{compare_link})"
- end
-
- def commit_messages
- commits.each_with_object('') do |commit, str|
- str << compose_commit_message(commit)
- end.chomp
- end
-
- def commit_message_attachments
- [{ text: format(commit_messages), color: attachment_color }]
- end
-
- def compose_commit_message(commit)
- author = commit.fetch(:author).fetch(:name)
- id = commit.fetch(:id)[0..8]
- message = commit.fetch(:message)
- url = commit.fetch(:url)
-
- "[#{id}](#{url}): #{message} - #{author}\n"
- end
-
- def new_branch?
- before.include?('000000')
- end
-
- def removed_branch?
- after.include?('000000')
- end
-
- def branch_url
- "#{project_url}/commits/#{ref}"
- end
-
- def compare_url
- "#{project_url}/compare/#{before}...#{after}"
- end
-
- def branch_link
- "[#{ref}](#{branch_url})"
- end
-
- def project_link
- "[#{project_name}](#{project_url})"
- end
-
- def compare_link
- "[Compare changes](#{compare_url})"
- end
-
- def attachment_color
- '#345'
- end
-end
diff --git a/app/models/project_services/slack_messages/slack_base_message.rb b/app/models/project_services/slack_messages/slack_base_message.rb
new file mode 100644
index 00000000000..c2fc27884bf
--- /dev/null
+++ b/app/models/project_services/slack_messages/slack_base_message.rb
@@ -0,0 +1,31 @@
+require 'slack-notifier'
+
+module SlackMessages
+ class SlackBaseMessage
+ def initialize(params)
+ raise NotImplementedError
+ end
+
+ def pretext
+ format(message)
+ end
+
+ def attachments
+ raise NotImplementedError
+ end
+
+ private
+
+ def message
+ raise NotImplementedError
+ end
+
+ def format(string)
+ Slack::Notifier::LinkFormatter.format(string)
+ end
+
+ def attachment_color
+ '#345'
+ end
+ end
+end
diff --git a/app/models/project_services/slack_messages/slack_issue_message.rb b/app/models/project_services/slack_messages/slack_issue_message.rb
new file mode 100644
index 00000000000..0c3a492aae7
--- /dev/null
+++ b/app/models/project_services/slack_messages/slack_issue_message.rb
@@ -0,0 +1,56 @@
+module SlackMessages
+ class SlackIssueMessage < SlackBaseMessage
+ attr_reader :username
+ attr_reader :title
+ attr_reader :project_name
+ attr_reader :project_url
+ attr_reader :issue_iid
+ attr_reader :issue_url
+ attr_reader :action
+ attr_reader :state
+ attr_reader :description
+
+ def initialize(params)
+ @username = params[:user][:username]
+ @project_name = params[:project_name]
+ @project_url = params[:project_url]
+
+ obj_attr = params[:object_attributes]
+ obj_attr = HashWithIndifferentAccess.new(obj_attr)
+ @title = obj_attr[:title]
+ @issue_iid = obj_attr[:iid]
+ @issue_url = obj_attr[:url]
+ @action = obj_attr[:action]
+ @state = obj_attr[:state]
+ @description = obj_attr[:description]
+ end
+
+ def attachments
+ return [] unless opened_issue?
+
+ description_message
+ end
+
+ private
+
+ def message
+ "#{username} #{state} issue #{issue_link} in #{project_link}: #{title}"
+ end
+
+ def opened_issue?
+ action == "open"
+ end
+
+ def description_message
+ [{ text: format(description), color: attachment_color }]
+ end
+
+ def project_link
+ "[#{project_name}](#{project_url})"
+ end
+
+ def issue_link
+ "[##{issue_iid}](#{issue_url})"
+ end
+ end
+end
diff --git a/app/models/project_services/slack_messages/slack_merge_message.rb b/app/models/project_services/slack_messages/slack_merge_message.rb
new file mode 100644
index 00000000000..bc49a963a9b
--- /dev/null
+++ b/app/models/project_services/slack_messages/slack_merge_message.rb
@@ -0,0 +1,54 @@
+module SlackMessages
+ class SlackMergeMessage < SlackBaseMessage
+ attr_reader :username
+ attr_reader :project_name
+ attr_reader :project_url
+ attr_reader :merge_request_id
+ attr_reader :source_branch
+ attr_reader :target_branch
+ attr_reader :state
+
+ def initialize(params)
+ @username = params[:user][:username]
+ @project_name = params[:project_name]
+ @project_url = params[:project_url]
+
+ obj_attr = params[:object_attributes]
+ obj_attr = HashWithIndifferentAccess.new(obj_attr)
+ @merge_request_id = obj_attr[:iid]
+ @source_branch = obj_attr[:source_branch]
+ @target_branch = obj_attr[:target_branch]
+ @state = obj_attr[:state]
+ end
+
+ def pretext
+ format(message)
+ end
+
+ def attachments
+ []
+ end
+
+ private
+
+ def message
+ merge_request_message
+ end
+
+ def project_link
+ "[#{project_name}](#{project_url})"
+ end
+
+ def merge_request_message
+ "#{username} #{state} merge request #{merge_request_link} in #{project_link}"
+ end
+
+ def merge_request_link
+ "[##{merge_request_id}](#{merge_request_url})"
+ end
+
+ def merge_request_url
+ "#{project_url}/merge_requests/#{merge_request_id}"
+ end
+ end
+end
diff --git a/app/models/project_services/slack_messages/slack_push_message.rb b/app/models/project_services/slack_messages/slack_push_message.rb
new file mode 100644
index 00000000000..c7769bbeda1
--- /dev/null
+++ b/app/models/project_services/slack_messages/slack_push_message.rb
@@ -0,0 +1,110 @@
+require 'slack-notifier'
+
+module SlackMessages
+ class SlackPushMessage < SlackBaseMessage
+ attr_reader :after
+ attr_reader :before
+ attr_reader :commits
+ attr_reader :project_name
+ attr_reader :project_url
+ attr_reader :ref
+ attr_reader :username
+
+ def initialize(params)
+ @after = params[:after]
+ @before = params[:before]
+ @commits = params.fetch(:commits, [])
+ @project_name = params[:project_name]
+ @project_url = params[:project_url]
+ @ref = params[:ref].gsub('refs/heads/', '')
+ @username = params[:user_name]
+ end
+
+ def pretext
+ format(message)
+ end
+
+ def attachments
+ return [] if new_branch? || removed_branch?
+
+ commit_message_attachments
+ end
+
+ private
+
+ def message
+ if new_branch?
+ new_branch_message
+ elsif removed_branch?
+ removed_branch_message
+ else
+ push_message
+ end
+ end
+
+ def format(string)
+ Slack::Notifier::LinkFormatter.format(string)
+ end
+
+ def new_branch_message
+ "#{username} pushed new branch #{branch_link} to #{project_link}"
+ end
+
+ def removed_branch_message
+ "#{username} removed branch #{ref} from #{project_link}"
+ end
+
+ def push_message
+ "#{username} pushed to branch #{branch_link} of #{project_link} (#{compare_link})"
+ end
+
+ def commit_messages
+ commits.map { |commit| compose_commit_message(commit) }.join("\n")
+ end
+
+ def commit_message_attachments
+ [{ text: format(commit_messages), color: attachment_color }]
+ end
+
+ def compose_commit_message(commit)
+ author = commit[:author][:name]
+ id = Commit.truncate_sha(commit[:id])
+ message = commit[:message]
+ url = commit[:url]
+
+ "[#{id}](#{url}): #{message} - #{author}"
+ end
+
+ def new_branch?
+ before.include?('000000')
+ end
+
+ def removed_branch?
+ after.include?('000000')
+ end
+
+ def branch_url
+ "#{project_url}/commits/#{ref}"
+ end
+
+ def compare_url
+ "#{project_url}/compare/#{before}...#{after}"
+ end
+
+ def branch_link
+ "[#{ref}](#{branch_url})"
+ end
+
+ def project_link
+ "[#{project_name}](#{project_url})"
+ end
+
+ def compare_link
+ "[Compare changes](#{compare_url})"
+ end
+
+ def attachment_color
+ '#345'
+ end
+ end
+end
diff --git a/app/models/project_services/slack_service.rb b/app/models/project_services/slack_service.rb
index c7cbff63fe5..1318a1ed1b8 100644
--- a/app/models/project_services/slack_service.rb
+++ b/app/models/project_services/slack_service.rb
@@ -11,7 +11,14 @@
# active :boolean default(FALSE), not null
# properties :text
# template :boolean default(FALSE)
+# push_events :boolean default(TRUE)
+# issues_events :boolean default(TRUE)
+# merge_requests_events :boolean default(TRUE)
+# tag_push_events :boolean default(TRUE)
#
+require "slack_messages/slack_issue_message"
+require "slack_messages/slack_push_message"
+require "slack_messages/slack_merge_message"
class SlackService < Service
prop_accessor :webhook, :username, :channel
@@ -38,20 +45,37 @@ class SlackService < Service
]
end
- def execute(push_data)
+ def execute(data)
return unless webhook.present?
- message = SlackMessage.new(push_data.merge(
+ object_kind = data[:object_kind]
+
+ data = data.merge(
project_url: project_url,
project_name: project_name
- ))
+ )
+
+ # WebHook events often have an 'update' event that follows a 'open' or
+ # 'close' action. Ignore update events for now to prevent duplicate
+ # messages from arriving.
+
+ message = case object_kind
+ when "push"
+ message = SlackMessages::SlackPushMessage.new(data)
+ when "issue"
+ message = SlackMessages::SlackIssueMessage.new(data) unless is_update?(data)
+ when "merge_request"
+ message = SlackMessages::SlackMergeMessage.new(data) unless is_update?(data)
+ end
opt = {}
opt[:channel] = channel if channel
opt[:username] = username if username
- notifier = Slack::Notifier.new(webhook, opt)
- notifier.ping(message.pretext, attachments: message.attachments)
+ if message
+ notifier = Slack::Notifier.new(webhook, opt)
+ notifier.ping(message.pretext, attachments: message.attachments)
+ end
end
private
@@ -63,4 +87,8 @@ class SlackService < Service
def project_url
project.web_url
end
+
+ def is_update?(data)
+ data[:object_attributes][:action] == 'update'
+ end
end
diff --git a/app/models/project_services/teamcity_service.rb b/app/models/project_services/teamcity_service.rb
index b6932f1c77b..07facfb6d06 100644
--- a/app/models/project_services/teamcity_service.rb
+++ b/app/models/project_services/teamcity_service.rb
@@ -11,6 +11,10 @@
# active :boolean default(FALSE), not null
# properties :text
# template :boolean default(FALSE)
+# push_events :boolean default(TRUE)
+# issues_events :boolean default(TRUE)
+# merge_requests_events :boolean default(TRUE)
+# tag_push_events :boolean default(TRUE)
#
class TeamcityService < CiService
@@ -115,13 +119,16 @@ class TeamcityService < CiService
end
end
- def execute(push)
+ def execute(data)
+ object_kind = data[:object_kind]
+ return unless object_kind == "push"
+
auth = {
username: username,
password: password,
}
- branch = push[:ref].gsub('refs/heads/', '')
+ branch = data[:ref].gsub('refs/heads/', '')
self.class.post("#{teamcity_url}/httpAuth/app/rest/buildQueue",
body: "<build branchName=\"#{branch}\">"\
diff --git a/app/models/service.rb b/app/models/service.rb
index f4e97da3212..9d6866f26d0 100644
--- a/app/models/service.rb
+++ b/app/models/service.rb
@@ -11,6 +11,11 @@
# active :boolean default(FALSE), not null
# properties :text
# template :boolean default(FALSE)
+# push_events :boolean
+# issues_events :boolean
+# merge_requests_events :boolean
+# tag_push_events :boolean
+#
# To add new service you should build a class inherited from Service
# and implement a set of methods
@@ -19,6 +24,10 @@ class Service < ActiveRecord::Base
serialize :properties, JSON
default_value_for :active, false
+ default_value_for :push_events, true
+ default_value_for :issues_events, true
+ default_value_for :merge_requests_events, true
+ default_value_for :tag_push_events, true
after_initialize :initialize_properties
@@ -29,6 +38,11 @@ class Service < ActiveRecord::Base
scope :visible, -> { where.not(type: 'GitlabIssueTrackerService') }
+ scope :push_hooks, -> { where(push_events: true, active: true) }
+ scope :tag_push_hooks, -> { where(tag_push_events: true, active: true) }
+ scope :issue_hooks, -> { where(issues_events: true, active: true) }
+ scope :merge_request_hooks, -> { where(merge_requests_events: true, active: true) }
+
def activated?
active
end
diff --git a/app/services/git_push_service.rb b/app/services/git_push_service.rb
index f21e6ac207d..13def127763 100644
--- a/app/services/git_push_service.rb
+++ b/app/services/git_push_service.rb
@@ -54,7 +54,7 @@ class GitPushService
@push_data = post_receive_data(oldrev, newrev, ref)
EventCreateService.new.push(project, user, @push_data)
project.execute_hooks(@push_data.dup, :push_hooks)
- project.execute_services(@push_data.dup)
+ project.execute_services(@push_data.dup, :push_hooks)
end
end
diff --git a/app/services/issues/base_service.rb b/app/services/issues/base_service.rb
index 755c0ef45a8..c3ca04a4343 100644
--- a/app/services/issues/base_service.rb
+++ b/app/services/issues/base_service.rb
@@ -1,13 +1,19 @@
module Issues
class BaseService < ::IssuableBaseService
- private
-
- def execute_hooks(issue, action = 'open')
+ def hook_data(issue, action)
issue_data = issue.to_hook_data(current_user)
issue_url = Gitlab::UrlBuilder.new(:issue).build(issue.id)
issue_data[:object_attributes].merge!(url: issue_url, action: action)
+ issue_data
+ end
+
+ private
+
+ def execute_hooks(issue, action = 'open')
+ issue_data = hook_data(issue, action)
issue.project.execute_hooks(issue_data, :issue_hooks)
+ issue.project.execute_services(issue_data, :issue_hooks)
end
end
end
diff --git a/app/services/merge_requests/base_service.rb b/app/services/merge_requests/base_service.rb
index b4199d1c800..f6e1ae6f283 100644
--- a/app/services/merge_requests/base_service.rb
+++ b/app/services/merge_requests/base_service.rb
@@ -5,13 +5,19 @@ module MergeRequests
Note.create_status_change_note(merge_request, merge_request.target_project, current_user, merge_request.state, nil)
end
+ def hook_data(merge_request, action)
+ hook_data = merge_request.to_hook_data(current_user)
+ merge_request_url = Gitlab::UrlBuilder.new(:merge_request).build(merge_request.id)
+ hook_data[:object_attributes][:url] = merge_request_url
+ hook_data[:object_attributes][:action] = action
+ hook_data
+ end
+
def execute_hooks(merge_request, action = 'open')
if merge_request.project
- hook_data = merge_request.to_hook_data(current_user)
- merge_request_url = Gitlab::UrlBuilder.new(:merge_request).build(merge_request.id)
- hook_data[:object_attributes][:url] = merge_request_url
- hook_data[:object_attributes][:action] = action
- merge_request.project.execute_hooks(hook_data, :merge_request_hooks)
+ merge_data = hook_data(merge_request, action)
+ merge_request.project.execute_hooks(merge_data, :merge_request_hooks)
+ merge_request.project.execute_services(merge_data, :merge_request_hooks)
end
end
end
diff --git a/app/views/projects/services/_form.html.haml b/app/views/projects/services/_form.html.haml
index 8db6d67e06b..0519c8150e9 100644
--- a/app/views/projects/services/_form.html.haml
+++ b/app/views/projects/services/_form.html.haml
@@ -27,6 +27,38 @@
.col-sm-10
= f.check_box :active
+ .form-group
+ = f.label :url, "Trigger", class: 'control-label'
+ .col-sm-10
+ %div
+ = f.check_box :push_events, class: 'pull-left'
+ .prepend-left-20
+ = f.label :push_events, class: 'list-label' do
+ %strong Push events
+ %p.light
+ This url will be triggered by a push to the repository
+ %div
+ = f.check_box :tag_push_events, class: 'pull-left'
+ .prepend-left-20
+ = f.label :tag_push_events, class: 'list-label' do
+ %strong Tag push events
+ %p.light
+ This url will be triggered when a new tag is pushed to the repository
+ %div
+ = f.check_box :issues_events, class: 'pull-left'
+ .prepend-left-20
+ = f.label :issues_events, class: 'list-label' do
+ %strong Issues events
+ %p.light
+ This url will be triggered when an issue is created
+ %div
+ = f.check_box :merge_requests_events, class: 'pull-left'
+ .prepend-left-20
+ = f.label :merge_requests_events, class: 'list-label' do
+ %strong Merge Request events
+ %p.light
+ This url will be triggered when a merge request is created
+
- @service.fields.each do |field|
- name = field[:name]
- value = @service.send(name) unless field[:type] == 'password'
diff --git a/db/migrate/20150219004514_add_events_to_services.rb b/db/migrate/20150219004514_add_events_to_services.rb
new file mode 100644
index 00000000000..cf73a0174f4
--- /dev/null
+++ b/db/migrate/20150219004514_add_events_to_services.rb
@@ -0,0 +1,8 @@
+class AddEventsToServices < ActiveRecord::Migration
+ def change
+ add_column :services, :push_events, :boolean, :default => true
+ add_column :services, :issues_events, :boolean, :default => true
+ add_column :services, :merge_requests_events, :boolean, :default => true
+ add_column :services, :tag_push_events, :boolean, :default => true
+ end
+end
diff --git a/db/schema.rb b/db/schema.rb
index 2659efe4df9..1a9b512e159 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -364,9 +364,13 @@ ActiveRecord::Schema.define(version: 20150223022001) do
t.integer "project_id"
t.datetime "created_at"
t.datetime "updated_at"
- t.boolean "active", default: false, null: false
+ t.boolean "active", default: false, null: false
t.text "properties"
- t.boolean "template", default: false
+ t.boolean "template", default: false
+ t.boolean "push_events", default: true
+ t.boolean "issues_events", default: true
+ t.boolean "merge_requests_events", default: true
+ t.boolean "tag_push_events", default: true
end
add_index "services", ["created_at", "id"], name: "index_services_on_created_at_and_id", using: :btree
diff --git a/lib/gitlab/push_data_builder.rb b/lib/gitlab/push_data_builder.rb
index 9aa5c8967a7..9d8d3ea3d22 100644
--- a/lib/gitlab/push_data_builder.rb
+++ b/lib/gitlab/push_data_builder.rb
@@ -29,6 +29,7 @@ module Gitlab
# Hash to be passed as post_receive_data
data = {
+ object_kind: "push",
before: oldrev,
after: newrev,
ref: ref,
diff --git a/spec/models/project_services/assembla_service_spec.rb b/spec/models/project_services/assembla_service_spec.rb
index ee7f780c8f6..cd34e006ebe 100644
--- a/spec/models/project_services/assembla_service_spec.rb
+++ b/spec/models/project_services/assembla_service_spec.rb
@@ -2,14 +2,18 @@
#
# Table name: services
#
-# id :integer not null, primary key
-# type :string(255)
-# title :string(255)
-# project_id :integer not null
-# created_at :datetime
-# updated_at :datetime
-# active :boolean default(FALSE), not null
-# properties :text
+# id :integer not null, primary key
+# type :string(255)
+# title :string(255)
+# project_id :integer not null
+# created_at :datetime
+# updated_at :datetime
+# active :boolean default(FALSE), not null
+# properties :text
+# push_events :boolean
+# issues_events :boolean
+# merge_requests_events :boolean
+# tag_push_events :boolean
#
require 'spec_helper'
diff --git a/spec/models/project_services/buildbox_service_spec.rb b/spec/models/project_services/buildbox_service_spec.rb
index 050363e14c7..c246e1c9d41 100644
--- a/spec/models/project_services/buildbox_service_spec.rb
+++ b/spec/models/project_services/buildbox_service_spec.rb
@@ -2,14 +2,18 @@
#
# Table name: services
#
-# id :integer not null, primary key
-# type :string(255)
-# title :string(255)
-# project_id :integer not null
-# created_at :datetime
-# updated_at :datetime
-# active :boolean default(FALSE), not null
-# properties :text
+# id :integer not null, primary key
+# type :string(255)
+# title :string(255)
+# project_id :integer not null
+# created_at :datetime
+# updated_at :datetime
+# active :boolean default(FALSE), not null
+# properties :text
+# push_events :boolean
+# issues_events :boolean
+# merge_requests_events :boolean
+# tag_push_events :boolean
#
require 'spec_helper'
diff --git a/spec/models/project_services/flowdock_service_spec.rb b/spec/models/project_services/flowdock_service_spec.rb
index b34e36bc940..2ec167a7330 100644
--- a/spec/models/project_services/flowdock_service_spec.rb
+++ b/spec/models/project_services/flowdock_service_spec.rb
@@ -2,14 +2,18 @@
#
# Table name: services
#
-# id :integer not null, primary key
-# type :string(255)
-# title :string(255)
-# project_id :integer not null
-# created_at :datetime
-# updated_at :datetime
-# active :boolean default(FALSE), not null
-# properties :text
+# id :integer not null, primary key
+# type :string(255)
+# title :string(255)
+# project_id :integer not null
+# created_at :datetime
+# updated_at :datetime
+# active :boolean default(FALSE), not null
+# properties :text
+# push_events :boolean
+# issues_events :boolean
+# merge_requests_events :boolean
+# tag_push_events :boolean
#
require 'spec_helper'
diff --git a/spec/models/project_services/gemnasium_service_spec.rb b/spec/models/project_services/gemnasium_service_spec.rb
index fe5d62b2f53..5f665fadfff 100644
--- a/spec/models/project_services/gemnasium_service_spec.rb
+++ b/spec/models/project_services/gemnasium_service_spec.rb
@@ -2,14 +2,18 @@
#
# Table name: services
#
-# id :integer not null, primary key
-# type :string(255)
-# title :string(255)
-# project_id :integer not null
-# created_at :datetime
-# updated_at :datetime
-# active :boolean default(FALSE), not null
-# properties :text
+# id :integer not null, primary key
+# type :string(255)
+# title :string(255)
+# project_id :integer not null
+# created_at :datetime
+# updated_at :datetime
+# active :boolean default(FALSE), not null
+# properties :text
+# push_events :boolean
+# issues_events :boolean
+# merge_requests_events :boolean
+# tag_push_events :boolean
#
require 'spec_helper'
diff --git a/spec/models/project_services/gitlab_ci_service_spec.rb b/spec/models/project_services/gitlab_ci_service_spec.rb
index 0cd255f08ea..fcb33b11732 100644
--- a/spec/models/project_services/gitlab_ci_service_spec.rb
+++ b/spec/models/project_services/gitlab_ci_service_spec.rb
@@ -2,14 +2,18 @@
#
# Table name: services
#
-# id :integer not null, primary key
-# type :string(255)
-# title :string(255)
-# project_id :integer not null
-# created_at :datetime
-# updated_at :datetime
-# active :boolean default(FALSE), not null
-# properties :text
+# id :integer not null, primary key
+# type :string(255)
+# title :string(255)
+# project_id :integer not null
+# created_at :datetime
+# updated_at :datetime
+# active :boolean default(FALSE), not null
+# properties :text
+# push_events :boolean
+# issues_events :boolean
+# merge_requests_events :boolean
+# tag_push_events :boolean
#
require 'spec_helper'
diff --git a/spec/models/project_services/pushover_service_spec.rb b/spec/models/project_services/pushover_service_spec.rb
index 188626a7a27..bb2e72c3ac1 100644
--- a/spec/models/project_services/pushover_service_spec.rb
+++ b/spec/models/project_services/pushover_service_spec.rb
@@ -2,14 +2,18 @@
#
# Table name: services
#
-# id :integer not null, primary key
-# type :string(255)
-# title :string(255)
-# project_id :integer not null
-# created_at :datetime
-# updated_at :datetime
-# active :boolean default(FALSE), not null
-# properties :text
+# id :integer not null, primary key
+# type :string(255)
+# title :string(255)
+# project_id :integer not null
+# created_at :datetime
+# updated_at :datetime
+# active :boolean default(FALSE), not null
+# properties :text
+# push_events :boolean
+# issues_events :boolean
+# merge_requests_events :boolean
+# tag_push_events :boolean
#
require 'spec_helper'
diff --git a/spec/models/project_services/slack_messages/slack_issue_message_spec.rb b/spec/models/project_services/slack_messages/slack_issue_message_spec.rb
new file mode 100644
index 00000000000..49a8eea0a58
--- /dev/null
+++ b/spec/models/project_services/slack_messages/slack_issue_message_spec.rb
@@ -0,0 +1,55 @@
+require 'spec_helper'
+
+describe SlackMessages::SlackIssueMessage do
+ subject { SlackMessages::SlackIssueMessage.new(args) }
+
+ let(:args) {
+ {
+ user: {
+ username: 'username'
+ },
+ project_name: 'project_name',
+ project_url: 'somewhere.com',
+
+ object_attributes: {
+ title: 'Issue title',
+ id: 10,
+ iid: 100,
+ assignee_id: 1,
+ url: 'url',
+ action: 'open',
+ state: 'opened',
+ description: 'issue description'
+ }
+ }
+ }
+
+ let(:color) { '#345' }
+
+ context 'open' do
+ it 'returns a message regarding opening of issues' do
+ expect(subject.pretext).to eq(
+ 'username opened issue <url|#100> in <somewhere.com|project_name>: '\
+ 'Issue title')
+ expect(subject.attachments).to eq([
+ {
+ text: "issue description",
+ color: color,
+ }
+ ])
+ end
+ end
+
+ context 'close' do
+ before do
+ args[:object_attributes][:action] = 'close'
+ args[:object_attributes][:state] = 'closed'
+ end
+ it 'returns a message regarding closing of issues' do
+ expect(subject.pretext). to eq(
+ 'username closed issue <url|#100> in <somewhere.com|project_name>: '\
+ 'Issue title')
+ expect(subject.attachments).to be_empty
+ end
+ end
+end
diff --git a/spec/models/project_services/slack_messages/slack_merge_message_spec.rb b/spec/models/project_services/slack_messages/slack_merge_message_spec.rb
new file mode 100644
index 00000000000..ef76c3312ea
--- /dev/null
+++ b/spec/models/project_services/slack_messages/slack_merge_message_spec.rb
@@ -0,0 +1,50 @@
+require 'spec_helper'
+
+describe SlackMessages::SlackMergeMessage do
+ subject { SlackMessages::SlackMergeMessage.new(args) }
+
+ let(:args) {
+ {
+ user: {
+ username: 'username'
+ },
+ project_name: 'project_name',
+ project_url: 'somewhere.com',
+
+ object_attributes: {
+ title: 'Issue title',
+ id: 10,
+ iid: 100,
+ assignee_id: 1,
+ url: 'url',
+ state: 'opened',
+ description: 'issue description',
+ source_branch: 'source_branch',
+ target_branch: 'target_branch',
+ }
+ }
+ }
+
+ let(:color) { '#345' }
+
+ context 'open' do
+ it 'returns a message regarding opening of merge requests' do
+ expect(subject.pretext).to eq(
+ 'username opened merge request <somewhere.com/merge_requests/100|#100> '\
+ 'in <somewhere.com|project_name>')
+ expect(subject.attachments).to be_empty
+ end
+ end
+
+ context 'close' do
+ before do
+ args[:object_attributes][:state] = 'closed'
+ end
+ it 'returns a message regarding closing of merge requests' do
+ expect(subject.pretext).to eq(
+ 'username closed merge request <somewhere.com/merge_requests/100|#100> '\
+ 'in <somewhere.com|project_name>')
+ expect(subject.attachments).to be_empty
+ end
+ end
+end
diff --git a/spec/models/project_services/slack_message_spec.rb b/spec/models/project_services/slack_messages/slack_push_message_spec.rb
index 7197a94e53f..f11614d6921 100644
--- a/spec/models/project_services/slack_message_spec.rb
+++ b/spec/models/project_services/slack_messages/slack_push_message_spec.rb
@@ -1,7 +1,7 @@
require 'spec_helper'
-describe SlackMessage do
- subject { SlackMessage.new(args) }
+describe SlackMessages::SlackPushMessage do
+ subject { SlackMessages::SlackPushMessage.new(args) }
let(:args) {
{
diff --git a/spec/models/project_services/slack_service_spec.rb b/spec/models/project_services/slack_service_spec.rb
index 8a75d8987ab..49c48d0b65c 100644
--- a/spec/models/project_services/slack_service_spec.rb
+++ b/spec/models/project_services/slack_service_spec.rb
@@ -2,14 +2,18 @@
#
# Table name: services
#
-# id :integer not null, primary key
-# type :string(255)
-# title :string(255)
-# project_id :integer not null
-# created_at :datetime
-# updated_at :datetime
-# active :boolean default(FALSE), not null
-# properties :text
+# id :integer not null, primary key
+# type :string(255)
+# title :string(255)
+# project_id :integer not null
+# created_at :datetime
+# updated_at :datetime
+# active :boolean default(FALSE), not null
+# properties :text
+# push_events :boolean
+# issues_events :boolean
+# merge_requests_events :boolean
+# tag_push_events :boolean
#
require 'spec_helper'
@@ -34,7 +38,7 @@ describe SlackService do
let(:slack) { SlackService.new }
let(:user) { create(:user) }
let(:project) { create(:project) }
- let(:sample_data) { Gitlab::PushDataBuilder.build_sample(project, user) }
+ let(:push_sample_data) { Gitlab::PushDataBuilder.build_sample(project, user) }
let(:webhook_url) { 'https://hooks.slack.com/services/SVRWFV0VVAR97N/B02R25XN3/ZBqu7xMupaEEICInN685' }
let(:username) { 'slack_username' }
let(:channel) { 'slack_channel' }
@@ -48,10 +52,43 @@ describe SlackService do
)
WebMock.stub_request(:post, webhook_url)
+
+ opts = {
+ title: 'Awesome issue',
+ description: 'please fix'
+ }
+
+ issue_service = Issues::CreateService.new(project, user, opts)
+ @issue = issue_service.execute
+ @issues_sample_data = issue_service.hook_data(@issue, 'open')
+
+ opts = {
+ title: 'Awesome merge_request',
+ description: 'please fix',
+ source_branch: 'stable',
+ target_branch: 'master'
+ }
+ merge_service = MergeRequests::CreateService.new(project,
+ user, opts)
+ @merge_request = merge_service.execute
+ @merge_sample_data = merge_service.hook_data(@merge_request,
+ 'open')
end
- it "should call Slack API" do
- slack.execute(sample_data)
+ it "should call Slack API for pull requests" do
+ slack.execute(push_sample_data)
+
+ WebMock.should have_requested(:post, webhook_url).once
+ end
+
+ it "should call Slack API for issue events" do
+ slack.execute(@issues_sample_data)
+
+ WebMock.should have_requested(:post, webhook_url).once
+ end
+
+ it "should call Slack API for merge requests events" do
+ slack.execute(@merge_sample_data)
expect(WebMock).to have_requested(:post, webhook_url).once
end
diff --git a/spec/models/service_spec.rb b/spec/models/service_spec.rb
index 9a1248055b1..cc047a20dd2 100644
--- a/spec/models/service_spec.rb
+++ b/spec/models/service_spec.rb
@@ -11,6 +11,10 @@
# active :boolean default(FALSE), not null
# properties :text
# template :boolean default(FALSE)
+# push_events :boolean
+# issues_events :boolean
+# merge_requests_events :boolean
+# tag_push_events :boolean
#
require 'spec_helper'
diff --git a/spec/services/git_push_service_spec.rb b/spec/services/git_push_service_spec.rb
index 9924935094e..e264072b573 100644
--- a/spec/services/git_push_service_spec.rb
+++ b/spec/services/git_push_service_spec.rb
@@ -49,6 +49,7 @@ describe GitPushService do
subject { @push_data }
+ it { is_expected.to include(object_kind: 'push') }
it { is_expected.to include(before: @oldrev) }
it { is_expected.to include(after: @newrev) }
it { is_expected.to include(ref: @ref) }