summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Goodman <jgoodman@gitlab.com>2019-04-10 12:42:47 -0400
committerJason Goodman <jgoodman@gitlab.com>2019-04-10 12:42:47 -0400
commit22c19b0d18da1f2ca5309e05b997ed8026717008 (patch)
tree4539ff09a2a4d49a1e69b9f7215c9b5852af11ef
parent7d351a24258af028998a8c0e7bed749239a255c8 (diff)
downloadgitlab-ce-spike-issue-42692-deployment-chat-notifications.tar.gz
Spike Slack notifications for deploymentsspike-issue-42692-deployment-chat-notifications
This is a spike for comments
-rw-r--r--app/controllers/concerns/service_params.rb1
-rw-r--r--app/models/concerns/triggerable_hooks.rb3
-rw-r--r--app/models/deployment.rb8
-rw-r--r--app/models/project_services/chat_message/deployment_message.rb27
-rw-r--r--app/models/project_services/chat_notification_service.rb13
-rw-r--r--app/models/service.rb4
-rw-r--r--app/workers/all_queues.yml1
-rw-r--r--app/workers/deployments/finished_worker.rb18
-rw-r--r--app/workers/deployments/success_worker.rb2
-rw-r--r--db/migrate/20190409203025_add_deployment_events_to_services.rb17
-rw-r--r--lib/gitlab/data_builder/deployment.rb16
11 files changed, 107 insertions, 3 deletions
diff --git a/app/controllers/concerns/service_params.rb b/app/controllers/concerns/service_params.rb
index 48451bedcc2..7f22dd4fb08 100644
--- a/app/controllers/concerns/service_params.rb
+++ b/app/controllers/concerns/service_params.rb
@@ -62,6 +62,7 @@ module ServiceParams
:url,
:user_key,
:username,
+ :environment,
:webhook
].freeze
diff --git a/app/models/concerns/triggerable_hooks.rb b/app/models/concerns/triggerable_hooks.rb
index c52baa0524c..b64a9e4f70b 100644
--- a/app/models/concerns/triggerable_hooks.rb
+++ b/app/models/concerns/triggerable_hooks.rb
@@ -12,7 +12,8 @@ module TriggerableHooks
merge_request_hooks: :merge_requests_events,
job_hooks: :job_events,
pipeline_hooks: :pipeline_events,
- wiki_page_hooks: :wiki_page_events
+ wiki_page_hooks: :wiki_page_events,
+ deployment_hooks: :deployment_events
}.freeze
extend ActiveSupport::Concern
diff --git a/app/models/deployment.rb b/app/models/deployment.rb
index d847a0a11e4..20f7d197985 100644
--- a/app/models/deployment.rb
+++ b/app/models/deployment.rb
@@ -42,8 +42,16 @@ class Deployment < ApplicationRecord
deployment.finished_at = Time.now
end
+ after_transition any => [:success, :failed, :canceled] do |deployment|
+ deployment.run_after_commit do
+ # Do it here? Because we want to fire for any finished deployment, regardless of success?
+ Deployments::FinishedWorker.perform_async(id)
+ end
+ end
+
after_transition any => :success do |deployment|
deployment.run_after_commit do
+ # Here is interesting too, but this would only be for successful deployments
Deployments::SuccessWorker.perform_async(id)
end
end
diff --git a/app/models/project_services/chat_message/deployment_message.rb b/app/models/project_services/chat_message/deployment_message.rb
new file mode 100644
index 00000000000..391f1ac306b
--- /dev/null
+++ b/app/models/project_services/chat_message/deployment_message.rb
@@ -0,0 +1,27 @@
+# frozen_string_literal: true
+
+module ChatMessage
+ class DeploymentMessage < BaseMessage
+ def initialize(params)
+ super
+ end
+
+ def attachments
+ []
+ end
+
+ def activity
+ {
+ title: "implement me",
+ subtitle: "subtitle",
+ text: 'some title'
+ }
+ end
+
+ private
+
+ def message
+ "implement me"
+ end
+ end
+end
diff --git a/app/models/project_services/chat_notification_service.rb b/app/models/project_services/chat_notification_service.rb
index c10ee07ccf4..45106aca0cb 100644
--- a/app/models/project_services/chat_notification_service.rb
+++ b/app/models/project_services/chat_notification_service.rb
@@ -7,7 +7,7 @@ class ChatNotificationService < Service
default_value_for :category, 'chat'
- prop_accessor :webhook, :username, :channel
+ prop_accessor :webhook, :username, :channel, :environment
boolean_accessor :notify_only_broken_pipelines, :notify_only_default_branch
validates :webhook, presence: true, public_url: true, if: :activated?
@@ -33,7 +33,7 @@ class ChatNotificationService < Service
def self.supported_events
%w[push issue confidential_issue merge_request note confidential_note tag_push
- pipeline wiki_page]
+ pipeline wiki_page deployment]
end
def fields
@@ -44,6 +44,7 @@ class ChatNotificationService < Service
[
{ type: 'text', name: 'webhook', placeholder: "e.g. #{webhook_placeholder}", required: true },
{ type: 'text', name: 'username', placeholder: 'e.g. GitLab' },
+ { type: 'text', name: 'environment', placeholder: 'e.g. production' },
{ type: 'checkbox', name: 'notify_only_broken_pipelines' },
{ type: 'checkbox', name: 'notify_only_default_branch' }
]
@@ -72,6 +73,7 @@ class ChatNotificationService < Service
opts = {}
opts[:channel] = channel_name if channel_name
opts[:username] = username if username
+ opts[:environment] = environment if environment
return false unless notify(message, opts)
@@ -122,9 +124,16 @@ class ChatNotificationService < Service
ChatMessage::PipelineMessage.new(data) if should_pipeline_be_notified?(data)
when "wiki_page"
ChatMessage::WikiPageMessage.new(data)
+ when "deployment"
+ ChatMessage::DeploymentMessage.new(data) if notify_for_environment?(data)
end
end
+ def notify_for_environment?(data)
+ # check environment
+ true
+ end
+
def get_channel_field(event)
field_name = event_channel_name(event)
self.public_send(field_name) # rubocop:disable GitlabSecurity/PublicSend
diff --git a/app/models/service.rb b/app/models/service.rb
index c6d5eb353dc..a8bad57f679 100644
--- a/app/models/service.rb
+++ b/app/models/service.rb
@@ -21,6 +21,7 @@ class Service < ApplicationRecord
default_value_for :job_events, true
default_value_for :pipeline_events, true
default_value_for :wiki_page_events, true
+ default_value_for :deployment_events, true
after_initialize :initialize_properties
@@ -50,6 +51,7 @@ class Service < ApplicationRecord
scope :job_hooks, -> { where(job_events: true, active: true) }
scope :pipeline_hooks, -> { where(pipeline_events: true, active: true) }
scope :wiki_page_hooks, -> { where(wiki_page_events: true, active: true) }
+ scope :deployment_hooks, -> { where(deployment_events: true, active: true) }
scope :external_issue_trackers, -> { issue_trackers.active.without_defaults }
scope :deployment, -> { where(category: 'deployment') }
@@ -332,6 +334,8 @@ class Service < ApplicationRecord
"Event will be triggered when a pipeline status changes"
when "wiki_page", "wiki_page_events"
"Event will be triggered when a wiki page is created/updated"
+ when "deployment", "deployment_events"
+ "Event will be triggered when a deployment finishes"
when "commit", "commit_events"
"Event will be triggered when a commit is created/updated"
end
diff --git a/app/workers/all_queues.yml b/app/workers/all_queues.yml
index f9b2e698fc9..d01bbbf269e 100644
--- a/app/workers/all_queues.yml
+++ b/app/workers/all_queues.yml
@@ -83,6 +83,7 @@
- pipeline_processing:ci_build_schedule
- deployment:deployments_success
+- deployment:deployments_finished
- repository_check:repository_check_clear
- repository_check:repository_check_batch
diff --git a/app/workers/deployments/finished_worker.rb b/app/workers/deployments/finished_worker.rb
new file mode 100644
index 00000000000..47d9910772d
--- /dev/null
+++ b/app/workers/deployments/finished_worker.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+module Deployments
+ class FinishedWorker
+ include ApplicationWorker
+
+ queue_namespace :deployment
+
+ def perform(deployment_id)
+ Deployment.find_by_id(deployment_id).try do |deployment|
+ data = Gitlab::DataBuilder::Deployment.build(deployment)
+ # In a later MR...
+ # deployment.project.execute_hooks(...)
+ deployment.project.execute_services(data, :deployment_hooks)
+ end
+ end
+ end
+end
diff --git a/app/workers/deployments/success_worker.rb b/app/workers/deployments/success_worker.rb
index da517f3fb26..61c70881835 100644
--- a/app/workers/deployments/success_worker.rb
+++ b/app/workers/deployments/success_worker.rb
@@ -10,6 +10,8 @@ module Deployments
Deployment.find_by_id(deployment_id).try do |deployment|
break unless deployment.success?
+ # Of interest, but probably don't trigger hooks and services here.
+
UpdateDeploymentService.new(deployment).execute
end
end
diff --git a/db/migrate/20190409203025_add_deployment_events_to_services.rb b/db/migrate/20190409203025_add_deployment_events_to_services.rb
new file mode 100644
index 00000000000..1fb137fb5f9
--- /dev/null
+++ b/db/migrate/20190409203025_add_deployment_events_to_services.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+class AddDeploymentEventsToServices < ActiveRecord::Migration[5.0]
+ include Gitlab::Database::MigrationHelpers
+
+ DOWNTIME = false
+
+ disable_ddl_transaction!
+
+ def up
+ add_column_with_default(:services, :deployment_events, :boolean, default: false, allow_null: false)
+ end
+
+ def down
+ remove_column(:services, :deployment_events)
+ end
+end
diff --git a/lib/gitlab/data_builder/deployment.rb b/lib/gitlab/data_builder/deployment.rb
new file mode 100644
index 00000000000..e5cbb46862e
--- /dev/null
+++ b/lib/gitlab/data_builder/deployment.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module DataBuilder
+ module Deployment
+ extend self
+
+ def build(deployment)
+ {
+ object_kind: 'deployment'
+ # etc...
+ }
+ end
+ end
+ end
+end