diff options
Diffstat (limited to 'app/models/ci/build_metadata.rb')
-rw-r--r-- | app/models/ci/build_metadata.rb | 46 |
1 files changed, 40 insertions, 6 deletions
diff --git a/app/models/ci/build_metadata.rb b/app/models/ci/build_metadata.rb index f281cbd1d6f..89cdd8c64f8 100644 --- a/app/models/ci/build_metadata.rb +++ b/app/models/ci/build_metadata.rb @@ -4,9 +4,12 @@ module Ci # The purpose of this class is to store Build related data that can be disposed. # Data that should be persisted forever, should be stored with Ci::Build model. class BuildMetadata < ApplicationRecord + BuildTimeout = Struct.new(:value, :source) + extend Gitlab::Ci::Model include Presentable include ChronicDurationAttribute + include Gitlab::Utils::StrongMemoize self.table_name = 'ci_builds_metadata' @@ -25,17 +28,16 @@ module Ci enum timeout_source: { unknown_timeout_source: 1, project_timeout_source: 2, - runner_timeout_source: 3 + runner_timeout_source: 3, + job_timeout_source: 4 } def update_timeout_state - return unless build.runner.present? + timeout = timeout_with_highest_precedence - project_timeout = project&.build_timeout - timeout = [project_timeout, build.runner.maximum_timeout].compact.min - timeout_source = timeout < project_timeout ? :runner_timeout_source : :project_timeout_source + return unless timeout - update(timeout: timeout, timeout_source: timeout_source) + update(timeout: timeout.value, timeout_source: timeout.source) end private @@ -43,5 +45,37 @@ module Ci def set_build_project self.project_id ||= self.build.project_id end + + def timeout_with_highest_precedence + [(job_timeout || project_timeout), runner_timeout].compact.min_by { |timeout| timeout.value } + end + + def project_timeout + strong_memoize(:project_timeout) do + BuildTimeout.new(project&.build_timeout, :project_timeout_source) + end + end + + def job_timeout + return unless build.options + + strong_memoize(:job_timeout) do + if timeout_from_options = build.options[:job_timeout] + BuildTimeout.new(timeout_from_options, :job_timeout_source) + end + end + end + + def runner_timeout + return unless runner_timeout_set? + + strong_memoize(:runner_timeout) do + BuildTimeout.new(build.runner.maximum_timeout, :runner_timeout_source) + end + end + + def runner_timeout_set? + build.runner&.maximum_timeout.to_i > 0 + end end end |