summaryrefslogtreecommitdiff
path: root/app/services/environments/create_for_build_service.rb
blob: ff4da212002b031d770534fd48241655b14350a8 (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
# frozen_string_literal: true

module Environments
  # This class creates an environment record for a build (a pipeline job).
  class CreateForBuildService
    def execute(build)
      return unless build.instance_of?(::Ci::Build) && build.has_environment_keyword?

      environment = to_resource(build)

      if environment.persisted?
        build.persisted_environment = environment
        build.assign_attributes(metadata_attributes: { expanded_environment_name: environment.name })
      else
        build.assign_attributes(status: :failed, failure_reason: :environment_creation_failure)
      end

      environment
    end

    private

    # rubocop: disable Performance/ActiveRecordSubtransactionMethods
    def to_resource(build)
      build.project.environments.safe_find_or_create_by(name: build.expanded_environment_name) do |environment|
        # Initialize the attributes at creation
        environment.auto_stop_in = expanded_auto_stop_in(build)
        environment.tier = build.environment_tier_from_options
        environment.merge_request = build.pipeline.merge_request
      end
    end
    # rubocop: enable Performance/ActiveRecordSubtransactionMethods

    def expanded_auto_stop_in(build)
      return unless build.environment_auto_stop_in

      ExpandVariables.expand(build.environment_auto_stop_in, -> { build.simple_variables.sort_and_expand_all })
    end
  end
end