Commit 1d16f137 authored by Kamil Trzcinski's avatar Kamil Trzcinski

Add deploy chat command [ci skip]

parent c99522f2
......@@ -19,7 +19,7 @@ class Environment < ActiveRecord::Base
allow_nil: true,
addressable_url: true
delegate :stop_action, to: :last_deployment, allow_nil: true
delegate :stop_action, :manual_actions, to: :last_deployment, allow_nil: true
scope :available, -> { with_state(:available) }
scope :stopped, -> { with_state(:stopped) }
......@@ -99,4 +99,12 @@ class Environment < ActiveRecord::Base
stop
stop_action.play(current_user)
end
def actions_for(environment)
return [] unless manual_actions
manual_actions.select |action|
action.expanded_environment_name = environment
end
end
end
module Gitlab
module ChatCommands
class Deploy < BaseCommand
def self.match(text)
/\Adeploy\s+(?<from>.*)\s+to+\s+(?<to>.*)\z/.match(text)
end
def self.help_message
'deploy <environment> to <target-environment>'
end
def self.allowed?(project, user)
can?(user, :create_deployment, project)
end
def execute(match)
from = match[:from]
to = match[:to]
environment = project.environments.find_by(name: from)
return unless environment
actions = environment.actions_for(to)
return unless actions.any?
if actions.one?
actions.first.play(current_user)
else
Result.new(:error, 'Too many actions defined')
end
end
end
end
end
module Gitlab
module ChatCommands
Result = Struct.new(:type, :message)
end
end
......@@ -24,20 +24,22 @@ module Mattermost
end
end
def present(resource)
return not_found unless resource
if resource.respond_to?(:count)
if resource.count > 1
return multiple_resources(resource)
elsif resource.count == 0
return not_found
def present(subject)
return not_found unless subject
if subject.is_a?(Gitlab::ChatCommands::Result)
show_result(subject)
elsif subject.respond_to?(:count)
if subject.try(:many?)
multiple_resources(subject)
elsif subject.count == 0
not_found
else
resource = resource.first
single_resource(subject)
end
else
single_resource(subject)
end
single_resource(resource)
end
def access_denied
......@@ -46,6 +48,10 @@ module Mattermost
private
def show_result(result)
ephemeral_response(result.message)
end
def not_found
ephemeral_response("404 not found! GitLab couldn't find what you were looking for! :boom:")
end
......@@ -54,7 +60,7 @@ module Mattermost
return error(resource) if resource.errors.any? || !resource.persisted?
message = "### #{title(resource)}"
message << "\n\n#{resource.description}" if resource.description
message << "\n\n#{resource.description}" if resource.try(:description)
in_channel_response(message)
end
......@@ -74,7 +80,10 @@ module Mattermost
end
def title(resource)
"[#{resource.to_reference} #{resource.title}](#{url(resource)})"
reference = resource.try(:to_reference) || resource.try(:id)
title = resource.try(:title) || resource.try(:name)
"[#{reference} #{title}](#{url(resource)})"
end
def header_with_list(header, items)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment