Skip to content
Snippets Groups Projects
commit_status.rb 2.9 KiB
Newer Older
  • Learn to ignore specific revisions
  • # == Schema Information
    #
    
    Stan Hu's avatar
    Stan Hu committed
    # 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
    
    class CommitStatus < ActiveRecord::Base
    
      include CiStatus
    
    
      self.table_name = 'ci_builds'
    
    
      belongs_to :project, class_name: '::Project', foreign_key: :gl_project_id
    
    Kamil Trzcinski's avatar
    Kamil Trzcinski committed
      belongs_to :commit, class_name: 'Ci::Commit', touch: true
    
      belongs_to :user
    
      validates :commit, presence: true
    
      validates_presence_of :name
    
    
    Kamil Trzcinski's avatar
    Kamil Trzcinski committed
      alias_attribute :author, :user
    
    
    Kamil Trzcinski's avatar
    Kamil Trzcinski committed
      scope :latest, -> { where(id: unscope(:select).select('max(id)').group(:name, :commit_id)) }
    
    Kamil Trzcinski's avatar
    Kamil Trzcinski committed
      scope :ordered, -> { order(:ref, :stage_idx, :name) }
    
      scope :ignored, -> { where(allow_failure: true, status: [:failed, :canceled]) }
    
    
      state_machine :status, initial: :pending do
        event :run do
          transition pending: :running
        end
    
        event :drop do
    
          transition [:pending, :running] => :failed
    
        end
    
        event :success do
          transition [:pending, :running] => :success
        end
    
        event :cancel do
          transition [:pending, :running] => :canceled
        end
    
    
        after_transition pending: :running do |commit_status|
          commit_status.update_attributes started_at: Time.now
    
        after_transition any => [:success, :failed, :canceled] do |commit_status|
          commit_status.update_attributes finished_at: Time.now
    
        after_transition [:pending, :running] => :success do |commit_status|
          MergeRequests::MergeWhenBuildSucceedsService.new(commit_status.commit.project, nil).trigger(commit_status)
    
      delegate :before_sha, :sha, :short_sha, to: :commit, prefix: false
    
      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
        Hash[group(:stage).pluck(:stage, self.status_sql)]
      end
    
    
      def duration
        if started_at && finished_at
          finished_at - started_at
        elsif started_at
          Time.now - started_at
        end
      end
    
    Kamil Trzcinski's avatar
    Kamil Trzcinski committed
    
    
      def stuck?