Cleanup the use of duration and optimize some queries
This commit is contained in:
parent
831b6c8fda
commit
21fdc1edae
9 changed files with 39 additions and 50 deletions
|
@ -15,25 +15,9 @@ module TimeHelper
|
|||
"#{from.to_s(:short)} - #{to.to_s(:short)}"
|
||||
end
|
||||
|
||||
def duration_in_numbers(finished_at, started_at)
|
||||
interval = interval_in_seconds(started_at, finished_at)
|
||||
def duration_in_numbers(duration)
|
||||
time_format = duration < 1.hour ? "%M:%S" : "%H:%M:%S"
|
||||
|
||||
duration_in_numbers_from_interval(interval)
|
||||
end
|
||||
|
||||
def duration_in_numbers_from_interval(interval)
|
||||
time_format = interval < 1.hour ? "%M:%S" : "%H:%M:%S"
|
||||
|
||||
Time.at(interval).utc.strftime(time_format)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def interval_in_seconds(started_at, finished_at = nil)
|
||||
if started_at && finished_at
|
||||
finished_at.to_i - started_at.to_i
|
||||
elsif started_at
|
||||
Time.now.to_i - started_at.to_i
|
||||
end
|
||||
Time.at(duration).utc.strftime(time_format)
|
||||
end
|
||||
end
|
||||
|
|
|
@ -34,6 +34,10 @@ module Ci
|
|||
CommitStatus.where(pipeline: pluck(:id)).stages
|
||||
end
|
||||
|
||||
def self.duration
|
||||
where.not(duration: nil).pluck(:duration).inject(0, &:+)
|
||||
end
|
||||
|
||||
def project_id
|
||||
project.id
|
||||
end
|
||||
|
@ -213,10 +217,6 @@ module Ci
|
|||
]
|
||||
end
|
||||
|
||||
def wall_clock_duration
|
||||
finished_at.to_i - started_at.to_i if finished_at && started_at
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def build_builds_for_stages(stages, user, status, trigger_request)
|
||||
|
@ -240,7 +240,7 @@ module Ci
|
|||
end
|
||||
self.started_at = statuses.started_at
|
||||
self.finished_at = statuses.finished_at
|
||||
self.duration = statuses.latest.duration
|
||||
self.duration = calculate_duration.to_i
|
||||
save
|
||||
end
|
||||
|
||||
|
|
|
@ -21,6 +21,7 @@ class CommitStatus < ActiveRecord::Base
|
|||
|
||||
where(id: max_id.group(:name, :commit_id))
|
||||
end
|
||||
|
||||
scope :retried, -> { where.not(id: latest) }
|
||||
scope :ordered, -> { order(:name) }
|
||||
scope :ignored, -> { where(allow_failure: true, status: [:failed, :canceled]) }
|
||||
|
@ -83,18 +84,17 @@ class CommitStatus < ActiveRecord::Base
|
|||
end
|
||||
end
|
||||
|
||||
def self.duration
|
||||
select(:started_at, :finished_at).all.
|
||||
map(&:duration).compact.inject(0, &:+)
|
||||
end
|
||||
|
||||
def ignored?
|
||||
allow_failure? && (failed? || canceled?)
|
||||
end
|
||||
|
||||
def duration
|
||||
duration =
|
||||
if started_at && finished_at
|
||||
finished_at - started_at
|
||||
elsif started_at
|
||||
Time.now - started_at
|
||||
end
|
||||
duration
|
||||
calculate_duration
|
||||
end
|
||||
|
||||
def stuck?
|
||||
|
|
|
@ -31,11 +31,6 @@ module Statuseable
|
|||
all.pluck(self.status_sql).first
|
||||
end
|
||||
|
||||
def duration
|
||||
duration_array = all.map(&:duration).compact
|
||||
duration_array.reduce(:+)
|
||||
end
|
||||
|
||||
def started_at
|
||||
all.minimum(:started_at)
|
||||
end
|
||||
|
@ -78,4 +73,14 @@ module Statuseable
|
|||
def complete?
|
||||
canceled? || success? || failed?
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def calculate_duration
|
||||
if started_at && finished_at
|
||||
finished_at - started_at
|
||||
elsif started_at
|
||||
Time.now - started_at
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -51,7 +51,7 @@
|
|||
- if build.duration
|
||||
%p.duration
|
||||
= custom_icon("icon_timer")
|
||||
= duration_in_numbers(build.finished_at, build.started_at)
|
||||
= duration_in_numbers(build.duration)
|
||||
|
||||
- if build.finished_at
|
||||
%p.finished-at
|
||||
|
|
|
@ -63,7 +63,7 @@
|
|||
- if build.duration
|
||||
%p.duration
|
||||
= custom_icon("icon_timer")
|
||||
= duration_in_numbers(build.finished_at, build.started_at)
|
||||
= duration_in_numbers(build.duration)
|
||||
- if build.finished_at
|
||||
%p.finished-at
|
||||
= icon("calendar")
|
||||
|
|
|
@ -46,10 +46,10 @@
|
|||
\-
|
||||
|
||||
%td
|
||||
- if pipeline.wall_clock_duration
|
||||
- if pipeline.duration
|
||||
%p.duration
|
||||
= custom_icon("icon_timer")
|
||||
= duration_in_numbers_from_interval(pipeline.wall_clock_duration)
|
||||
= duration_in_numbers(pipeline.duration)
|
||||
- if pipeline.finished_at
|
||||
%p.finished-at
|
||||
= icon("calendar")
|
||||
|
|
|
@ -7,9 +7,9 @@
|
|||
- if @pipeline.ref
|
||||
for
|
||||
= link_to @pipeline.ref, namespace_project_commits_path(@project.namespace, @project, @pipeline.ref), class: "monospace"
|
||||
- if @pipeline.wall_clock_duration
|
||||
- if @pipeline.duration
|
||||
in
|
||||
= time_interval_in_words(@pipeline.wall_clock_duration)
|
||||
= time_interval_in_words(@pipeline.duration)
|
||||
|
||||
.pull-right
|
||||
= link_to namespace_project_pipeline_path(@project.namespace, @project, @pipeline), class: "ci-status ci-#{@pipeline.status}" do
|
||||
|
|
|
@ -19,16 +19,16 @@ describe TimeHelper do
|
|||
|
||||
describe "#duration_in_numbers" do
|
||||
it "returns minutes and seconds" do
|
||||
duration_in_numbers = {
|
||||
[100, 0] => "01:40",
|
||||
[121, 0] => "02:01",
|
||||
[3721, 0] => "01:02:01",
|
||||
[0, 0] => "00:00",
|
||||
[nil, Time.now.to_i - 42] => "00:42"
|
||||
durations_and_expectations = {
|
||||
100 => "01:40",
|
||||
121 => "02:01",
|
||||
3721 => "01:02:01",
|
||||
0 => "00:00",
|
||||
42 => "00:42"
|
||||
}
|
||||
|
||||
duration_in_numbers.each do |interval, expectation|
|
||||
expect(duration_in_numbers(*interval)).to eq(expectation)
|
||||
durations_and_expectations.each do |duration, expectation|
|
||||
expect(duration_in_numbers(duration)).to eq(expectation)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
Loading…
Reference in a new issue