diff options
author | Grzegorz Bizon <grzegorz@gitlab.com> | 2018-11-07 18:02:18 +0300 |
---|---|---|
committer | Grzegorz Bizon <grzegorz@gitlab.com> | 2018-11-07 18:02:18 +0300 |
commit | f323d6148b7b71609cbd32ab9db4724fc108729d (patch) | |
tree | 28762cadb685f35a7a4b70bbf243a3023e999262 /app | |
parent | 5dc0577b84b9d41b1e2a6e781dfeaa400e8e2c10 (diff) | |
parent | 0c59fdaab69e93e2f00fdf70f2a31bb095e3d8d0 (diff) |
Merge branch 'max_retries_when' into 'master'
Allow to configure when to retry builds
Closes gitlab-runner#3515
See merge request gitlab-org/gitlab-ce!21758
Diffstat (limited to 'app')
-rw-r--r-- | app/models/ci/build.rb | 26 |
1 files changed, 22 insertions, 4 deletions
diff --git a/app/models/ci/build.rb b/app/models/ci/build.rb index 5c1168e8ef5..889f8ce27a6 100644 --- a/app/models/ci/build.rb +++ b/app/models/ci/build.rb @@ -221,9 +221,7 @@ module Ci build.deployment&.drop - next if build.retries_max.zero? - - if build.retries_count < build.retries_max + if build.retry_failure? begin Ci::Build.retry(build, build.user) rescue Gitlab::Access::AccessDeniedError => ex @@ -321,7 +319,17 @@ module Ci end def retries_max - self.options.to_h.fetch(:retry, 0).to_i + normalized_retry.fetch(:max, 0) + end + + def retry_when + normalized_retry.fetch(:when, ['always']) + end + + def retry_failure? + return false if retries_max.zero? || retries_count >= retries_max + + retry_when.include?('always') || retry_when.include?(failure_reason.to_s) end def latest? @@ -886,6 +894,16 @@ module Ci options&.dig(:environment, :url) || persisted_environment&.external_url end + # The format of the retry option changed in GitLab 11.5: Before it was + # integer only, after it is a hash. New builds are created with the new + # format, but builds created before GitLab 11.5 and saved in database still + # have the old integer only format. This method returns the retry option + # normalized as a hash in 11.5+ format. + def normalized_retry + value = options&.dig(:retry) + value.is_a?(Integer) ? { max: value } : value.to_h + end + def build_attributes_from_config return {} unless pipeline.config_processor |