Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'lib/gitlab/chat/responder/mattermost.rb')
-rw-r--r--lib/gitlab/chat/responder/mattermost.rb131
1 files changed, 131 insertions, 0 deletions
diff --git a/lib/gitlab/chat/responder/mattermost.rb b/lib/gitlab/chat/responder/mattermost.rb
new file mode 100644
index 00000000000..0488c98e422
--- /dev/null
+++ b/lib/gitlab/chat/responder/mattermost.rb
@@ -0,0 +1,131 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Chat
+ module Responder
+ class Mattermost < Responder::Base
+ SUCCESS_COLOR = '#00c100'
+ FAILURE_COLOR = '#e40303'
+
+ # Slack breaks messages apart if they're around 4 KB in size. We use a
+ # slightly smaller limit here to account for user mentions.
+ MESSAGE_SIZE_LIMIT = 3.5.kilobytes
+
+ # Sends a response back to Mattermost
+ #
+ # body - The message payload to send back to Mattermost, as a Hash.
+ def send_response(body)
+ Gitlab::HTTP.post(
+ pipeline.chat_data.response_url,
+ {
+ headers: { 'Content-Type': 'application/json' },
+ body: body.to_json
+ }
+ )
+ end
+
+ # Sends the output for a build that completed successfully.
+ #
+ # output - The output produced by the chat command.
+ def success(output)
+ return if output.empty?
+
+ send_response(
+ response_type: :in_channel,
+ attachments: [
+ {
+ color: SUCCESS_COLOR,
+ text: "ChatOps job started by #{user_ref} completed successfully",
+ fields: [
+ {
+ short: true,
+ title: "ID",
+ value: "#{build_ref}"
+ },
+ {
+ short: true,
+ title: "Name",
+ value: build.name
+ },
+ {
+ short: false,
+ title: "Output",
+ value: success_message(output)
+ }
+ ]
+ }
+ ]
+ )
+ end
+
+ # Sends the output for a build that failed.
+ def failure
+ send_response(
+ response_type: :in_channel,
+ attachments: [
+ {
+ color: FAILURE_COLOR,
+ text: "ChatOps job started by #{user_ref} failed!",
+ fields: [
+ {
+ short: true,
+ title: "ID",
+ value: "#{build_ref}"
+ },
+ {
+ short: true,
+ title: "Name",
+ value: build.name
+ }
+ ]
+ }
+ ]
+ )
+ end
+
+ # Returns the output to send back after a command has been scheduled.
+ def scheduled_output
+ {
+ response_type: :ephemeral,
+ text: "Your ChatOps job #{build_ref} has been created!"
+ }
+ end
+
+ private
+
+ def success_message(output)
+ <<~HEREDOC.chomp
+ ```shell
+ #{strip_ansi_colorcodes(limit_output(output))}
+ ```
+ HEREDOC
+ end
+
+ def limit_output(output)
+ if output.bytesize <= MESSAGE_SIZE_LIMIT
+ output
+ else
+ "The output is too large to be sent back directly!"
+ end
+ end
+
+ def strip_ansi_colorcodes(output)
+ output.gsub(/\x1b\[[0-9;]*m/, '')
+ end
+
+ def user_ref
+ user = pipeline.chat_data.chat_name.user
+ user_url = ::Gitlab::Routing.url_helpers.user_url(user)
+
+ "[#{user.name}](#{user_url})"
+ end
+
+ def build_ref
+ build_url = ::Gitlab::Routing.url_helpers.project_build_url(project, build)
+
+ "[##{build.id}](#{build_url})"
+ end
+ end
+ end
+ end
+end