summaryrefslogtreecommitdiff
path: root/app/services/update_deployment_service.rb
blob: 49a7d0178f438d3af90eefd8a54fc3f522a7e1b9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# frozen_string_literal: true

class UpdateDeploymentService
  attr_reader :deployment
  attr_reader :deployable

  delegate :environment, to: :deployment
  delegate :variables, to: :deployable

  def initialize(deployment)
    @deployment = deployment
    @deployable = deployment.deployable
  end

  def execute
    deployment.create_ref
    deployment.invalidate_cache

    ActiveRecord::Base.transaction do
      environment.external_url = expanded_environment_url if
        expanded_environment_url

      environment.fire_state_event(action)

      break unless environment.save
      break if environment.stopped?

      deployment.tap(&:update_merge_request_metrics!)
    end

    deployment
  end

  private

  def environment_options
    @environment_options ||= deployable.options&.dig(:environment) || {}
  end

  def expanded_environment_url
    return @expanded_environment_url if defined?(@expanded_environment_url)
    return unless environment_url

    @expanded_environment_url =
      ExpandVariables.expand(environment_url, variables)
  end

  def environment_url
    environment_options[:url]
  end

  def action
    environment_options[:action] || 'start'
  end
end