9f93395389
When the owner of a pipelines schedule was either blocked or was removed from the project, the pipeline schedular would still schedule the pipeline. This would than fail however, given the user had no access to the project and it contents. However, a better way to handle it would be to not schedule it at all. Furthermore, from now on, such schedules will be deactivated so the schedule worker can ignore it on the next runs.
60 lines
1.6 KiB
Ruby
60 lines
1.6 KiB
Ruby
module Ci
|
|
class PipelineSchedule < ActiveRecord::Base
|
|
extend Ci::Model
|
|
include Importable
|
|
|
|
acts_as_paranoid
|
|
|
|
belongs_to :project
|
|
belongs_to :owner, class_name: 'User'
|
|
has_one :last_pipeline, -> { order(id: :desc) }, class_name: 'Ci::Pipeline'
|
|
has_many :pipelines
|
|
|
|
validates :cron, unless: :importing_or_inactive?, cron: true, presence: { unless: :importing_or_inactive? }
|
|
validates :cron_timezone, cron_timezone: true, presence: { unless: :importing_or_inactive? }
|
|
validates :ref, presence: { unless: :importing_or_inactive? }
|
|
validates :description, presence: true
|
|
|
|
before_save :set_next_run_at
|
|
|
|
scope :active, -> { where(active: true) }
|
|
scope :inactive, -> { where(active: false) }
|
|
|
|
def owned_by?(current_user)
|
|
owner == current_user
|
|
end
|
|
|
|
def inactive?
|
|
!active?
|
|
end
|
|
|
|
def deactivate!
|
|
update_attribute(:active, false)
|
|
end
|
|
|
|
def importing_or_inactive?
|
|
importing? || inactive?
|
|
end
|
|
|
|
def runnable_by_owner?
|
|
Ability.allowed?(owner, :create_pipeline, project)
|
|
end
|
|
|
|
def set_next_run_at
|
|
self.next_run_at = Gitlab::Ci::CronParser.new(cron, cron_timezone).next_time_from(Time.now)
|
|
end
|
|
|
|
def schedule_next_run!
|
|
save! # with set_next_run_at
|
|
rescue ActiveRecord::RecordInvalid
|
|
update_attribute(:next_run_at, nil) # update without validation
|
|
end
|
|
|
|
def real_next_run(
|
|
worker_cron: Settings.cron_jobs['pipeline_schedule_worker']['cron'],
|
|
worker_time_zone: Time.zone.name)
|
|
Gitlab::Ci::CronParser.new(worker_cron, worker_time_zone)
|
|
.next_time_from(next_run_at)
|
|
end
|
|
end
|
|
end
|