diff options
Diffstat (limited to 'lib/gitlab/chat/responder/mattermost.rb')
-rw-r--r-- | lib/gitlab/chat/responder/mattermost.rb | 131 |
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 |