Commit af048f22 authored by Kamil Trzciński's avatar Kamil Trzciński

Merge branch 'fix/gb/improve-timeout-inputs-help-sections' into 'master'

Improve help and validation sections of maximum build timeout inputs

Closes #49434

See merge request gitlab-org/gitlab-ce!23586
parents 61bc233e 35337177
...@@ -114,7 +114,8 @@ module Ci ...@@ -114,7 +114,8 @@ module Ci
cached_attr_reader :version, :revision, :platform, :architecture, :ip_address, :contacted_at cached_attr_reader :version, :revision, :platform, :architecture, :ip_address, :contacted_at
chronic_duration_attr :maximum_timeout_human_readable, :maximum_timeout chronic_duration_attr :maximum_timeout_human_readable, :maximum_timeout,
error_message: 'Maximum job timeout has a value which could not be accepted'
validates :maximum_timeout, allow_nil: true, validates :maximum_timeout, allow_nil: true,
numericality: { greater_than_or_equal_to: 600, numericality: { greater_than_or_equal_to: 600,
......
...@@ -24,7 +24,7 @@ module ChronicDurationAttribute ...@@ -24,7 +24,7 @@ module ChronicDurationAttribute
end end
end end
validates virtual_attribute, allow_nil: true, duration: true validates virtual_attribute, allow_nil: true, duration: { message: parameters[:error_message] }
end end
alias_method :chronic_duration_attr, :chronic_duration_attr_writer alias_method :chronic_duration_attr, :chronic_duration_attr_writer
......
...@@ -384,7 +384,8 @@ class Project < ActiveRecord::Base ...@@ -384,7 +384,8 @@ class Project < ActiveRecord::Base
enum auto_cancel_pending_pipelines: { disabled: 0, enabled: 1 } enum auto_cancel_pending_pipelines: { disabled: 0, enabled: 1 }
chronic_duration_attr :build_timeout_human_readable, :build_timeout, default: 3600 chronic_duration_attr :build_timeout_human_readable, :build_timeout,
default: 3600, error_message: 'Maximum job timeout has a value which could not be accepted'
validates :build_timeout, allow_nil: true, validates :build_timeout, allow_nil: true,
numericality: { greater_than_or_equal_to: 10.minutes, numericality: { greater_than_or_equal_to: 10.minutes,
......
...@@ -14,6 +14,10 @@ class DurationValidator < ActiveModel::EachValidator ...@@ -14,6 +14,10 @@ class DurationValidator < ActiveModel::EachValidator
def validate_each(record, attribute, value) def validate_each(record, attribute, value)
ChronicDuration.parse(value) ChronicDuration.parse(value)
rescue ChronicDuration::DurationParseError rescue ChronicDuration::DurationParseError
if options[:message]
record.errors.add(:base, options[:message])
else
record.errors.add(attribute, "is not a correct duration") record.errors.add(attribute, "is not a correct duration")
end end
end
end end
...@@ -29,7 +29,7 @@ ...@@ -29,7 +29,7 @@
= f.label :build_timeout_human_readable, _('Timeout'), class: 'label-bold' = f.label :build_timeout_human_readable, _('Timeout'), class: 'label-bold'
= f.text_field :build_timeout_human_readable, class: 'form-control' = f.text_field :build_timeout_human_readable, class: 'form-control'
%p.form-text.text-muted %p.form-text.text-muted
= _("Per job. If a job passes this threshold, it will be marked as failed") = _('If any job surpasses this timeout threshold, it will be marked as failed. Human readable time input language is accepted like "1 hour". Values without specification represent seconds.')
= link_to icon('question-circle'), help_page_path('user/project/pipelines/settings', anchor: 'timeout'), target: '_blank' = link_to icon('question-circle'), help_page_path('user/project/pipelines/settings', anchor: 'timeout'), target: '_blank'
%hr %hr
......
...@@ -45,7 +45,7 @@ ...@@ -45,7 +45,7 @@
= _('Maximum job timeout') = _('Maximum job timeout')
.col-sm-10 .col-sm-10
= f.text_field :maximum_timeout_human_readable, class: 'form-control' = f.text_field :maximum_timeout_human_readable, class: 'form-control'
.form-text.text-muted= _('This timeout will take precedence when lower than Project-defined timeout') .form-text.text-muted= _('This timeout will take precedence when lower than project-defined timeout and accepts a human readable time input language like "1 hour". Values without specification represent seconds.')
.form-group.row .form-group.row
= label_tag :tag_list, class: 'col-form-label col-sm-2' do = label_tag :tag_list, class: 'col-form-label col-sm-2' do
= _('Tags') = _('Tags')
......
---
title: Improve help and validation sections of maximum build timeout inputs
merge_request: 23586
author:
type: fixed
...@@ -3436,6 +3436,9 @@ msgstr "" ...@@ -3436,6 +3436,9 @@ msgstr ""
msgid "Identities" msgid "Identities"
msgstr "" msgstr ""
msgid "If any job surpasses this timeout threshold, it will be marked as failed. Human readable time input language is accepted like \"1 hour\". Values without specification represent seconds."
msgstr ""
msgid "If disabled, the access level will depend on the user's permissions in the project." msgid "If disabled, the access level will depend on the user's permissions in the project."
msgstr "" msgstr ""
...@@ -4614,9 +4617,6 @@ msgstr "" ...@@ -4614,9 +4617,6 @@ msgstr ""
msgid "People without permission will never get a notification and won't be able to comment." msgid "People without permission will never get a notification and won't be able to comment."
msgstr "" msgstr ""
msgid "Per job. If a job passes this threshold, it will be marked as failed"
msgstr ""
msgid "Perform advanced options such as changing path, transferring, or removing the group." msgid "Perform advanced options such as changing path, transferring, or removing the group."
msgstr "" msgstr ""
...@@ -6632,7 +6632,7 @@ msgstr "" ...@@ -6632,7 +6632,7 @@ msgstr ""
msgid "This source diff could not be displayed because it is too large." msgid "This source diff could not be displayed because it is too large."
msgstr "" msgstr ""
msgid "This timeout will take precedence when lower than Project-defined timeout" msgid "This timeout will take precedence when lower than project-defined timeout and accepts a human readable time input language like \"1 hour\". Values without specification represent seconds."
msgstr "" msgstr ""
msgid "This user has no identities" msgid "This user has no identities"
......
...@@ -54,7 +54,8 @@ shared_examples 'ChronicDurationAttribute writer' do ...@@ -54,7 +54,8 @@ shared_examples 'ChronicDurationAttribute writer' do
subject.send("#{virtual_field}=", '-10m') subject.send("#{virtual_field}=", '-10m')
expect(subject.valid?).to be_falsey expect(subject.valid?).to be_falsey
expect(subject.errors&.messages).to include(virtual_field => ['is not a correct duration']) expect(subject.errors&.messages)
.to include(base: ['Maximum job timeout has a value which could not be accepted'])
end end
end end
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment