66 lines
1.8 KiB
Ruby
66 lines
1.8 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module Gitlab
|
|
module Ci
|
|
module Pipeline
|
|
module Chain
|
|
module Limit
|
|
class ActiveJobs < Chain::Base
|
|
include ::Gitlab::Utils::StrongMemoize
|
|
include ::Gitlab::Ci::Pipeline::Chain::Helpers
|
|
|
|
LIMIT_NAME = :ci_active_jobs
|
|
MESSAGE = "Project exceeded the allowed number of jobs in active pipelines. Retry later."
|
|
|
|
def perform!
|
|
return unless limits.exceeded?(LIMIT_NAME, count_jobs_in_alive_pipelines)
|
|
|
|
error(MESSAGE, drop_reason: :job_activity_limit_exceeded)
|
|
|
|
Gitlab::AppLogger.info(
|
|
class: self.class.name,
|
|
message: MESSAGE,
|
|
project_id: project.id,
|
|
plan: project.actual_plan_name,
|
|
project_path: project.path,
|
|
jobs_in_alive_pipelines_count: count_jobs_in_alive_pipelines
|
|
)
|
|
end
|
|
|
|
def break?
|
|
pipeline.errors.any?
|
|
end
|
|
|
|
private
|
|
|
|
def namespace
|
|
strong_memoize(:namespace) do
|
|
project.namespace
|
|
end
|
|
end
|
|
|
|
def limits
|
|
strong_memoize(:limits) do
|
|
namespace.actual_limits
|
|
end
|
|
end
|
|
|
|
def count_jobs_in_alive_pipelines
|
|
strong_memoize(:count_jobs_in_alive_pipelines) do
|
|
count_persisted_jobs_in_all_alive_pipelines + count_current_pipeline_jobs
|
|
end
|
|
end
|
|
|
|
def count_current_pipeline_jobs
|
|
command.pipeline_seed.size
|
|
end
|
|
|
|
def count_persisted_jobs_in_all_alive_pipelines
|
|
project.all_pipelines.jobs_count_in_alive_pipelines
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|