retry.rb 2.3 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
module Gitlab
  module Ci
    class Config
      module Entry
        ##
        # Entry that represents a retry config for a job.
        #
        class Retry < Simplifiable
          strategy :SimpleRetry, if: -> (config) { config.is_a?(Integer) }
          strategy :FullRetry, if: -> (config) { config.is_a?(Hash) }

          class SimpleRetry < Entry::Node
            include Entry::Validatable

            validations do
              validates :config, numericality: { only_integer: true,
                                                 greater_than_or_equal_to: 0,
                                                 less_than_or_equal_to: 2 }
            end
M
Markus Doits 已提交
20 21 22 23

            def location
              'retry'
            end
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
          end

          class FullRetry < Entry::Node
            include Entry::Validatable
            include Entry::Attributable

            ALLOWED_KEYS = %i[max when].freeze
            attributes :max, :when

            validations do
              validates :config, allowed_keys: ALLOWED_KEYS

              with_options allow_nil: true do
                validates :max, numericality: { only_integer: true,
                                                greater_than_or_equal_to: 0,
                                                less_than_or_equal_to: 2 }

                validates :when, array_of_strings_or_string: true
                validates :when,
                          allowed_array_values: { in: FullRetry.possible_retry_when_values },
                          if: -> (config) { config.when.is_a?(Array) }
                validates :when,
                          inclusion: { in: FullRetry.possible_retry_when_values },
                          if: -> (config) { config.when.is_a?(String) }
              end
            end

            def self.possible_retry_when_values
              @possible_retry_when_values ||= Gitlab::Ci::Status::Build::Failed.reasons.keys.map(&:to_s) + ['always']
            end
M
Markus Doits 已提交
54 55 56 57

            def location
              'retry'
            end
58 59 60 61 62 63
          end

          class UnknownStrategy < Entry::Node
            def errors
              ["#{location} has to be either an integer or a hash"]
            end
M
Markus Doits 已提交
64 65 66 67

            def location
              'retry config'
            end
68 69 70 71 72 73 74 75 76
          end

          def self.default
          end
        end
      end
    end
  end
end