Class: Ci::JobArtifacts::ExpireProjectBuildArtifactsService

Inherits:
Object
  • Object
show all
Defined in:
app/services/ci/job_artifacts/expire_project_build_artifacts_service.rb

Constant Summary collapse

BATCH_SIZE =
1000

Instance Method Summary collapse

Constructor Details

#initialize(project_id, expiry_time) ⇒ ExpireProjectBuildArtifactsService

Returns a new instance of ExpireProjectBuildArtifactsService.



8
9
10
11
# File 'app/services/ci/job_artifacts/expire_project_build_artifacts_service.rb', line 8

def initialize(project_id, expiry_time)
  @project_id = project_id
  @expiry_time = expiry_time
end

Instance Method Details

#executeObject

rubocop:disable CodeReuse/ActiveRecord



14
15
16
17
18
19
20
21
22
23
24
25
26
27
# File 'app/services/ci/job_artifacts/expire_project_build_artifacts_service.rb', line 14

def execute
  scope = Ci::JobArtifact.for_project(project_id).order(:id)
  file_type_values = Ci::JobArtifact.erasable_file_types.map { |file_type| [Ci::JobArtifact.file_types[file_type]] }
  from_sql = Arel::Nodes::Grouping.new(Arel::Nodes::ValuesList.new(file_type_values)).as('file_types (file_type)').to_sql
  array_scope = Ci::JobArtifact.from(from_sql).select(:file_type)
  array_mapping_scope = -> (file_type_expression) { Ci::JobArtifact.where(Ci::JobArtifact.arel_table[:file_type].eq(file_type_expression)) }

  Gitlab::Pagination::Keyset::Iterator
    .new(scope: scope, in_operator_optimization_options: { array_scope: array_scope, array_mapping_scope: array_mapping_scope })
    .each_batch(of: BATCH_SIZE) do |batch|
    ids = batch.reselect!(:id).to_a.map(&:id)
    Ci::JobArtifact.unlocked.where(id: ids).update_all(locked: Ci::JobArtifact.lockeds[:unlocked], expire_at: expiry_time)
  end
end