diff --git a/app/models/deployment.rb b/app/models/deployment.rb index 20f404ccbdd8b2f32a3f6f9b74118bdb582d826a..db3a86f84e69d589e82170b63f3e67668cf53921 100644 --- a/app/models/deployment.rb +++ b/app/models/deployment.rb @@ -232,6 +232,8 @@ def finalize_fast_destroy(params) by_project.each do |project, ref_paths| project.repository.delete_refs(*ref_paths.flatten) + rescue Gitlab::Git::Repository::NoRepository + next end end diff --git a/spec/models/deployment_spec.rb b/spec/models/deployment_spec.rb index ceb897725955e18a341309be60d5338092387529..a7ae52109afa51b699356b45937484eea587eb44 100644 --- a/spec/models/deployment_spec.rb +++ b/spec/models/deployment_spec.rb @@ -1797,6 +1797,20 @@ def last_deployment_group(env) expect { project.deployments.fast_destroy_all }.not_to exceed_query_limit(control) end + + context 'when repository was already removed' do + it 'removes deployment without any errors' do + project = create(:project, :repository) + environment = create(:environment, project: project) + deployment = create(:deployment, environment: environment, project: project) + + Repositories::DestroyService.new(project.repository).execute + project.save! # to trigger a repository removal + + expect { described_class.where(id: deployment).fast_destroy_all } + .to change { Deployment.count }.by(-1) + end + end end describe '#update_merge_request_metrics!' do