71 lines
1.3 KiB
Ruby
71 lines
1.3 KiB
Ruby
class CreateDeploymentService < BaseService
|
|
def execute(deployable = nil)
|
|
return unless executable?
|
|
|
|
ActiveRecord::Base.transaction do
|
|
@deployable = deployable
|
|
|
|
@environment = environment
|
|
@environment.external_url = expanded_url if expanded_url
|
|
@environment.fire_state_event(action)
|
|
|
|
return unless @environment.save
|
|
return if @environment.stopped?
|
|
|
|
deploy.tap do |deployment|
|
|
deployment.update_merge_request_metrics!
|
|
end
|
|
end
|
|
end
|
|
|
|
private
|
|
|
|
def executable?
|
|
project && name.present?
|
|
end
|
|
|
|
def deploy
|
|
project.deployments.create(
|
|
environment: @environment,
|
|
ref: params[:ref],
|
|
tag: params[:tag],
|
|
sha: params[:sha],
|
|
user: current_user,
|
|
deployable: @deployable,
|
|
on_stop: options[:on_stop])
|
|
end
|
|
|
|
def environment
|
|
@environment ||= project.environments.find_or_create_by(name: expanded_name)
|
|
end
|
|
|
|
def expanded_name
|
|
ExpandVariables.expand(name, variables)
|
|
end
|
|
|
|
def expanded_url
|
|
return unless url
|
|
|
|
@expanded_url ||= ExpandVariables.expand(url, variables)
|
|
end
|
|
|
|
def name
|
|
params[:environment]
|
|
end
|
|
|
|
def url
|
|
options[:url]
|
|
end
|
|
|
|
def options
|
|
params[:options] || {}
|
|
end
|
|
|
|
def variables
|
|
params[:variables] || []
|
|
end
|
|
|
|
def action
|
|
options[:action] || 'start'
|
|
end
|
|
end
|