From 7021455bd1ed7b125c55eb1b33c5a01f2bc55ee0 Mon Sep 17 00:00:00 2001 From: GitLab Bot Date: Thu, 17 Nov 2022 11:33:21 +0000 Subject: Add latest changes from gitlab-org/gitlab@15-6-stable-ee --- app/models/integrations/assembla.rb | 5 +- app/models/integrations/bamboo.rb | 9 +--- app/models/integrations/base_chat_notification.rb | 8 +-- app/models/integrations/base_ci.rb | 2 +- app/models/integrations/base_issue_tracker.rb | 2 +- app/models/integrations/base_monitoring.rb | 2 +- app/models/integrations/base_slack_notification.rb | 62 +++++++++++++++++++++ app/models/integrations/base_slash_commands.rb | 2 +- app/models/integrations/base_third_party_wiki.rb | 2 +- app/models/integrations/buildkite.rb | 2 +- .../integrations/chat_message/pipeline_message.rb | 9 ++++ app/models/integrations/datadog.rb | 7 ++- app/models/integrations/discord.rb | 3 +- app/models/integrations/drone_ci.rb | 1 - app/models/integrations/hangouts_chat.rb | 6 +-- app/models/integrations/jenkins.rb | 20 +++---- app/models/integrations/jira.rb | 6 +-- app/models/integrations/mattermost.rb | 3 +- app/models/integrations/microsoft_teams.rb | 6 +-- app/models/integrations/packagist.rb | 7 ++- app/models/integrations/pivotaltracker.rb | 2 +- app/models/integrations/pumble.rb | 4 +- app/models/integrations/slack.rb | 63 ++-------------------- app/models/integrations/teamcity.rb | 9 +--- app/models/integrations/unify_circuit.rb | 8 +-- app/models/integrations/webex_teams.rb | 4 +- 26 files changed, 120 insertions(+), 134 deletions(-) create mode 100644 app/models/integrations/base_slack_notification.rb (limited to 'app/models/integrations') diff --git a/app/models/integrations/assembla.rb b/app/models/integrations/assembla.rb index 88dbf2915ef..536d5584bf6 100644 --- a/app/models/integrations/assembla.rb +++ b/app/models/integrations/assembla.rb @@ -12,6 +12,7 @@ module Integrations required: true field :subdomain, + exposes_secrets: true, placeholder: '' def title @@ -34,7 +35,9 @@ module Integrations return unless supported_events.include?(data[:object_kind]) url = "https://atlas.assembla.com/spaces/#{subdomain}/github_tool?secret_key=#{token}" - Gitlab::HTTP.post(url, body: { payload: data }.to_json, headers: { 'Content-Type' => 'application/json' }) + body = { payload: data } + + Gitlab::HTTP.post(url, body: Gitlab::Json.dump(body), headers: { 'Content-Type' => 'application/json' }) end end end diff --git a/app/models/integrations/bamboo.rb b/app/models/integrations/bamboo.rb index c3a4b84bb2d..b4e97f0871e 100644 --- a/app/models/integrations/bamboo.rb +++ b/app/models/integrations/bamboo.rb @@ -9,6 +9,7 @@ module Integrations title: -> { s_('BambooService|Bamboo URL') }, placeholder: -> { s_('https://bamboo.example.com') }, help: -> { s_('BambooService|Bamboo service root URL.') }, + exposes_secrets: true, required: true field :build_key, @@ -37,14 +38,6 @@ module Integrations attr_accessor :response - before_validation :reset_password - - def reset_password - if bamboo_url_changed? && !password_touched? - self.password = nil - end - end - def title s_('BambooService|Atlassian Bamboo') end diff --git a/app/models/integrations/base_chat_notification.rb b/app/models/integrations/base_chat_notification.rb index c7992e4083c..750aa60b185 100644 --- a/app/models/integrations/base_chat_notification.rb +++ b/app/models/integrations/base_chat_notification.rb @@ -22,7 +22,9 @@ module Integrations MATCH_ALL_LABELS = 'match_all' ].freeze - default_value_for :category, 'chat' + SECRET_MASK = '************' + + attribute :category, default: 'chat' prop_accessor :webhook, :username, :channel, :branches_to_be_notified, :labels_to_be_notified, :labels_to_be_notified_behavior @@ -71,7 +73,7 @@ module Integrations def default_fields [ - { type: 'text', name: 'webhook', placeholder: "#{webhook_placeholder}", required: true }.freeze, + { type: 'text', name: 'webhook', help: "#{webhook_help}", required: true }.freeze, { type: 'text', name: 'username', placeholder: 'GitLab-integration' }.freeze, { type: 'checkbox', name: 'notify_only_broken_pipelines', help: 'Do not send notifications for successful pipelines.' }.freeze, { @@ -147,7 +149,7 @@ module Integrations raise NotImplementedError end - def webhook_placeholder + def webhook_help raise NotImplementedError end diff --git a/app/models/integrations/base_ci.rb b/app/models/integrations/base_ci.rb index 4f8732da703..db29f228e60 100644 --- a/app/models/integrations/base_ci.rb +++ b/app/models/integrations/base_ci.rb @@ -5,7 +5,7 @@ # working with GitLab merge requests module Integrations class BaseCi < Integration - default_value_for :category, 'ci' + attribute :category, default: 'ci' def valid_token?(token) self.respond_to?(:token) && self.token.present? && ActiveSupport::SecurityUtils.secure_compare(token, self.token) diff --git a/app/models/integrations/base_issue_tracker.rb b/app/models/integrations/base_issue_tracker.rb index a4cec5f927b..e0994305e9d 100644 --- a/app/models/integrations/base_issue_tracker.rb +++ b/app/models/integrations/base_issue_tracker.rb @@ -4,7 +4,7 @@ module Integrations class BaseIssueTracker < Integration validate :one_issue_tracker, if: :activated?, on: :manual_change - default_value_for :category, 'issue_tracker' + attribute :category, default: 'issue_tracker' before_validation :handle_properties before_validation :set_default_data, on: :create diff --git a/app/models/integrations/base_monitoring.rb b/app/models/integrations/base_monitoring.rb index 280eeda7c6c..b0bebb5a859 100644 --- a/app/models/integrations/base_monitoring.rb +++ b/app/models/integrations/base_monitoring.rb @@ -6,7 +6,7 @@ # to provide additional features for environments. module Integrations class BaseMonitoring < Integration - default_value_for :category, 'monitoring' + attribute :category, default: 'monitoring' def self.supported_events %w() diff --git a/app/models/integrations/base_slack_notification.rb b/app/models/integrations/base_slack_notification.rb new file mode 100644 index 00000000000..cb785afdcfe --- /dev/null +++ b/app/models/integrations/base_slack_notification.rb @@ -0,0 +1,62 @@ +# frozen_string_literal: true + +module Integrations + class BaseSlackNotification < BaseChatNotification + SUPPORTED_EVENTS_FOR_USAGE_LOG = %w[ + push issue confidential_issue merge_request note confidential_note tag_push wiki_page deployment + ].freeze + + prop_accessor EVENT_CHANNEL['alert'] + + override :default_channel_placeholder + def default_channel_placeholder + _('#general, #development') + end + + override :get_message + def get_message(object_kind, data) + return Integrations::ChatMessage::AlertMessage.new(data) if object_kind == 'alert' + + super + end + + override :supported_events + def supported_events + additional = ['alert'] + + super + additional + end + + override :configurable_channels? + def configurable_channels? + true + end + + override :log_usage + def log_usage(event, user_id) + return unless user_id + + return unless SUPPORTED_EVENTS_FOR_USAGE_LOG.include?(event) + + key = "i_ecosystem_slack_service_#{event}_notification" + + Gitlab::UsageDataCounters::HLLRedisCounter.track_event(key, values: user_id) + + return unless Feature.enabled?(:route_hll_to_snowplow_phase2) + + optional_arguments = { + project: project, + namespace: group || project&.namespace + }.compact + + Gitlab::Tracking.event( + self.class.name, + Integration::SNOWPLOW_EVENT_ACTION, + label: Integration::SNOWPLOW_EVENT_LABEL, + property: key, + user: User.find(user_id), + **optional_arguments + ) + end + end +end diff --git a/app/models/integrations/base_slash_commands.rb b/app/models/integrations/base_slash_commands.rb index e51d748b562..314f0a6ee5d 100644 --- a/app/models/integrations/base_slash_commands.rb +++ b/app/models/integrations/base_slash_commands.rb @@ -4,7 +4,7 @@ # This class is not meant to be used directly, but only to inherrit from. module Integrations class BaseSlashCommands < Integration - default_value_for :category, 'chat' + attribute :category, default: 'chat' prop_accessor :token diff --git a/app/models/integrations/base_third_party_wiki.rb b/app/models/integrations/base_third_party_wiki.rb index 24f5bec93cf..8df172e9a53 100644 --- a/app/models/integrations/base_third_party_wiki.rb +++ b/app/models/integrations/base_third_party_wiki.rb @@ -2,7 +2,7 @@ module Integrations class BaseThirdPartyWiki < Integration - default_value_for :category, 'third_party_wiki' + attribute :category, default: 'third_party_wiki' validate :only_one_third_party_wiki, if: :activated?, on: :manual_change diff --git a/app/models/integrations/buildkite.rb b/app/models/integrations/buildkite.rb index f2d2aca3ffe..5c08eac8557 100644 --- a/app/models/integrations/buildkite.rb +++ b/app/models/integrations/buildkite.rb @@ -6,13 +6,13 @@ module Integrations class Buildkite < BaseCi include HasWebHook include ReactivelyCached - extend Gitlab::Utils::Override ENDPOINT = "https://buildkite.com" field :project_url, title: -> { _('Pipeline URL') }, placeholder: "#{ENDPOINT}/example-org/test-pipeline", + exposes_secrets: true, required: true field :token, diff --git a/app/models/integrations/chat_message/pipeline_message.rb b/app/models/integrations/chat_message/pipeline_message.rb index b3502905bf7..88db40bea7f 100644 --- a/app/models/integrations/chat_message/pipeline_message.rb +++ b/app/models/integrations/chat_message/pipeline_message.rb @@ -126,6 +126,14 @@ module Integrations } end + def pipeline_name_field + { + title: s_("ChatMessage|Pipeline name"), + value: pipeline.name, + short: false + } + end + def attachments_fields fields = [ { @@ -143,6 +151,7 @@ module Integrations fields << failed_stages_field if failed_stages.any? fields << failed_jobs_field if failed_jobs.any? fields << yaml_error_field if pipeline.has_yaml_errors? + fields << pipeline_name_field if Feature.enabled?(:pipeline_name, project) && pipeline.name.present? fields end diff --git a/app/models/integrations/datadog.rb b/app/models/integrations/datadog.rb index ab0fdbd777f..27bed5d3f76 100644 --- a/app/models/integrations/datadog.rb +++ b/app/models/integrations/datadog.rb @@ -3,7 +3,6 @@ module Integrations class Datadog < Integration include HasWebHook - extend Gitlab::Utils::Override DEFAULT_DOMAIN = 'datadoghq.com' URL_TEMPLATE = 'https://webhook-intake.%{datadog_domain}/api/v2/webhook' @@ -91,7 +90,7 @@ module Integrations with_options if: :activated? do validates :api_key, presence: true, format: { with: /\A\w+\z/ } - validates :datadog_site, format: { with: /\A[\w\.]+\z/, allow_blank: true } + validates :datadog_site, format: { with: %r{\A\w+([-.]\w+)*\.[a-zA-Z]{2,5}(:[0-9]{1,5})?\z}, allow_blank: true } validates :api_url, public_url: { allow_blank: true } validates :datadog_site, presence: true, unless: -> (obj) { obj.api_url.present? } validates :api_url, presence: true, unless: -> (obj) { obj.datadog_site.present? } @@ -169,8 +168,8 @@ module Integrations result = execute(data) { - success: (200..299).cover?(result[:http_status]), - result: result[:message] + success: (200..299).cover?(result.payload[:http_status]), + result: result.message } end diff --git a/app/models/integrations/discord.rb b/app/models/integrations/discord.rb index d0389b82410..061c491034d 100644 --- a/app/models/integrations/discord.rb +++ b/app/models/integrations/discord.rb @@ -10,8 +10,7 @@ module Integrations field :webhook, section: SECTION_TYPE_CONNECTION, - placeholder: 'https://discordapp.com/api/webhooks/…', - help: 'URL to the webhook for the Discord channel.', + help: 'e.g. https://discordapp.com/api/webhooks/…', required: true field :notify_only_broken_pipelines, diff --git a/app/models/integrations/drone_ci.rb b/app/models/integrations/drone_ci.rb index d1a64aa96d4..781acf65c47 100644 --- a/app/models/integrations/drone_ci.rb +++ b/app/models/integrations/drone_ci.rb @@ -6,7 +6,6 @@ module Integrations include PushDataValidations include ReactivelyCached prepend EnableSslVerification - extend Gitlab::Utils::Override DRONE_SAAS_HOSTNAME = 'cloud.drone.io' diff --git a/app/models/integrations/hangouts_chat.rb b/app/models/integrations/hangouts_chat.rb index 6e7f31aa030..c903e8d9eb8 100644 --- a/app/models/integrations/hangouts_chat.rb +++ b/app/models/integrations/hangouts_chat.rb @@ -22,10 +22,6 @@ module Integrations def default_channel_placeholder end - def webhook_placeholder - 'https://chat.googleapis.com/v1/spaces…' - end - def self.supported_events %w[push issue confidential_issue merge_request note confidential_note tag_push pipeline wiki_page] @@ -33,7 +29,7 @@ module Integrations def default_fields [ - { type: 'text', name: 'webhook', placeholder: "#{webhook_placeholder}" }, + { type: 'text', name: 'webhook', help: 'https://chat.googleapis.com/v1/spaces…' }, { type: 'checkbox', name: 'notify_only_broken_pipelines' }, { type: 'select', diff --git a/app/models/integrations/jenkins.rb b/app/models/integrations/jenkins.rb index 74a6449f4f9..d2e8393ef95 100644 --- a/app/models/integrations/jenkins.rb +++ b/app/models/integrations/jenkins.rb @@ -5,10 +5,10 @@ module Integrations include HasWebHook prepend EnableSslVerification - extend Gitlab::Utils::Override field :jenkins_url, title: -> { s_('ProjectService|Jenkins server URL') }, + exposes_secrets: true, required: true, placeholder: 'http://jenkins.example.com', help: -> { s_('The URL of the Jenkins server.') } @@ -27,21 +27,13 @@ module Integrations non_empty_password_title: -> { s_('ProjectService|Enter new password.') }, non_empty_password_help: -> { s_('ProjectService|Leave blank to use your current password.') } - before_validation :reset_password - validates :jenkins_url, presence: true, addressable_url: true, if: :activated? validates :project_name, presence: true, if: :activated? validates :username, presence: true, if: ->(service) { service.activated? && service.password_touched? && service.password.present? } + validates :password, presence: true, if: ->(service) { service.activated? && service.username.present? } - default_value_for :merge_requests_events, false - default_value_for :tag_push_events, false - - def reset_password - # don't reset the password if a new one is provided - if (jenkins_url_changed? || username.blank?) && !password_touched? - self.password = nil - end - end + attribute :merge_requests_events, default: false + attribute :tag_push_events, default: false def execute(data) return unless supported_events.include?(data[:object_kind]) @@ -52,12 +44,12 @@ module Integrations def test(data) begin result = execute(data) - return { success: false, result: result[:message] } if result[:http_status] != 200 + return { success: false, result: result.message } if result.payload[:http_status] != 200 rescue StandardError => e return { success: false, result: e } end - { success: true, result: result[:message] } + { success: true, result: result.message } end override :hook_url diff --git a/app/models/integrations/jira.rb b/app/models/integrations/jira.rb index 3ca514ab1fd..30497c0110e 100644 --- a/app/models/integrations/jira.rb +++ b/app/models/integrations/jira.rb @@ -3,7 +3,6 @@ # Accessible as Project#external_issue_tracker module Integrations class Jira < BaseIssueTracker - extend ::Gitlab::Utils::Override include Gitlab::Routing include ApplicationHelper include ActionView::Helpers::AssetUrlHelper @@ -533,13 +532,14 @@ module Integrations end def build_entity_meta(entity) - if entity.is_a?(Commit) + case entity + when Commit { id: entity.short_id, description: entity.safe_message, branch: branch_name(entity) } - elsif entity.is_a?(MergeRequest) + when MergeRequest { id: entity.to_reference, branch: entity.source_branch diff --git a/app/models/integrations/mattermost.rb b/app/models/integrations/mattermost.rb index dae11b99bc5..dd1c98ee06b 100644 --- a/app/models/integrations/mattermost.rb +++ b/app/models/integrations/mattermost.rb @@ -3,7 +3,6 @@ module Integrations class Mattermost < BaseChatNotification include SlackMattermostNotifier - extend ::Gitlab::Utils::Override def title s_('Mattermost notifications') @@ -26,7 +25,7 @@ module Integrations 'my-channel' end - def webhook_placeholder + def webhook_help 'http://mattermost.example.com/hooks/' end diff --git a/app/models/integrations/microsoft_teams.rb b/app/models/integrations/microsoft_teams.rb index 69863f164cd..d6cbe5760e8 100644 --- a/app/models/integrations/microsoft_teams.rb +++ b/app/models/integrations/microsoft_teams.rb @@ -18,10 +18,6 @@ module Integrations '

Use this service to send notifications about events in GitLab projects to your Microsoft Teams channels. How do I configure this integration?

' end - def webhook_placeholder - 'https://outlook.office.com/webhook/…' - end - def default_channel_placeholder end @@ -32,7 +28,7 @@ module Integrations def default_fields [ - { type: 'text', section: SECTION_TYPE_CONNECTION, name: 'webhook', required: true, placeholder: "#{webhook_placeholder}" }, + { type: 'text', section: SECTION_TYPE_CONNECTION, name: 'webhook', help: 'https://outlook.office.com/webhook/…', required: true }, { type: 'checkbox', section: SECTION_TYPE_CONFIGURATION, diff --git a/app/models/integrations/packagist.rb b/app/models/integrations/packagist.rb index 7177c82a167..7148de66aee 100644 --- a/app/models/integrations/packagist.rb +++ b/app/models/integrations/packagist.rb @@ -3,7 +3,6 @@ module Integrations class Packagist < Integration include HasWebHook - extend Gitlab::Utils::Override field :username, title: -> { s_('Username') }, @@ -55,12 +54,12 @@ module Integrations def test(data) begin result = execute(data) - return { success: false, result: result[:message] } if result[:http_status] != 202 + return { success: false, result: result.message } if result.payload[:http_status] != 202 rescue StandardError => e - return { success: false, result: e } + return { success: false, result: e.message } end - { success: true, result: result[:message] } + { success: true, result: result.message } end override :hook_url diff --git a/app/models/integrations/pivotaltracker.rb b/app/models/integrations/pivotaltracker.rb index d32fb974339..1acdbbbf9bc 100644 --- a/app/models/integrations/pivotaltracker.rb +++ b/app/models/integrations/pivotaltracker.rb @@ -56,7 +56,7 @@ module Integrations } Gitlab::HTTP.post( API_ENDPOINT, - body: message.to_json, + body: Gitlab::Json.dump(message), headers: { 'Content-Type' => 'application/json', 'X-TrackerToken' => token diff --git a/app/models/integrations/pumble.rb b/app/models/integrations/pumble.rb index 17026410eb1..e08dc6d0f51 100644 --- a/app/models/integrations/pumble.rb +++ b/app/models/integrations/pumble.rb @@ -36,7 +36,7 @@ module Integrations def default_fields [ - { type: 'text', name: 'webhook', placeholder: "https://api.pumble.com/workspaces/x/...", required: true }, + { type: 'text', name: 'webhook', help: 'https://api.pumble.com/workspaces/x/...', required: true }, { type: 'checkbox', name: 'notify_only_broken_pipelines' }, { type: 'select', @@ -51,7 +51,7 @@ module Integrations def notify(message, opts) header = { 'Content-Type' => 'application/json' } - response = Gitlab::HTTP.post(webhook, headers: header, body: { text: message.summary }.to_json) + response = Gitlab::HTTP.post(webhook, headers: header, body: Gitlab::Json.dump({ text: message.summary })) response if response.success? end diff --git a/app/models/integrations/slack.rb b/app/models/integrations/slack.rb index c254ea379bb..89326b8174f 100644 --- a/app/models/integrations/slack.rb +++ b/app/models/integrations/slack.rb @@ -1,17 +1,8 @@ # frozen_string_literal: true module Integrations - class Slack < BaseChatNotification + class Slack < BaseSlackNotification include SlackMattermostNotifier - extend ::Gitlab::Utils::Override - - SUPPORTED_EVENTS_FOR_USAGE_LOG = %w[ - push issue confidential_issue merge_request note confidential_note - tag_push wiki_page deployment - ].freeze - SNOWPLOW_EVENT_CATEGORY = self.name - - prop_accessor EVENT_CHANNEL['alert'] def title 'Slack notifications' @@ -25,57 +16,9 @@ module Integrations 'slack' end - def default_channel_placeholder - _('#general, #development') - end - - def webhook_placeholder + override :webhook_help + def webhook_help 'https://hooks.slack.com/services/…' end - - def supported_events - additional = [] - additional << 'alert' - - super + additional - end - - def get_message(object_kind, data) - return Integrations::ChatMessage::AlertMessage.new(data) if object_kind == 'alert' - - super - end - - override :log_usage - def log_usage(event, user_id) - return unless user_id - - return unless SUPPORTED_EVENTS_FOR_USAGE_LOG.include?(event) - - key = "i_ecosystem_slack_service_#{event}_notification" - - Gitlab::UsageDataCounters::HLLRedisCounter.track_event(key, values: user_id) - - return unless Feature.enabled?(:route_hll_to_snowplow_phase2) - - optional_arguments = { - project: project, - namespace: group || project&.namespace - }.compact - - Gitlab::Tracking.event( - SNOWPLOW_EVENT_CATEGORY, - Integration::SNOWPLOW_EVENT_ACTION, - label: Integration::SNOWPLOW_EVENT_LABEL, - property: key, - user: User.find(user_id), - **optional_arguments - ) - end - - override :configurable_channels? - def configurable_channels? - true - end end end diff --git a/app/models/integrations/teamcity.rb b/app/models/integrations/teamcity.rb index ca7a715f4b3..af629d6ef1e 100644 --- a/app/models/integrations/teamcity.rb +++ b/app/models/integrations/teamcity.rb @@ -11,6 +11,7 @@ module Integrations field :teamcity_url, title: -> { s_('ProjectService|TeamCity server URL') }, placeholder: 'https://teamcity.example.com', + exposes_secrets: true, required: true field :build_type, @@ -36,8 +37,6 @@ module Integrations attr_accessor :response - before_validation :reset_password - class << self def to_param 'teamcity' @@ -48,12 +47,6 @@ module Integrations end end - def reset_password - if teamcity_url_changed? && !password_touched? - self.password = nil - end - end - def title 'JetBrains TeamCity' end diff --git a/app/models/integrations/unify_circuit.rb b/app/models/integrations/unify_circuit.rb index f10a75fac5d..aa19133b8c2 100644 --- a/app/models/integrations/unify_circuit.rb +++ b/app/models/integrations/unify_circuit.rb @@ -29,7 +29,7 @@ module Integrations def default_fields [ - { type: 'text', name: 'webhook', placeholder: "https://yourcircuit.com/rest/v2/webhooks/incoming/…", required: true }, + { type: 'text', name: 'webhook', help: 'https://yourcircuit.com/rest/v2/webhooks/incoming/…', required: true }, { type: 'checkbox', name: 'notify_only_broken_pipelines' }, { type: 'select', @@ -43,11 +43,13 @@ module Integrations private def notify(message, opts) - response = Gitlab::HTTP.post(webhook, body: { + body = { subject: message.project_name, text: message.summary, markdown: true - }.to_json) + } + + response = Gitlab::HTTP.post(webhook, body: Gitlab::Json.dump(body)) response if response.success? end diff --git a/app/models/integrations/webex_teams.rb b/app/models/integrations/webex_teams.rb index 75be457dcf5..8e6f5ca6d17 100644 --- a/app/models/integrations/webex_teams.rb +++ b/app/models/integrations/webex_teams.rb @@ -29,7 +29,7 @@ module Integrations def default_fields [ - { type: 'text', name: 'webhook', placeholder: "https://api.ciscospark.com/v1/webhooks/incoming/...", required: true }, + { type: 'text', name: 'webhook', help: 'https://api.ciscospark.com/v1/webhooks/incoming/...', required: true }, { type: 'checkbox', name: 'notify_only_broken_pipelines' }, { type: 'select', @@ -44,7 +44,7 @@ module Integrations def notify(message, opts) header = { 'Content-Type' => 'application/json' } - response = Gitlab::HTTP.post(webhook, headers: header, body: { markdown: message.summary }.to_json) + response = Gitlab::HTTP.post(webhook, headers: header, body: Gitlab::Json.dump({ markdown: message.summary })) response if response.success? end -- cgit v1.2.1