commit_status.rb 3.03 KB
Newer Older
1 2
# == Schema Information
#
Stan Hu's avatar
Stan Hu committed
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
# Table name: ci_builds
#
#  id                 :integer          not null, primary key
#  project_id         :integer
#  status             :string(255)
#  finished_at        :datetime
#  trace              :text
#  created_at         :datetime
#  updated_at         :datetime
#  started_at         :datetime
#  runner_id          :integer
#  coverage           :float
#  commit_id          :integer
#  commands           :text
#  job_id             :integer
#  name               :string(255)
#  deploy             :boolean          default(FALSE)
#  options            :text
#  allow_failure      :boolean          default(FALSE), not null
#  stage              :string(255)
#  trigger_request_id :integer
#  stage_idx          :integer
#  tag                :boolean
#  ref                :string(255)
#  user_id            :integer
#  type               :string(255)
#  target_url         :string(255)
#  description        :string(255)
#  artifacts_file     :text
#  gl_project_id      :integer
33 34
#

35
class CommitStatus < ActiveRecord::Base
36
  include Statuseable
37

38 39
  self.table_name = 'ci_builds'

40
  belongs_to :project, class_name: '::Project', foreign_key: :gl_project_id
Kamil Trzcinski's avatar
Kamil Trzcinski committed
41
  belongs_to :commit, class_name: 'Ci::Commit', touch: true
42 43 44 45 46 47
  belongs_to :user

  validates :commit, presence: true

  validates_presence_of :name

Kamil Trzcinski's avatar
Kamil Trzcinski committed
48 49
  alias_attribute :author, :user

Kamil Trzcinski's avatar
Kamil Trzcinski committed
50
  scope :latest, -> { where(id: unscope(:select).select('max(id)').group(:name, :commit_id)) }
Kamil Trzcinski's avatar
Kamil Trzcinski committed
51
  scope :ordered, -> { order(:ref, :stage_idx, :name) }
52
  scope :ignored, -> { where(allow_failure: true, status: [:failed, :canceled]) }
53 54 55 56 57 58 59

  state_machine :status, initial: :pending do
    event :run do
      transition pending: :running
    end

    event :drop do
60
      transition [:pending, :running] => :failed
61 62 63 64 65 66 67 68 69 70
    end

    event :success do
      transition [:pending, :running] => :success
    end

    event :cancel do
      transition [:pending, :running] => :canceled
    end

71 72
    after_transition pending: :running do |commit_status|
      commit_status.update_attributes started_at: Time.now
73 74
    end

75 76
    after_transition any => [:success, :failed, :canceled] do |commit_status|
      commit_status.update_attributes finished_at: Time.now
77 78
    end

79 80
    after_transition [:pending, :running] => :success do |commit_status|
      MergeRequests::MergeWhenBuildSucceedsService.new(commit_status.commit.project, nil).trigger(commit_status)
81
    end
82 83
  end

84 85 86 87 88
  delegate :sha, :short_sha, to: :commit

  def before_sha
    commit.before_sha || Gitlab::Git::BLANK_SHA
  end
89

90 91 92 93 94 95
  def self.stages
    order_by = 'max(stage_idx)'
    group('stage').order(order_by).pluck(:stage, order_by).map(&:first).compact
  end

  def self.stages_status
96 97 98 99
    all.stages.inject({}) do |h, stage|
      h[stage] = all.where(stage: stage).status
      h
    end
100 101
  end

102
  def ignored?
103
    allow_failure? && (failed? || canceled?)
104 105
  end

106
  def duration
107 108 109 110 111 112
    duration =
      if started_at && finished_at
        finished_at - started_at
      elsif started_at
        Time.now - started_at
      end
Kamil Trzcinski's avatar
Kamil Trzcinski committed
113
    duration
114
  end
Kamil Trzcinski's avatar
Kamil Trzcinski committed
115

116
  def stuck?
117 118
    false
  end
119
end