diff options
author | Kamil Trzciński <ayufan@ayufan.eu> | 2018-10-05 16:30:33 +0000 |
---|---|---|
committer | Kamil Trzciński <ayufan@ayufan.eu> | 2018-10-05 16:30:33 +0000 |
commit | 059da9bc8eb9355a760031ef8e73b0aa6285012f (patch) | |
tree | b6057c99d0c53951a650122d624dc37405194551 /app/models/ci/build.rb | |
parent | 7f86172f806558d2b614abcb06cef0ea516c5900 (diff) | |
parent | 7542a5d102bc48f5f7b8104fda22f0975b2dd931 (diff) | |
download | gitlab-ce-059da9bc8eb9355a760031ef8e73b0aa6285012f.tar.gz |
Merge branch 'scheduled-manual-jobs' into 'master'
Delayed jobs
Closes #51352
See merge request gitlab-org/gitlab-ce!21767
Diffstat (limited to 'app/models/ci/build.rb')
-rw-r--r-- | app/models/ci/build.rb | 44 |
1 files changed, 41 insertions, 3 deletions
diff --git a/app/models/ci/build.rb b/app/models/ci/build.rb index a59ff731954..cdfe8175a42 100644 --- a/app/models/ci/build.rb +++ b/app/models/ci/build.rb @@ -92,7 +92,8 @@ module Ci scope :with_artifacts_not_expired, ->() { with_artifacts_archive.where('artifacts_expire_at IS NULL OR artifacts_expire_at > ?', Time.now) } scope :with_expired_artifacts, ->() { with_artifacts_archive.where('artifacts_expire_at < ?', Time.now) } scope :last_month, ->() { where('created_at > ?', Date.today - 1.month) } - scope :manual_actions, ->() { where(when: :manual, status: COMPLETED_STATUSES + [:manual]) } + scope :manual_actions, ->() { where(when: :manual, status: COMPLETED_STATUSES + %i[manual]) } + scope :scheduled_actions, ->() { where(when: :delayed, status: COMPLETED_STATUSES + %i[scheduled]) } scope :ref_protected, -> { where(protected: true) } scope :with_live_trace, -> { where('EXISTS (?)', Ci::BuildTraceChunk.where('ci_builds.id = ci_build_trace_chunks.build_id').select(1)) } @@ -159,6 +160,34 @@ module Ci transition created: :manual end + event :schedule do + transition created: :scheduled + end + + event :unschedule do + transition scheduled: :manual + end + + event :enqueue_scheduled do + transition scheduled: :pending, if: ->(build) do + build.scheduled_at && build.scheduled_at < Time.now + end + end + + before_transition scheduled: any do |build| + build.scheduled_at = nil + end + + before_transition created: :scheduled do |build| + build.scheduled_at = build.options_scheduled_at + end + + after_transition created: :scheduled do |build| + build.run_after_commit do + Ci::BuildScheduleWorker.perform_at(build.scheduled_at, build.id) + end + end + after_transition any => [:pending] do |build| build.run_after_commit do BuildQueueWorker.perform_async(id) @@ -226,11 +255,20 @@ module Ci end def playable? - action? && (manual? || retryable?) + action? && (manual? || scheduled? || retryable?) + end + + def schedulable? + Feature.enabled?('ci_enable_scheduled_build', default_enabled: true) && + self.when == 'delayed' && options[:start_in].present? + end + + def options_scheduled_at + ChronicDuration.parse(options[:start_in])&.seconds&.from_now end def action? - self.when == 'manual' + %w[manual delayed].include?(self.when) end # rubocop: disable CodeReuse/ServiceClass |