summaryrefslogtreecommitdiff
path: root/app/models/ci
diff options
context:
space:
mode:
authorKamil Trzcinski <ayufan@ayufan.eu>2015-10-06 12:01:16 +0200
committerKamil Trzcinski <ayufan@ayufan.eu>2015-10-12 11:53:49 +0200
commit914cfbd2f154ed3154a7dc3cee3309713eea786f (patch)
tree445862a347f3c915b2c41f0e8ba26d362017aa52 /app/models/ci
parent5ffbf5feb7577ec3affc32992c79cddca3036c4d (diff)
downloadgitlab-ce-914cfbd2f154ed3154a7dc3cee3309713eea786f.tar.gz
Implement Commit Status API
Diffstat (limited to 'app/models/ci')
-rw-r--r--app/models/ci/build.rb87
-rw-r--r--app/models/ci/commit.rb88
2 files changed, 56 insertions, 119 deletions
diff --git a/app/models/ci/build.rb b/app/models/ci/build.rb
index 5d17f4418ed..41ce522b2ff 100644
--- a/app/models/ci/build.rb
+++ b/app/models/ci/build.rb
@@ -24,32 +24,19 @@
#
module Ci
- class Build < ActiveRecord::Base
- extend Ci::Model
-
+ class Build < CommitStatus
LAZY_ATTRIBUTES = ['trace']
- belongs_to :commit, class_name: 'Ci::Commit'
belongs_to :runner, class_name: 'Ci::Runner'
belongs_to :trigger_request, class_name: 'Ci::TriggerRequest'
- belongs_to :user
serialize :options
- validates :commit, presence: true
- validates :status, presence: true
validates :coverage, numericality: true, allow_blank: true
validates_presence_of :ref
- scope :running, ->() { where(status: "running") }
- scope :pending, ->() { where(status: "pending") }
- scope :success, ->() { where(status: "success") }
- scope :failed, ->() { where(status: "failed") }
scope :unstarted, ->() { where(runner_id: nil) }
- 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 :ignore_failures, ->() { where(allow_failure: false) }
- scope :for_ref, ->(ref) { where(ref: ref) }
scope :similar, ->(build) { where(ref: build.ref, tag: build.tag, trigger_request_id: build.trigger_request_id) }
acts_as_taggable
@@ -74,13 +61,14 @@ module Ci
def create_from(build)
new_build = build.dup
- new_build.status = :pending
+ new_build.status = 'pending'
new_build.runner_id = nil
+ new_build.trigger_request_id = nil
new_build.save
end
def retry(build)
- new_build = Ci::Build.new(status: :pending)
+ new_build = Ci::Build.new(status: 'pending')
new_build.ref = build.ref
new_build.tag = build.tag
new_build.options = build.options
@@ -98,28 +86,7 @@ module Ci
end
state_machine :status, initial: :pending do
- event :run do
- transition pending: :running
- end
-
- event :drop do
- transition running: :failed
- end
-
- event :success do
- transition 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
project = build.project
if project.web_hooks?
@@ -136,19 +103,10 @@ module Ci
build.update_coverage
end
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, :project, :gl_project,
- to: :commit, prefix: false
-
- def before_sha
- Gitlab::Git::BLANK_SHA
+ def ignored?
+ failed? && allow_failure?
end
def trace_html
@@ -156,22 +114,6 @@ module Ci
html || ''
end
- def started?
- !pending? && !canceled? && started_at
- end
-
- def active?
- running? || pending?
- end
-
- def complete?
- canceled? || success? || failed?
- end
-
- def ignored?
- failed? && allow_failure?
- end
-
def timeout
project.timeout
end
@@ -180,14 +122,6 @@ module Ci
yaml_variables + project_variables + trigger_variables
end
- def duration
- if started_at && finished_at
- finished_at - started_at
- elsif started_at
- Time.now - started_at
- end
- end
-
def project
commit.project
end
@@ -278,6 +212,15 @@ module Ci
"#{dir_to_trace}/#{id}.log"
end
+ def description
+ name
+ end
+
+ def target_url
+ Gitlab::Application.routes.url_helpers.
+ namespace_project_build_url(gl_project.namespace, gl_project, self)
+ end
+
private
def yaml_variables
diff --git a/app/models/ci/commit.rb b/app/models/ci/commit.rb
index fde754a92a1..042a68681bb 100644
--- a/app/models/ci/commit.rb
+++ b/app/models/ci/commit.rb
@@ -20,7 +20,8 @@ module Ci
extend Ci::Model
belongs_to :gl_project, class_name: '::Project', foreign_key: :gl_project_id
- has_many :builds, dependent: :destroy, class_name: 'Ci::Build'
+ has_many :statuses, dependent: :destroy, class_name: 'CommitStatus'
+ has_many :builds, class_name: 'Ci::Build'
has_many :trigger_requests, dependent: :destroy, class_name: 'Ci::TriggerRequest'
validates_presence_of :sha
@@ -81,12 +82,11 @@ module Ci
end
def stage
- running_or_pending = builds_without_retry.running_or_pending
- running_or_pending.limit(1).pluck(:stage).first
+ running_or_pending = statuses.latest.running_or_pending
+ running_or_pending.first.try(:stage)
end
def create_builds(ref, tag, user, trigger_request = nil)
- return if skip_ci? && trigger_request.blank?
return unless config_processor
config_processor.stages.any? do |stage|
CreateBuildsService.new.execute(self, stage, ref, tag, user, trigger_request).present?
@@ -94,7 +94,6 @@ module Ci
end
def create_next_builds(ref, tag, user, trigger_request)
- return if skip_ci? && trigger_request.blank?
return unless config_processor
stages = builds.where(ref: ref, tag: tag, trigger_request: trigger_request).group_by(&:stage)
@@ -107,39 +106,47 @@ module Ci
end
def refs
- builds.group(:ref).pluck(:ref)
+ statuses.pluck(:ref).compact.uniq
end
- def last_ref
- builds.latest.first.try(:ref)
- end
-
- def builds_without_retry
- builds.latest
+ def statuses_for_ref(ref = nil)
+ if ref
+ statuses.for_ref(ref)
+ else
+ statuses
+ end
end
- def builds_without_retry_for_ref(ref)
- builds.for_ref(ref).latest
+ def builds_without_retry(ref = nil)
+ if ref
+ builds.for_ref(ref).latest
+ else
+ builds.latest
+ end
end
- def retried_builds
- @retried_builds ||= (builds.order(id: :desc) - builds_without_retry)
+ def retried
+ @retried ||= (statuses.order(id: :desc) - statuses.latest)
end
- def status
- if skip_ci?
- return 'skipped'
- elsif yaml_errors.present?
+ def status(ref = nil)
+ if yaml_errors.present?
return 'failed'
- elsif builds.none?
+ end
+
+ latest_statuses = statuses.latest.to_a
+ latest_statuses.reject! { |status| status.try(&:allow_failure?) }
+ latest_statuses.select! { |status| status.ref == nil || status.ref == ref } if ref
+
+ if latest_statuses.none?
return 'skipped'
- elsif success?
+ elsif latest_statuses.all?(&:success?)
'success'
- elsif pending?
+ elsif latest_statuses.all?(&:pending?)
'pending'
- elsif running?
+ elsif latest_statuses.any?(&:running?) || latest_statuses.any?(&:pending?)
'running'
- elsif canceled?
+ elsif latest_statuses.all?(&:canceled?)
'canceled'
else
'failed'
@@ -147,21 +154,15 @@ module Ci
end
def pending?
- builds_without_retry.all? do |build|
- build.pending?
- end
+ status == 'pending'
end
def running?
- builds_without_retry.any? do |build|
- build.running? || build.pending?
- end
+ status == 'running'
end
def success?
- builds_without_retry.all? do |build|
- build.success? || build.ignored?
- end
+ status == 'success'
end
def failed?
@@ -169,21 +170,15 @@ module Ci
end
def canceled?
- builds_without_retry.all? do |build|
- build.canceled?
- end
- end
-
- def duration
- @duration ||= builds_without_retry.select(&:duration).sum(&:duration).to_i
+ status == 'canceled'
end
- def duration_for_ref(ref)
- builds_without_retry_for_ref(ref).select(&:duration).sum(&:duration).to_i
+ def duration(ref = nil)
+ statuses_for_ref(ref).latest.select(&:duration).sum(&:duration).to_i
end
def finished_at
- @finished_at ||= builds.order('finished_at DESC').first.try(:finished_at)
+ @finished_at ||= statuses.order('finished_at DESC').first.try(:finished_at)
end
def coverage
@@ -195,8 +190,8 @@ module Ci
end
end
- def matrix_for_ref?(ref)
- builds_without_retry_for_ref(ref).pluck(:id).size > 1
+ def matrix?(ref)
+ builds_without_retry(ref).pluck(:id).size > 1
end
def config_processor
@@ -217,7 +212,6 @@ module Ci
end
def skip_ci?
- return false if builds.any?
git_commit_message =~ /(\[ci skip\])/ if git_commit_message
end