Skip to content
Snippets Groups Projects
commit_status.rb 2.04 KiB
Newer Older
  • Learn to ignore specific revisions
  • class CommitStatus < ActiveRecord::Base
      self.table_name = 'ci_builds'
    
      belongs_to :commit, class_name: 'Ci::Commit'
      belongs_to :user
    
      validates :commit, presence: true
    
      validates :status, inclusion: { in: %w(pending running failed success canceled) }
    
    
      validates_presence_of :name
    
    
    Kamil Trzcinski's avatar
    Kamil Trzcinski committed
      alias_attribute :author, :user
    
    
      scope :running, ->() { where(status: 'running') }
      scope :pending, ->() { where(status: 'pending') }
      scope :success, ->() { where(status: 'success') }
      scope :failed, ->() { where(status: 'failed')  }
      scope :running_or_pending, ->() { where(status:[:running, :pending]) }
      scope :latest, ->() { where(id: unscope(:select).select('max(id)').group(:name, :ref)).order(stage_idx: :asc) }
      scope :for_ref, ->(ref) { where(ref: [ref, nil]) }
      scope :running_or_pending, ->() { where(status: [:running, :pending]) }
    
      state_machine :status, initial: :pending do
        event :run do
          transition pending: :running
        end
    
        event :drop do
          transition running: :failed
        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
    
      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
    end