Support pipelines API

Pass `updated_at` to get only incremental changes since last update
This commit is contained in:
Kamil Trzcinski 2016-11-10 15:32:23 +01:00
parent 532c031915
commit 4e06818d33
6 changed files with 32 additions and 21 deletions

View file

@ -98,19 +98,38 @@ module Ci
sha[0...8]
end
def self.stages
# We use pluck here due to problems with MySQL which doesn't allow LIMIT/OFFSET in queries
CommitStatus.where(pipeline: pluck(:id)).stages
end
def self.total_duration
where.not(duration: nil).sum(:duration)
end
def stages
statuses.group('stage').select(:stage)
.order('max(stage_idx)')
end
def stages_with_statuses
status_sql = statuses.latest.where('stage=sg.stage').status_sql
stages_with_statuses = CommitStatus.from(self.stages, :sg).
pluck('sg.stage', status_sql)
stages_with_statuses.map do |stage|
OpenStruct.new(
name: stage.first,
status: stage.last,
pipeline: self
)
end
end
def stages_with_latest_statuses
statuses.latest.includes(project: :namespace).order(:stage_idx).group_by(&:stage)
end
def artifacts
builds.latest.with_artifacts_not_expired
end
def project_id
project.id
end

View file

@ -119,16 +119,7 @@ class CommitStatus < ActiveRecord::Base
def self.stages
# We group by stage name, but order stages by theirs' index
unscoped.from(all, :sg).group('stage').order('max(stage_idx)', 'stage').pluck('sg.stage')
end
def self.stages_status
# We execute subquery for each stage to calculate a stage status
statuses = unscoped.from(all, :sg).group('stage').pluck('sg.stage', all.where('stage=sg.stage').status_sql)
statuses.inject({}) do |h, k|
h[k.first] = k.last
h
end
unscoped.from(all, :sg).group('stage').order('max(stage_idx)', 'stage').select('sg.stage')
end
def failed_but_allowed?

View file

@ -45,9 +45,10 @@
- stages_status = pipeline.statuses.latest.stages_status
%td.stage-cell
- stages.each do |stage|
- status = stages_status[stage]
- tooltip = "#{stage.titleize}: #{status || 'not found'}"
- pipeline.statuses.latest.stages_status.each do |stage|
- name = stage.first
- status = stage.last
- tooltip = "#{name.titleize}: #{status || 'not found'}"
- if status
.stage-container
= link_to namespace_project_pipeline_path(pipeline.project.namespace, pipeline.project, pipeline.id, anchor: stage), class: "has-tooltip ci-status-icon-#{status}", title: tooltip do

View file

@ -62,5 +62,5 @@
- if pipeline.project.build_coverage_enabled?
%th Coverage
%th
- pipeline.statuses.relevant.stages.each do |stage|
- pipeline.stages.each do |stage|
= render 'projects/commit/ci_stage', stage: stage, statuses: pipeline.statuses.relevant.where(stage: stage)

View file

@ -12,4 +12,4 @@
%th Stages
%th
%th
= render pipelines, commit_sha: true, stage: true, allow_retry: true, stages: pipelines.stages, show_commit: false
= render pipelines, commit_sha: true, stage: true, allow_retry: true, show_commit: false

View file

@ -51,6 +51,6 @@
%th Stages
%th
%th.hidden-xs
= render @pipelines, commit_sha: true, stage: true, allow_retry: true, stages: stages
= render @pipelines, commit_sha: true, stage: true, allow_retry: true
= paginate @pipelines, theme: 'gitlab'