Skip to content
Snippets Groups Projects
Commit afe5d7d2 authored by Stan Hu's avatar Stan Hu Committed by Douwe Maan
Browse files

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.
parent 2f4656b5
No related branches found
No related tags found
1 merge request!8686add "Uplaod" and "Replace" functionality
Showing
with 115 additions and 6 deletions
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
Loading
Loading
Loading
Loading
@@ -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
Loading
Loading
@@ -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
Loading
Loading
Loading
Loading
@@ -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'
Loading
Loading
@@ -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
Loading
Loading
Loading
Loading
@@ -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
Loading
Loading
@@ -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
Loading
Loading
@@ -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
Loading
Loading
@@ -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)
Loading
Loading
Loading
Loading
@@ -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"
 
Loading
Loading
@@ -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
 
Loading
Loading
Loading
Loading
@@ -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
Loading
Loading
@@ -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
 
Loading
Loading
Loading
Loading
@@ -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
Loading
Loading
Loading
Loading
@@ -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
Loading
Loading
@@ -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
 
Loading
Loading
Loading
Loading
@@ -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"
Loading
Loading
@@ -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],
Loading
Loading
Loading
Loading
@@ -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"
Loading
Loading
@@ -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],
Loading
Loading
Loading
Loading
@@ -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
Loading
Loading
Loading
Loading
@@ -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
Loading
Loading
Loading
Loading
@@ -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
Loading
Loading
@@ -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
 
Loading
Loading
Loading
Loading
@@ -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
Loading
Loading
@@ -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
 
Loading
Loading
Loading
Loading
@@ -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
Loading
Loading
Loading
Loading
@@ -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
Loading
Loading
@@ -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 = {
Loading
Loading
Loading
Loading
@@ -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
Loading
Loading
@@ -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]
Loading
Loading
Loading
Loading
@@ -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
Loading
Loading
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment