commit_status.rb 3.2 KB
Newer Older
D
Dmitriy Zaporozhets 已提交
1 2 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 33
# == Schema Information
#
# 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
#

K
Kamil Trzcinski 已提交
34 35 36 37 38 39 40
class CommitStatus < ActiveRecord::Base
  self.table_name = 'ci_builds'

  belongs_to :commit, class_name: 'Ci::Commit'
  belongs_to :user

  validates :commit, presence: true
K
Kamil Trzcinski 已提交
41
  validates :status, inclusion: { in: %w(pending running failed success canceled) }
K
Kamil Trzcinski 已提交
42 43 44

  validates_presence_of :name

K
Kamil Trzcinski 已提交
45 46
  alias_attribute :author, :user

K
Kamil Trzcinski 已提交
47 48 49 50
  scope :running, -> { where(status: 'running') }
  scope :pending, -> { where(status: 'pending') }
  scope :success, -> { where(status: 'success') }
  scope :failed, -> { where(status: 'failed')  }
K
Kamil Trzcinski 已提交
51 52
  scope :running_or_pending, -> { where(status: [:running, :pending]) }
  scope :finished, -> { where(status: [:success, :failed, :canceled]) }
K
Kamil Trzcinski 已提交
53 54 55
  scope :latest, -> { where(id: unscope(:select).select('max(id)').group(:name, :ref)) }
  scope :ordered, -> { order(:ref, :stage_idx, :name) }
  scope :for_ref, ->(ref) { where(ref: ref) }
K
Kamil Trzcinski 已提交
56 57 58 59 60 61 62

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

    event :drop do
63
      transition [:pending, :running] => :failed
K
Kamil Trzcinski 已提交
64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
    end

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

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

    after_transition pending: :running do |build, transition|
      build.update_attributes started_at: Time.now
    end

    after_transition any => [:success, :failed, :canceled] do |build, transition|
      build.update_attributes finished_at: Time.now
    end

    state :pending, value: 'pending'
    state :running, value: 'running'
    state :failed, value: 'failed'
    state :success, value: 'success'
    state :canceled, value: 'canceled'
  end

  delegate :sha, :short_sha, :gl_project,
           to: :commit, prefix: false

K
Kamil Trzcinski 已提交
92
  # TODO: this should be removed with all references
K
Kamil Trzcinski 已提交
93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115
  def before_sha
    Gitlab::Git::BLANK_SHA
  end

  def started?
    !pending? && !canceled? && started_at
  end

  def active?
    running? || pending?
  end

  def complete?
    canceled? || success? || failed?
  end

  def duration
    if started_at && finished_at
      finished_at - started_at
    elsif started_at
      Time.now - started_at
    end
  end
K
Kamil Trzcinski 已提交
116 117 118 119 120 121 122 123

  def cancel_url
    nil
  end

  def retry_url
    nil
  end
124 125 126 127

  def show_warning?
    false
  end
K
Kamil Trzcinski 已提交
128 129 130 131

  def download_url
    nil
  end
K
Kamil Trzcinski 已提交
132
end