BigW Consortium Gitlab

commit_status.rb 3.22 KB
Newer Older
Dmitriy Zaporozhets committed
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
#

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
41
  validates :status, inclusion: { in: %w(pending running failed success canceled) }
42 43 44

  validates_presence_of :name

45 46
  alias_attribute :author, :user

Kamil Trzcinski committed
47 48 49 50
  scope :running, -> { where(status: 'running') }
  scope :pending, -> { where(status: 'pending') }
  scope :success, -> { where(status: 'success') }
  scope :failed, -> { where(status: 'failed')  }
Kamil Trzcinski committed
51 52
  scope :running_or_pending, -> { where(status: [:running, :pending]) }
  scope :finished, -> { where(status: [:success, :failed, :canceled]) }
Kamil Trzcinski committed
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) }
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
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

Kamil Trzcinski committed
92
  # TODO: this should be removed with all references
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
Kamil Trzcinski committed
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
128 129 130 131

  def download_url
    nil
  end
132
end