diff options
author | Jason Goodman <jgoodman@gitlab.com> | 2019-04-10 12:42:47 -0400 |
---|---|---|
committer | Jason Goodman <jgoodman@gitlab.com> | 2019-04-10 12:42:47 -0400 |
commit | 22c19b0d18da1f2ca5309e05b997ed8026717008 (patch) | |
tree | 4539ff09a2a4d49a1e69b9f7215c9b5852af11ef | |
parent | 7d351a24258af028998a8c0e7bed749239a255c8 (diff) | |
download | gitlab-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.rb | 1 | ||||
-rw-r--r-- | app/models/concerns/triggerable_hooks.rb | 3 | ||||
-rw-r--r-- | app/models/deployment.rb | 8 | ||||
-rw-r--r-- | app/models/project_services/chat_message/deployment_message.rb | 27 | ||||
-rw-r--r-- | app/models/project_services/chat_notification_service.rb | 13 | ||||
-rw-r--r-- | app/models/service.rb | 4 | ||||
-rw-r--r-- | app/workers/all_queues.yml | 1 | ||||
-rw-r--r-- | app/workers/deployments/finished_worker.rb | 18 | ||||
-rw-r--r-- | app/workers/deployments/success_worker.rb | 2 | ||||
-rw-r--r-- | db/migrate/20190409203025_add_deployment_events_to_services.rb | 17 | ||||
-rw-r--r-- | lib/gitlab/data_builder/deployment.rb | 16 |
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 |