diff options
| author | Shinya Maeda <shinya@gitlab.com> | 2018-09-21 11:17:37 +0900 |
|---|---|---|
| committer | Alessio Caiazza <acaiazza@gitlab.com> | 2018-10-02 17:02:11 +0200 |
| commit | a7c767f16446f71f6e35a5aa3d2fdc73037fcdf5 (patch) | |
| tree | 6f0f2a85f44d796a31ae0813e1ce6d5434bc8fda /app/models | |
| parent | af51b95442aa867bd570b99d32f8b580f554675d (diff) | |
| download | gitlab-ce-a7c767f16446f71f6e35a5aa3d2fdc73037fcdf5.tar.gz | |
Add a new status to ci_builds.status
Diffstat (limited to 'app/models')
| -rw-r--r-- | app/models/ci/build.rb | 42 | ||||
| -rw-r--r-- | app/models/ci/build_schedule.rb | 10 | ||||
| -rw-r--r-- | app/models/commit_status.rb | 8 | ||||
| -rw-r--r-- | app/models/concerns/has_status.rb | 16 |
4 files changed, 42 insertions, 34 deletions
diff --git a/app/models/ci/build.rb b/app/models/ci/build.rb index b608bfdb8b9..3ef149f3632 100644 --- a/app/models/ci/build.rb +++ b/app/models/ci/build.rb @@ -160,6 +160,22 @@ module Ci transition created: :manual end + event :schedule do + transition created: :scheduled + end + + event :unschedule do + transition scheduled: :manual + end + + before_transition created: :scheduled do |build| + build_build_schedule(execute_at: execute_at) + end + + before_transition scheduled: any do |build| + build_schedule.delete! + end + after_transition any => [:pending] do |build| build.run_after_commit do BuildQueueWorker.perform_async(id) @@ -185,12 +201,6 @@ module Ci end end - after_transition any => [:manual] do |build| - build.run_after_commit do - build.schedule! - end - end - before_transition any => [:failed] do |build| next unless build.project next if build.retries_max.zero? @@ -233,25 +243,11 @@ module Ci end def playable? - action? && (manual? || retryable?) + action? && (manual? || scheduled? || retryable?) end def schedulable? - manual? && options[:start_in].present? - end - - def scheduled? - build_schedule.present? - end - - def schedule! - return unless schedulable? - - create_build_schedule!(execute_at: execute_at) - end - - def unschedule! - build_schedule.delete! + self.when == 'delayed' && options[:start_in].present? end def execute_at @@ -259,7 +255,7 @@ module Ci end def action? - %w[manual delayed].include?(self.when) + %w[manual scheduled].include?(self.when) end # rubocop: disable CodeReuse/ServiceClass diff --git a/app/models/ci/build_schedule.rb b/app/models/ci/build_schedule.rb index d6378224fe0..4128fade86c 100644 --- a/app/models/ci/build_schedule.rb +++ b/app/models/ci/build_schedule.rb @@ -8,14 +8,24 @@ module Ci belongs_to :build + validate :schedule_at_future + after_create :schedule, unless: :importing? + scope :stale, -> { where("execute_at < ?", Time.now) } + def execute_in [0, self.execute_at - Time.now].max end private + def schedule_at_future + if self.execute_at < Time.now + errors.add(:execute_at, "Excute point must be somewhere in the future") + end + end + def schedule run_after_commit do Ci::BuildScheduleWorker.perform_at(self.execute_at, self.build_id) diff --git a/app/models/commit_status.rb b/app/models/commit_status.rb index fe2f144ef03..6bf2888505e 100644 --- a/app/models/commit_status.rb +++ b/app/models/commit_status.rb @@ -26,7 +26,7 @@ class CommitStatus < ActiveRecord::Base scope :failed_but_allowed, -> do where(allow_failure: true, status: [:failed, :canceled]) end - + scope :exclude_ignored, -> do # We want to ignore failed but allowed to fail jobs. # @@ -71,7 +71,7 @@ class CommitStatus < ActiveRecord::Base end event :enqueue do - transition [:created, :skipped, :manual] => :pending + transition [:created, :skipped, :manual, :scheduled] => :pending end event :run do @@ -91,10 +91,10 @@ class CommitStatus < ActiveRecord::Base end event :cancel do - transition [:created, :pending, :running, :manual] => :canceled + transition [:created, :pending, :running, :manual, :scheduled] => :canceled end - before_transition [:created, :skipped, :manual] => :pending do |commit_status| + before_transition [:created, :skipped, :manual, :scheduled] => :pending do |commit_status| commit_status.queued_at = Time.now end diff --git a/app/models/concerns/has_status.rb b/app/models/concerns/has_status.rb index e2700db1438..0a97e4cdfc4 100644 --- a/app/models/concerns/has_status.rb +++ b/app/models/concerns/has_status.rb @@ -4,14 +4,15 @@ module HasStatus extend ActiveSupport::Concern DEFAULT_STATUS = 'created'.freeze - BLOCKED_STATUS = 'manual'.freeze - AVAILABLE_STATUSES = %w[created pending running success failed canceled skipped manual].freeze - STARTED_STATUSES = %w[running success failed skipped manual].freeze + BLOCKED_STATUS = %w[manual scheduled].freeze + AVAILABLE_STATUSES = %w[created pending running success failed canceled skipped manual scheduled].freeze + STARTED_STATUSES = %w[running success failed skipped manual scheduled].freeze ACTIVE_STATUSES = %w[pending running].freeze COMPLETED_STATUSES = %w[success failed canceled skipped].freeze - ORDERED_STATUSES = %w[failed pending running manual canceled success skipped created].freeze + ORDERED_STATUSES = %w[failed pending running manual scheduled canceled success skipped created].freeze STATUSES_ENUM = { created: 0, pending: 1, running: 2, success: 3, - failed: 4, canceled: 5, skipped: 6, manual: 7 }.freeze + failed: 4, canceled: 5, skipped: 6, manual: 7, + scheduled: 8 }.freeze UnknownStatusError = Class.new(StandardError) @@ -24,6 +25,7 @@ module HasStatus created = scope_relevant.created.select('count(*)').to_sql success = scope_relevant.success.select('count(*)').to_sql manual = scope_relevant.manual.select('count(*)').to_sql + scheduled = scope_relevant.scheduled.select('count(*)').to_sql pending = scope_relevant.pending.select('count(*)').to_sql running = scope_relevant.running.select('count(*)').to_sql skipped = scope_relevant.skipped.select('count(*)').to_sql @@ -31,6 +33,7 @@ module HasStatus warnings = scope_warnings.select('count(*) > 0').to_sql.presence || 'false' "(CASE + WHEN (#{scheduled})>0 THEN 'scheduled' WHEN (#{builds})=(#{skipped}) AND (#{warnings}) THEN 'success' WHEN (#{builds})=(#{skipped}) THEN 'skipped' WHEN (#{builds})=(#{success}) THEN 'success' @@ -92,8 +95,7 @@ module HasStatus scope :failed_or_canceled, -> { where(status: [:failed, :canceled]) } scope :cancelable, -> do - where("status IN ('running', 'pending', 'created') OR " \ - "(status = 'manual' AND EXISTS (select 1 from ci_build_schedules where ci_builds.id = ci_build_schedules.build_id))") + where("status IN ('running', 'pending', 'created', 'scheduled')") end end |
